您的位置:首页 > 其它

学习自建调试体系(三)

2016-04-20 19:27 537 查看
这部分是讲释放在OD插件中的资源文件,也就是一个驱动,然后安装驱动、卸载驱动的过程。主要关注点放在安装、卸载者部分代码上。

安装、启动服务

总结大致步骤如下:

获得服务控制管理器句柄(OpenSCManager)

获得服务句柄(CreateService)

如果CreateService失败,使用OpenService再次获得服务句柄

StartService

//
// 安装服务
//
BOOL DbgObjInstallService(
const wchar_t *SzPath,      //驱动路径
const wchar_t *SzName)      //服务名称
{
BOOL bRet = FALSE;
DWORD dwLastError;
SC_HANDLE hSCManager;
SC_HANDLE hService = NULL;

// 获得服务控制管理器句柄
if (hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS))
{
//获得服务句柄
hService = CreateService(
hSCManager, SzName,
SzName, SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START,
SERVICE_ERROR_IGNORE, SzPath,
NULL, NULL, NULL, NULL, NULL
);

if (hService == NULL)
{
//再次获得服务句柄
hService = OpenService(hSCManager, SzName, SERVICE_ALL_ACCESS);

if (!hService)
{
CloseServiceHandle(hSCManager);
return FALSE;
}

}
//开启服务
bRet = StartService(hService, 0, NULL);
if (!bRet)
{
dwLastError = GetLastError();
}
}

if (hService)
{
CloseServiceHandle(hService);
}

if (hSCManager)
{
CloseServiceHandle(hSCManager);
}

return bRet;
}

卸载服务

//
// 卸载服务 参数:服务名称
//
BOOL DbgObjUnInstallService(wchar_t* SzServiceName)
{
BOOL bRet = FALSE;
SC_HANDLE hServiceMgr = NULL;
SC_HANDLE hServiceDDK = NULL;
SERVICE_STATUS SvrSta;

do
{
//
// 打开SCM管理器
//
hServiceMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

if (hServiceMgr == NULL)
{
break;
}

//
// 打开驱动所对应的服务
//
hServiceDDK = OpenService(hServiceMgr, SzServiceName, SERVICE_ALL_ACCESS);

if (hServiceDDK == NULL)
{
break;
}
//
// 关闭驱动所对应的服务
//
ControlService(hServiceDDK, SERVICE_CONTROL_STOP, &SvrSta);

if (DeleteService(hServiceDDK))
{
bRet = TRUE;
}

} while (FALSE);        //while FALSE 是个什么鬼?

if (hServiceDDK)
{
CloseServiceHandle(hServiceDDK);
}

if (hServiceMgr)
{
CloseServiceHandle(hServiceMgr);
}

return bRet;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: