关于驱动程序的结构:
1. 应用层:通过调用交互层的函数得到驱动程序对应的文件路径,名称和DOS名称,并将这个驱动程序注册为服务程序,然后在交互层用函数CreateFile并传入驱程的DOS名称打开驱程,现在就可以调用交互层的WriteIo(自定义)函数对驱动程序发出指令。
2. 交互层:它的WriteIo函数其实只是对系统函数DeviceIoControl的封装。并且它通过该函数实现对驱程的控制。驱程在派遣函数里面通过:
IoGetCurrentIrpStackLocation(Irp) ->Parameters.DeviceIoControl.IoControlCode可以得到
上层传过来的控制码信息,通过分析这个信息,从Irp->AssociatedIrp.SystemBuffer中
取得缓冲区指针,从irpStack->Parameters.DeviceIoControl.InputBufferLength和
irpStack->Parameters.DeviceIoControl.outputBufferLength中取得缓冲区大小来进行处理。
3. 驱动层:按照经典WDM模型,DriveEntry是它的入口,dispatch是它的派遣例程,
相当于一个窗口的消息循环,注意中间重要的是IRP的生成和传递。