`
totoxian
  • 浏览: 1104455 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

Windows NT服务--独立的观点

 
阅读更多

在windows中,服务是一种特殊的进程,可以说它和用户无关,它的作用不是完成用户任务,而是进行一些管理类的操作或者通用的服务类操作,实际上windows服务就是一个可执行文件,但是远远不只是这些。

Windows NT的服务架构非常复杂,是整个系统架构中独立的一块。windows服务执行的往往都是一些无须用户介入的任务,也就是说它执行的任务不是具体的,而是具有支撑性质的,比较底层的,比如网络登录,文件驱动,设备驱动,ftp等等,其他的进程往往就和登录用户密切相关了,毕竟计算机就是让用户使用的,而其上执行的任务也就是用户要求的,因此用户是windows进程一个很重要的属性,同时也是操作系统本身一个很重要的性质,可以实现安全管理等相关操作。

windows服务主要由三部分组成,一是服务本身;二是服务控制管理器(SCM);三是服务控制程序(SCP)。SCM是个管理中心,管理着所有的线上服务,所谓线上服务就是已经安装的服务,SCP和SCM交互来管理服务本身,注意服务本身并不需要直接和SCM交互,这样就可以让写一个服务变得更加容易,人们可以像写普通的应用程序一样来完成一个服务的编程,唯一需要附加的就是和SCP接口就可以了,这样看来虽然windows服务的架构非常复杂,但是三者之间的耦合度却很低,足见设计的精妙。SCM维护着一个数据库,该数据库储存着已安装的服务和驱动程序的信息,SCM管理着它们,SCM根据这些信息控制服务的关闭和启动等行为,服务可以从SCM接收命令然后采取一定的动作,注意它是通过SCP来接收命令的,服务本身就是一个一直运行的应用程序,SCP作为一个 接口提供出来,用户可以通过它控制服务的行为,SCM同时也和SCP交互,在这繁复的数据流背后是成熟的RPC,windows中信号是不流行的,但是RPC却非常普遍,下面通过一个简单例子说明一下枝枝蔓蔓:

#include "stdafx.h"

#include <windows.h></windows.h>

void Install(char * name);

void Uninstall(char *name);

char *a = "mee11";

BOOL Running = TRUE;

SERVICE_STATUS_HANDLE hServiceStatus;

SERVICE_STATUS status;

SC_HANDLE hSCM;

int option(int argc, TCHAR* argv[])

{

hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

if (argc

if (_wcsicmp(argv[1], _T("-i")) == 0)

{

Install(a);

::CloseServiceHandle(hSCM);

return 1;

}

if (_wcsicmp(argv[1], _T("-u")) == 0)

{

Uninstall(a);

return 1;

}

return 0;

}

void Install(char *name ) //安装服务,实际上就是将该新服务的信息写入SCM管理的数据库中

{

if (!hSCM) return 0;

char szFilePath[260];

::GetModuleFileNameA(NULL, szFilePath, sizeof(szFilePath));

SC_HANDLE hService = ::CreateServiceA(hSCM,(LPCSTR)name,(LPCSTR)name,SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,szFilePath,NULL,NULL,NULL,NULL,NULL);

if (!hService) {

::CloseServiceHandle(hSCM);

return ;

}

char szKey[256];

HKEY hKey = NULL;

strcpy(szKey, "SYSTEM//CurrentControlSet//Services//EventLog//Application//");

strcat(szKey, name);

if (::RegCreateKeyA(HKEY_LOCAL_MACHINE, szKey, &hKey) != ERROR_SUCCESS) {

::CloseServiceHandle(hService);

::CloseServiceHandle(hSCM);

return;

}

::RegSetValueEx(hKey,_T("EventMessageFile"),0,REG_EXPAND_SZ, (CONST BYTE*)szFilePath,strlen(szFilePath) + 1);

DWORD dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE;

::RegSetValueEx(hKey,_T("TypesSupported"),0,REG_DWORD,(CONST BYTE*)&dwData,sizeof(DWORD));::RegCloseKey(hKey);

::CloseServiceHandle(hService);

}

void Uninstall(char *name)

{

SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

if (!hSCM) return ;

SC_HANDLE hService = ::OpenServiceA(hSCM,name,DELETE);

if (hService) {

if (::DeleteService(hService))

::CloseServiceHandle(hService);

}

::CloseServiceHandle(hSCM);

}

static void WINAPI Handler(DWORD dwOpcode)

{ //注意是在这个Handler回调中处理的SCM发来的命令,这里要做的就是设置控制变量,间接改变服务的运行行为。

switch (dwOpcode) {

case SERVICE_CONTROL_STOP:

status.dwCurrentState = SERVICE_STOP_PENDING;

::SetServiceStatus(hServiceStatus, &status);

Running = FALSE;

break;

default:

break;

}

::SetServiceStatus(hServiceStatus, &status);

}

static void WINAPI ServiceMaina(DWORD dwArgc, LPTSTR* lpszArgv)

{

hServiceStatus = RegisterServiceCtrlHandlerA(a,Handler);

::SetServiceStatus(hServiceStatus, &status);

status.dwCurrentState = SERVICE_RUNNING;

::SetServiceStatus(hServiceStatus, &status);

while (Running)

{

//做具体的服务吧,就像这是一个普通的应用程序一样

}

status.dwCurrentState = SERVICE_STOP_PENDING;

::SetServiceStatus(hServiceStatus, &status);//最后告诉SCM,这个服务停止了。

}

void StartService()

{

SERVICE_TABLE_ENTRY st[] = {

{(LPWSTR)a, ServiceMain},{NULL, NULL}};

status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;

status.dwCurrentState = SERVICE_STOPPED;

status.dwControlsAccepted = SERVICE_ACCEPT_STOP;

status.dwWin32ExitCode = 0;

status.dwServiceSpecificExitCode = 0;

status.dwCheckPoint = 0;

status.dwWaitHint = 0;

::StartServiceCtrlDispatcher(st);//分派器开始,服务即将开始运行

}

int _tmain(int argc, _TCHAR* argv[])

{

if(!option(argc, argv))

{

StartService();

}

return 0;

}

看到在RegisterServiceCtrlHandlerA中注册的Handler了吧,Handler就相当于一个控制器,这个Handler就是负责接收和处理命令的,它和主服务在不同的线程当中,主服务也就是上面例子中的while循环线程可以旁若无人的做任何事情,控制变量是全局的,可以在别的线程被改变,这个变量控制着服务的关闭行为,一切就是这么简单。关于服务的调试,可以用远程调试的办法进行。

windows专门为服务这个东西设计了如此复杂的机制,看得出服务的重要性,不过也不一定,windows本身就是微核结构而且内部大量使用了C/S架构,它为任何东西单独设计一个机制都不足为奇。它的API相当复杂,之所以这样就使因为windows是面向用户的,而用户是很难缠的,因此其api就提供了很多策略性的东西,当然也就相对复杂,windows服务仅仅是其中的一块而已,不过即使这样,windows的设计者还是做的很不错,程序员几乎不用费力就可以完成一个服务框架,当然如果深入一些,还有更加复杂的,不过那就涉及到一个新机制了,这就是svchost,很熟悉吧,不过不说了,我不喜欢讨论网上一搜一堆的东西,我比较喜欢思想性的东西,最起码还可能遭到一些反驳...

分享到:
评论

相关推荐

    MFC Windows程序设计(第2版修订版)--源代码

    如果没有特别说明它们都与Windows 98、WindowsNT4.0及Windows 2000兼容,其中大部分也与Windows 95及WindowsNT 3.51兼容。  您可用CD—ROM的根目录下的安装程序来将CD-ROM中,的内容复制到硬盘里,也可只复制...

    您可能没有权限使用网络资源。请与这台服务器的管理员联系以查明您是否有访问权限。拒绝访问解决方法

    解决:在控制面板-管理工具-服务中启动Server服务。并设置“启动类型”为“自动”。 2,IP设置有误。 症状:双机之间无法互Ping,连接用的双绞线经过测试没有问题,没有安装防火墙。 解决:检查两台电脑的IP...

    ASP.NET-[论坛社区]Discuz!NT2.6ForAccess.zip

    ASP.NET是由微软开发的一种服务器端Web应用程序框架,用于构建动态网站、Web应用程序和Web服务。它是.NET Framework的一部分,提供了一种高效、高性能的方式来创建和运行基于Web的应用程序。ASP.NET提供了丰富的控件...

    Microsoft Windows Internals

    Windows内核还涉及到了Windows NT系列的多个版本,包括Windows NT、Windows 2000、Windows XP、Windows Server 2003、Windows Vista和Windows Server 2008等。这些版本虽然在功能上有所差异,但它们共有的NT架构使得...

    MFC Windows程序设计(第2版修订版)--详细书签版2卷

    如果没有特别说明它们都与Windows 98、WindowsNT4.0及Windows 2000兼容,其中大部分也与Windows 95及WindowsNT 3.51兼容。  您可用CD—ROM的根目录下的安装程序来将CD-ROM中,的内容复制到硬盘里,也可只复制...

    MFC Windows程序设计(第2版修订版)--详细书签版1卷

    如果没有特别说明它们都与Windows 98、WindowsNT4.0及Windows 2000兼容,其中大部分也与Windows 95及WindowsNT 3.51兼容。  您可用CD—ROM的根目录下的安装程序来将CD-ROM中,的内容复制到硬盘里,也可只复制...

    精准通智能网站流量分析系统4.2

    适用平台:Windows 9x/ME/NT/2000/2003/XP 功能简介: ----------------------------------------------------- “精准通” 智能网站分析系统,可以准确收集网站访客信息,快速生成500多个分析报表。在韩国网站...

    Discuz!NT2.5

    NT2.5新增六大创新: 创新一:支持最新Windows Server2008、IIS7、Silverlight 2.0 beta2 &lt;br&gt;创新二:新增商品交易插件,社区系统自带应用插件化 &lt;br&gt;创新三:优化用户在线处理,提高负载能力,减少等待...

    带有增强功能的原始Windows文件管理器(winfile)-C/C++开发

    master分支中有两个主要版本的源代码:original_plus标记:以最小的更改引用Windows NT4上WinFile的源代码,以便它可以与Visual Studio一起编译并在当前Windows上运行。 现任硕士:包含我的观点

    修改微软启动组件

    当计算机启动时,BIOS或UEFI首先加载MBR,MBR负责加载操作系统分区上的NTLDR(NT Loader),NTLDR接着读取BOOT.INI文件来确定加载哪个操作系统。此过程中的每个步骤都可能成为需要进行修改的地方。 #### 修改...

    Linux实力分析 (1).pdf

    文章中还提到了1999年MindCraft公司所做的一项评测,其结果显示Windows NT在文件服务和网页服务性能方面领先Linux。然而,由于测试环境可能对NT进行了优化,而Linux机器未获得同等优化,这一结果饱受争议。除此之外...

    网络操作系统管理与配置课件完整版电子讲义.pptx

    单块式操作系统如DOS,层次式操作系统如UNIX和Novell NetWare,Client/Server模式如Mach和Microsoft Windows NT。 网络操作系统的功能: 网络操作系统除了应具有通常操作系统应有的处理机管理、存储器管理、设备...

    (完整版)烟草计算机试题.doc

    - 工作站上常用的主流操作系统包括各种版本的Unix、Linux以及Windows NT等高级版本。 通过以上知识点的总结,我们可以更深入地理解计算机系统的各个组成部分及其工作原理。这对于学习计算机科学和技术非常有帮助。

    三级网络考试资料-押题卷

    正确的观点是D)互联的计算机是分布在不同地理位置的多台独立的自治计算机系统。 9. 网络操作系统的基本任务: 它的任务包括屏蔽资源差异,提供网络服务,管理共享资源,并提供安全性服务。正确答案是D)安全性服务...

    计算机网络试题库判断题-.doc

    23. **Windows NT与UNIX/Linux**:都可以作为网络服务器平台。 24. **RIP协议**:是路由信息协议,用于动态路由配置。 25. **网络结构核心**:强调了分层和协议标准的重要性。 26. **广域网拓扑**:再次确认广域网多...

    BBS论坛系统的设计与实现.pptx

    SQL Server 2000以其客户机/服务器体系结构、图形化用户界面、丰富的编程接口、与Windows NT的深度集成、良好的跨平台伸缩性以及对Web技术的支持,成为理想的数据库选择。此外,开发环境选用了Windows 2000NT操作...

    数据整合工具评测报告

    - **操作系统要求**:支持 Windows 98、Windows 2000、Windows XP 和 Windows NT 4.0 等操作系统,也支持 Solaris、HP-UX 和 AIX 等 Unix 平台。 - **存储空间需求**:总需 70MB 的客户端安装空间,数据库空间...

    Linux的认识存在的一些误区

    然而,在多任务处理能力方面,DOS远不如现代的多任务操作系统如Linux和Windows NT。 - **多任务处理的优势**:Linux作为一种多任务操作系统,在同时处理多个进程时表现出色。这意味着用户可以在同一时间运行多个...

Global site tag (gtag.js) - Google Analytics