Windows驱动程序框架理解_经典入门

Windows驱动程序框架理解_经典入门
Windows驱动程序框架理解_经典入门

标题: 【原创】Windows驱动程序框架

windows驱动程序入门比较坑爹一点,本文旨在降低入门的门槛。注:下面的主要以NT式驱动为例,部分涉及到WDM驱动的差别会有特别说明。

首先,肯定是配置好对应的开发环境啦,不懂的就百度下吧,这里不再次描述了。

在Console控制台下,我们的有一个入口函数main;在Windows图形界面平台下,有另外一个入口函数Winmain。我们只要在这入口函数里面调用其他相关的函数,程序就会按照我们的意愿跑起来了。在我们用IDE开发的时候,也许你不会发现这些细微之处是如何配置出来的,一般来说我们也不用理会,因为在新建工程的时候,IDE已经帮我们把编译器(Compiler)以及连接器(Linker)的相关参数设置好,在正式编程的时候,我们只要按照规定的框架编程就行了。

同样,在驱动程序也有一个入口函数DriverEntry,这并不是一定的,但这是微软默认的、推荐使用的。在我们配置开发环境的时候我们有机会指定入口函数,这是链接器的参数/entry:"DriverEntry"。

入口函数的声明

代码:

DriverEntry主要是对驱动程序进行初始化工作,它由系统进程(System)创建,系统启动的时候System系统进程就被创建了。

驱动加载的时候,系统进程将会创建新的线程,然后调用执行体组件中的对象管理器,创建一个驱动对象(DRIVER_OBJECT)。另外,系统进程还得调用执行体组件中的配置管理程序,查询此驱动程序在注册表中对应项。系统进程在调用驱动程序的Driv erEntry的时候就会将这两个值传到pDriverObject和pRegistryPath。

接下来,我们介绍下上面出现的几个数据结构:

typedef LONG NTSTATUS

在驱动开发中,我们应习惯于用NTSTATUS返回信息,NTSTATUS各个位有不同的含义,我们可以也应该用宏NT_SUCCESS来判断是否返回成功。

代码:

NTSTAUS的编码意义:

其中

Ser是Serviity的缩写,代表严重程度。

00:成功01:信息10:警告11:错误

C是Customer的缩写,代表自定义的位。

Facility:设备位

Code:设备的状态代码。

根据这定义编码,还有补码的概念,那么只要是错误的时候,最高位就是1,NTSTATUS的值就是负数,所以可以大于零来判断,但无论如何都希望读者用NT_SUCCESS宏来判断是否成功,因为这可能在以后会有所改动,即使这么多年来都一直沿用着。

同样的,微软也为我们定义了其他几个判断宏:

代码:

有了之前的介绍,这三个相信不说大家也能领会了。但最常用的还是NT_SUCCESS。

我们继续说其他的两个数据结构,先说PUNICODE_STRING吧,P代表这是一个指针类型,指向一个UNICODE_STRING结构。

宽字符串结构体(UNICODE_STRING)

代码:

其中,

?Length:Unicode字符串当前的字符长度。注意不是字节数,每个Unicode字符占用两个字节。

?MaximumLength:该Unicode字符串的最大容纳长度。

?Buffer:Unicode字符串的缓冲地址。

UNICODE_STRING是Windows驱动开发里面经常用到的一个结构,用Length来标记字符串的长度而不再用\0来表示结束。可以用RtlInitUnicodeString来对其初始化,但这里的pRegistryPath是直接由创建驱动程序的线程传进来的参数,如果在接下来仍需要用到该值,最好是使用RtlCopyUnicodeString函数将其值另外保存下来,因为这个字符串并不是长期存在的,DriverEn try函数返回的时候可能就会被销毁了。

PDRIVER_OBJECT,P代表这是一个指针类型,指向一个驱动对象(DRIVER_OBJECT),每个驱动程序都有一个驱动对象。这是一个半透明的数据结构,微软没有公开它的完全定义,只是有提到几个成员,但我们依旧可以通过WinDbg看到它的定义,只是不同的系统可能会存在不同的结构。不过我另外在WDK的头文件WDM.h里面发现了它的定义:

驱动对象(DRIVER_OBJECT)

代码:

这里提下几个比较重要的字段,

?DeviceObject:指向由此驱动创建的设备对象。每个驱动程序都会有一个或多个的设备对象。其中,每个设备对象都会有一个指针指向下一个设备对象,这在我们介绍设备对象的时候再继续说。

?DriverName:驱动的名字,该字符串一般为\Driver\[驱动程序名称]。

?HardwareDatabase:记录设备的硬件数据库键名。该字符串一般为"\REGISTRY\MACHINE\SYSTEM\ControlSet001\Services \[服务名]"。

?FastIoDispatch:指向快速I/O函数入口,是文件驱动中用到的排遣函数。

?DriverStartIo:记录StartIo例程的函数地址,用于串行化操作。

?DriverUnload:指定驱动卸载时所用的回调函数地址。

?MajorFunction:这是一个函数指针数组,每个指针指向的是一个函数,该函数就是处理相应IRP的排遣函数,数组的索引值与IRP_MJ_XXX相对应。

我们已经了解了DriverEntry函数头的那个数据结构了,但这还不够,在DriverEntry里,我们主要是对驱动程序进行初始化,这就涉及到其他的一些数据结构了,下面我们继续逐一地介绍。

设备对象(DEVICE_OBJECT)

代码:

这里只对几个比较重要的字段进行说明:

?DriverObject:指向创建此设备对象的驱动程序对象。同属于一个驱动程序的设备对象指向的是同一个驱动对象。

?NextObject:指向同一个驱动程序创建的下一个设备对象。同一个驱动对象可以创建若干个设备对象,每个设备对象根据N extDevice来连成一个链表,最后一个设备对象的NextDevice域为NULL。

?AttachedDevice:指向附加到此设备对象之上的最近设备对象。这里需要理解分层驱动程序的概念。

?DeviceExtension:指向设备的扩展对象。每个设备都会指定一个设备扩展对象,这个数据结构由驱动程序开发者自行定义,可以用来记录一些与设备相关的一些信息,同时应尽量避免使用全局变量,将数据存放在设备扩展里,具有很大的灵活性。?CurrentIrp:在使用StartIO例程的时候,该成员指向的是当前IRP结构。

?Flags:指定了该设备对象的标记。下面列出了常用的几个标记:

?DeviceType:指定设备的类型。一般在开发虚拟设备时,选择FILE_DEVICE_UNKNOW。其他的请自行参考WDK文档。

?StackSize:在多层驱动情况下,驱动与驱动之间会形成类似堆栈的结构,称之为设备栈。IRP会依次从最高层传递到最底层。StackSize描述的就是该层数。最底层的设备层数为1。

?AlignmentRequirement:在进行大容量传输的时候,往往需要进行内存对齐,以保证传输速度。请使用类似FILE_XXX_AL IGNMENT的方式进行赋值。

