2014-03-05 98 views
0

CreateService或StartService掛在Windows 7 x64上,當我嘗試使用它來註冊服務的新服務時。 在服務控制管理器中,我嘗試運行的服務的狀態爲「正在啓動」。試圖創建和運行服務CreateService或StartService在Windows 7上掛起x64

代碼:

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; 
} 

請幫助:)

+0

很樂意提供幫助,但信息不足。 –

+0

這是試圖運行服務的代碼: – palmer

+0

那麼,什麼是'C:\\ processmanager.sys'?我相信Q中的代碼運行得更高。它到達的代碼有多遠?它掛在'CreateService'中? –

回答

2

documentation for ServiceMain

不要試圖在ServiceMain函數啓動另一個服務。

的SCM初始化期間鎖定服務控制數據庫,因此,如果一個服務嘗試初始化期間調用StartService,調用將阻塞。當服務向SCM報告它已成功啓動時,它可以調用StartService。如果服務需要運行其他服務,則該服務應設置所需的依賴關係。

因此,有你的問題:你的程序死鎖,因爲它是調用StartService在服務控制數據庫被鎖定。 (實際上,它可能首先在CreateService呼叫上發生死鎖;文檔沒有明確提及它,但同樣的限制也適用於此)。

在安裝服務的同時安裝設備驅動程序,而比試圖從您的服務安裝它。