Windows驱动开发笔记(一)——串口过滤

最近在学Windows驱动开发,感觉还是蛮有意思的,主要是驱动能做到许多在应用层面完成不了的功能~

附件是对计算机各个串口进行过滤的驱动源码,其大概流程如下:

1.使用IoGetDeviceObjectPointer(…)函数由物品设备名获得其设备对象的指针;

2.使用IoCreateDevice(…)创建一个用于过滤的设备对象,并将它的各个属性赋值为跟真实设备相同的属性;

3.使用IoAttachDeviceToDeviceStack(…)将过滤设备对象与真实设备对象绑定,并返回指向下一个设备对象的指针;

4.编写分发函数,大概内容为:先用IoGetCurrentIrpStackLocation(irp)获得IRP栈地址,然后若为IRP_MJ_POWER请求用PoStartNextPowerIrp(…)、IoSkipCurrentIrpStackLocation(irp)和PoCallDriver(…)下发。其它请求则用IoSkipCurrentIrpStackLocation(irp)和IoCallDriver(…)直接下发。当为IRP_MJ_WRITE请求时,用MmGetSystemAddressForMdlSafe(…)函数或直接从irp->UserBuffer或irp->AssociatedIrp.SystemBuffer中获得其写串口的数据,最后打印输出;

5.编写驱动卸载函数,大概内容为:用IoDetachDevice(…)解除所有下一个设备对象的引用,用IoDeleteDevice(…)删除所有过滤设备对象;

6.编写驱动入门函数DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path),内容为用driver->MajorFunction[i] = ccpDispatch设置分发函数,设置驱动卸载函数,最后绑定所有串口,返回成功状态。

其具体源码可参加附件,且XP版本的驱动已经编译好,建议在虚拟机下调试。

点击下载