Windows服务编写原理及探讨

合集下载

深入解析Windows操作系统

深入解析Windows操作系统

《深入解析Windows操作系统》是由著名的操作系统专家编写的Windows操作系统原理的著作,在今后很长的一段时间内,我将我学过的一些东西以学习笔记的形式总结出来提供给大家,大家可以跟着我一起了解和学习,也可以去买这本《深入解析Windows操作系统》,让我们共同探究Windows的神秘世界。

一、基本概念和术语★WinAPI:我的中文名叫“Windows应用编程接口”英文名叫“Windows API”Windows API包括几千个可调用的函数,他们可以被分成以下几个分类:基本服务,组件服务,用户界面服务,图形和多媒体服务,消息和协作,网络,Web服务。

那么我们如何查询到Windows API呢?这里用到的是微软提供的SDK(平台软件开发工具),通过MSDN可以在线免费查阅SDK文档()MSDN是指微软对开发人员的支持计划。

★服务,函数Windows API 函数:指Windows API中已经被文档化的可调用子例程。

例如CreateProcess 原生的系统服务:指在操作系统中未被文档化的可在用户模式下调用的底层服务。

例如NtCreateProcessWindows服务:指由Windows服务管理器(services.exe)启动的进程。

DLL:动态链接库,指一组可调用的子例程,合起来被链接成一个二进制文件,使用这些子例程的应用程序可以动态的加载此二进制文件。

★进程,线程和作业进程可以理解为一个容器,其中包含了当执行一个程序的特定实例时所用到的各种资源。

从最高层次来看,一个Windows进程由以下几个元素组成:一个私有的地址空间,这是指该进程可以使用的一段虚拟内存地址。

一个可执行程序,它定义了初始的代码和数据,并且被映射到该进程的虚拟地址空间中。

一个已打开句柄的列表,这些句柄指向各种系统资源,比如信号量,通信端口和文件,该进程内所有的线程都可以访问这些系统资源。

一个被成为访问令牌的安全环境,它标识了与该进程关联的用户,安全组和特权。

windows操作系统原理

windows操作系统原理

windows操作系统原理Windows操作系统原理是指Windows操作系统设计与实现的基本原理和机制。

Windows操作系统是由微软公司开发的一种面向个人计算机的操作系统。

Windows操作系统的原理包括以下几个方面:1. 多任务管理:Windows操作系统采用了抢占式的多任务处理机制,通过任务调度器来管理多个任务的执行。

每个任务独立运行在自己的进程中,操作系统根据进程的优先级和时间片来进行任务调度。

2. 内存管理:Windows操作系统使用虚拟内存管理机制,将物理内存划分为多个页框,每个进程有自己的虚拟地址空间。

操作系统通过分页机制将虚拟内存映射到物理内存中,以便实现进程间的隔离和保护。

3. 文件系统:Windows操作系统使用NTFS文件系统作为默认的文件系统。

NTFS文件系统支持文件和目录的权限控制、文件压缩和加密等功能。

4. 设备管理:Windows操作系统通过设备驱动程序来管理硬件设备。

每个设备驱动程序负责与特定设备的通信,并提供统一的接口供应用程序调用。

5. 网络通信:Windows操作系统支持TCP/IP协议栈,并提供了各种网络通信服务,如网络协议栈、网络接口、套接字接口等,以实现应用程序之间的网络通信。

6. 用户界面:Windows操作系统提供了图形用户界面(GUI),包括窗口管理、菜单、对话框等,使得用户可以通过鼠标、键盘等输入设备与计算机进行交互。

7. 安全性:Windows操作系统通过用户账户和权限管理来保护系统和用户数据的安全性。

每个用户都有自己的账户,并且可以通过权限控制来限制对文件和系统资源的访问。

这些原理和机制共同构成了Windows操作系统的核心。

通过合理地设计和实现,Windows操作系统能够提供稳定、安全、高效的计算环境,满足用户的各种需求。

windows程序设计概论

windows程序设计概论

windows程序设计概论Windows程序设计概论Windows程序设计是指在Windows操作系统上开发应用程序的过程。

Windows操作系统是目前全球使用最广泛的操作系统之一,因此Windows程序设计也是非常重要的一项技能。

Windows程序设计的基础是掌握Windows操作系统的基本知识,包括Windows操作系统的架构、文件系统、进程管理、内存管理、网络通信等方面的知识。

此外,还需要掌握Windows API的使用方法,Windows API是Windows操作系统提供的一组函数和数据结构,可以用来访问操作系统的各种功能。

在Windows程序设计中,常用的编程语言包括C++、C#、Visual Basic等。

其中,C++是一种面向对象的编程语言,可以使用Windows API和MFC(Microsoft Foundation Classes)等框架进行Windows程序设计;C#是一种基于.NET框架的编程语言,可以使用Windows Forms和WPF(Windows Presentation Foundation)等框架进行Windows程序设计;Visual Basic是一种基于COM (Component Object Model)的编程语言,可以使用Windows Forms和WPF等框架进行Windows程序设计。

在Windows程序设计中,常见的应用程序包括桌面应用程序、游戏、多媒体应用程序、网络应用程序等。

桌面应用程序是指在Windows桌面上运行的应用程序,如文本编辑器、图像处理软件、办公软件等;游戏是指在Windows上运行的各种游戏,如角色扮演游戏、射击游戏、赛车游戏等;多媒体应用程序是指在Windows上播放音频和视频的应用程序,如音乐播放器、视频播放器等;网络应用程序是指在Windows上进行网络通信的应用程序,如浏览器、邮件客户端等。

Windows程序设计的开发工具包括Visual Studio、Code::Blocks、Dev-C++等。

剖析Windows任务管理器开发原理与实现

剖析Windows任务管理器开发原理与实现

剖析Windows任务管理器开发原理与实现剖析Windows任务管理器开发原理与实现Windows2000/XP内含的任务管理器(Taskmgr)相信大家都熟悉吧,相比之下XP里的要比2000功能更加强大,返回的信息也更加的详细,不过您是否觉得还有很多希望获得的消息没有包含在里面吗?您是否觉得Windows的系统管理工具箱里的东西太分散了吗?下面就让我们看看它们的开发原理,并动手实现一个真正的任务管理器。

现在我们是调用Win32API来实现这些功能的,但是大家都说MS隐藏了太多的细节,以后我们将讨论更多关于Windows内核的东东。

可能大家对任务管理器里最熟悉的功能要数进程管理了,常常我们在怀疑中了病毒/木马的时候都会看看任务管理器里有没有什么特别的进程在运行,所以进程查看器应该是一个非常重要的功能。

我们除了需要获得进程的名称外,还有什么呢?当然包括它的进程标识符(ProcessID),用户信息(UserName),CPU使用时间(CPUTime)和存储器的使用情况(MemoryUsage),还有它的优先权(BasePriority)。

CPU和Memory信息可以帮助我们分析进程的运行情况,而优先权可以表示进程在CPU分配处理器使用时的优先情况。

这些都是通用的进程信息,让我们再看看其他的信息吧。

进程的父进程标识符(ParentProcess ID),创建时间(CreateTime),程序名称等在很多情况下也是我们关心的信息。

我们再看看进程相关的性能信息。

在Windows下通常有两种模式:内核模式(Kernel:Level 0)和用户模式(User: Level3),进程往往在两种模式中来回切换,所以可以获得进程在内核模式和用户模式各自的使用时间。

同时还包括进程相关的工作集(WorkingSet),分页池(PagedPool),非分页池(NonePagedPool)和页面文件(PageFile)信息。

WINDOWS程序设计

WINDOWS程序设计

WINDOWS程序设计Windows程序设计是一门非常重要的计算机科学领域,用于开发运行在Windows操作系统上的应用程序。

它可以涵盖从简单的桌面应用程序到复杂的企业级应用程序的开发。

在过去的几十年中,Windows程序设计已经取得了巨大的发展和进步,为我们的日常生活和工作提供了方便和便利。

首先,我们来了解一些Windows程序设计的基本概念和原理。

Windows操作系统提供了一系列的应用程序编程接口(API),开发者可以通过这些API来获取操作系统的功能和资源。

这些API包括图形用户界面(GUI)API、文件和存储管理API、网络通信API等。

通过使用这些API,开发者可以实现用户界面的设计、文件的读写、数据库的操作、网络通信等功能。

