轉自:http://laokaddk.blog.51cto.com/368606/411887
以服務的方式,動态加載驅動
以後就是兩個實作這兩個功能的函數.
//=================================================================
//函數名:StopDriver
//功能: 暫停驅動
//參數:
// IN strDriverName 驅動名
// IN strServiceName 服務名
//傳回值:
// TRUE 成功
// FALSE 失敗
//=================================================================
BOOL StopDriver(IN LPCSTR strDriverName,
IN LPCSTR strServiceName)
{
SC_HANDLE hMangerHandle = NULL;
SC_HANDLE hCreateServiceHandle = NULL;
SC_HANDLE hOpenServiceHandle = NULL;
SERVICE_STATUS sStatus ;
DWORD dwErrCode = 0;
BOOL bRet = TRUE;
do
{
//1.打開服務控制管理器
hMangerHandle = ::OpenSCManager(NULL,
NULL,
SC_MANAGER_ALL_ACCESS);
if(!hMangerHandle)
{
bRet = FALSE;
break;
}
//2. 打開service
hOpenServiceHandle = OpenService(hMangerHandle, strServiceName,
SERVICE_START | DELETE | SERVICE_STOP);
if (!hOpenServiceHandle)
{
dwErrCode = ::GetLastError();
bRet = FALSE;
break;
}
//4.啟動服務程式
bRet = ControlService(hOpenServiceHandle, SERVICE_CONTROL_STOP, &sStatus);
if (!bRet)
{
bRet = FALSE;
break;
}
//删除服務
bRet = DeleteService(hOpenServiceHandle);
} while (0);
if (hOpenServiceHandle)
{
CloseServiceHandle(hOpenServiceHandle);
hOpenServiceHandle = NULL;
}
if (hCreateServiceHandle)
{
CloseServiceHandle(hCreateServiceHandle);
hCreateServiceHandle = NULL;
}
if (hMangerHandle)
{
CloseServiceHandle(hMangerHandle);
hMangerHandle = NULL;
}
return bRet;
}
//加載驅動
//=================================================================
//函數名:StartDriver
//功能: 以服務的方式啟動驅動
//參數:
// IN strDriverName 驅動名
// IN strServiceName 服務名
// IN strDriverFilePath 檔案路徑
//傳回值:
// TRUE 成功
// FALSE 失敗
//=================================================================
BOOL StartDriver(IN LPCSTR strDriverName,
IN LPCSTR strServiceName,
IN LPCSTR strDriverFilePath)
{
SC_HANDLE hMangerHandle = NULL;
SC_HANDLE hCreateServiceHandle = NULL;
SC_HANDLE hOpenServiceHandle = NULL;
SERVICE_STATUS sStatus ;
DWORD dwErrCode = 0;
BOOL bRet = TRUE;
do
{
//1.打開服務控制管理器
hMangerHandle = ::OpenSCManager(NULL,
NULL,
SC_MANAGER_ALL_ACCESS);
if(!hMangerHandle)
{
bRet = FALSE;
break;
}
//2. 建立service
hCreateServiceHandle = CreateService(hMangerHandle,
strServiceName,
strDriverName,
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,//SERVICE_FILE_SYSTEM_DRIVER
SERVICE_DEMAND_START,
SERVICE_ERROR_IGNORE,
strDriverFilePath,
NULL,
NULL,
NULL,
NULL,
NULL);
if (!hCreateServiceHandle)
{
dwErrCode = ::GetLastError();
if (ERROR_SERVICE_EXISTS != dwErrCode)
{
bRet = FALSE;
break;
}
}
//3. 打開service
hOpenServiceHandle = OpenService(hMangerHandle, strServiceName,
SERVICE_START | DELETE | SERVICE_STOP);
if (!hOpenServiceHandle)
{
dwErrCode = ::GetLastError();
bRet = FALSE;
break;
}
//4.啟動服務程式
bRet = StartService(hOpenServiceHandle,NULL, NULL);
if (FALSE == bRet)
{
dwErrCode = ::GetLastError();
bRet = FALSE;
break;
}
} while (0);
if (hOpenServiceHandle)
{
CloseServiceHandle(hOpenServiceHandle);
hOpenServiceHandle = NULL;
}
if (hCreateServiceHandle)
{
CloseServiceHandle(hCreateServiceHandle);
hCreateServiceHandle = NULL;
}
if (hMangerHandle)
{
CloseServiceHandle(hMangerHandle);
hMangerHandle = NULL;
}
return bRet;
}