4 《Undocumented Windows 2000 Secrets》翻译 --- 第三章

第三章 编写内核模式驱动程序
翻译: Kendiv
更新: Thursday, February 10, 2005
表 3-4 列出了定义于 列表 3-8 中的函数,同时还给出了简短的介绍 。其中的一些函数的名字,如 w2kServiceStart() 和 w2kServiceControl() 和 SC 管理器的原生 API 函数 ---StartService() 和 ControlService() 比较类似 。这没有什么不一致,在这些外包函数的核心位置都能找到对这些原生函数的调用 。外包函数和原生函数的主要区别在于: StartService() 和 ControlService() 的操作对象是服务句柄,而 w2kServiceOpen() 和 w2kServiceClose() 则是服务的名称 。这些名字会在内部调用 w2kServiceOpen() 和 w2kServiceClose() 转化为对应的句柄,w2kServiceOpen() 和 w2kServiceClose() 会依次调用 OpenService() 和 CloseServiceHandle()。
名 称
描 述
w2kServiceAdd
向系统中增加一个服务 / 驱动程序
w2kServiceClose
关闭一个服务句柄
w2kServiceConnect
连接到服务控制管理器
w2kServiceContinue
继续执行暂停的服务 / 驱动程序
w2kServiceControl
停止、暂停、继续、查询或通知一个已加载的服务 / 驱动程序
w2kServiceDisconnect
断开和服务控制管理器的连接
w2kServiceLoad
加载和启动(可选的)一个服务 / 驱动程序
w2kServiceLoadEx
加载和启动(可选的)一个服务 / 驱动程序(自动生成名称)
w2kServiceManager
打开 / 关闭一个临时的服务控制管理器句柄
w2kServiceOpen
获取一个已加载的服务 / 驱动程序的句柄
w2kServicePause
暂停一个正在运行的服务 / 驱动程序
w2kServiceRemove
从系统中移除一个服务 / 驱动程序
w2kServiceStart
启动一个已加载的服务 / 驱动程序
w2kServiceStop
停止一个正在运行的服务 / 驱动程序
w2kServiceUnload
停止和卸载一个服务 / 驱动程序
w2kServiceUnloadEx
停止和卸载一个服务 / 驱动程序(自动生成名称)
表 3-4. w2k_lib.dll 提供的 SC 管理器的外包函数
表 3-4 中函数的典型用法都需遵循如下的指导方针:
l 使用 w2kServiceLoad() 或 w2kServiceLoadEx() 来加载一个服务 。后一个函数会根据可执行文件的路径和版本信息自动生成服务的显示名称 。逻辑变量 fStart 用来确定是否在成功加载服务后自动执行该服务 。在成功的情况下,该函数会为后续的调用返回一个管理器句柄 。如果服务已经加载或服务已经开始运行而 fStart 为 TRUE ,调用该函数不会返回任何错误 。但如果发生错误,如有必要,发生错误的服务会被自动卸载 。
l 使用 w2kServiceUnload() 和 w2kServiceUnloadEx() 来卸载一个服务,这需要用到 w2kServiceLoad() 或 w2kServiceLoadEx() 返回的管理器句柄 。w2kServiceUnloadEx() 会根据可执行文件的路径自动生成服务名称 。如果你已经关闭了管理器句柄,可使用 w2kServiceConnect() 来或取一个新的管理器句柄或者简单的传递一个 NULL (这表示使用临时的管理器句柄) 。管理器句柄会由 w2kServiceUnload() 自动关闭 。如果服务已经有删除标志,则不会返回任何错误,但并不会立即删除服务,这是因为打开的设备句柄还存在着 。
l 使用 w2kServiceStart() 、 w2kServiceStop() 、 w2kServicePause() 或 w2kServiceContinue() 来控制一个服务 。这些函数也需要使用 w2kServiceLoad() 或 w2kServiceLoadEx() 返回的管理器句柄 。如果你提供一个值为 NULL 的管理器句柄,则使用临时管理器句柄 。如果指定的服务已处于所要求的状态,则不会返回任何错误 。
l 调用 w2kServiceDisconnect() 来关闭一个管理器句柄 。你可以在任何时候调用 w2kServiceConnect() 来获取一个管理器句柄 。

推荐阅读