下面给大家展示一下DriverEntry的最基本框架:

代码:

这是用C++写的,所以必要的地方加上了extern“C”,否则会引起一些错误,这是因为C++与C在进行名称粉碎的时候处理得不一样,C++这个改进主要是为了实现一些高级功能,比如多态。虽然加上extern “C”会有点麻烦,但可以用上C++那些功能,个人觉得也有所值。如果用C,直接忽略上面的extern “C”。

NTDDK.h是NT式驱动需要加载的头文件,如果是WDM式驱动,那么加载的是WDM.h

#define INITCODE code_seg("INIT")定义一个宏,#prama INITCODE还原后就是#pramacode_seg(“INIT”),表示接下来的代码加载到INIT内存区域中,成功加载后,可以退出内存。对于DriverEntry这种一次性的函数而言,这是最适合的选择,可以节省内存。函数结束后需要显式地切换回来,如:#prama LOCKEDCODE。

同样,PAGECODE表示分页内存,作用是将此部分代码放入分页内存中运行,在里面的代码切换进程上下文时可能会被换回分页文件。LOCKEDCODE表示默认内存,也就是非分页内存,里面的代码常驻内存。IRQL处于DISPATCH_LEVEL或者以上的等级,必须处于非分页内存里面。

同理,对于数据段也有同样的机制,于是有了PAGEDATA、LOCKEDDATA、INITDATA。

KdPrint是一个宏,在调试版本(Checked)里面(具备DBG宏定义),有

代码:

而在正式版本(Free)里面,KdPrint被定义为空。所以可以用来作为调试输出。但注意Kdprint后面是两层括号,用法与C

语言运行库的printf差不多。

pDriverObject->DriverUnload = UnloadRoutine;将卸载例程函数告诉驱动对象,驱动对象在前面已经有定义,这里不做深入讨论。

pDriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchRoutine;注册排遣例程。Windows是消息驱动,而驱动程序是IRP驱动的,I/O管理器将发送到驱动的“消息”封装在IRP里面,驱动程序也将结果告诉IRP。类似windows的消息机制,对于不同的“消息”,驱动程序需要注册不同的处理例程来区别对待,当然也可以放在同一个例程里面,然后用sw itch语句来区别对待,但当处理过程比较长的时候,会比较凌乱。

IRP_MJ_CREATE是当RING3应用程序在使用CreateFile函数建立与驱动程序的通信通道时所激活的。IRP_MJ_READ是ReadFile,IRP_MJ_WRITE是WriteFile,而IRP_MJ_CLOSE是CloseHandle关闭文件句柄的时候产生的。

小知识:对于WDM式驱动,仍需要注册AddDevice例程,pDriverObject->DriverExtension->AddDevice = WDMAddDeviceRou tine,设备对象的初始化将在AddDevice里面进行而不是DriverEntry。另外还需要注册IRP_MJ_PNP排遣函数。

前面有讲到UNICODE_STRING结构,那么这里就可以很好的了解初始化的这两个结构了,忘记的看回前面的,这里只列出RtlIn itUnicodeString函数定义。

代码:

IoCreateDevice是注册设备对象,一个驱动必须对应这一个或多个设备对象。

代码:

?DriverObject:驱动对象的指针,这里用的是入口函数传进来的驱动对象。每个驱动有若干个设备对象,每个设备对象只有一个驱动函数。

?DeviceExtensionSize:自定义的设备扩展的大小。

?DeviceName:设备对象名称,前面有用RtlInitUnicodeString对其进行过初始化。设备对象是暴露在内核层面上的名称,对于RING3层桌面程序是不可见的。格式需为:\Device\[设备名]。如果不指定设备名,I/O管理器将会自动分配一个数字作为

设备名,如:\Device\00000001

?DeviceType:设备类型,这里用FILE_DEVICE_UNKNOWN。

?DeviceCharacteristics:设备对象的特征。

?Exclusive:设置设备对象是否为专用的。也即是否允许有第二个驱动、程序访问这个设备对象。

?DeviceObject:I/O管理器将会负责创建这个设备对象,可以用这个参数来接收该对象的地址。

创建了设备对象,在程序临近结束之际需要用IoDeleteDevice删除设备对象。

pDevObj->Flags |= DO_BUFFERED_IO;是设置访问标志为缓冲模式。

pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;获取设备扩展。

pDevExt->ustrDeviceName = ustrDeviceName;将相关信息保存在设备扩展里面。

设备对象名称只暴露在内核层面,想要在RING3用户层访问驱动程序则需要创建符号链接。符号链接是暴露在用户层面的。注册符号链接用的函数是IoCreateSymbolicLink。

代码:

?SymbolicLinkName:符号链接的字符串,前面有对其初始化。符号链接名需要以\??\开头,或者\DosDevice\(未证实)。而在用户模式下需要以\\.\开头才能找到对应的符号链接。

?DeviceName:设备名的字符串。

注意:创建了符号链接,在程序临近结束之际需要用IoDeleteSymbolicLink删除符号链接。并且先删除符号链接在删除设备对象。

在上面的DriverEntry函数里面,已经完成了基本的初始化工作,接下来,我们看一下卸载回调例程。

回调例程的声明为:

代码:

除了函数名字外,请不要改动其他参数。

在回调函数里面,我们主要进行一些清理工作。

代码:

基本在上面都已经有所描述了。这里还强调一点,一个驱动程序可以有一个或者多个设备对象,在驱动程序完全卸载之前需要删除对应的符号链接、设备对象。所以这里用到了while循环来完成这项工作,不明白的回去上面继续熟悉下设备对象的结构。

这个驱动程序没有做什么工作,所以在排遣函数里面我们只是单纯的设置状态为成功,操作的字节为0,设置IRP状态为完成,就返回了。

代码:

pIrp->IoStatus.Status = status;设置IO状态。

pIrp->https://www.360docs.net/doc/5c3546126.html,rmation = 0;设置实际操作的字节数。用户层函数ReadFile、WriteFile的第四个参数lpNumberOfByt esRead用于接收实际操作的字节数,这个结果就是这样产生的。

IoCompleteRequest设置完成IRP的处理,否则会继续往下层传递。

整一个框架都已基本介绍完毕了,下面贴上完整的代码吧。

代码:

windows驱动开发和调试环境搭建

Windows驱动开发和环境搭建 【文章标题】: Windows驱动开发和调试的环境设置 【文章作者】: haikerenwu 【使用工具】: VC6.0,VMware6.0.3,Windbg 【电脑配置】: 惠普笔记本xp sp3 (一)VMWare安装篇 VMWare的安装一路Next即可,关于其序列号,百度一下就能找到,虚拟机安装完成之后,需要安装操作系统,我在虚拟机中安装的是windows xp sp2系统。 点击“文件”----“新建”----“虚拟机” 进入新建虚拟机的向导,配置虚拟系统参数

