// 開啟預設桌面
HDESK hDesk = OpenDesktop("Default", 0, FALSE, DESKTOP_ENUMERATE);
// 枚舉桌面上所有視窗,回調函數處理
EnumDesktopWindows(hDesk, (WNDENUMPROC)EnumWindowProc, 0);
BOOL CALLBACK EnumWindowProc(HWND hWnd, LPARAM lParam)
{
// 1. 取得視窗標題
TCHAR szTitle[256];
GetWindowText(hWnd, szTitle, 256);
// 2. 取得進程/執行緒 ID
DWORD dwPID, dwTID;
dwTID = GetWindowThreadProcessId(hWnd, &dwPID);
// 3. 判斷可見性、樣式等
if (IsWindowVisible(hWnd) && (GetWindowLong(hWnd, GWL_STYLE) & WS_VISIBLE))
; // 處理邏輯
return TRUE; // 繼續枚舉
}
服務控制管理器 (SCM) 統一管理服務與核心模式驅動。
SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
DWORD dwBytesNeeded, dwReturned, dwResume = 0;
ENUM_SERVICE_STATUS *pEnum = NULL;
DWORD dwBufSize = 0;
// 先查所需緩衝區大小
EnumServicesStatus(hSCM, SERVICE_DRIVER, SERVICE_STATE_ALL,
NULL, 0, &dwBytesNeeded, &dwReturned, &dwResume);
pEnum = (ENUM_SERVICE_STATUS*)LocalAlloc(LPTR, dwBytesNeeded);
EnumServicesStatus(hSCM, SERVICE_DRIVER, SERVICE_STATE_ALL,
pEnum, dwBufSize, &dwBytesNeeded, &dwReturned, &dwResume);
// 遍歷 pEnum[0..dwReturned-1] 取得服務名、顯示名、狀態
LocalFree(pEnum);
SC_HANDLE hSvc = OpenService(hSCM, szDriverName, SERVICE_ALL_ACCESS);
// 1. 服務配置(啟動類型、二進位路徑、錯誤控制等)
QUERY_SERVICE_CONFIG *pConfig = (QUERY_SERVICE_CONFIG*)LocalAlloc(LPTR, 8192);
QueryServiceConfig(hSvc, pConfig, 8192, &dwBytesNeeded);
// 2. 即時狀態(目前狀態、檢查點、等待提示等)
SERVICE_STATUS_PROCESS ssp;
QueryServiceStatusEx(hSvc, SC_STATUS_PROCESS_INFO,
(LPBYTE)&ssp, sizeof(ssp), &dwBytesNeeded);
// 3. 描述字串(需 Win2000+)
LPQUERY_SERVICE_CONFIG2 pDesc = (LPQUERY_SERVICE_CONFIG2)LocalAlloc(LPTR, 8192);
QueryServiceConfig2(hSvc, SERVICE_CONFIG_DESCRIPTION,
(LPBYTE)pDesc, 8192, &dwBytesNeeded);
CloseServiceHandle(hSvc);
CloseServiceHandle(hSCM);
| 常數 | 值 | 說明 |
|---|---|---|
| SERVICE_KERNEL_DRIVER | 0x00000001 | 核心模式驅動 |
| SERVICE_FILE_SYSTEM_DRIVER | 0x00000002 | 檔案系統驅動 |
| SERVICE_WIN32_OWN_PROCESS | 0x00000010 | 獨立進程服務 |
| SERVICE_WIN32_SHARE_PROCESS | 0x00000020 | 共享進程服務 |
SC_MANAGER_ALL_ACCESS 與 SERVICE_ALL_ACCESS。OpenSCManagerW、QueryServiceConfigW 等寬字元版本。OpenSCManager("\\\\RemoteHost", ...) 可管理遠端機器(需 RPC/RPCSS 服務)。SERVICE_BOOT_START(0), SERVICE_SYSTEM_START(1), SERVICE_AUTO_START(2), SERVICE_DEMAND_START(3), SERVICE_DISABLED(4)。
掌握這組 API,即可構建系統監控、驅動管理、安全審計等工具的核心資料蒐集層。