//需要包含的頭文件
#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
//關閉服務
//關閉服務句柄