首页 > 代码库 > Windows 驱动开发基础(六)NT驱动的基本结构

Windows 驱动开发基础(六)NT驱动的基本结构

Windows 驱动开发基础系列,转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/38821919


NT类型的驱动即不是即插即用的驱动,主要包括3部分:DriverEntry函数,CreateDevice函数,DriverUnload函数.其实还有IRP派遣函数,但是这里先不做介绍。

接下来详细的说明一下。


系统启动的时候,就创建了系统进程;驱动加载的时候,系统启动一个新的线程,创建一个驱动对象。而当系统线程调用DriverEntry函数的时候,就实现了对驱动对象的初始化。

1. DriverEntry


extern “C”NTSTATUS DriverEntry(  IN PDRIVER_OBJECT pDriver_Object,

IN PUNICODE_STRING pRegistryPath );

pDriver_Object:指向这个驱动对象。

pRegistryPath:指向设备服务键的键名字符串的指针。该字符串的内容一般为\REGISTRY\MACHINE\SYSTEM\ControlSet\Services\[服务名]

其中:IN 是参数的修饰词,代表是 参数时输入,同理,OUT表示存催的输出,两个可以同时用。


返回值是一个32位的LONG,也就是NTSTATUS型的数据。


2. CreateDevice

是通过IoCreateDevice创建的,形式如下:


NTSTATUS 
  IoCreateDevice(
    IN PDRIVER_OBJECT  DriverObject,
    IN ULONG  DeviceExtensionSize, //
指定设备扩展的大小
    IN PUNICODE_STRING  DeviceName  OPTIONAL,//
设备对象的名字
    IN DEVICE_TYPE  DeviceType
    IN ULONG  DeviceCharacteristics,//
设置设备对象的特征
    IN BOOLEAN  Exclusive,//
设置设备对象是否在内核模式下使用,一般为TRUE
    OUT PDEVICE_OBJECT  *DeviceObject //
指向新创建的设备对象。
    );


需要指出的是,即便是给出了设备的名称也只能是被内核模式下其他驱动所识别,要用用户模式下面的应用程序识别就需要使用:符号链接的方法。也就是起一个别名的方式,就好像我们给硬盘取名叫“C盘”,就可以被其他的应用程序识别了。

这个函数是:

NTSTATUS 
   IoCreateSymbolicLink(
    IN PUNICODE_STRING  SymbolicLinkName,//别名(的地址)
    IN PUNICODE_STRING  DeviceName            //这个设备
    );

在内核模式下,符号链接就是以”\??\”开头的(或者“\DosDevice\”开头的)。如C盘就是“\??\C:”。而在用户模式下则是以“\\.\”开头的,如C盘就是“\\.\C:”


3. DriverUnload


一般负责删除掉DriverEntry里面创建的设备对象。同时也会删掉创建的符号链接。具体的函数如下:


VOID 
   IoDeleteDevice(
    IN PDEVICE_OBJECT  DeviceObject
    );

NTSTATUS 
IoDeleteSymbolicLink(
   IN PUNICODE_STRING  SymbolicLinkName
);



Windows 驱动开发基础(六)NT驱动的基本结构