选择虚拟系统文件的兼容格式(新手推荐选择默认选项) 按照默认设置继续点击下一步,选择好您需要的操作系统,此处我选择的是Windows XP Prefessional。 设置虚拟机名称和虚拟操作系统安装路径,我单独空出来一个F 盘,将虚拟机和虚拟操作系统全部装在该盘。

配置网络模式(推荐选择NA T,一般主机不用做任何的设置虚拟机就可以利用主机上网)。 配置虚拟磁盘的容量。在这里可以直接单击完成,来完成基本操作设置,磁盘默认空间是8GB,用户可以根据自己的实际使用情况来调整大小,也可以自定义分区。

操作完成之后,在“VM”菜单下有个“setting。。。”菜单,点击此菜单,在CD-ROM中选择合适的选项,我使用的是Use ISO image 选项,将我的xp sp2操作系统的ISO映像路径设置好,安装操作系统。点击ok之后,启动虚拟机,即开始安装操作系统,安装过程跟普通装机过程相同。安装完成之后,启动操作系统,然后在VM菜单下点击“Install VMWare Tools”,把虚拟操作系统的驱动装好。 (二)VMWare设置篇

windows服务大全

windows服务大全 一、什么是系统服务 在Windows 2000/XP/2003系统中,服务是指执行指定系统功能的程序、例程或进程,以便支持其他程序,尤其是低层(接近硬件)程序。通过网络提供服务时,服务可以在Active Directory(活动目录)中发布,从而促进了以服务为中心的管理和使用。 服务是一种应用程序类型,它在后台运行。服务应用程序通常可以在本地和通过网络为用户提供一些功能,例如客户端/服务器应用程序、Web服务器、数据库服务器以及其他基于服务器的应用程序。 二、配置和管理系统服务 通过上面的阅读,相信你已对Windows系统服务有所了解,与系统注册表类似,对系统服务的操作,我们可以通过“服务管理控制台”来实现。 以管理员或Administrators组成员身份登录,单击“开始→运行”菜单项,在出现的对话框中键入“Services.msc”并回车,即可打开“服务管理控制台”。你也可以单击“开始→控制面板→性能和维护→管理工具→服务”选项来启动该控制台。 在服务控制台中,双击任意一个服务,就可以打开该服务的属性对话框。在这里,我们可以对服务进行配置、管理操作,通过更改服务的启动类型来设置满足自己需要的启动、关闭或禁用服务。 在“常规”选项卡中,“服务名称”是指服务的“简称”,并且也是在注册表中显示的名称;“显示名称”是指在服务配置界面中每项服务显示的名称;“描述”是为该服务作的简单解释;“可执行文件的路

径”即是该服务对应的可执行文件的具体位置;“启动类型”是整个服务配置的核心,对于任意一个服务,通常都有3种启动类型,即自动、手动和已禁用。只要从下拉菜单中选择就可以更改服务的启动类型。“服务状态”是指服务的现在状态是启动还是停止,通常,我们可以利用下面的“启动”、“停止”、“暂停”、“恢复”按钮来改变服务的状态。 下面让我们来看看3种不同类型的启动状态: 自动:此服务随着系统启动时启动,它将延长启动所需要的时间,有些服务是必须设置为自动的,如Remote Procedure Call(RPC)。由于依存关系或其他影响,其他的一些服务也必须设置为自动,这样的服务最好不要去更改它,否则系统无法正常运行。 手动:如果一个服务被设置为手动,那么可以在需要时再运行它。这样可以节省大量的系统资源,加快系统启动。 已禁用:此类服务不能再运行。这个设置一般在提高系统安全性时使用。如果怀疑一个陌生的服务会给你的系统带来安全上的隐患,可以先尝试停止它,看看系统是否能正常运行,如果一切正常,那么就可以直接禁用它了。如果以后需要这个服务,在启动它之前,必须先将启动类型设置为自动或手动。 单击“依存关系”选项卡,在这里我们可以看到,在顶端列表中指出运行选定服务所需的其他服务,底端列表指出了需要运行选定服务才能正确运行的服务。它说明了一些服务并不能单独运行,必须依靠其他服务。在停止或禁用一个服务之前,一定要看看这个服务的依存关系,

设备驱动程序

驱动程序 驱动程序一般指的是设备驱动程序(Device Driver),是一种可以使计算机和设备通信的特殊程序。相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。 因此,驱动程序被比作“硬件的灵魂”、“硬件的主宰”、和“硬件和系统之间的桥梁”等。 中文名 驱动程序 外文名 Device Driver 全称 设备驱动程序 性质 可使计算机和设备通信的特殊程序 目录 1定义 2作用 3界定 ?正式版 ?认证版 ?第三方 ?修改版 ?测试版 4驱动程序的开发 ?微软平台 ?Unix平台 5安装顺序 6inf文件 1定义 驱动程序(Device Driver)全称为“设备驱动程序”,是一种可以使计算机和设备通信的特殊程序,可以说相当于硬件的接口,操作系统只能通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。 惠普显卡驱动安装 正因为这个原因,驱动程序在系统中的所占的地位十分重要,一般当操作系统安装完毕后,首要的便是安装硬件设备的驱动程序。不过,大多数情况下,我们并不需要安装所有硬件设备的驱动程序,例如硬盘、显示器、光驱等就不需要安装驱动程序,而显卡、声卡、扫描仪、摄像头、Modem等就需要安装驱动程序。另外,不同版本的操作系统对硬件设