在进行Windows程序设计时,开发者需要了解Windows操作系统的基本架构和工作原理。

Windows操作系统由内核(Kernel)和系统服务(System Services)组成。

内核负责管理计算机硬件和操作系统的核心功能,而系统服务则提供了更高级的功能,如内存管理、进程管理、文件系统等。

开发者可以通过使用Windows API来与内核和系统服务进行交互,实现自己的应用程序需求。

Windows程序设计的开发过程通常包括需求分析、系统设计、编码实现和测试等阶段。

需求分析阶段是在与用户和项目相关人员交流的基础上,明确应用程序的功能和需求。

系统设计阶段则是根据需求分析的结果来设计应用程序的结构和模块。

编码实现阶段是将设计的方案转化为实际的源代码,即编写程序。

测试阶段是通过对程序进行测试,验证其功能和性能是否符合预期。

除了以上的基本概念和原理之外,Windows程序设计还涉及到一些高级的技术和概念。

例如,多线程编程可以提高程序的并发性和响应能力。

用户界面设计可以提升应用程序的易用性和用户体验。

网络编程可以实现应用程序之间的通信和数据交换。

安全编程可以确保应用程序的安全性和可靠性。

windows运行原理

windows运行原理

windows运行原理Windows是一种操作系统,它基于C语言开发,并由微软公司发布和维护。

它的运行原理涉及到许多不同的部分和过程。

首先,在计算机启动时,BIOS(基本输入/输出系统)会加载并运行。

BIOS的主要功能是初始化硬件设备并进行自检。

然后,它会搜索存储设备上的引导扇区,并将控制权传递给该引导扇区。

接下来,引导扇区中的Bootloader(引导加载程序)会运行。

Bootloader是一个小型程序,负责加载操作系统内核并将控制权传递给它。

在Windows系统中,引导加载程序可以是NTLDR(对于Windows XP及更早版本)或Bootmgr(对于Windows Vista及更高版本)。

一旦引导加载程序完成,操作系统内核将开始加载。

Windows系统内核是一个巨大的二进制文件,其中包含了管理和控制计算机硬件和软件资源的代码和数据。

其主要职责包括内存管理、进程和线程调度、设备驱动程序管理等。

在内核加载完毕后,Windows会初始化硬件设备并启动服务。

Windows服务是一种在后台运行的程序,提供了各种功能和服务,如网络连接、文件共享、打印机支持等。

这些服务在操作系统启动时自动启动,以便在需要时可随时调用。

一旦系统准备就绪,Windows会显示用户登录界面。

用户可以通过输入用户名和密码登录到自己的账户,然后操作系统会加载用户配置文件和个人设置。

一旦用户登录,Windows将提供一个图形用户界面(GUI),通过桌面、任务栏、文件资源管理器等元素来与用户交互。

用户可以通过鼠标、键盘或触摸屏来执行各种操作,如打开程序、编辑文件、访问互联网等。

在用户操作期间,Windows将根据用户的指令和需求调用相应的程序和服务。

这些程序和服务通过系统资源管理器的接口进行通信,以便在用户需要时提供所需的功能和服务。

最后,当用户关闭计算机或注销时,Windows会保存用户的配置和设置,并执行一些关闭操作,如终止未完成的进程、卸载硬件设备等。

windows程序设计概论

windows程序设计概论

windows程序设计概论Windows程序设计概论Windows程序设计是指在Windows操作系统上开发和编写应用程序的过程。

随着计算机技术的不断发展,Windows操作系统成为了世界上最流行的操作系统之一,因此掌握Windows程序设计的基本知识成为了程序员的必备技能之一。

本文将从基本概念、开发工具、编程语言以及常用技术等方面介绍Windows程序设计的相关内容。

一、基本概念1.1 Windows操作系统Windows操作系统是由美国微软公司开发的一款图形化操作系统,具有用户友好的界面和丰富的功能。

它提供了一种便捷的平台,使得开发者可以利用其强大的功能来创建各种应用程序。

1.2 Windows应用程序Windows应用程序是在Windows操作系统上运行的软件程序,可以实现各种功能,如文档处理、图形处理、多媒体播放等。

