WinPcap的内核驱动程序NPF是一个协议驱动程序,其涉及到一些编写Windows驱动程序的基础知识与NDIS协议驱动程序编写的基础知识。本章主要对这些基础知识进行简要的描述以便于后续的理解。
1.1 Windows驱动的基础知识
本节主要描述在WinPcap的NPF中经常使用一些编写Windows驱动程序所需掌握的部分基础知识,以便于后面的理解。
1.1.1 驱动对象(DRIVER_OBJECT)
每个驱动程序都有唯一的驱动对象与之对应,该驱动对象在驱动程序被加载时由内核的对象管理程序所创建。
驱动对象用DRIVER_OBJECT数据结构表示,它作为驱动程序的一个实例被内核加载,对一个驱动程序内核I/O管理器只加载一个实例。
驱动对象数据结构在wdm.h文件中的定义如下。
typedef struct _DRIVER_OBJECT {
CSHORT Type;
CSHORT Size;
/*
*DeviceObject为每个驱动程序所创建的一个或多个设备对象链表,
*Flags提供一个扩展的标识定位驱动对象
*/
PDEVICE_OBJECT DeviceObject;
ULONG Flags;
/*下列各成员字段描述驱动程序从哪儿被加载*/
PVOID DriverStart;
ULONG DriverSize;
PVOID DriverSection;
PDRIVER_EXTENSION DriverExtension;
/*
*DriverName成员被错误日志线程用来
*确定一个I/O请求越界的驱动名称
*/
UNICODE_STRING DriverName;
/*指向注册表中硬件信息的路径*/
PUNICODE_STRING HardwareDatabase;
/*
*如果驱动支持“fast I/O”,
*就指向一个“fast I/O”的派遣函数数组
*/
PFAST_IO_DISPATCH FastIoDispatch;
/*
*描述该特定驱动的入口点。
*主函数(major function)派遣函数表必须是对象最后的成员,
*因此它仍然是可扩展的
*/
PDRIVER_INITIALIZE DriverInit;
PDRIVER_STAR