【原創】驅動加載之CreateService


  1. SC_HANDLE WINAPI CreateService(
  2. _In_ SC_HANDLE hSCManager,
  3. _In_ LPCTSTR lpServiceName,
  4. _In_opt_ LPCTSTR lpDisplayName,
  5. _In_ DWORD dwDesiredAccess,
  6. _In_ DWORD dwServiceType,
  7. _In_ DWORD dwStartType,
  8. _In_ DWORD dwErrorControl,
  9. _In_opt_ LPCTSTR lpBinaryPathName,
  10. _In_opt_ LPCTSTR lpLoadOrderGroup,
  11. _Out_opt_ LPDWORD lpdwTagId,
  12. _In_opt_ LPCTSTR lpDependencies,
  13. _In_opt_ LPCTSTR lpServiceStartName,
  14. _In_opt_ LPCTSTR lpPassword
  15. );
函數作用:創建一個服務對象,並把它添加進SCM數據庫
參數:
1. hSCManager:SCM數據庫句柄,同時該句柄需要具有SC_MANAGER_CREATE_SERVICE權限; OpenSCManager
2. lpServiceName:要安裝服務的名字, 不可超過256個字符,不能含有/和\字符,同時大小寫敏感
3.  lpDisplayName: 服務顯示出的名稱
4.  dwDesiredAccess: 對服務的權限
5. dwServiceType:服務類型
 
Value Meaning
SERVICE_ADAPTER
0x00000004

Reserved.

SERVICE_FILE_SYSTEM_DRIVER
0x00000002

File system driver service.

SERVICE_KERNEL_DRIVER
0x00000001

Driver service.

SERVICE_RECOGNIZER_DRIVER
0x00000008

Reserved.

SERVICE_WIN32_OWN_PROCESS
0x00000010

Service that runs in its own process.

SERVICE_WIN32_SHARE_PROCESS
0x00000020

Service that shares a process with one or more other services. For more information, see Service Programs.


如果指定了  SERVICE_WIN32_OWN_PROCESS 或  SERVICE _WIN32_SHARE_PROCESS ,並且服務運行在LocalSystem上下文,你也可以指定下面的值:
Value Meaning
SERVICE_INTERACTIVE_PROCESS
0x00000100

The service can interact with the desktop.

For more information, see Interactive Services.

6. dwStartType:服務啟動選項
Value Meaning
SERVICE_AUTO_START
0x00000002

A service started automatically by the service control manager during system startup. For more information, see Automatically Starting Services.

(在系統啟動的時候,由SCM自動運行服務)

SERVICE_BOOT_START
0x00000000

A device driver started by the system loader. This value is valid only for driver services.