通过编写代码和使用开发工具,开发者可以将自己的想法转化为实际的应用程序。

二、开发工具2.1 Visual StudioVisual Studio是微软公司推出的一款集成开发环境(IDE),提供了丰富的开发工具和功能,如代码编辑器、调试器、编译器等。

它支持多种编程语言,如C++、C#等,可以帮助开发者高效地编写和调试Windows应用程序。

2.2 .NET Framework.NET Framework是一个应用程序开发平台,提供了一系列的类库和工具,用于简化Windows应用程序的开发过程。

它支持多种编程语言,并提供了丰富的API,使得开发者可以轻松地访问操作系统的功能和资源。

三、编程语言3.1 C++C++是一种通用的编程语言,广泛用于系统级编程和高性能应用程序的开发。

它在Windows程序设计中被广泛使用,可以直接访问操作系统的底层功能,并提供了丰富的类库和工具,使得开发者可以灵活地控制和管理应用程序。

3.2 C#C#是一种面向对象的编程语言,专门用于Windows应用程序的开发。

WINS服务

WINS服务
推复制发生的情况: a.WINS服务启动的时 b.当信息改变的项数达到配置的数量时 c.当WINS服务数据库内一项信息中IP改动时 d.系统管理员手动进行推复制操作时 拉复制发生的情况: a. WINS服务启动的时 b. 所配置的间隔时间到期 c.系统管理员手动进行拉复制操作时
2、WINS的客户端
一 、名字解析
1、名字解析
2、WINS 服务
WINS全称为Windows Internet名称服务(Windows Internet Name Service)是将非IP地址解析成IP地址的一种特殊服务。
Windows中有两种名字解析,分别是主机名解析(DNS)和 NetBIOS名解析(WINS)。
四、DHCP与WINS的动态更新
作业
1、动手安装WINS服务器 2、练习管理WINS服务器 3、练习配置WINS数据库复制 4、动手设置WINS的客户端
Windows NT 3.5或以后版本 Windows NT Workstation 3.5或以后的版本 Windows 95或以后的版本 运行TCP/IP-32的Windows for Workgroup 3.11 带有实模式TCP/IP驱动程序的Microsoft Network Client
(4)名称解析 上述三个过程完成后,客户机通信,由wins服务器解析
对方的IP地址
三、配置WINS服务 (1)安装WINS服务(demo) (2)配置WINS服务器 (3)爆发处理
1、 WINS复制 (1)WINS复制的意义:
(2)WINS复制功能的实现:
Hale Waihona Puke (3)WINS服务复制分为推复制和拉复制
3.0 for MS-DOS LAN Manager 2.2c for MS-DOS
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Windows服务编写原理及探讨有那么一类应用程序,是能够为各种用户(包括本地用户和远程用户)所用的,拥有用户授权级进行管理的能力,并且不论用户是否物理的与正在运行该应用程序的计算机相连都能正常执行,这就是所谓的服务了。

(一)服务的基础知识Question 1. 什么是服务?它的特征是什么?在NT/2000中,服务是一类受到操作系统优待的程序。

一个服务首先是一个Win32可执行程序,如果要写一个功能完备且强大的服务,需要熟悉动态连接库(Dlls)、结构异常处理、内存映射文件、虚拟内存、设备I/O、线程及其同步、Unicode以及其他的由WinAPI函数提供的应用接口。

当然本文讨论的只是建立一个可以安装、运行、启动、停止的没有任何其他功能的服务,所以无需上述知识仍可以继续看下去,我会在过程中将理解本文所需要的知识逐一讲解。

第二要知道的是一个服务决不需要用户界面。

大多数的服务将运行在那些被锁在某些黑暗的,冬暖夏凉的小屋子里的强大的服务器上面,即使有用户界面一般也没有人可以看到。

如果服务提供任何用户界面如消息框,那么用户错过这些消息的可能性就极高了,所以服务程序通常以控制台程序的形式被编写,进入点函数是main()而不是WinMain()。

也许有人有疑问:没有用户界面的话,要怎样设置、管理一个服务?怎样开始、停止它?服务如何发出警告或错误信息、如何报告关于它的执行情况的统计数据?这些问题的答案就是服务能够被远程管理,Windows NT/2000提供了大量的管理工具,这些工具允许通过网络上的其它计算机对某台机器上面的服务进行管理。

