#include < Winsvc.h>CString s1 = TEXT("MyDriver1.sys"); //lpServiceNameCString s2 = TEXT("C://MyDriver1.sys");//lpPathNameBOOL CMFCapplication1Dlg::jiazaiqudong(LPCTSTR lpServiceName, LPCTSTR lpPathName)//加載驅動{ SC_HANDLE ScManagerHandle = NULL; SC_HANDLE sc_CreateHanle = NULL; ScManagerHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_access);//建立了一個連接到服務控制管理器,并打開指定的數據庫 if (NULL == ScManagerHandle) { TRACE("OpenSCManager fail"); UpdateData(FALSE); return FALSE; } sc_CreateHanle = CreateService( ScManagerHandle, lpServiceName,//用于創建登記數據庫中的關鍵字 lpServiceName,//用于用戶界面標識服務 SC_MANAGER_ALL_ACCESS,//指定服務返回類型 SERVICE_KERNEL_DRIVER,//加載類型為:驅動類型 SERVICE_DEMAND_START,//指定何時啟動服務 SERVICE_ERROR_IGNORE,//忽略異常 lpPathName,//加載驅動的路徑 NULL, NULL, NULL, NULL, NULL ); if (sc_CreateHanle == NULL) { if (ERROR_SERVICE_EXISTS == GetLastError()) { m_FilePath = "驅動已經加載"; UpdateData(FALSE); return FALSE; } sc_CreateHanle = OpenService(ScManagerHandle, lpServiceName, SC_MANAGER_ALL_ACCESS); if (sc_CreateHanle == NULL) return FALSE; } StartService(sc_CreateHanle, NULL, NULL); m_FilePath = "驅動加載成功"; UpdateData(FALSE); CloseServiceHandle(sc_CreateHanle); CloseServiceHandle(ScManagerHandle); return TRUE;}BOOL CMFCApplication1Dlg::xiezaiqudong(LPCTSTR lpServiceName)//卸載驅動程序 { 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, lpServiceName, 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:deleteSrevice() ok !/n"); } bRet = TRUE; BeforeLeave: //離開前關閉打開的句柄 if (hServiceDDK) { CloseServiceHandle(hServiceDDK); } if (hServiceMgr) { CloseServiceHandle(hServiceMgr); } return bRet; return TRUE;}
新聞熱點
疑難解答