#include <windows.h> #include <winsvc.h> #include <conio.h> #include <stdio.h> #define DRIVER_NAME "123467" #define DRIVER_PATH "..\\HelloDDK.sys" //裝載NT驅動程序 BOOL LoadNTDriver(char* lpszDriverName,char* lpszDriverPath) { /************************ 加載NT驅動的代碼******************************* ① 調用OpenSCManager,打開SCM管理器.若是返回NULL,則返回失敗,不然繼續 ② 調用CreateService,建立服務,建立成功則轉步驟 ⑥ ③ 用GetLastError的獲得錯誤返回值 ④ 返回值爲ERROR_IO_PENDING,說明服務已經建立過,用OpenService打開此服務. ⑤ 返回值爲其餘值, 建立武服務失敗,返回失敗. ⑥ 調用StartService開啓服務 ⑦ 成功返回 ************************************************************************/ 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 ); if( hServiceMgr == NULL ) { // OpenSCManager失敗 printf( "OpenSCManager() Faild %d ! \n", GetLastError() ); bRet = FALSE; goto BeforeLeave; } else { // OpenSCManager成功 printf( "OpenSCManager() ok ! \n" ); } //建立驅動所對應的服務 hServiceDDK = CreateService( hServiceMgr, lpszDriverName, // 驅動程序的在註冊表中的名字 lpszDriverName, // 註冊表驅動程序的 DisplayName 值 SERVICE_ALL_ACCESS, // 加載驅動程序的訪問權限 SERVICE_KERNEL_DRIVER, // 表示加載的服務是驅動程序 SERVICE_DEMAND_START, // 註冊表驅動程序的 Start 值 SERVICE_ERROR_IGNORE, // 註冊表驅動程序的 ErrorControl 值 szDriverImagePath, // 註冊表驅動程序的 ImagePath 值 NULL, NULL, NULL, NULL, NULL); DWORD dwRtn; // 判斷服務是否失敗 if( hServiceDDK == NULL ) { dwRtn = GetLastError(); if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS ) { //因爲其餘緣由建立服務失敗 printf( "CrateService() Faild %d ! \n", dwRtn ); bRet = FALSE; goto BeforeLeave; } else { //服務建立失敗,是因爲服務已經創立過 printf( "CrateService() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! \n" ); } // 驅動程序已經加載,只須要打開 hServiceDDK = OpenService( hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS ); if( hServiceDDK == NULL ) { // 若是打開服務也失敗,則意味錯誤 dwRtn = GetLastError(); printf( "OpenService() Faild %d ! \n", dwRtn ); bRet = FALSE; goto BeforeLeave; } else { printf( "OpenService() ok ! \n" ); } } else { printf( "CrateService() ok ! \n" ); } // 開啓此項服務 bRet= StartService( hServiceDDK, NULL, NULL ); if( !bRet ) { DWORD dwRtn = GetLastError(); if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING ) { printf( "StartService() Faild %d ! \n", dwRtn ); bRet = FALSE; goto BeforeLeave; } else { if( dwRtn == ERROR_IO_PENDING ) { // 設備被掛住 printf( "StartService() Faild ERROR_IO_PENDING ! \n"); bRet = FALSE; goto BeforeLeave; } else { // 服務已經開啓 printf( "StartService() Faild ERROR_SERVICE_ALREADY_RUNNING ! \n"); bRet = TRUE; goto BeforeLeave; } } } bRet = TRUE; // 離開前關閉句柄 BeforeLeave: if(hServiceDDK) { CloseServiceHandle(hServiceDDK); // 服務句柄 } if(hServiceMgr) { CloseServiceHandle(hServiceMgr); // SCM句柄 } return bRet; } // 卸載驅動程序 BOOL UnloadNTDriver( char * szSvrName ) { /************************* 卸載NT驅動的代碼****************************** ① 調用OpenSCManager,打開SCM管理器,若是返回NULL,則返回失敗,不然繼續. ② 調用OpenService.若是返回NULL,則返回失敗,不然繼續 ③ 調用DeleteService卸載此項服務. ④ 成功返回. ************************************************************************/ BOOL bRet = FALSE; SC_HANDLE hServiceMgr=NULL;// SCM管理器的句柄 SC_HANDLE hServiceDDK=NULL;// NT驅動程序的服務句柄 SERVICE_STATUS SvrSta; // 打開SCM管理器 hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); if( hServiceMgr == NULL ) { // 打開SCM管理器失敗 printf( "OpenSCManager() Faild %d ! \n", GetLastError() ); bRet = FALSE; goto BeforeLeave; } else { // 打開SCM管理器失敗成功 printf( "OpenSCManager() ok ! \n" ); } // 打開驅動所對應的服務 hServiceDDK = OpenService( hServiceMgr, szSvrName, SERVICE_ALL_ACCESS ); if( hServiceDDK == NULL ) { // 打開驅動所對應的服務失敗 printf( "OpenService() Faild %d ! \n", GetLastError() ); bRet = FALSE; goto BeforeLeave; } else { printf( "OpenService() ok ! \n" ); } // 中止驅動程序,若是中止失敗,只有從新啓動才能,再動態加載。 if( !ControlService( hServiceDDK, SERVICE_CONTROL_STOP , &SvrSta ) ) { printf( "ControlService() Faild %d !\n", GetLastError() ); } else { // 打開驅動所對應的失敗 printf( "ControlService() ok !\n" ); } // 動態卸載驅動程序。 if( !DeleteService( hServiceDDK ) ) { // 卸載失敗 printf( "DeleteSrevice() Faild %d !\n", GetLastError() ); } else { // 卸載成功 printf( "DelServer:eleteSrevice() ok !\n" ); } bRet = TRUE; BeforeLeave: // 離開前關閉打開的句柄 if(hServiceDDK) { CloseServiceHandle(hServiceDDK); // 服務句柄 } if(hServiceMgr) { CloseServiceHandle(hServiceMgr); // SCM 句柄 } return bRet; } void TestDriver() { // 測試驅動程序 HANDLE hDevice = CreateFile("\\\\.\\HelloDDK", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); if( hDevice != INVALID_HANDLE_VALUE ) { MessageBox(NULL,"SUCESSFULLY....ComeOn...","Yes",0); printf( "Create Device ok ! \n" ); } else { printf( "Create Device faild %d ! \n", GetLastError() ); MessageBox(NULL,"Faild...Fuckking...","No",0); } CloseHandle( hDevice ); } int main(int argc, char* argv[]) { UnloadNTDriver(DRIVER_NAME); // 加載驅動 BOOL bRet = LoadNTDriver(DRIVER_NAME,DRIVER_PATH); if (!bRet) { printf("LoadNTDriver error\n"); return 0; } // 加載成功 printf( "press any to create device!\n" ); getch(); TestDriver(); // 這時候你能夠經過註冊表,或其餘查看符號鏈接的軟件驗證。 printf( "press any to unload the driver!\n" ); getch(); // 卸載驅動 UnloadNTDriver(DRIVER_NAME); // if (!bRet) // { // printf("UnloadNTDriver error\n"); // return 0; // } system("pause"); return 0; }