编程打开Windows服务控制管理器
假設要自己編程來加載Windows下后綴為.sys的驅動程序;首先要使用?OpenSCManager 函數打開Windows服務控制管理器;
下面先來調用此函數看一下會不會打開成功;代碼如下;
#include <windows.h> #include <winsvc.h> #include <conio.h> #include <stdio.h> #define DRIVER_NAME "HelloDriver" #define DRIVER_PATH "..//MyDriver//HelloDriver.sys" int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) {/* TODO: Place code here.*/PVOID lpMsgBuf; char szBuffer[100];char szDriverImagePath[256]; //得到完整的驅動路徑 //GetFullPathName(lpszDriverPath, 256, szDriverImagePath, NULL); BOOL bRet = FALSE; SC_HANDLE hServiceMgr=NULL;//SCM管理器的句柄 SC_HANDLE hServiceDDK=NULL;//NT驅動程序的服務句柄 //打開服務控制管理器 //hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); hServiceMgr = OpenSCManager( NULL, "abc", SC_MANAGER_ALL_ACCESS); if( hServiceMgr == NULL ) { //OpenSCManager失敗 if (FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(), // 錯誤代碼MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf,0,NULL)){MessageBox(NULL, (LPCTSTR)lpMsgBuf, TEXT("打開服務控制管理器失敗"), MB_OK);}} else { wsprintf(szBuffer, "0x%08x",hServiceMgr);MessageBox(NULL,szBuffer,TEXT("開服務控制管理器,句柄:"),0);} LocalFree(lpMsgBuf); return 0; }? ? 打開成功,則顯示打開的句柄;打開失敗,顯示格式化錯誤消息;使用Dev C++;
打開成功如下;
?
OpenSCManager 函數描述如下;
SC_HANDLE WINAPI OpenSCManager(
_In_opt_ LPCTSTR lpMachineName,
_In_opt_ LPCTSTR lpDatabaseName,
_In_ DWORD dwDesiredAccess
);
函數作用:以一定的權限,在指定的計算機打開指定的SCM數據庫;
參數:
1. lpMachineName:目標計算機名,NULL表示本地計算機
2. lpDatabaseName:服務管理程序系統組件數據庫,可以設為SERVICES_ACTIVE_DATABASE,如果為NULL,表示默認打開SERVICES_ACTIVE_DATABASE數據庫
3. dwDesiredAccess:對SCM的權限,可以是以下:
Access right?? ?Description
SC_MANAGER_ALL_ACCESS (0xF003F)?? ?Includes STANDARD_RIGHTS_REQUIRED, in addition to all access rights in this table.
SC_MANAGER_CREATE_SERVICE (0x0002)?? ?Required to call the CreateService function to create a service object and add it to the database.
SC_MANAGER_CONNECT (0x0001)?? ?Required to connect to the service control manager.
SC_MANAGER_ENUMERATE_SERVICE (0x0004)?? ?SC_MANAGER_LOCK (0x0008)?? ?Required to call the LockServiceDatabase function to acquire a lock on the database.
SC_MANAGER_MODIFY_BOOT_CONFIG (0x0020)?? ?Required to call the NotifyBootConfigStatus function.
SC_MANAGER_QUERY_LOCK_STATUS (0x0010)?? ?Required to call the QueryServiceLockStatus function to retrieve the lock status information for the database.
第二個參數是數據庫名;如果隨便給個"abc",則打開失敗如下;
?
總結
以上是生活随笔為你收集整理的编程打开Windows服务控制管理器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ const char* 学习
- 下一篇: windows令牌学习