名 称
描 述
CloseServiceHandle
关闭来自 OpenSCManager() 、 CreateService() 或 OpenService() 的句柄
ControlService
停止、暂停、继续、查询或通知已加载的服务 / 驱动程序
CreateService
加载一个服务 / 驱动程序
DeleteService
卸载一个服务 / 驱动程序
OpenSCManager
获取 SC 管理器的句柄
OpenService
获取一个已加载的服务 / 驱动程序的句柄
【3 《Undocumented Windows 2000 Secrets》翻译 --- 第三章】QueryServiceStatus
查询一个服务 / 驱动程序的属性和当前状态
StartService
启动一个已加载的服务 / 驱动程序
表 3-3. 基本的服务控制函数
加载和运行一个服务需要执行的典型操作步骤:
1. 调用 OpenSCManager() 以获取一个管理器句柄
2. 调用 CreateService() 来向系统中添加一个服务
3. 调用 StartService() 来运行一个服务
4. 调用 CloseServiceHandle() 来释放管理器或服务句柄
要确保当一个错误发生时,要回滚到最后一个成功的调用,然后再开始 。例如,你在调用 StartService() 时 SC 管理器报告了一个错误,你就需要调用 DeleteService()。否则,服务将保持在一个非预期的状态 。另一个使用 SC 管理器 API 易犯的错误是,必须为 CreateService() 函数提供可执行文件的全路径名,否则,如果该函数在当前目录中没有找到可执行文件的话,就会失败 。因此,你应该使用 Win32 函数 ---GetFullPathName() 来规格化传递给 CreateService() 的所有文件名,除非可以保证它们已经是全路径的 。
高层的驱动程序管理函数
为了更容易的和 SC 管理器进行交互,本书附带的 CD 提供了多个更高级的外包函数,这些函数屏蔽了原有的一些不方便的特殊要求 。这些函数是本书提供的庞大的 Windows 2000 工具库(位于随书 CD 中的 srcw2k_lib )中的一部分 。w2k_lib.dll 导出的所有函数都有一个全局的名字前缀 w2k ,服务和驱动程序管理函数都使用 w2kService 前缀 。列表 3-8 给出了本书提供的工具库中实现的加载、控制和卸载服务 / 驱动程序的函数的细节 。
// =================================================================
// SERVICE/DRIVER MANAGEMENT
// =================================================================
SC_HANDLE WINAPI w2kServiceConnect (void)
{
return OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS);
}
// -----------------------------------------------------------------
SC_HANDLE WINAPI w2kServiceDisconnect (SC_HANDLE hManager)
{
if (hManager != NULL) CloseServiceHandle (hManager);
return NULL;
}
// -----------------------------------------------------------------
SC_HANDLE WINAPI w2kServiceManager (SC_HANDLE hManager,
PSC_HANDLE phManager,
BOOL fOpen)
{
SC_HANDLE hManager1 = NULL;
if (phManager != NULL)
{
if (fOpen)
{
if (hManager == NULL)
{
*phManager = w2kServiceConnect ();
}
else
{
*phManager = hManager;
}
}
else
{
if (hManager == NULL)
{
*phManager = w2kServiceDisconnect (*phManager);
}
}
hManager1 = *phManager;
}
return hManager1;
}
// -----------------------------------------------------------------
SC_HANDLE WINAPI w2kServiceOpen (SC_HANDLE hManager,
PWord pwName)
{
SC_HANDLE hManager1;
SC_HANDLE hService = NULL;
w2kServiceManager (hManager, &hManager1, TRUE);
if ((hManager1 != NULL) && (pwName != NULL))
{
hService = OpenService (hManager1, pwName,
SERVICE_ALL_ACCESS);
}
w2kServiceManager (hManager, &hManager1, FALSE);
推荐阅读
- 暗恋橘生淮南是在哪拍的
- 9 《Undocumented Windows 2000 Secrets》翻译 --- 第四章
- 奶酪陷阱大结局是什么
- 叶澜依结局
- 安装Microsoft Windows 2000 恢复控制台
- 4 《Undocumented Windows 2000 Secrets》翻译 --- 第三章
- 1 《Undocumented Windows 2000 Secrets》翻译 --- 第二章
- 浅谈非系统管理员用户本地登录Windows 2000 server
- 同床异梦秋瓷炫多少期
- Windows 2000进程细述