备的支持也是不同的,一般情况下版本越高所支持的硬件设备也越多,例如笔者使用了Windows XP,装好系统后一个驱动程序也不用安装。 设备驱动程序用来将硬件本身的功能告诉操作系统,完成硬件设备电子信号与操作系统及软件的高级编程语言之间的互相翻译。当操作系统需要使用某个硬件时,比如:让声卡播放音乐,它会先发送相应指令到声卡驱动程序,声卡驱动程序接收到后,马上将其翻译成声卡才能听懂的电子信号命令,从而让声卡播放音乐。 所以简单的说,驱动程序提供了硬件到操作系统的一个接口以及协调二者之间的关系,而因为驱动程序有如此重要的作用,所以人们都称“驱动程序是硬件的灵魂”、“硬件的主宰”,同时驱动程序也被形象的称为“硬件和系统之间的桥梁”。 戴尔电脑驱动盘 驱动程序即添加到操作系统中的一小块代码,其中包含有关硬件设备的信息。有了此信息,计算机就可以与设备进行通信。驱动程序是硬件厂商根据操作系统编写的配置文件,可以说没有驱动程序,计算机中的硬件就无法工作。操作系统不同,硬件的驱动程序也不同,各个硬件厂商为了保证硬件的兼容性及增强硬件的功能会不断地升级驱动程序。如:Nvidia显卡芯片公司平均每个月会升级显卡驱动程序2-3次。驱动程序是硬件的一部分,当你安装新硬件时,驱动程序是一项不可或缺的重要元件。凡是安装一个原本不属于你电脑中的硬件设备时,系统就会要求你安装驱动程序,将新的硬件与电脑系统连接起来。驱动程序扮演沟通的角色,把硬件的功能告诉电脑系统,并且也将系统的指令传达给硬件,让它开始工作。 当你在安装新硬件时总会被要求放入“这种硬件的驱动程序”,很多人这时就开始头痛。不是找不到驱动程序的盘片,就是找不到文件的位置,或是根本不知道什么是驱动程序。比如安装打印机这类的硬件外设,并不是把连接线接上就算完成,如果你这时候开始使用,系统会告诉你,找不到驱动程序。怎么办呢参照说明书也未必就能顺利安装。其实在安装方面还是有一定的惯例与通则可寻的,这些都可以帮你做到无障碍安装。 在Windows系统中,需要安装主板、光驱、显卡、声卡等一套完整的驱动程序。如果你需要外接别的硬件设备,则还要安装相应的驱动程序,如:外接游戏硬件要安装手柄、方向盘、摇杆、跳舞毯等的驱动程序,外接打印机要安装打印机驱动程序,上网或接入局域网要安装网卡、Modem甚至ISDN、ADSL的驱动程序。说了这么多的驱动程序,你是否有一点头痛了。下面就介绍Windows系统中各种的不同硬件设备的驱动程序,希望能让你拨云见日。 在Windows 9x下,驱动程序按照其提供的硬件支持可以分为:声卡驱动程序、显卡驱动程序、鼠标驱动程序、主板驱动程序、网络设备驱动程序、打印机驱动程序、扫描仪驱动程序等等。为什么没有CPU、内存驱动程序呢因为CPU和内存无需驱动程序便可使用,不仅如此,绝大多数键盘、鼠标、硬盘、软驱、显示器和主板上的标准设备都可以用Windows 自带的标准驱动程序来驱动,当然其它特定功能除外。如果你需要在Windows系统中的DOS 模式下使用光驱,那么还需要在DOS模式下安装光驱驱动程序。多数显卡、声卡、网卡等内置扩展卡和打印机、扫描仪、外置Modem等外设都需要安装与设备型号相符的驱动程序,否则无法发挥其部分或全部功能。驱动程序一般可通过三种途径得到,一是购买的硬件附

Windows驱动开发培训

Windows驱动开发培训 培训流程: 一、基础知识 在开始驱动开发之前,您应该知道操作系统原理以及驱动程序是如何在操作系统中进行工作的,了解这些基本原理将有助于您做出正确的设计决策并简化您的开发过程。 1、了解Windows操作系统构造\\ 可以链接进去 2、安装WDK,参考相关文档,熟悉WDK的内容\\ 可以链接进去 二、Windows驱动开发\\ 可以链接进去 一、基础知识 在开始驱动开发之前,您应该知道操作系统原理以及驱动程序是如何在操作系统中进行工作的,了解这些基本原理将有助于您做出正确的设计决策并简化您的开发过程。 1、了解Windows操作系统构造 (1)培训目标 深入了解Windows操作系统的系统结构以及工作原理 (2)培训内容 阅读书籍《深入解析Windows操作系统》的第3、4、6、7、9章,重点关注第九章“I/O系统” (3)培训任务 ①掌握Windows操作系统的系统结构 ②理解ISR、IRP、IRQL、DCP等概念的含义 ③了解注册表的用法,掌握注册表数据的查看和修改方法 ④了解进程和线程的内部机理以及线程的调度策略 ⑤了解I/O系统的内容,理解I/O请求以及I/O处理过程 注:以上相关内容,请在一周内完成。

2、安装WDK,参考相关文档,熟悉WDK的内容 (1)培训目标 了解WDK的安装过程,熟悉WDK的编译环境,掌握如何使用WDK的相关帮助文档;了解WDM驱动程序的基本结构 (2)培训内容 ①.阅读文档\\10.151.131.12\book\windows\MSWDM.chm,掌握WDM驱动程序的基本结构以及基本的编程技术。 ②.参考WDK的帮助文档:WDK documentation ,了解WDK的基本内容 (3)培训任务 ①理解分层驱动结构的含义,掌握设备和驱动程序的层次结构 ②理解“驱动对象”和“设备对象”的概念 ③理解2个基本例程:DriverEntry 和addDevice ④了解IRP的结构以及IRP处理的流程 ⑤初步了解I/O的控制操作 注:以上相关内容,请在一周内完成。 二、Windows驱动开发 学习如何基于WDK进行驱动程序的开发 1、培训目标 (1)学会根据WDK开发一个基本的Windows驱动程序和测试程序 (2)学会利用不同的IOCTL方式在内核模式和用户模式之间进行通讯 (3)学会如何在内核模式下和用户模式下访问注册表 (4)利用WinDbg跟踪程序,学会使用WinDbg进行调试 2、培训内容 (1)阅读\src\general\ioctl中的示例代码 (2)build并运行应用程序和驱动程序

用C语言编写Windows服务程序的五个步骤

用C语言编写Windows服务程序的五个步骤 https://www.360docs.net/doc/5c3546126.html,/Article/kfyy/cyy/jszl/200603/3842.html Windows 服务被设计用于需要在后台运行的应用程序以及实现没有用户交互的任务。为了学习这种控制台应用程序的基础知识,C(不是C++)是最佳选择。本文将建立并实现一个简单的服务程序,其功能是查询系统中可用物理内存数量,然后将结果写入一个文本文件。最后,你可以用所学知识编写自己的 Windows 服务。 当初我写第一个NT 服务时,我到 MSDN 上找例子。在那里我找到了一篇Nigel Thompson 写的文章:“Creating a Simple Win32 Service in C++”,这篇文章附带一个 C++ 例子。虽然这篇文章很好地解释了服务的开发过程,但是,我仍然感觉缺少我需要的重要信息。我想理解通过什么框架,调用什么函数,以及何时调用,但 C++ 在这方面没有让我轻松多少。面向对象的方法固然方便,但由于用类对底层 Win32 函数调用进行了封装,它不利于学习服务程序的基本知识。这就是为什么我觉得 C 更加适合于编写初级服务程序或者实现简单后台任务的服务。在你对服务程序有了充分透彻的理解之后,用 C++ 编写才能游刃有余。当我离开原来的工作岗位,不得不向另一个人转移我的知识的时候,利用我用 C 所写的例子就非常容易解释 NT 服务之所以然。 服务是一个运行在后台并实现勿需用户交互的任务的控制台程序。Windows NT/2000/XP 操作系统提供为服务程序提供专门的支持。人们可以用服务控制面板来配置安装好的服务程序,也就是 Windows 2000/XP 控制面板|管理工具中的“服务”(或在“开始”|“运行”对话框中输入 services.msc /s——译者注)。可以将服务配置成操作系统启动时自动启动,这样你就不必每次再重启系统后还要手动启动服务。 本文将首先解释如何创建一个定期查询可用物理内存并将结果写入某个文本文件的服务。然后指导你完成生成,安装和实现服务的整个过程。 第一步:主函数和全局定义 首先,包含所需的头文件。例子要调用 Win32 函数(windows.h)和磁盘文件写入(stdio.h): 接着,定义两个常量:

