Giáo trình Chương trình quản lý phòng máy

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

pdf234 trang | Chia sẻ: trungkhoi17 | Lượt xem: 400 | Lượt tải: 0download
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:

  • pdfgiao_trinh_chuong_trinh_quan_ly_phong_may.pdf