//需要包含的頭文件 #include "winsvc.h"
//====================全局變量 SC_HANDLE m_ScmHandle; SC_HANDLE m_HerService;
/*函數功能*/ ----第一步
//打開SCM管理器 (獲取SCM句柄) - OpenSCManagerA //創建驅動服務 (獲得服務句柄,如果服務存在,此步則變成打開服務) CreateServiceA BOOL MyLoadDriver(PCHAR SzSysFileName,PCHAR SzSysFilePath) { m_ScmHandle = NULL; m_HerService = NULL; //打開SCM管理器 (獲取SCM句柄) - OpenSCManagerA m_ScmHandle = OpenSCManagerA(NULL,NULL,SC_MANAGER_ALL_ACCESS); if (m_ScmHandle == NULL) { AfxMessageBox("OpenSCManagerA ERROR"); m_loadAddDriverError = GetLastError(); return FALSE; } m_HerService = CreateServiceA(m_ScmHandle,SzSysFileName,SzSysFileName,SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,SzSysFilePath,NULL,NULL,NULL,NULL,NULL); if (m_HerService == NULL) { m_loadAddDriverError = GetLastError(); if ( m_loadAddDriverError == ERROR_SERVICE_EXISTS) { m_HerService = OpenService(m_ScmHandle,SzSysFileName,SERVICE_ALL_ACCESS); if (m_HerService == NULL) { CloseServiceHandle(m_ScmHandle); return FALSE; } }else { CloseServiceHandle(m_ScmHandle); return FALSE; } } return TRUE; }
// 名稱:StartDriver // 功能:開啟服務,輸出到程序 // BOOL CProcessDlg::StartDriver(void) { if (m_HerService == NULL) { AfxMessageBox("m_HerService [Null Handle]"); return FALSE; } if (!StartService(m_HerService,NULL,NULL)) { m_loadAddDriverError = GetLastError(); CString Str; Str.Format("Error:%d\n",m_loadAddDriverError); m_outputdrivertext.SetWindowTextA(Str); return FALSE; } m_outputdrivertext.SetWindowTextA("Start Success"); return 0; }
// 關閉驅動服務 BOOL CProcessDlg::StopSerVice(void) { SERVICE_STATUS ss; if (!ControlService(m_HerService,SERVICE_CONTROL_STOP,&ss)) { m_loadAddDriverError = GetLastError(); m_outputdrivertext.SetWindowTextA("停止服務失敗!"); } m_outputdrivertext.SetWindowTextA("Stop Success"); return 0; }
//最后在來一個卸載 BOOL CProcessDlg::Remove(void) { CloseServiceHandle(m_HerService); if (!DeleteService(m_HerService)) { m_loadAddDriverError = GetLastError(); m_outputdrivertext.SetWindowTextA("驅動卸載失敗!"); } m_outputdrivertext.SetWindowTextA("Delete Success"); return 0; }
驅動加載主要流程 //打開SCM管理器 (獲取SCM句柄) - OpenSCManagerA //創建驅動服務 (獲得服務句柄,如果服務存在,此步則變成打開服務)CreateServiceA //啟動服務 - StartServiceA //停止服務 - ControlService //卸載服務 - DeleteService //關閉服務 //關閉服務句柄