在修改C8051F320单片机的驱动程序时,一开始真的有点无从下手,幸好看到了这本书-《USB应用开发技术大全》(人民邮电出版社),使自己对那一大堆的代码,终于理出了思路。在这里就把WDM驱动程序的组成的大概内容摘抄出来,与大家分享。
基本驱动程序例程:DriverEntry和AddDevice。
I/O控制例程:StartIO、AdapterControl、OnInterrupt……
派遣函数:DispatchPnP、DispatchPower、DispatchRead、DispatchWrite……
常用的IRP主功能代码:
IRP_MJ_CREATE 打开文件句柄 IRP_MJ_CLOSE 关闭文件句柄 IRP_MJ_READ 读取数据 IRP_MJ_WRITE 写数据 IRP_MJ_CLEANUP 清除挂起的IRP IRP_MJ_DEVICE_CONTROL 设备I/O控制 IRP_MJ_INTERNAL_DEVICE_CONTROL 底层的设备I/O控制 IRP_MJ_SYSTEM_CONTROL 系统管理与测试 IRP_MJ_POWER 电源管理 IRP_MJ_PNP 即插即用管理 入口例程DriverEntry:主要用于WDM驱动程序的初始化,是所有驱动程序必须的。 即插即用例程:用户处理即插即用设备的添加、停止和删除等。 分发例程:用于处理主机程序的各种I/O请求。 电源管理例程:用于处理系统和设备的电源管理请求。 卸载例程:处理WDM驱动程序的卸载等操作。 其例程主要有两个:一个AddDevice例程和一个IRP_MJ_PNP例程。
AddDevice 例程主要使用IoCreateDevice函数来创建和初始化一个设备对象,然后初始化设备扩展,并使用IoAttachDeviceToDeviceSt
IRP_MJ_PNP例程主要负责处理系统即插即用管理器发出的PnP信息,包括启动设备(IRP_MN_START_DEVICE)、停止设备(IRP_MN_STOP_DEVICE)、删除设备(IRP_MN_REMOVE_DEVICE)等。 IRP_MJ_CREATE例程,对应的Win32函数为CreateFile。 IRP_MJ_CLOSE例程,对应的Win32函数为CloseHandle。 IRP_MJ_READ例程,对应的Win32函数为ReadFile。 IRP_MJ_WRITE例程,对应的Win32函数为WriteFile。 IRP_MJ_DEVICE_CONTROL例程,对应的Win32函数为DeviceIoControl。 一般来说,并不是所有的分发例程都是必须的,但是所有的驱动程序都要包含IRP_MJ_CREATE例程和IRP_MJ_CLOSE例程。如果没有这两个例程,主机程序便不能获得设备句柄,也就不能控制设备。 IRP_MN_SET_POWER设置系统或设备电源状态。 IRP_MN_QUERY_POWER查询是否允许改变系统或设备的电源状态。 IRP_MN_WAIT_WAKE响应外部事件以唤醒设备。 IRP_MN_POWER_SEQUENCE确认设备是否进入指定的电源状态。
|
|