关键思路:为驱动创建一个设备对象
usbnwifi 例程中,
MPInitialize
函数通过NICRegisterDevice
函数,注册了NICDispatch
函数入口(该函数实现IRP的分发处理),从而为小端口驱动注册了一个IOCTL接口。这一过程根本上是调用了NDIS的NdisRegisterDeviceEx
函数,传入了包含分发函数入口的_NDIS_DEVICE_OBJECT_ATTRIBUTES
数据结构。
最近在编写 NDIS 小端口驱动程序时,需要利用 IOCTL 对网卡进行配置,但翻遍 NDIS 文档也没有找到 NDIS 的 IOCTL 实现。有幸在 WDK 7600 提供的 usbnwifi 例程中看到了实现思路,看起来基本上也就是 WDM 框架下 IOCTL 的简单封装。现在把思路写下来供思考,不全面的地方,建议直接参考 usbnwifi 例程的实现。
1. 创建设备对象
NDIS框架提供的NdisRegisterDeviceEx
函数,可以为 NDIS 小端口驱动创建一个设备对象。函数原型如下:
NDIS_STATUS NdisRegisterDeviceEx(
_In_ NDIS_HANDLE NdisHandle,
_In_ PNDIS_DEVICE_OBJECT_ATTRIBUTES DeviceObjectAttributes,
_Out_ PDEVICE_OBJECT *pDeviceObject,
_Out_ PNDIS_HANDLE NdisDeviceHandle
);
第一个参数是 NDIS 句柄不提。
第二个参数是 IRP 的关键参数。NDIS_DEVICE_OBJECT_ATTRIBUTES
结构定义了设备对象的若干属性。
先创建一个分发表,将分发函数入口点传入:
DispatchTable[IRP_MJ_CREATE] = NICDispatch_Create;
DispatchTable[IRP_MJ_CLEANUP] = NICDispatch_Cleanup;
DispatchTable[IRP_MJ_CLOSE]