C#编写的windows服务用命令行安装的详细步骤

第一步:建立好服务,写好代码 第二步:安装 步骤:win+R -----→CMD -------输入microsoft的framework的相应版本的执行程序位置(如:C:\Windows\https://www.360docs.net/doc/5c3546126.html,\Framework\v4.0.30319\InstallUtil.exe -----图一所示文件)-→空一格再输入你的服务的执行文件的路径(如:D:\zt_documents\服务\SSY.DealerLoginStateService.root\SSY.DealerLoginStateService\SSY.LoginStateService\SSY.LoginSt ateService\bin\Debug\XX.exe(这里的.exe写自己的项目的名称) 图三所示文件)--→回车(如果安装成功可以都到如图2所示的提示)

图一

图二

图三 第三步:启动服务 打开服务管理,找到你自己的服务启动 第四步:卸载 步骤:win+R -----→CMD -------输入microsoft的framework的相应版本的执行程序位置(如:C:\Windows\https://www.360docs.net/doc/5c3546126.html,\Framework\v4.0.30319\InstallUtil.exe -u -----图一所示文件)-→空一格再输入-u -→空一格再输入你的服务的执行文件的路径(如:D:\zt_documents\服务\SSY.DealerLoginStateService.root\SSY.DealerLoginStateService\SSY.LoginStateService\SSY.LoginSt

Windows驱动开发入门

接触windows驱动开发有一个月了,感觉Windows驱动编程并不像传说中的那么神秘。为了更好地为以后的学习打下基础,记录下来这些学习心得,也为像跟我一样致力于驱动开发却苦于没有门路的菜鸟朋友们抛个砖,引个玉。 我的开发环境:Windows xp 主机+ VMW ARE虚拟机(windows 2003 server系统)。编译环境:WinDDK6001.18002。代码编辑工具:SourceInsight。IDE:VS2005/VC6.0。调试工具:WinDBG,DbgView.exe, SRVINSTW.EXE 上面所有工具均来自互联网。 对于初学者,DbgView.exe和SRVINSTW.EXE是非常简单有用的两个工具,一定要装上。前者用于查看日志信息,后者用于加载驱动。 下面从最简单的helloworld说起吧。Follow me。 驱动程序的入口函数叫做DriverEntry(PDRIVER_OBJECT pDriverObj,PUNICODE_STRING pRegisgryString)。两个参数,一个是驱动对象,代表该驱动程序;另一个跟注册表相关,是驱动程序在注册表中的服务名,暂时不用管它。DriverEntry 类似于C语言中的main函数。它跟main的差别就是,main完全按照顺序调用的方法执行,所有东西都按照程序员预先设定的顺序依次发生;而DriverEntry则有它自己的规则,程序员只需要填写各个子例程,至于何时调用,谁先调,由操作系统决定。我想这主要是因为驱动偏底层,而底层与硬件打交道,硬件很多都是通过中断来与操作系统通信,中断的话就比较随机了。但到了上层应用程序,我们是看不到中断的影子的。说到中断,驱动程序中可以人为添加软中断,__asm int 3或者Int_3();前者是32位操作系统用的,后者是64位用的。64位驱动不允许内嵌汇编。下面是我的一个helloworld的源码:

Windows服务

Windows 服务应用程序介绍 Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。有关服务和 Windows 会话的更多信息,请参见MSDN Online 的 Platform SDK 文档中的“About Services”部分。 注意Windows 服务应用程序项目模板和相关的功能在 Visual Basic 和 Visual C# .NET 的标准版中不可用。有关更多信息,请参见Visual Basic 标准版功能或Visual C# 标准版的功能。 通过创建作为服务安装的应用程序,可以轻松地创建服务。例如,假设要监视性能计数器数据并对阈值做出反应。可以编写一个侦听性能计数器数据的 Windows 服务应用程序、部署该应用程序并开始收集和分析数据。 将服务创建为 Microsoft Visual Studio .NET 项目,并在其中定义特定代码,以控制可以发送到服务的命令和接收到这些命令时采取的操作。可以发送到服务的命令包括开始、暂停、继续和停止该服务,以及执行自定义命令。 创建并生成了应用程序后,可以通过运行命令行实用工具InstallUtil.exe 并将路径传递给服务的可执行文件,或通过使用 Visual Studio 的部署功能来安装该应用程序。然后可以使用服务控制管理器启动、停止、暂停、继续和配置服务。这些任务中有许多也可以在“服务器资源管理器”的“服务”节点中或通过使用ServiceController类来实现。 服务应用程序与其他 Visual Studio .NET 应用程序对比 服务应用程序与其他许多项目类型的功能在几个方面有所不同: ?必须将服务应用程序项目创建的已编译可执行文件安装在服务器上,此项目才能以有意义的方式运行。不能通过按 F5 键或 F11 键来调试或运行服务应 用程序;不能立即运行服务或进入并单步执行其代码。相反,必须安装和启动服务,然后将一个调试器附加到服务的进程中。有关更多信息,请参见调试 Windows 服务应用程序。 ?与一些类型的项目不同,对于服务应用程序,必须为其创建安装组件。安装组件在服务器上安装和注册服务,并用 Windows 服务控制管理器为服务创 建一个项。有关更多信息,请参见将安装程序添加到服务应用程序。

操作系统与驱动开发试题

河北科技大学硕士学位研究生 2014——2015学年第1学期 《操作系统与驱动开发》课程期末考试试卷 学院信息学院专业电路与系统姓名程莉学号 2201414007 题号一二三四五六总分 得分 一.单项选择题(每小题1分,共10分) 1.操作系统的 D 管理部分负责对进程进行调度。 A.主存储器 B.控制器 C.运算器 D.处理机 2.分时操作系统通常采用 B 策略为用户服务。 A.可靠性和灵活性 B.时间片轮转 C.时间片加权分配 D.短作业优先 3.很好地解决了“零头”问题的存储管理方法是 A 。 A 页式存储管理 B 段式存储管理 C 多重分区管理 D 可变式分区管理 4.用WAIT、SIGNAL操作管理临界区时,信号量的初值应定义为 B 。 A.-1 B.0 C.1 D.任意值 5.在进程管理中,当 C 时,进程从阻塞状态变为就绪状态。 A.进程被进程调度程序选中 B.等待某一事件 C.等待的事件发生 D.时间片用完 6.某系统中有3个并发进程,都需要同类资源4个,试问该系统不会发生死锁的最少资源数 B 。 A.9 B.10 C.11 D.12 7.虚拟存储器管理系统的基础是程序的 B 理论。 A.全局性 B.局部性 C. 动态性 D.虚拟性 8.从用户的角度看,引入文件系统的主要目的是 D A.实现虚拟存储 B.保存系统文档

C.保存用户和系统文档 D.实现对文件的按名存取 9.操作系统中采用多道程序设计技术提高CPU和外部设备的 A A.利用率 B.可靠性 C.稳定性 D.兼容性 10.缓冲技术中缓冲池在 C 中。 A.主存 B. 外存 C. ROM D. 时间片轮转 二.填空(每空0.5分,共15分)。 11.进程存在的唯一标志是PCB 。 12.通常进程实体是由程序块、进程控制块和数据块三部分组成。 13.磁盘访问时间由寻道时间、旋转延迟时间和传输时间组成。 14.作业调度是从后备作业队列中选一些作业,为它们分配资源,并为它们创建进程。 15.文件的物理组织有顺序、链接和索引。 16.若一个进程已经进入临界区,则其它欲要进入临界区的进程必须___等待____。 17.信号量的物理意义是,当信号量值大于零时其值表示可分配资源的个数;当信号 量值小于零时,其绝对值表示等待使用该资源的进程的个数。 18.静态重定位在程序装入时进行; 而动态重定位在程序运行时进行。 19.分区管理中采用“最佳适应”分配算法时,宜把空闲区按长度递增次序登记在空闲 区表中。 20.所谓系统调用,就是用户在程序中调用操作系统所提供的一些子功能。 21.把逻辑地址映射为物理地址的工作称为地址映射。 22.设备管理中采用的数据结构有设备控制表、控制器控制表、通道控制表、 系统设备表等四种。 23.从资源管理(分配)的角度,I/O设备可分为独占设备、共享设备和虚 拟设备三种。 24.设备与控制器之间的接口信号主要包括数据、状态和控制。 25.DMA控制器由三部分组成,分别为主机与DMA控制器的接口、 DMA控制器与块设备的接 口和 I/O控制逻辑。 三.名词解释(每小题2.5分,共10分)。 26.虚拟存储器 答:虚拟存储器是指在具有层次结构存储器的计算机系统中,自动实现部分装入和部分替换功能,能从逻辑上为用户提供一个比物理贮存容量大得多,可寻址的“主存储器”。

Windows应用程序设计大纲

Windows应用程序设计 学时:总学时54;理论36;实验18 学分:3 适用对象:信息管理与信息系统、计算机科学与技术、软件工程专业 先修课程:《C++程序设计》 考核方式:本课程采用期末考核与平时成绩相结合的方式进行成绩评定,平时成绩占40%,期末考核成绩占60%。平时成绩包括作业、实验报告与上课表现,期末考核为闭卷笔试方式。 一、课程的性质与任务 《Windows应用程序设计》是为计算机科学与信息工程系各专业开设的一门专业基础课。该课程以面向对象程序开发理论为基础,具有较强的理论性、实践性和实用性。该课程的主要任务是讲授利用MFC进行Windows应用程序设计的基本原理和方法,并向学生灌输框架编程的核心思想,从而为今后开发实用性较强的软件系统打下坚实基础。 二、教学目的与基本要求 本课程的目的是使学生深刻理解框架编程的思想,学会MFC的常用类的用法,并能够开发出一般功能的Windows应用程序,进一步提高学生实际编程和用程序解决问题的能力。 教学中要求学生掌握Windows应用程序的基础概念、术语;理解Windows应用程序框架的封装原理;深刻理解VC提供的“文档/视图”结构框架;掌握MFC类库提供的常用类在窗口中绘制图形;熟练掌握鼠标、键盘消息处理的方法;熟练掌握资源的使用方法;掌握MFC的文件处理机制;熟练掌握对话框及控件的编程方法;了解应用程序中进程与线程的管理方法;学会用MFC设计数据库应用程序。 理论教学部分 理论课学时:36 使用教材及主要参考书: 1、使用教材: 任哲等编著,《MFC Windows应用程序设计》,清华大学出版社,2004年 2、主要参考书: 候俊杰,《深入浅出MFC》第二版,华中科技大学出版社,2001年 陈志泊等编著,《Visual C++ 6.0程序设计》,中国铁道出版社,2005年 一、学时分配 章节课程内容学时 1 Windows应用程序基础知识 2 2 Windows应用程序的类封装 2 3 MFC应用程序框架 2

Windows驱动程序开发环境配置

Windows驱动程序开发笔记 一、WDK与DDK环境 最新版的WDK 微软已经不提供下载了这里:https://https://www.360docs.net/doc/5c3546126.html,/ 可以下并且这里有好多好东东! 不要走进一个误区:下最新版的就好,虽然最新版是Windows Driver Kit (WDK) 7_0_0,支持windows7,vista 2003 xp等但是它的意思是指在windows7操作系统下安装能编写针对windows xp vista的驱动程序, 但是不能在xp 2003环境下安装Windows Driver Kit (WDK) 7_0_0这个高版本,否则你在build的时候会有好多好多的问题. 上文build指:首先安装好WDK/DDK,然后进入"开始"->"所有程序"->"Windows Driver Kits"->"WDK XXXX.XXXX.X" ->"Windows XP"->"x86 Checked Build Environment"在弹出来的命令行窗口中输入"Build",让它自动生成所需要的库 如果你是要给xp下的开发环境还是老老实实的找针对xp的老版DDK吧,并且xp无WDK 版只有DDK版build自己的demo 有个常见问题: 'jvc' 不是内部或外部命令,也不是可运行的程序。 解决办法:去掉build路径中的空格。 二、下载 WDK 开发包的步骤 1、访问Microsoft Connect Web site站点 2、使用微软 Passport 账户登录站点 3、登录进入之后,点击站点目录链接 4、在左侧的类别列表中选择开发人员工具,在右侧打开的类别:开发人员工具目录中找到Windows Driver Kit (WDK) and Windows Driver Framework (WDF)并添加到您的控制面板中 5、添加该项完毕后,选择您的控制面板,就可以看到新添加进来的项了。 6、点击Windows Driver Kit (WDK) and Windows Driver Framework (WDF),看到下面有下载链接,OK,下载开始。下载后的文件名为: 6.1.6001.18002.081017-1400_wdksp-WDK18002SP_EN_DVD.iso将近600M大小。

C# Windows服务开发

一、VS2012下开发Windows服务 1、打开VS2012,新建项目,选择Windows服务,此处我以开发一个定时自动发送邮件的服务来做介绍,如下图: 2、创建好后,编译器会自动创建一些文件,其中会有一个Service1类文件,该文件是服务的关键,我们可以将其重命名,这里我将其命名为MainService,如下图: 3、在MainService的后台代码中会自动创建一些方法,包括服务的启动和停止方法等,如下图:

4、将服务启动时要执行的操作放在OnStart方法中,服务停止时要执行的操作放在OnStop方法中 5、在MainService.cs设计器中,单击邮件,选择选择添加安装程序,便会生成一个ProjectInstaller.cs的文件,如图所示: 6、设置ProjectInstaller.cs的属性,切换到属性设置界面 (1)选择serviceInstaller1,并设置相应属性如下图所示:

其中:Description属性用于设置服务安装之后再服务界面上显示的描述信息; DisplayName属性用于设置服务安装之后再服务界面上显示的服务名称; ServiceName属性用于设置服务的名称,此名称必须与ServiceBase类的ServiceName 属性设置的名称一致,该名称用于系统标识此服务,可以理解成DisplayName为ServiceName的别名; StartType属性用于设置服务的启动方式。 (2)选择serviceProcessInster1,设置其属性如下:

此处主要设置Account属性,该属性用来指示运行该服务时的账户类型,一般设置为LocalSystem。 7、到此步一个简单的windows服务就创建好了,编译程序会生成一个EmailService.exe 的可执行文件,接下来便是安装服务了。 Windows服务的安装有多种方式,比如可以再cmd下调用命令来安装,也可以写一个安装程序来安装,此处介绍使用bat批处理来安装。 1、安装Windows服务需要用到InstallUtil.exe程序,该程序位于: C:\Windows\https://www.360docs.net/doc/5c3546126.html,\Framework64\v4.0.30319 .NET4.0 C:\Windows\https://www.360docs.net/doc/5c3546126.html,\Framework64\v2.0.50727 .NET2.0 2、我们可以再批处理命令中直接调用以上目录中的InstallUtil.exe程序,也可以将该程序拷贝到应用程序的目录下,此处我选择奖该程序拷贝到应用程序的目录下,同时将批处理文件也创建在应用程序的的目录下,如下图所示:

Windows程序设计题

《Windows程序设计》模拟题 一.单项选择题 1. 在VC++中,项目文件的扩展名是(B)。 A)exe B)dsp C)dsw D)cpp 2. 在MFC中,利用ClassWizard不能(D)。 A)建立新类B)进行消息映射 C)增加类的成员变量D)插入资源 3. 当滑块滑动时,滑块条控件将发送滚动消息来通知父窗口,垂直滑动条发送(C)消息。 A)WM_CHAR B)WM_HSCROLL C)WM_VSCROLL D)WM_CHANGE 4. 更新菜单状态的消息是( C )。 A)WM_COMMAND B)UPDATE C)UPDATE_COMMAND_UI D)INVALIDATE 5. 对于消息队列描述正确的是( D ) A)在Windows中只有一个消息系统,即系统消息队列。消息队列是一个系统定义的数据结构,用于临时存储消息。 B)系统可从消息队列将信息直接发给窗口。另外,每个正在Windows下运行的应用程序都有自己的消息队列。 C)系统消息队列中的每个消息最终都要被USER模块传送到应用程序的消息队列中去。 应用程序的消息对列中存储了程序的所有窗口的全部消息。 D)以上都正确 6. 在MFC中,所有的控件都是(B)类的派生类,都可以作为一个特殊的窗口来处理。 A)CView B)CWnd C)CWindow D)CDialog 7. 使用GetDC()获取的设备上下文在退出时,必须调用(A)释放设备上下文。 A)ReleaseDC() B)delete() C)DeleteDC() D)Detach() 8. 希望菜单无效,应该用CCmdUI类的(A)成员函数。 A)Enable B)SetRadio C)SetCheck D)SetText 9. 希望菜单前出现一个“√”,应该用CCmdUI类的(C)成员函数。 A)Enable B)SetRadio C)SetCheck D)SetText 10. 下面(A)不是MFC设备环境类CDC类的派生类。 A)GDI B)CPaintDC C)CClientDC D)CWindowDC 11. 在MFC中,所有的文档类都派生于(C),所有的视图类都派生于(A)。 A)CView B)CWindow C)CDocument D)CFormView 12. 采用C++进行绘图时,(B)用于指定图形的填充样式,(A)用于指定图形的边框样式。

