您的位置:首页 > 其它

Windows 驱动开发2:驱动的执行过程

2013-06-11 19:42 183 查看
Windows 驱动的执行过程

转载:http://blog.csdn.net/bigbat/article/details/2347440

驱动程序是被动的。一切的执行要通过系统的指挥。那么,我们看看系统是怎么管理你的驱动的。

驱动加载(一):

BOOT开始->注册表项目->加载XXX.SYS驱动->执行入口函数DriverEntry(...)->完成加载。

系统在BOOT时要检查注册表。(也可能不是在BOOT时加载驱动,可以是手工加载)然后根据注册表的项目来加载你的驱动程序。所以,驱动程序在安装时要写注册表的。不然,你的驱动是不能被发现的。在找到XXX.SYS驱动后,就去调用它的DriverEntry(...)函数。完成各种注册任务。这样,你的各种功能就被挂到系统了。

用户调用(二):

fopen->Windows API(Kenel32.dll,ReadFile)->Ntdll.dll API(NtReadFile)->内核模式I/O管理器生成一个IRP->I/O管理器调用,驱动函数->返回

在你的驱动加载好以后,你的各种功能就等着系统来调用了。(为什么不是用户呢?:慢慢看!)。假设有一个应用app.exe要调用一个系统功能。app.exe首先通过Windows api函数这个函数,再调用更底层的函数。然后进入内核模式。I/O管理器根据你的调用内容生成一个IRP对象(也可以叫变量,任务列表)。把这个IRP放入一个队列中。以后的调度程序工具用这个IRP记载你的各种操作情况。依据任务列表去调用各种驱动功能函数。系统根据察看到IRP的各种执行结果来决定各种操作。用户的调用成功与否完全根据这个IRP的纪录。I/O管理器根据IRP来填充各种返回信息。用户的调用结果被WINDOWS
API包装后返回给用户的调用。可能,觉得这些操作不是一次完成的!对了,不要忘记WIndows是一个多任务的操作系统。

为了由个初步的认识和感觉我们就做个Hello World驱动来看看吧!

这个驱动是网上的前辈写的。本人实在是不知道前辈大名。特别予以声明。在此,致敬!

文件名 hello.c

/****************************************************************

Hello,World驱动。一个简单demo

****************************************************************/

#include <ntddk.h>

NTSTATUS

/***************************************************************

函数名称:DriverEntry()

功能描述:程序入口

***************************************************************/

DriverEntry (

IN PDRIVER_OBJECT DriverObject,

IN PUNICODE_STRING RegistryPath

)

{

DbgPrint(("Hello World!/n"));/* 调试信息*/

return STATUS_SUCCESS;

}

文件名 makefile

#

# DO NOT EDIT THIS Edit ./sources. if you want to add a new source

# file to this component. This file merely indirects to the real make file

# that is shared by all the driver components of the Windows NT DDK

#

!INCLUDE $(NTMAKEENV)/makefile.def

文件名 Sources

TARGETNAME=hello

TARGETPATH=obj

TARGETTYPE=DRIVER

SOURCES=hello.c

建个目录 HelloDRV 把三个文件放入其中。进入DDK环境Checked Build Environment。

转到该目录下去。键入 build 编译。完成后会产生一个 objchk_w2k_x86 目录。找到Hello.sys文件。这就是你的成果了。将hello.sys靠到

Windows/System32/drivers下。

下一步就是安装了。如果是用INF来安装步骤很麻烦。现在,直接写注册表就可以安装了。

建立一个文件 Hello.reg

REGEDIT4

[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/hello]

"ErrorControl"=dword:00000001

#

# When to start the driver:

# At boot: Start=1

# Manually: Start=3

#

"Start"=dword:00000003

"Type"=dword:00000001

双击Hello.reg执行。。可以,用regedit看看结果。察看这个值[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/hello]

下载一个工具debugview。这个工具是免费的。

启动机器。执行debugview。 注意选择capture kernel的选项是选择的。

进入命令行。执行

net start hello

就可以从debugview看到hello,world了。这个,程序就是一个驱动。可以做任何事情。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Windows 驱动开发