Windows 7 x64上的CreateService或StartService挂起

时间:2014-03-05 10:38:17

标签: windows winapi service windows-7 windows-7-x64

当我尝试使用它从服务注册新服务时,在Windows 7 x64上挂起CreateService或StartService。 在服务控制管理器中,我尝试运行的服务的状态为“正在启动”。

尝试创建和运行服务的代码:

SC_HANDLE hSCManager = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(!hSCManager)
    throw ::GetLastError();
SC_HANDLE hService = ::OpenService(hSCManager,
                                       TEXT("ProcessManager"),
                                       SERVICE_ALL_ACCESS);

if(!hService && ::GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST)
{
    hService = ::CreateService(hSCManager, TEXT("ProcessManager"),
        TEXT("ProcessManager"), SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER,
        SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, TEXT("C:\\processmanager.sys"),
        NULL, NULL, NULL, NULL, NULL);
}

if(!hService ||
    (!::StartService(hService, 0, NULL) && ::GetLastError() != ERROR_SERVICE_ALREADY_RUNNING))
{
    ::CloseServiceHandle(hSCManager);
    if(hService)
        ::CloseServiceHandle(hService);
    DWORD err = ::GetLastError();
    throw err;
}

请帮助:)

1 个答案:

答案 0 :(得分:2)

来自documentation for ServiceMain

  

请勿尝试在ServiceMain功能中启动其他服务。

  

SCM在初始化期间锁定服务控制数据库,因此如果服务在初始化期间尝试调用StartService,则调用将被阻止。当服务向SCM报告它已成功启动时,它可以调用StartService。如果服务需要运行其他服务,则服务应设置所需的依赖项。

所以,有你的问题:你的程序是死锁的,因为它在服务控制数据库被锁定时调用了StartService。 (实际上,它可能首先在CreateService调用上死锁;文档没有明确提及它,但同样的限制也适用于那里。)

在安装服务的同时安装设备驱动程序,而不是尝试从服务中安装它。