Windows服务开发实例

C#Windows服务程序开发实例介绍 C#Windows服务程序开发实例程序的目的和用途: 很多开机启动程序仅仅加在启动项里面,只有登陆后才真正启动。windows服务在开机未进行用户登录前就启动了。正是利用这一点,解决一些服务器自动重启后特定软件也自动启动的问题。 C#Windows服务程序开发1. 新建一个服务项目 visual C#----windows----windows服务; C#Windows服务程序开发2. 添加一个dataset(.xsd),用于存储启动目标的路径,日志路径等。 在dataset可视化编辑中,添加一个datatable,包含两列 StartAppPath 和LogFilePath。分别用于存储目标的路径、日志路径。 我认为利用dataset.xsd存储配置参数的优势在于可以忽略xml解析的具体过程直接使用xml文件。 在dataset中提供了ReadXml方法用于读取xml文件并将其转换成内存中的一张datatable表,数据很容易取出来!同样,WriteXml方法用于存储为xml格式的文件,也仅仅需要一句话而已。 C#Windows服务程序开发3. program.cs文件作为程序入口,代码如下: https://www.360docs.net/doc/5c3546126.html,ing ; https://www.360docs.net/doc/5c3546126.html,ing System.ServiceProcess; https://www.360docs.net/doc/5c3546126.html,ing System.Text; https://www.360docs.net/doc/5c3546126.html,space WindowsServices_AutoStart 5.{ 6.static class Program 7.{ 8./// ﹤summary﹥ 9./// 应用程序的主入口点。 10./// ﹤/summary﹥ 11.static void Main() 12.{ 13.ServiceBase[] ServicesToRun;