(系統引導程序自動運行服務,只對driver services有效

SERVICE_DEMAND_START
0x00000003

A service started by the service control manager when a process calls the StartService function. For more information, see Starting Services on Demand.

(當一個程序調用StartService函數時,SCM啟動服務

SERVICE_DISABLED
0x00000004

A service that cannot be started. Attempts to start the service result in the error code ERROR_SERVICE_DISABLED.

(一個不能啟動的服務,嘗試啟動它時,會產生ERROR_SERVICE_DISABLED

SERVICE_SYSTEM_START
0x00000001

A device driver started by the IoInitSystem function. This value is valid only for driver services.

(一個由 IoInitSystem函數啟動的服務

 
7. dwErrorControl :服務錯誤處理方式
Value Meaning
SERVICE_ERROR_CRITICAL
0x00000003

The startup program logs the error in the event log, if possible. If the last-known-good configuration is being started, the startup operation fails. Otherwise, the system is restarted with the last-known good configuration.

SERVICE_ERROR_IGNORE
0x00000000

The startup program ignores the error and continues the startup operation.

SERVICE_ERROR_NORMAL
0x00000001

The startup program logs the error in the event log but continues the startup operation.

SERVICE_ERROR_SEVERE
0x00000002

The startup program logs the error in the event log. If the last-known-good configuration is being started, the startup operation continues. Otherwise, the system is restarted with the last-known-good configuration.

8. lpBinaryPathName:服務程序路徑
驅動程序的完整路徑,如果路徑包含有空格,那么路徑必須加引號,如 "d:\\my share\\myservice.exe"應該為 "\"d:\\my share\\myservice.exe\"";
對於一個自動啟動的服務,路徑能夠帶有啟動參數,比如 "d:\\myshare\\myservice.exe arg1 arg2",這些參數被傳遞給服務入口(比如main函數);
 
如果另一台計算機上指定一個路徑,共享必須可以訪問由本地計算機的計算機帳戶,因為這是在遠程調用中使用的安全上下文。 但是,這項規定會影響本地計算機遠程計算機中允許任何潛在的漏洞。 因此,最好使用一個本地文件。 
 
9. lpLoadOrderGroup:
在加載順序此服務所屬的組的名稱。 指定 NULL 或空字符串,如果該服務不屬於組。 啟動程序使用加載順序組加載服務相對於其他組的指定順序組。 加載順序組列表包含在下面的注冊表值:[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ServiceGroupOrder]
 
10. lpdwTagId
指向接收 lpLoadOrderGroup 參數中指定的組中唯一的標記值的變量。 如果不更改現有的標簽,請指定 NULL。訂購服務啟動一個加載順序通過在以下注冊表值中指定標記順序矢量的組中,您可以使用的標記:[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\GroupOrderList]。標記只能用於具有 SERVICE_BOOT_START 或啟動類型的 SERVICE_SYSTEM_START 驅動程序服務。
 
11.  lpDependencies
空分隔名稱的服務或加載順序組系統必須在這個服務開始之前的雙空終止數組的指針。 如果服務沒有任何依賴關系,請指定為 NULL 或空字符串。 一組依賴意味着如果至少一個組的成員運行后試圖啟動組的所有成員,可以運行此服務。當需要區分各服務由於服務和服務組共享相同的命名空間前綴與 SC_GROUP_IDENTIFIER 的組名時必須加上此參數。
 
12. lpServiceStartName
該服務應在其下運行的帳戶的名稱。 如果SERVICE_WIN32_OWN_PROCESS 服務類型DomainNameUserName窗體中使用一個帳戶名。 服務進程將被作為此用戶登錄。 如果該帳戶屬於內置域,您可以指定.UserName。
如果為NULL此參數CreateService使用LocalSystem帳戶。 如果服務類型指定 SERVICE_INTERACTIVE_PROCESS,該服務必須運行在LocalSystem帳戶。
如果NTAUTHORITYLocalService此參數CreateService使用LocalService帳戶。 如果NTAUTHORITYNetworkService參數CreateService使用NetworkService帳戶。
共享的處理可以運行於任何用戶。
如果服務類型 SERVICE_KERNEL_DRIVER 或 SERVICE_FILE_SYSTEM_DRIVER 名稱是系統用來加載設備驅動程序的驅動程序對象名稱。 如果該驅動程序將使用由IO系統創建的默認對象名稱,請指定NULL。
可以將服務配置為使用一個托管的帳戶或虛擬帳戶。 如果該服務被配置為使用一個托管的服務帳戶,名稱是托管的服務帳戶名稱。 如果該服務被配置為使用一個虛擬帳戶,作為NTSERVICEServiceName指定名稱。 有關托管的服務帳戶和虛擬帳戶的詳細信息請參閱服務帳戶的分步指南。
WindowsServer2008、WindowsVista、WindowsServer2003 和WindowsXP2000:Windows7 和WindowsServer2008 R2 之前不支持托管的服務帳戶和虛擬帳戶。
 
13. lpPassword
由lpServiceStartName參數指定的帳戶名的密碼。 如果該帳戶沒有密碼,或者如果在LocalService,NetworkService或LocalSystem帳戶中運行該服務,請指定一個空字符串。 更多的信息請參閱服務記錄列表。
如果托管的服務帳戶或虛擬帳戶名稱的名稱由lpServiceStartName參數指定的帳戶名稱lpPassword參數必須為NULL。
密碼將被忽略,對驅動程序服務。
 
返回值
如果函數成功,返回值將是該服務的句柄。
如果函數失敗,則返回值為 NULL。 若要擴展的錯誤了解調用GetLastError。
下面的錯誤代碼可以由服務控制管理器設置。 其他錯誤代碼可以設置的由服務控制管理器調用注冊表函數。
 
返回值
描述
ERROR_ACCESS_DENIED
提供的hSCManager參數沒有SC_MANAGER_CREATE_SERVICE權限。
ERROR_CIRCULAR_DEPENDENCY
存在循環嵌套的服務依賴關系。
ERROR_DUPLICATE_SERVICE_NAME
顯示名稱已在SCM中被其他服務注冊為服務名稱或顯示名稱。
ERROR_INVALID_HANDLE
提供的hSCManager參數無效。
ERROR_INVALID_NAME
提供的服務名稱無效。
ERROR_INVALID_PARAMETER
其他參數無效。
ERROR_INVALID_SERVICE_ACCOUNT
lpServiceStartName參數指定的用戶名不存在。
ERROR_SERVICE_EXISTS
已存在完全相同的服務。
 
說明:
(1)CreateService函數創建一個服務對象並將其安裝在SCM數據庫中,同時在注冊表以下位置中創建同名鍵值:[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services]
由CreateService、ChangeServiceConfig和ChangeServiceConfig2等函數創建服務時提供的服務相關信息就存放於這個鍵值中。以下是一些鍵值的描述:
描述
DependOnGroup
lpDependencies參數指定的依賴性服務群組,包含加載順序。
DependOnService
lpDependencies參數指定的依賴性服務。
Description
ChangeServiceConfig2函數寫入的描述信息。
DisplayName
由l pDisplayName參數指定的服務顯示名稱。
ErrorControl
dwErrorControl參數指定的糾錯方案。
FailureActions
ChangeServiceConfig2函數寫入的異常信息。
Group
lpLoadOrderGroup參數指定的服務群組,包含加載順序。
ImagePath
lpBinaryPathName參數指定的服務程序文件位置。
ObjectName
lpServiceStartName參數指定的名稱。
Start
dwStartType參數指定的服務啟動時間。
Tag
lpdwTagId參數指定的識別信息。
Type
dwServiceType參數指定的服務類型。
服務安裝程序可以創建子鍵來提供更多額外的信息。
(2)CreateService函數返回的句柄只能由調用它的進程使用,可以調用CloseServiceHandle函數來關掉這個句柄。若創建進程共享服務,請不要隨意調用可能影響其他進程的函數,如ExitProcess。另外,請不要卸載服務程序的動態鏈接庫(DLL文件)。

本文鏈接:http://www.cnblogs.com/cposture/p/4717479.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM