转自: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;
}