MFC Windows应用程序设计复习题2

第9章MFC的文件处理机制 1) 文档负责将数据存储到磁盘中,存取过程称为(D) 。 A. 文件访问 B. 格式化 C. 文件读写 D. 串行化 2) 一个CArchive 类对象必须与一个( C ) 对象相关联。 A. CObject B. CFileDialog C. CFile类 D. CDocument 3) 不能将Newfile 文件的文件指针定位在文件头的方法是( B ) 。 A. Newfile.Open("MyFile.txt", CFile::modeCreate) B. NewFile::Seek( 0L, CFile::end) C. Newfile.SeekT oBegin() D. Newfile.Seek(0L, CFile::begin) 4)( A )函数用于获取指定文件的文件名。 A. GetFileName() B. GetStatus() C. GetFilePath() D. GetFileTitle() 5) 当应用程序读取或写入文件时,文档对象的( )函数被调用,并将( )对象作为参数传递。 6) ( CArchive )类是一个对象数组类,它可以存放任何从CObject 派生出的对象,还可以根据元素的数量动态地调整自己的大小。 7) 在Visual C++中,数据文件的操作通常按照( 打开) 、( 操作) 、( 关闭) 的步骤进行。 8) 写出以读写方式打开文件student.txt 的语句序列( File.Open(“student.txt”,CFile:modeReadWrite); ) 。 10)什么是序列化? 答:序列化是面向对象程序设计中应对象这种数据的存储和恢复的要求而产生的一种文件读写机制。 第11章对话框 1. 在对话框的编辑器中,最左边的按键的作用是(B )。 A. 激活对话框编辑功能 B. 测试对话框 C. 控件左对齐 D. 控件垂直居中