比如Windows 2000里面的“控制台”程序(mmc.exe),用它添加“管理单元”就可以管理本机或其他机器上的服务。

Question 2. 服务的安全性…想要写一个服务,就必须熟悉Win NT/2000的安全机制,在上述操作系统之中,所有安全都是基于用户的。

换句话说——进程、线程、文件、注册表键、信号、事件等等等等都属于一个用户。

当一个进程被产生的时候,它都是执行在一个用户的上下文(context),这个用户帐号可能在本机,也可能在网络中的其他机器上,或者是在一个特殊的账号:System Account——即系统帐号的上下文如果一个进程正在一个用户帐号下执行,那么这个进程就同时拥有这个用户所能拥有的一切访问权限,不论是在本机还是网络。

系统帐号则是一个特殊的账号,它用来标识系统本身,而且运行在这个帐号下的任何进程都拥有系统上的所有访问权限,但是系统帐号不能在域上使用,无法访问网络资源…服务也是Win32可执行程序,它也需要执行在一个context,通常服务都是在系统账号下运行,但是也可以根据情况选择让它运行在一个用户账号下,也就会因此获得相应的访问资源的权限。

Question 3. 服务的三个组成部分一个服务由三部分组成,第一部分是Service Control Manager(SCM)。

每个Windows NT/2000系统都有一个SCM,SCM存在于Service.exe中,在Windows启动的时候会自动运行,伴随着操作系统的启动和关闭而产生和终止。

这个进程以系统特权运行,并且提供一个统一的、安全的手段去控制服务。

它其实是一个RPC Server,因此我们可以远程安装和管理服务,不过这不在本文讨论的范围之内。

SCM包含一个储存着已安装的服务和驱动程序的信息的数据库,通过SCM可以统一的、安全的管理这些信息,因此一个服务程序的安装过程就是将自身的信息写入这个数据库。

第二部分就是服务本身。

一个服务拥有能从SCM收到信号和命令所必需的的特殊代码,并且能够在处理后将它的状态回传给SCM。

第三部分也就是最后一部分,是一个Service Control Dispatcher(SCP)。

它是一个拥有用户界面,允许用户开始、停止、暂停、继续,并且控制一个或多个安装在计算机上服务的Win32应用程序。

SCP的作用是与SCM通讯,Windows 2000管理工具中的“服务”就是一个典型的SCP。

在这三个组成部分中,用户最可能去写服务本身,同时也可能不得不写一个与其伴随的客户端程序作为一个SCP去和SCM通讯,本文只讨论去设计和实现一个服务,关于如何去实现一个SCP则在以后的其它文章中介绍。

Question 4. 怎样开始设计服务还记得前面我提到服务程序的入口点函数一般都是main()吗?一个服务拥有很重要的三个函数,第一个就是入口点函数,其实用WinMain()作为入口点函数也不是不可以,虽然说服务不应该有用户界面,但是其实存在很少的几个例外,这就是下面图中的选项存在的原因。

由于要和用户桌面进行信息交互,服务程序有时会以WinMain()作为入口点函数。

入口函数负责初始化整个进程,由这个进程中的主线程来执行。

这意味着它应用于这个可执行文件中的所有服务。

要知道,一个可执行文件中能够包含多个服务以使得执行更加有效。

主进程通知SCM在可执行文件中含有几个服务,并且给出每一个服务的ServiceMain回调(Call Back)函数的地址。

一旦在可执行文件内的所有服务都已经停止运行,主线程就在进程终止前对整个进程进行清除。

第二个很重要的函数就是ServiceMain,我看过一些例子程序里面对自己的服务的进入点函数都固定命名为ServiceMain,其实并没有规定过一定要那样命名,任何的函数只要符合下列的形式都可以作为服务的进入点函数。

