Tương tác với hệ thống – Điều khiển danh sách các ứng
dụng đang chạy:
Trong quá trình thực hiện phần mềm, có một yêu cầu quản trị hệ thống là
người quản trị muốn biết tại thời điểm hiện tại, người dùng đang mở những ứng
dụng gì. Người quản trị có thể xem danh sách các ứng dụng đó, đồng thời có thể
thay đổi bằng cách thêm (mở một ứng dụng mới), bớt (tắt một ứng dụng đang
chạy). Yêu cầu này đòi hỏi cần phải tìm hiểu cơ chế quản lý cửa sổ trong hệ điều
hành Windows.
3.3.1 Các hàm dạng Enum_ và cơ chế gọi ngược (callback) của
Windows:
Có một số dữ liệu về hệ thống mà chúng ta khi cần truy cập trực tiếp sẽ rất
khó khăn, ví dụ như có bao nhiêu font chữ trên hệ thống ?, có bao nhiêu cửa sổ
đang họat động trên hệ thống ?. vì các dữ liệu dạng này đều do hệ thống nắm giữ,
và hệ thống không muốn chúng ta để ý nhiều về chi tiết quản lý của nó. Do đó, hệ
điều hành Windows cung cấp một số các hàm liệt kê sẽ giải đáp những thắc mắc
trên của chúng ta. Vấn đề còn lại là hệ thống không biết chúng ta sẽ xử lý như thế
nào với những dữ liệu mà nó cung cấp vì dữ liệu dạng này không được tường minh
(có thể không có hoặc có rất nhiều), hệ thống phải kiểm tra và trả về từng thành
phần dữ liệu một
Câu trả lời là hệ điều hành Windows sẽ cung cấp một cơ chế gọi ngược
(callback). Nói một cách đơn giản, chúng ta sẽ thông báo với hệ thống rằng khi hệ
thống cung cấp các dữ liệu mà ta yêu cầu thì hãy xử lý theo những công việc mà ta
đề ra. Hàm mà chứa các công việc ta giao cho hệ thống làm được gọi là hàm gọi
ngược (callback function).
Một hàm gọi ngược là một hàm do ứng dụng của người dùng tự định nghĩa
và được thực thi bởi hệ điều hành mỗi khi có sự kiện liên quan đến hàm xảy ra.112
3.3.2 EnumWindows
Để lấy được danh sách các ứng dụng đang chạy, ta sẽ sử dụng cơ chế gọi
ngược. Theo cơ chế gọi ngược, hệ điều hành Windows cung cấp một loạt các hàm
liệt kê bắt đầu bằng từ Enum (enumerate : liệt kê) như
EnumFontFamilliesEx, EnumForms và EnumWindows.
EnumWindows chính là hàm ta cần:
Hàm EnumWindows
Chức năng: liệt kê tất cả cửa sổ top-level trên màn hình bằng cách trả về
handle của từng cửa sổ một cho một hàm gọi ngược của ứng dụng định nghĩa. Việc
liệt kê sẽ kết thúc khi đến cửa sổ cuối hoặc hàm gọi ngược trả về FALSE
234 trang |
Chia sẻ: trungkhoi17 | Lượt xem: 400 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Giáo trình Chương trình quản lý phòng máy, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
tin văn bản,
thao tác sẽ thất bại.
NULL : Các phiên bản trước Windows 2000: tên thao tác mặc định
quy định trong registry. Nếu không, thao tác “open” sẽ được dùng.
Các phiên bản từ Windows 2000: tên thao tác mặc định quy
định trong registry. Nếu không, thao tác “open” sẽ được dùng. Nếu vẫn không
được, hệ điều hành sẽ dùng thao tác đầu tiên đăng ký vào danh sách trong registry.
lpFile: tên tập tin hay thư mục.
117
lpParameters : tham số dành cho lpFile nếu lpFile là một tập tin thực thi.
Nếu lpFile là một tập tin văn bản, lpParameters nên đặt là NULL.
lpDirectory : đường dẫn tuyệt đối.
nShowCmd :
SW_HIDE
Giấu cửa sổ.
SW_MAXIMIZE
Phóng to hết cỡ cửa sổ.
SW_MINIMIZE
Thu nhỏ cửa sổ.
SW_RESTORE
Phục hồi cửa sổ về kích thước mặc định của nó.
SW_SHOW
Hiện cửa sổ theo kích thước mặc định của nó.
SW_SHOWDEFAULT
Đặt trạng thái mặc định của cửa sổ khi mở là hiện ra.
SW_SHOWMAXIMIZED
Hiện và phóng to hết cỡ cửa sổ.
SW_SHOWMINIMIZED
Hiện và thu nhỏ cửa sổ.
SW_SHOWMINNOACTIVE
Thu nhỏ cửa sổ nhưng không kích hoạt nó.
SW_SHOWNA
Hiện cửa sổ như trạng thái mà nó đã quy định.
SW_SHOWNOACTIVATE
Hiện cửa sổ nhưng không kích hoạt nó.
SW_SHOWNORMAL
Hiện và kích hoạt cửa sổ.
Giá trị trả về:
118
[out]
Nếu thành công, trả về giá trị lớn hơn 32.
Nếu thất bại, trả lỗi.
Áp dụng vào chương trình:
(int)ShellExecute(NULL, "open", lpFile, lpParam, lpPath, SW_SHOW);
Với lpFile, lpParam, lpPath lần lượt là các giá trị lpFile, lpParameters,
lpDirectory đã giải thích ở trên. Lưu ý rằng, ta phải ép kiểu “(int)” khi lấy kết quả vì
nguyên hàm của hàm có trị trả về là HINSTANCE. Thực chất, kiểu trị trả về như
thế để tương thích ngược với các ứng dụng 16-bit cũ.
Hình 3-11 Mở một ứng dụng
3.4 Điều khiển máy tính từ xa:
Trong quá trình thực hiện phần mềm, có một yêu cầu quản trị hệ thống là
người quản trị cần log out, restart và shutdown một máy tính hoặc các máy đang
hoạt động. Điều này có thể thực hiện thông qua các hàm API hệ thống của
Windows nhưng trước hết, ta cần phải biết thêm cơ chế đăng nhập của hệ điều hành
Windows.
119
3.4.1 Cơ chế đăng nhập:
3.4.1.1 Winlogon:
Cơ chế đăng nhập của Windows, Winlogon được thiết kế theo mô hình đăng
nhập tương tác gồm 3 phần : thành phần thực thi (“winlogon.exe”), thư viện liên kết
động “Chứng thực và nhận dạng theo cơ chế đồ họa” (Graphical Identification and
Authentication GINA) (“msgina.dll”), và các thành phần mạng. Để biết thêm về
GINA, xem Phụ lục GINA stub – kỹ thuật xây dựng.
Quá trình đăng nhập được mô tả như sau:
Hình 3-12 Quá trình đăng nhập
* thẻ bài truy cập (access token):
Một thẻ bài truy cập chứa đựng thông tin bảo mật của session đăng nhập. Hệ
thống tạo thẻ bài khi người dùng đăng nhập, và mỗi tiến trình thực thi dưới quyền
của người dùng đều có một bản sao của thẻ bài. Thẻ bài xác định người dùng, nhóm
người dùng và đặc quyền của người dùng. Hệ thống dùng thẻ bài để kiểm soát việc
truy cập đến các đối tượng bảo mật và khống chế các hoạt động liên quan đến hệ
Người
dùng
đăng
nhập hệ
thống
Hệ thống
cấp một
thẻ bài truy
cập (access
token) cho
người dùng
Người
dùng sử
dụng tài
nguyên hệ
thống
Dựa vào thẻ
bài, hệ thống
quyết định
xem người
dùng có được
sử dụng tài
nguyên hay
không.
Người dùng
thóat khỏi hệ
thống
Hệ thống
chấp nhận
và hủy thẻ
bài
120
thống của người dùng. Tùy thuộc vào đặc quyền của người dùng, mà mức độ khống
chế cao hay thấp. Chẳng hạn, quản trị viên có toàn quyền đối với hệ thống.
3.4.1.2 Phân tích:
Vậy việc ta phải làm là :
• Lấy thẻ bài của người dùng.
• Với thẻ bài, kiểm tra xem người dùng có đặc quyền log out, restart,
shutdown hay không.
• Nếu có, bật đặc quyền lên (cho phép các tiến trình sử dụng đặc quyền để
thực hiện thao tác log out, restart, hay shutdown trên hệ thống).
• Nếu thành công. công việc hoàn tất.
3.4.2 Các hàm API hệ thống được sử dụng:
3.4.2.1 OpenProcessToken
Chức năng : mở thẻ bài truy cập của tiến trình. khi biết handle.
BOOL OpenProcessToken(
HANDLE ProcessHandle,
DWORD DesiredAccess,
PHANDLE TokenHandle
);
Ý nghĩa tham số:
[in]
ProcessHandle : handle của tiến trình.
DesiredAccess : quyền truy cập yêu cầu.
[out]
TokenHandle : handle của thẻ bài.
Giá trị trả về:
[out]
Nếu thành công, trả về khác 0.
121
Nếu thất bại, trả về 0. Gọi GetLastError để biết lỗi.
3.4.2.2 LookupPrivilegeValue
Chức năng : lấy số định dạng cục bộ duy nhất (LUID). LUID là một giá trị
64 bit có ý nghĩa duy nhất trên hệ điều hành mà phát sinh ra số cho đến khi hệ thống
khởi động lại.
BOOL LookupPrivilegeValue(
LPCTSTR lpSystemName,
LPCTSTR lpName,
PLUID lpLuid
);
Ý nghĩa tham số:
lpSystemName : tên hệ thống mà đặc quyền sẽ được lấy.
lpName : tên đặc quyền.
[out]
lpLuid : LUID của hệ thống.
Giá trị trả về
[out]
Nếu thành công, trả về khác 0.
Nếu thất bại, trả về 0. Để biết lỗi, gọi GetLastError.
3.4.2.3 AdjustTokenPrivileges
Chức năng: bật hay tắt đặc quyền của một thẻ bài truy cập, phải có truy cập
TOKEN_ADJUST_PRIVILEGES.
BOOL AdjustTokenPrivileges(
HANDLE TokenHandle,
BOOL DisableAllPrivileges,
PTOKEN_PRIVILEGES NewState,
DWORD BufferLength,
PTOKEN_PRIVILEGES PreviousState,
122
PDWORD ReturnLength
);
Ý nghĩa tham số:
[in]
TokenHandle : handle của thẻ bài cần bật/tắt đặc quyền.
DisableAllPrivileges : TRUE, tắt tất cả các đặc quyền.
FALSE, chỉnh sửa các đặc quyền dựa trên thông tin của NewState.
NewState : trỏ đến cấu trúc TOKEN_PRIVILEGES:
typedef struct _TOKEN_PRIVILEGES {
DWORD PrivilegeCount; // số đặc quyền
LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]; // mảng các
LUID
} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;
trong đó cấu trúc LUID_AND_ATTRIBUTES :
typedef struct _LUID_AND_ATTRIBUTES {
LUID Luid; // số LUID
DWORD Attributes.; // thuộc tính của LUID
} LUID_AND_ATTRIBUTES,
*PLUID_AND_ATTRIBUTES
với Attributes tổ hợp các giá trị sau:
Giá trị Ý nghĩa
SE_PRIVILEGE_ENABLED Đặc quyền bật.
SE_PRIVILEGE_REMOVED Gở bỏ đặc quyền.
None Tắt đặc quyền.
Bảng 3-3 Giá trị của biến Attributes
BufferLength : kích thước theo byte của vùng đệm chứa PreviousState. Giá
trị này là 0 nếu PreviousState là NULL.
123
PreviousState : tương tự NewState, nhưng cho biết trạng thái trước của đặc
quyền cần chỉnh sửa.
ReturnLength : trả về kích thước thật của vùng đệm chứa PreviousState.
NULL nếu PreviousState là NULL.
Giá trị trả về:
[out]
Nếu thành công, trả về khác 0
Nếu thất bại, trả về 0. Gọi GetLastError để biết lỗi.
3.4.2.4 ExitWindowsEx
Chức năng : thực hiện log out, restart, shutdown.
BOOL ExitWindowsEx(
UINT uFlags,
DWORD dwReason
);
Ý nghĩa tham số:
[in]
uFlags: cờ hiệu, là tổ hợp những giá trị sau:
Giá trị Ý nghĩa
EWX_LOGOFF
Đóng tất cả các cửa sổ và đăng xuất
người dùng
EWX_POWEROFF
Shutdown hệ thống và tắt máy. Hệ
thống phải hỗ trợ tính năng tắt máy.
Tiến trình gọi phải có đặc quyền
SE_SHUTDOWN_NAME.
EWX_REBOOT
Shutdown hệ thống và khởi động lại
máy. Tiến trình gọi phải có đặc quyền
SE_SHUTDOWN_NAME.
124
EWX_SHUTDOWN
Shutdown hệ thống ở thời điểm an
toàn nhưng không tắt máy. Tiến trình
gọi phải có đặc quyền
SE_SHUTDOWN_NAME.
Bảng 3-4 Giá trị cờ hiệu
Tham số tùy chọn :
Giá trị Ý nghĩa
EWX_FORCE
Ép các tiến trình kết thúc. Cờ hiệu
này có thể làm ứng dụng mất dữ liệu.
Windows XP: Nếu máy bị khóa và
cờ không đặct, tiến trình shutdown sẽ
thất bại.
EWX_FORCEIFHUNG
Ép các tiến trình kết thúc nếu chúng
bỏ qua thông điệp yêu cầu kết thúc
thông thường
WM_QUERYENDSESSION hay
WM_ENDSESSION. cờ sẽ bỏ qua
nếu đã có EWX_FORCE.
Windows NT and
Windows Me/98/95: không hỗ trợ.
Bảng 3-5 Giá trị cờ hiệu tùy chọn
dwReason: lý do shutdown, xem thêm trong MSDN để biết chi tiết.
Giá trị trả về:
[out]
Nếu thành công, trả về khác 0. Tuy thế, điều này vẫn không chắc rằng thao
tác có thành công hay không.
125
Nếu thất bại, trả về 0. Gọi GetLastError để biết lỗi.
3.4.3 Cài đặt :
Áp dụng các hàm API trên để thực hiện các công việc đề ra ở 3.4.1.2 Phân
tích:
BOOL CShutdownClient::ShutdownSystem(int iOption)
Hàm có tác dụng thực hiện shutdown, restart, log out trong một khoảng thời
gian xác định.
Có một lưu ý nhỏ là trong quá trình làm phần mềm, ta gặp rắc rối là khi thực
thi thành công hàm ShutdownSystem, ta vẫn không chắc là thao tác ta yêu cầu
trên máy khách có thành công hay không. Vì vậy, bên phía Server chỉ biết được
điều này khi Server mất liên lạc với chương trình bên Client. Việc còn lại là ta chỉ
cần thông báo cho Server biết lỗi thực thi không thành công chứ không bao giờ gởi
báo thành công.
Hình 3-13 Điều khiển hoạt động máy tính từ xa
126
3.5 Tương tác hệ thống – Điều khiển các dịch vụ có trên hệ
thống:
Trong quá trình thực hiện phần mềm, có một yêu cầu quản trị hệ thống là
người quản trị muốn biết tại thời điểm hiện tại, máy khách đang hoạt động những
dịch vụ (service) gì. Người quản trị có thể xem danh sách các dịch vụ đó, đồng thời
có thể thay đổi bằng cách thêm (mở một dịch vụ mới), bớt (tắt một dịch vụ đang
chạy). Yêu cầu này đòi hỏi cần phải tìm hiểu cơ chế quản lý dịch vụ trong hệ điều
hành Windows.
3.5.1 Dịch vụ
3.5.1.1 Khái niệm:
Ứng dụng có khả năng hoạt động trong một khỏang thời gian dài trong một
session của hệ điều hành Windows được gọi là dịch vụ. Các dịch vụ có thể tự động
chạy lên mỗi khi máy khởi động, có thể dừng và khởi động lại, và không đưa ra
giao diện với người dùng. Dịch vụ thường được sử dụng trên server hoặc bất cứ
máy nào cần các tính năng hoạt động lâu dài nhưng không cần can thiệp bởi người
dùng.
3.5.1.2 Loại dịch vụ:
Ta không đi quá sâu vào các dịch vụ cấp thấp. Ta chỉ quan tâm các dịch vụ
dạng ứng dụng chạy là 2 loại Win32OwnProcess và Win32ShareProcess.
3.5.1.3 Vòng đời của dịch vụ:
Một dịch vụ trải qua nhiều trạng thái trong vòng đời hoạt động của nó. Trước
hết, dịch vụ được cài đặt trong hệ thống mà nó sẽ chạy. Quá trình này thực thi bộ
cài đặt của dịch vụ và nạp dịch vụ vào trong Service Control Manager (Bộ Quản lý
Điều khiển Dịch vụ). Service Control Manager là một công cụ do hệ điều hành
Windows cung cấp để quản trị các dịch vụ.
127
Sau khi dịch vụ được nạp, nó phải được khởi động (start). Khởi động dịch vụ
cho phép nó hoạt động. Một dịch vụ đang hoạt động (running) có thể tồn tại ở trạng
thái này cho đến khi nó được ngưng lại (stop) hoặc dừng hẳn (pause) hay máy
shutdown. Dịch vụ có thể tồn tại dưới 3 trạng thái căn bản : Đang hoạt động
(Running), Ngưng (Paused), hay Dừng (Stopped). Dịch vụ còn báo về các trạng thái
chuyển (pending) của nó: Tiếp tục Chuyển (ContinuePending), Chuyển Ngưng
(PausePending), Chuyển Khởi động (StartPending), hay Chuyển Dừng
(StopPending). Các trạng thái chuyển cho biết lệnh nào mới vừa được kích hoạt,
nhưng chưa thực thi xong.
Ngoài ra, dịch vụ cần thêm thông tin về trạng thái khởi động của nó. Một số
dịch vụ rất cần thiết cho hệ thống (như dịch vụ DHCP), còn một số thì không.
Người sử dụng máy có thể cần kích hoạt tự động (Automatic), kích hoạt bằng tay
(Manual), hay vô hiệu hóa (Disabled) dịch vụ. Vì vậy, dịch vụ có 3 trạng thái khởi
động (trạng thái dịch vụ khi máy vừa khởi động xong) là Tự động (Automatic),
Bằng tay (Manual), Vô hiệu (Disabled).
Việc điều khiển các dịch vụ đang hoạt động chính là xem danh sách các dịch
vụ, thay đổi 3 trạng thái hoạt động là Đang hoạt động (Running), Ngưng (Paused),
hay Dừng (Stopped), và 3 trạng thái khởi động là : Tự động (Automatic), Bằng tay
(Manual), Vô hiệu (Disabled). Tuy nhiên, với yêu cầu ở đầu mục, ta chỉ cần điều
khiển 2 trạng thái hoạt động là Running và Stopped, và 3 trạng thái khởi động đã
nêu là đủ.
3.5.2 Điều khiển các dịch vụ đang hoạt động trên hệ thống:
Qua kiến thức khái quát về dịch vụ ở 3.5.1, ta có thể thấy rằng để truy xuất
đến các dịch vụ đang chạy trên hệ thống, ta phải thông qua Service Control
Manager. Đây là cách chung nhất, và có vẻ là cách khả thi duy nhất trên Visual C++
do VC++ 6.0 không hỗ trợ về truy xuất liên quan đến dịch vụ.
128
3.5.2.1 Các hàm API sử dụng :
3.5.2.1.1 OpenSCManager:
Chức năng : thiết lập kết nối đến Service Control Manager trên máy tính và
mở cơ sở dữ liệu của Service Control Manager.
SC_HANDLE OpenSCManager(
LPCTSTR lpMachineName,
LPCTSTR lpDatabaseName,
DWORD dwDesiredAccess
);
Ý nghĩa tham sô:
[in]
lpMachineName : tên máy tính. Nếu là NULL, sẽ mở chính máy tính cục
bộ này.
lpDatabaseName : tên của cơ sở dữ liệu Service Control Manager cần được
mở.
dwDesiredAccess : quyền truy cập mong muốn, xem chi tiết trong MSDN
về các quyền truy cập.
Giá trị trả về:
[out]
Nếu thành công, trả về handle của cơ sở dữ liệu Service Control Manager
được mở.
Nếu thất bại, trả về NULL. . Để biết lỗi, gọi GetLastError.
3.5.2.1.2 EnumServicesStatus
Chức năng: đếm và lấy thông tin về các dịch vụ trong một cơ sở dữ liệu
Service Control Manager được mở.
BOOL EnumServicesStatus(
SC_HANDLE hSCManager,
DWORD dwServiceType,
129
DWORD dwServiceState,
LPENUM_SERVICE_STATUS lpServices,
DWORD cbBufSize,
LPDWORD pcbBytesNeeded,
LPDWORD lpServicesReturned,
LPDWORD
);
Ý nghĩa tham số:
[in]
hSCManager: handle của cơ sở dữ liệu Service Control Manager
được mở, do OpenSCManager trả về khi mở thành công.
dwServiceType : loại dịch vụ cần mở
dwServiceState : trạng thái loại dịch vụ cần liệt kê
[out]
lpServices : trỏ đến cấu trúc ENUM_SERVICE_STATUS chứa thông tin
dịch vụ:
typedef struct _ENUM_SERVICE_STATUS {
LPTSTR lpServiceName; // tên đăng ký của dịch vụ
LPTSTR lpDisplayName; //tên của dịch vụ
SERVICE_STATUS ServiceStatus;
} ENUM_SERVICE_STATUS,
*LPENUM_SERVICE_STATUS;
ServiceStatus : là cấu trúc SERVICE_STATUS
typedef struct _SERVICE_STATUS {
DWORD dwServiceType;
DWORD dwCurrentState;
DWORD dwControlsAccepted;
DWORD dwWin32ExitCode;
DWORD dwServiceSpecificExitCode;
130
DWORD dwCheckPoint;
DWORD dwWaitHint;
} SERVICE_STATUS, *LPSERVICE_STATUS;
dwServiceType : loại dịch vụ.
dwCurrentState :
Giá trị Ý nghĩa
SERVICE_CONTINUE_PENDING Tiếp tục chuyển.
SERVICE_PAUSE_PENDING Chuyển ngưng.
SERVICE_PAUSED Dịch vụ ngưng.
SERVICE_RUNNING Dịch vụ đang chạy.
SERVICE_START_PENDING Dịch vụ đang khởi động.
SERVICE_STOP_PENDING Dịch vụ đang dừng.
SERVICE_STOPPED Dịch vụ dừng hẳn.
Bảng 3-6 Tình trạng hiện tại
dwControlsAccepted
Mã điều khiển Ý nghĩa
SERVICE_ACCEPT_NETBINDCHANGE
Dịch vụ là một thành phần mạng
chấp nhận thay đổi trong
binding mà không cần dừng hay
khởi động lại.
SERVICE_ACCEPT_PARAMCHANGE
Dịch vụ có thể đọc lại các tham
số khởi tạo mà không cần dừng
hay khởi động lại.
SERVICE_ACCEPT_PAUSE_CONTINUE
Dịch vụ có thể ngưng hay tiếp
tục.
SERVICE_ACCEPT_SHUTDOWN Dịch vụ được thông báo khi hệ
131
thống shutdown.
SERVICE_ACCEPT_STOP Dịch vụ có thể dừng.
Bảng 3-7 Loại điều khiển chấp nhận
dwWin32ExitCode : mã lỗi khi có một lỗi xảy ra khi đang khởi động
hay đang dừng.
dwServiceSpecificExitCode : lỗi thực thi do dịch vụ tự định nghĩa.
dwCheckPoint : giá trị tăng dần khi dịch vụ trải qua lần lược các quá
trình khởi động, dừng, ngưng, hay tiếp tục.
dwWaitHint : thời gian dự đoán cho một thao tác khởi động, dừng,
ngưng, hay tiếp tục, tính theo mili giây.
cbBufSize : vùng đệm chứa thông tin dịch vụ từ lpServices.
[out]
pcbBytesNeeded : số byte cần thêm để lấy các mục dịch vụ còn sót (không
chứa đủ trong cbBufSize).
lpServicesReturned : số lượng các mục dịch vụ lấy được.
[in, out]
lpResumeHandle : handle bắt đầu của dữ liệu chứa các mục dịch vụ còn sót
lại.
Giá trị trả về:
[out]
Nếu thành công, trả về khác 0.
Nếu thất bại, trả về 0. Để biết lỗi, gọi GetLastError.
3.5.2.1.3 OpenService
Chức năng: mở một dịch vụ có sẵn.
SC_HANDLE OpenService(
SC_HANDLE hSCManager,
LPCTSTR lpServiceName,
DWORD dwDesiredAccess
132
);
Ý nghĩa tham số
[in]
hSCManager : handle của một cơ sở dữ liệu Service Control Manager được
mở. Hàm OpenSCManager trả về handle này.
lpServiceName : tên của service được mở, tên này không dài quá 256 ký tự.
Cơ sở dữ liệu Service Control Manager phân biệc chữ hoa chữ thường, nhưng so
sánh tên của các dịch vụ thì không. Các ký tự “/” và “\” đều không dùng cho tên của
dịch vụ.
dwDesiredAccess : quyền truy cập dịch vụ mong muốn.
Giá trị trả về
[out]
Nếu thành công, trả về handle của dịch vụ được mở.
Nếu thất bại, trả về NULL. Để biết lỗi, gọi GetLastError.
3.5.2.1.4 StartService
Chức năng : kích hoạt một dịch vụ.
BOOL StartService(
SC_HANDLE hService,
DWORD dwNumServiceArgs,
LPCTSTR* lpServiceArgVectors
);
Ý nghĩa tham số:
hService : handle dịch vụ đã mở bằng OpenService hay CreateService, và
phải có quyền truy cập SERVICE_START.
dwNumServiceArgs : số đối số chuỗi truyền cho dịch vụ.
lpServiceArgVectors : mảng các đối số chuỗi. Dịch vụ driver không nhận
các đối số này. Nếu không cần đối số cho dịch vụ, biến đặt là NULL.
Giá trị trả về:
133
[out]
Nếu thành công, trả về khác 0.
Nếu thất bại, trả về 0. Để biết lỗi, gọi GetLastError.
3.5.2.1.5 ControlService
Chức năng : gởi mã điều khiển đến dịch vụ.
BOOL ControlService(
SC_HANDLE hService,
DWORD dwControl,
LPSERVICE_STATUS lpServiceStatus
);
Ý nghĩa tham số:
hService : handle dịch vụ đã mở bằng OpenService hay CreateService, và
phải có quyền truy cập SERVICE_START.
dwControl : mã điều khiển.
lpServiceStatus: trỏ đến cấu trúc SERVICE_STATUS nhận thông tin tình
trạng mới nhất của dịch vụ, xem thêm 3.5.2.12 EnumServicesStatus để biết thêm
về cấu trúc.
Giá trị trả về:
[out]
Nếu thành công, trả về khác 0.
Nếu thất bại, trả về 0. Để biết lỗi, gọi GetLastError.
3.5.2.1.6 ChangeServiceConfig:
Chức năng : thay đổi các tham số cấu hình của dịch vụ.
BOOL ChangeServiceConfig(
SC_HANDLE hService,
DWORD dwServiceType,
DWORD dwStartType,
DWORD dwErrorControl,
134
LPCTSTR lpBinaryPathName,
LPCTSTR lpLoadOrderGroup,
LPDWORD lpdwTagId,
LPCTSTR lpDependencies,
LPCTSTR lpServiceStartName,
LPCTSTR lpPassword,
LPCTSTR lpDisplayName
);
Ý nghĩa tham số
[in]
hService : handle dịch vụ đã mở bằng OpenService hay CreateService
dwServiceType : loại dịch vụ, xem 3.5.2.1.2 EnumServicesStatus để biết
thêm.
dwStartType : loại trạng thái khởi động.
dwErrorControl : lỗi điều khiển, để SERVICE_NO_CHANGE nếu không
muốn thay đổi điều khiển lỗi đang có.
lpBinaryPathName : tên tập tin nhị phân thực thi của dịch vụ.
lpLoadOrderGroup : tên nhóm thứ tự nạp mà dịch vụ là thành viên.
lpdwTagId : giá trị thẻ ghi duy nhất trong nhóm nạp.
lpDependencies : dịch vụ hay nhóm các dịch vụ trong nhóm nạp cần tải
trước khi dịch vụ có thể khởi động.
lpServiceStartName : tên tài khỏan mà dịch vụ chạy.
lpPassword : mật khẩu.
lpDisplayName : tên giao tiếp của dịch vụ với các ứng dụng.
Giá trị trả về:
[out]
Nếu thành công, trả về khác 0.
Nếu thất bại, trả về 0. Để biết lỗi, gọi GetLastError.
3.5.2.1.7 CloseServiceHandle
135
Chức năng : đóng handle được mở cho cơ sở dữ liệu Service Control
Manager hay đối tượng dịch vụ.
BOOL CloseServiceHandle(
SC_HANDLE hSCObject
);
Ý nghĩa tham số:
[in]
hSCObject : handle được mở cho cơ sở dữ liệu Service Control Manager
hay đối tượng dịch vụ cần đóng.
Giá trị trả về:
[out]
Nếu thành công, trả về khác 0.
Nếu thất bại, trả về 0. Để biết lỗi, gọi GetLastError.
3.5.2.2 Cài đặt :
Dựa vào các hàm API nêu ở 3.5.1, ta sẽ thực hiện các cài đặt
3.5.2.2.1 Xem danh sách các dịch vụ :
Các công việc cần làm:
o Mở cơ sở dữ liệu SERVICES_ACTIVE_DATABASE của Service Control
Manager.
o Lấy danh sách các dịch vụ.
o Đóng cơ sở dữ liệu lại.
Hàm cài đặt
BOOL CTaskMgr::GetServiceList(ENUM_SERVICE_STATUS* &pSrvList,
DWORD& nCount)
Có lưu ý cho hàm GetServiceBufferSizeNeeded. Hàm cài đặt này
có tác dụng trả về số byte thực sự cần để lưu các thông tin về các dịch vụ.
136
Hình 3-14 Xem danh sách các dịch vụ
3.5.2.2.2 Đổi trạng thái khởi động của dịch vụ :
Thực hiện các công việc sau:
o Mở cơ sở dữ liệu Service Control Manager.
o Mở dịch vụ
o Thay đổi trạng thái khởi động là SERVICE_AUTO_START hay
SERVICE_DEMAND_START hay SERVICE_DISABLED.
o Đóng các handle lại.
Hàm cài đặt ChangeWaytoStartup
int CTaskMgr::ChangeWaytoStartup(CString sServiceName, DWORD
dwStartType)
137
Hình 3-15 Đổi trạng thái khởi động
3.5.2.2.3 Khởi động dịch vụ:
Thực hiện các công việc sau:
o Mở cơ sở dữ liệu Service Control Manager.
o Mở dịch vụ
o Khởi động dịch vụ.
o Đóng các handle lại.
Hàm cài đặt StartService
int CTaskMgr::StartService(CString sServiceName)
3.5.2.2.4 Dừng dịch vụ:
Thực hiện các công việc sau:
o Mở cơ sở dữ liệu Service Control Manager.
o Mở dịch vụ
o Dừng dịch vụ.
o Đóng các handle lại.
Hàm cài đặt StopService
int CTaskMgr::StopService(LPCTSTR sServiceName)
138
Hình 3-16 Khởi động / tắt dịch vụ
Hoàn tất yêu cầu ban đầu.
Chương 4 Các công nghệ :
Trong ba công nghệ truyền hình ảnh, âm thanh chúng em đã nghiên cứu và
trình bày trong chương này đều có những ưu và nhược điểm riêng:
RFB H323 Windows Media
Encoder (WME)
Ưu điểm Giải quyết triệt để
vấn đề quan sát màn
hình từ xa vì nghi
thức giao tiếp với
hai đầu cuối là là
vùng đệm khung cho
màn hình. Nghi thức
mã nguồn mở, hỗ trợ
đa nền.
Khả năng ứng dụng
rộng rãi trên nhiều hệ
điều hành khác nhau.
Với khả năng tích hợp
mạnh mẽ, H323 có thể
hỗ trợ nhiều công nghệ
truyền hình ảnh âm
thanh khác nhau
(H261, H263). Công
nghệ mã nguồn mở.
Là một bộ phát
triển phần mềm của
Windows, WME
tích hợp chặt chẽ
với hệ điều hành
Windows, đưa ra
các khả năng mã
hóa và giải mã âm
thanh hình ảnh theo
dòng rất hiệu quả.
Khuyết điểm Khả năng ứng dụng
các lĩnh vực khác
Các bản phát hành trên
Windows còn nhiều
Đòi hỏi tối đa việc
hỗ trợ về hệ điều
139
khá hạn chế, nghi
thức hầu như chỉ
dành riêng cho ứng
dụng điều khiển máy
tính từ xa.
hạn chế và lỗi, chưa
giải quyết triệt để việc
hỗ trợ trên Windows
(còn “bóng dáng” của
Linux trong việc biên
dịch).
hành trong việc
truyền gởi (phải là
hệ điều hành
Windows các phiên
bản mới thì hỗ trợ
hiệu quả cho
WME).
Bảng 4-1 So sánh các công nghệ nghiên cứu
Qua các sơ lược về ưu khuyết điểm trên, chúng em chọn nghi thức RFB để
thực hiện việc cài đặt, hai công nghệ còn lại chỉ dừng ở mức tìm hiểu và nghiên
cứu.
4.1 RFB
4.1.1 Giới thiệu:
RFB (“remote framebuffer”) là một nghi thức đơn giản để truy xuất đến giao
diện người dùng đồ họa. Vì nó làm việc ở mức vùng đệm khung, nghi thức
tương thích với mọi ứng dụng và hệ thống theo dạng “cửa sổ”, gồm cả X11,
Window.
Đầu cuối ở xa là nơi người dùng sử dụng (chẳng hạn màn hình kèm bàn
phím và có hay không chuột) được gọi là RFB client. Đầu cuối nơi những thay
đổi trên vùng đệm khung phát sinh (chẳng hạn các ứng dụng và hệ thống dạng
“cửa sổ”) gọi là RFB server.
140
Hình 4-1 Giới thiệu nghi thức RFB
RFB là nghi thức dành cho thin client. Điều đáng lưu ý trong thiết kế nghi
thức RFB là có rất ít yêu cầu về hệ thống cho client. Do đó, client có thể chạy
trên hầu hết các loại phần cứng khác nhau, công việc cài đặt, xây dựng client
càng đơn giản càng tốt.
Nghi thức xây dựng cho client ở dạng stateless. Nếu nghi thức ngắt kết nối từ
một server cho trước và sau đó kết nối lại với server, trạng thái của giao diện
người dùng được giữ nguyên. Hơn nữa, một đầu cuối client khác cũng có thể kết
nối vào cùng RFB server. Ở đầu cuối mới, người dùng cũng sẽ thấy chính xác
cùng một giao diện người dùng đồ họa như đầu cuối kia. Khi có kết nối mạng
thích hợp, người dùng có thể truy cập, các ứng dụng cá nhân của họ, và trạng
thái của ứng dụng đó sẽ giữ gìn giữa các truy xuất từ các vị trí khác nhau. Điều
này cung cấp cho người dùng một cách nhìn thân thiện, chuẩn mực về kiến trúc
máy tính khi họ đi đến bất cứ đâu.
4.1.2 Nghi thức xuất ra màn hình:
Phần xuất của nghi thức dựa trên nguyên tắc đồ họa đơn nhất : “in một hình
chữ nhật dữ liệu điểm ảnh (pixel) tại một vị trí x, y cho trước”. Nhìn sơ qua,
điều này có vẻ không phải là cách làm hiệu quả để vẽ nhiều thành phần giao
diện người dùng. Tuy nhiên, áp dụng nhiều thuật tóan mã hóa khác nhau cho dữ
liệu điểm ảnh lại đem đến cho chúng ta sự linh động rất cao trong việc điều
141
chỉnh các thông sô như băng thông mạng, tốc độ vẽ bên client và tốc độ xử lý
của server.
Một lọat các hình chữ nhật như tr
Các file đính kèm theo tài liệu này:
- giao_trinh_chuong_trinh_quan_ly_phong_may.pdf