WINDOWS驱动编程

WDM驱动程序开发之读写设备寄存器:KIoRange类 2009-11-09 14:05 WDM驱动程序开发之读写设备寄存器:KIoRange类收藏 KIoRange类: 一、Overview KIoRange类将一系列特殊的外围总线的地址映射到CPU总线的地址空间。CPU总线上的地址即可能在CPU的I/O空间,也可能在CPU的内存空间,这取决于平台和外围总线的控制方式。考虑到可移植性,所有对I/O周期(I/O cycle)进行译码的设备驱动程序必须用这个类对I/O的位置(location)进行正确的访问(access)。KIoRange是KPeripheralAddress类的派生类。 一旦映射关系建立起来,驱动程序就用KIoRange类的成员函数去控制设备的I/O寄存器。这个类提供了8位、16位和32位I/O访问控制的函数。这些函数是以内联(in-line)函数方式来使用的,它们调用系统内相应的宏来产生依赖于平台的代码。 对I/O位置(location)进行访问的另一种备选方案是创建一个KIoRegister 的实例。这要通过取得一个KIoRange对象的数组元素来实现。 为了访问一系列外围总线内存空间的地址,需要用KMemoryRange类。 二、Member Functions 1、KIoRange - Constructor (4 forms) 构造函数 【函数原型】 FORM 1: KIoRange( void ); FORM 2: (NTDDK Only) KIoRange( INTERFACE_TYPE IntfType, ULONG BusNumber , ULONGLONG BaseBusAddress, ULONG Count, BOOLEAN MapToSystemVirtual =TRUE ); FORM 3 (WDM): KIoRange( ULONGLONG CpuPhysicalAddress, BOOLEAN InCpuIoSpace, ULONG Count, BOOLEAN MapToSystemVirtual =TRUE

Windows服务编写原理及探讨

Windows服务编写原理及探讨 有那么一类应用程序,是能够为各种用户(包括本地用户和远程用户)所用的,拥有用户授权级进行管理的能力,并且不论用户是否物理的与正在运行该应用程序的计算机相连都能正常执行,这就是所谓的服务了。 (一)服务的基础知识 Question 1. 什么是服务?它的特征是什么? 在NT/2000中,服务是一类受到操作系统优待的程序。一个服务首先是一个Win32可执行程序,如果要写一个功能完备且强大的服务,需要熟悉动态连接库(Dlls)、结构异常处理、内存映射文件、虚拟内存、设备I/O、线程及其同步、Unicode以及其他的由WinAPI函数提供的应用接口。当然本文讨论的只是建立 一个可以安装、运行、启动、停止的没有任何其他功能的服务,所以无需上述知识仍可以继续看下去,我会在过程中将理解本文所需要的知识逐一讲解。 第二要知道的是一个服务决不需要用户界面。大多数的服务将运行在那些被锁在某些黑暗的,冬暖夏凉的小屋子里的强大的服务器上面,即使有用户界面一般也没有人可以看到。如果服务提供任何用户界面如消息框,那么用户错过这些消息的可能性就极高了,所以服务程序通常以控制台程序的形式被编写,进 入点函数是main()而不是WinMain()。 也许有人有疑问:没有用户界面的话,要怎样设置、管理一个服务?怎样开始、停止它?服务如何发出警告或错误信息、如何报告关于它的执行情况的统计数据?这些问题的答案就是服务能够被远程管理, Windows NT/2000提供了大量的管理工具,这些工具允许通过网络上的其它计算机对某台机器上面的服务进行管理。比如Windows 2000里面的“控制台”程序(mmc.exe),用它添加“管理单元”就可以管理本机或其他机器上的服务。

Windows 内核技术与驱动开发笔记(完整版)

Windows 内核技术与驱动开发笔记 1.简述Driver Entry例程 动程序的某些全局初始化操作只能在第一次被装入时执行一次,而Driver Entry例程就是这个目的。 * Driver Entry是内核模式驱动程序主入口点常用的名字。 * Driver Entry的第一个参数是一个指针,指向一个刚被初始化的驱动程序对象,该对象就代表你的驱动程序。WDM驱动程序的Driver Entry例程应完成对这个对象的初始化并返回。非WDM驱动程序需要做大量额外的工作,它们必须探测自己的硬件,为硬件创建设备对象(用于代表硬件),配置并初始化硬件使其正常工作。 * Driver Entry的第二个参数是设备服务键的键名。这个串不是长期存在的(函数返回后可能消失)。如果以后想使用该串就必须先把它复制到安全的地方。 * 对于WDM驱动程序的Driver Entry例程,其主要工作是把各种函数指针填入驱动程序对象,这些指针为操作系统指明了驱动程序容器中各种例程的位置。 2.简述使用VC进行内核程序编译的步骤 编译方式是使用VC++进行编译 1.用VC新建工程。 2.将两个源文件Driver.h和Driver.cpp拷贝到工程目录中,并添加到工程中。 3.增加新的编译版本。 4.修改工程属性,选择“project | setting”将IterMediate file和Output file 都改为MyDriver_Check。 5.选择C/C++选项卡,将原有的Project Options内容全部删除替换成相关参数。 6.选择Link选项卡,将原有的Project Options内容删除替换成相关Link。 7.修改VC的lib目录和include的目录。 8.在VC中选择tools | options,在弹出的对话框中选择“Directories”选项卡,在“Show directories for”下拉菜单中选择“Include file”菜单。添加DDK的相关路径。 3.简述单机内核调试技术 答:1.下载和安装WinDbg能够调试windows内核模块的调试工具不多,其中一个选择是微软提供的WinDbg 下载WinDbg后直接双击安装包执行安装。 2.安装好虚拟机以后必须把这个虚拟机上的windows设置为调试执行。在被调试系统2000、2003或是xp的情况下打开虚拟机中的windows系统盘。 3.将boot.ini文件最后一行复制一下,并加上新的参数使之以调试的方法启动。重启系统,在启动时就可以看到菜单,可以进入正常windows xp,也可以进入Debug模式的windows xp。 4.设置VMware管道虚拟串口。调试机与被调试机用串口相连,但是有被调试机是虚拟机的情况下,就不可能用真正的串口连接了,但是可以在虚拟机上生成一个用管道虚拟机的串口,从而可以继续内核调试。 4.请画出Windows架构简图

相关文档
最新文档