VOID WINAPI ServiceMain(DWORD dwArgc, // 参数个数LPTSTR *lpszArgv // 参数串);这个函数由操作系统调用,并执行能完成服务的代码。

一个专用的线程执行每一个服务的ServiceMain 函数,注意是服务而不是服务程序,这是因为每个服务也都拥有与自己唯一对应的ServiceMain函数,关于这一点可以用“管理工具”里的“服务”去察看Win2000里面自带的服务,就会发现其实很多服务都是由service.exe单独提供的。

当主线程调用Win32函数StartServiceCtrlDispatcher的时候,SCM为这个进程中的每一个服务产生一个线程。

这些线程中的每一个都和它的相应的服务的ServiceMain函数一起执行,这就是服务总是多线程的原因——一个仅有一个服务的可执行文件将有一个主线程,其它的线程执行服务本身。

第三个也就是最后的一个重要函数是CtrlHandler,它必须拥有下面的原型:VOID WINAPI CtrlHandler(DWORD fdwControl //控制命令)像ServiceMain一样,CtrlHandler也是一个回调函数,用户必须为它的服务程序中每一个服务写一个单独的CtrlHandler函数,因此如果有一个程序含有两个服务,那么它至少要拥有5个不同的函数:作为入口点的main()或WinMain(),用于第一个服务的ServiceMain函数和CtrlHandler函数,以及用于第二个服务的ServiceMain函数和CtrlHandler函数。

SCM调用一个服务的CtrlHandler函数去改变这个服务的状态。

例如,当某个管理员用管理工具里的“服务”尝试停止你的服务的时候,你的服务的CtrlHandler函数将收到一个SERVICE_CONTROL_STOP 通知。

CtrlHandler函数负责执行停止服务所需的一切代码。

由于是进程的主线程执行所有的CtrlHandler 函数,因而必须尽量优化你的CtrlHandler函数的代码,使它运行起来足够快,以便相同进程中的其它服务的CtrlHandler函数能在适当的时间内收到属于它们的通知。

而且基于上述原因,你的CtrlHandler函数必须要能够将想要传达的状态送到服务线程,这个传递过程没有固定的方法,完全取决于你的服务的用途。

(二)对服务的深入讨论之上上一章其实只是概括性的介绍,下面开始才是真正的细节所在。

在进入点函数里面要完成ServiceMain 的初始化,准确点说是初始化一个SERVICE_TABLE_ENTRY结构数组,这个结构记录了这个服务程序里面所包含的所有服务的名称和服务的进入点函数,下面是一个SERVICE_TABLE_ENTRY的例子:SERVICE_TABLE_ENTRY service_table_entry[] ={{ "MyFTPd" , FtpdMain },{ "MyHttpd", Httpserv},{ NULL, NULL },};第一个成员代表服务的名字,第二个成员是ServiceMain回调函数的地址,上面的服务程序因为拥有两个服务,所以有三个SERVICE_TABLE_ENTRY元素,前两个用于服务,最后的NULL指明数组的结束。

接下来这个数组的地址被传递到StartServiceCtrlDispatcher函数:BOOL StartServiceCtrlDispatcher(LPSERVICE_TABLE_ENTRY lpServiceStartTable)这个Win32函数表明可执行文件的进程怎样通知SCM包含在这个进程中的服务。

就像上一章中讲的那样,StartServiceCtrlDispatcher为每一个传递到它的数组中的非空元素产生一个新的线程,每一个进程开始执行由数组元素中的lpServiceStartTable指明的ServiceMain函数。

SCM启动一个服务程序之后,它会等待该程序的主线程去调StartServiceCtrlDispatcher。

如果那个函数在两分钟内没有被调用,SCM将会认为这个服务有问题,并调用TerminateProcess去杀死这个进程。

这就要求你的主线程要尽可能快的调用StartServiceCtrlDispatcher。

StartServiceCtrlDispatcher函数则并不立即返回,相反它会驻留在一个循环内。

当在该循环内时,StartServiceCtrlDispatcher悬挂起自己,等待下面两个事件中的一个发生。

第一,如果SCM要去送一个控制通知给运行在这个进程内一个服务的时候,这个线程就会激活。

当控制通知到达后,线程激活并调用相应服务的CtrlHandler函数。

CtrlHandler函数处理这个服务控制通知,并返回到StartServiceCtrlDispatcher。

StartServiceCtrlDispatcher循环回去后再一次悬挂自己。

第二,如果服务线程中的一个服务中止,这个线程也将激活。

在这种情况下,该进程将运行在它里面的服务数减一。

相关文档
最新文档