#include < Winsvc.h>CString s1 = TEXT("MyDriver1.sys"); //lpServiceNameCString s2 = TEXT("C://MyDriver1.sys");//lpPathNameBOOL CMFCapplication1Dlg::jiazaiqudong(LPCTSTR lpServiceName, LPCTSTR lpPathName)//加載驅(qū)動{ SC_HANDLE ScManagerHandle = NULL; SC_HANDLE sc_CreateHanle = NULL; ScManagerHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_access);//建立了一個連接到服務(wù)控制管理器,并打開指定的數(shù)據(jù)庫 if (NULL == ScManagerHandle) { TRACE("OpenSCManager fail"); UpdateData(FALSE); return FALSE; } sc_CreateHanle = CreateService( ScManagerHandle, lpServiceName,//用于創(chuàng)建登記數(shù)據(jù)庫中的關(guān)鍵字 lpServiceName,//用于用戶界面標(biāo)識服務(wù) SC_MANAGER_ALL_ACCESS,//指定服務(wù)返回類型 SERVICE_KERNEL_DRIVER,//加載類型為:驅(qū)動類型 SERVICE_DEMAND_START,//指定何時啟動服務(wù) SERVICE_ERROR_IGNORE,//忽略異常 lpPathName,//加載驅(qū)動的路徑 NULL, NULL, NULL, NULL, NULL ); if (sc_CreateHanle == NULL) { if (ERROR_SERVICE_EXISTS == GetLastError()) { m_FilePath = "驅(qū)動已經(jīng)加載"; 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 = "驅(qū)動加載成功"; UpdateData(FALSE); CloseServiceHandle(sc_CreateHanle); CloseServiceHandle(ScManagerHandle); return TRUE;}BOOL CMFCApplication1Dlg::xiezaiqudong(LPCTSTR lpServiceName)//卸載驅(qū)動程序 { BOOL bRet = FALSE; SC_HANDLE hServiceMgr = NULL;//SCM管理器的句柄 SC_HANDLE hServiceDDK = NULL;//NT驅(qū)動程序的服務(wù)句柄 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"); } //打開驅(qū)動所對應(yīng)的服務(wù) hServiceDDK = OpenService(hServiceMgr, lpServiceName, SERVICE_ALL_ACCESS); if (hServiceDDK == NULL) { //打開驅(qū)動所對應(yīng)的服務(wù)失敗 printf("OpenService() Faild %d ! /n", GetLastError()); bRet = FALSE; goto BeforeLeave; } else { printf("OpenService() ok ! /n"); } //停止驅(qū)動程序,如果停止失敗,只有重新啟動才能,再動態(tài)加載。 if (!ControlService(hServiceDDK, SERVICE_CONTROL_STOP, &SvrSta)) { printf("ControlService() Faild %d !/n", GetLastError()); } else { //打開驅(qū)動所對應(yīng)的失敗 printf("ControlService() ok !/n"); } //動態(tài)卸載驅(qū)動程序。 if (!DeleteService(hServiceDDK)) { //卸載失敗 printf("DeleteSrevice() Faild %d !/n", GetLastError()); } else { //卸載成功 printf("DelServer:deleteSrevice() ok !/n"); } bRet = TRUE; BeforeLeave: //離開前關(guān)閉打開的句柄 if (hServiceDDK) { CloseServiceHandle(hServiceDDK); } if (hServiceMgr) { CloseServiceHandle(hServiceMgr); } return bRet; return TRUE;}
新聞熱點
疑難解答