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
由lpDisplayName参数指定的服务显示名称。
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

【原创】驱动加载之CreateService的更多相关文章

  1. 老调重弹:JDBC系列之<驱动加载原理全面解析) ----转

      最近在研究Mybatis框架,由于该框架基于JDBC,想要很好地理解和学习Mybatis,必须要对JDBC有较深入的了解.所以便把JDBC 这个东东翻出来,好好总结一番,作为自己的笔记,也是给读者 ...

  2. (DT系列四)驱动加载中, 如何取得device tree中的属性

    本文以At91rm9200平台为例,从源码实现的角度来分析驱动加载时,Device tree的属性是如何取得的.一:系统级初始化DT_MACHINE_START 主要是定义"struct m ...

  3. 【转】(DT系列四)驱动加载中, 如何取得device tree中的属性

    原文网址:http://www.cnblogs.com/biglucky/p/4057488.html 本文以At91rm9200平台为例,从源码实现的角度来分析驱动加载时,Device tree的属 ...

  4. linux设备和驱动加载的先后顺序

    点击打开链接 Linux驱动先注册总线,总线上可以先挂device,也可以先挂driver,那么究竟怎么控制先后的顺序呢. Linux系统使用两种方式去加载系统中的模块:动态和静态. 静态加载:将所有 ...

  5. 如何调整Linux内核启动中的驱动初始化顺序-驱动加载优先级

    Linux内核为不同驱动的加载顺序对应不同的优先级,定义了一些宏: include\linux\init.h #define pure_initcall(fn) __define_initcall(& ...

  6. 关于Eclipse在servlet中连接数据库时出现驱动加载失败的解决

    问题:在队友发来的项目中想将他获取到的数据通过数据库储存,出现驱动加载失败问题 解决:首先百度了下相关情况,大多数都是说下载mysql-connector-java-5.1.39-bin.jar包,然 ...

  7. 【ESXI6.0】 ESXI6.0安装时无法安装网卡驱动的解决方法及将网卡驱动加载进ISO

    http://blog.163.com/xifanliang@yeah/blog/static/115078488201571584321787/ 若安装时提示如下图所示 之后安装无法完成,会提示没有 ...

  8. Windows 驱动加载程序代码

    #include <windows.h> #include <winsvc.h> #include <conio.h> #include <stdio.h&g ...

  9. jdbc数据库连接过程及驱动加载与设计模式详解

    首先要导入JDBC的jar包:接下来,代码:Class.forName(xxx.xx.xx)返回的是一个类 Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类, 也就 ...

随机推荐

  1. 将n个东西分成n1,n2,n3,n4,....nr 共 r组分给r个人有多少种分法。

    (n!/(n1! *n2! *n3!..nr!) )   * r!/( 同数量组A的数量! 同数量组B的数量!....) 比方20个东西分成2,2,,2,2   3,3,3,3 8组分给8个人有多少种 ...

  2. 环境搭建文档——Windows下的Python3环境搭建

    前言 背景介绍: 自己用Python开发了一些安卓性能自动化测试的脚本, 但是想要运行这些脚本的话, 本地需要Python的环境. 测试组的同事基本都没有安装Python环境, 于是乎, 我就想直接在 ...

  3. js之Ajax下载文件

    传统上,客户端将依靠浏览器来处理从服务器下载文件.然而,这种方法需要打开一个新的浏览器窗口,iframe或任何其他类型的不友好和黑客行为.为下载请求添加额外的头信息也很困难.更好的解决方案是使用HTM ...

  4. 移动端布局:视口viewport的理解

    移动端开发中,有一些基本概念需要理解清楚,才能更好的组织编程逻辑.在刚接触时,移动端视口的缩放和rem单位的缩放搞混淆了,弄得自己很蒙圈.所以仔细总结下自己的理解. 移动端的适配,我理解为两点: 第一 ...

  5. Jupyter-NoteBook-你应该知道的N个小技巧

    智能决策上手系列教程索引 不断更新部分内容来自于翻译整理 多行输出 在Notebook的中开头cell中添加以下代码可以实现多行输出: from IPython.core.interactiveshe ...

  6. 获取resource下文件

    Resource resource = new ClassPathResource(certPath);File file= resource.getFile();

  7. 解决weblogic 部署环境后出现的乱码问题

    1.在startWebloci.cmd 中 set CLASSPATH=%SAVE_CLASSPATH% 下增加一行 JAVA_OPTIONS="${JAVA_OPTIONS} -Dfile ...

  8. 在windows上安装wamp时遇到apache无法启动,图标为橙色

    1.首先测试端口号是否被占用,如果端口号被占用,修改相对应文件的端口号,修改端口号的方法网上很容易搜到. 2.如果端口号没有被占用,cd到httpd.exe目录下,查看错误原因,这里我显示的错误是ht ...

  9. SQL Server 存储过程的运用

    概述 最近因为业务的需求写了一段时间存储过程,发现之前写的存储过程存在一些不严谨的地方,特别是TRY...CATCH中嵌套事务的写法:虽然之前写的并没有错,但是还是埋藏着很大的隐患在里面.希望这篇文章 ...

  10. 【高速接口-RapidIO】5、Xilinx RapidIO核例子工程源码分析

    提示:本文的所有图片如果不清晰,请在浏览器的新建标签中打开或保存到本地打开 一.软件平台与硬件平台 软件平台: 操作系统:Windows 8.1 64-bit 开发套件:Vivado2015.4.2 ...