DriverEntry
使用WDF框架
WDF_DRIVER_CONFIG config;
WDF_DRIVER_CONFIG_INIT(&config, WDF_NO_EVENT_CALLBACK); //这是设置添加设备的回调函数(PNP)
//不处理任何IRP
config.DriverInitFlags |= WdfDriverInitNoDispatchOverride;
ntStatus = WdfDriverCreate(DriverObject,
RegistryPath,
WDF_NO_OBJECT_ATTRIBUTES,
&config,
WDF_NO_HANDLE);
//初始化包装句柄 是一个固定用法,给NDIS函数提供参数
NdisMInitializeWrapper(
&NdisWrapperHandle,
DriverObject,
RegistryPath,
NULL
);
//小端口特征
NDIS_MINIPORT_CHARACTERISTICS MPChar;
// 注册小端口。注意需要包装句柄与小端口特征。
Status = NdisMRegisterMiniport(
NdisWrapperHandle,
&MPChar,
sizeof(NDIS_MINIPORT_CHARACTERISTICS));
初始化一些全局变量
特征之MPINIT
该回调函数在WINDOWS内核发现每个实例(Adapter 适配器 也就是网卡)时调用,初始化一个数据结构Adapter管理网卡。
检测媒体介质类型是否为802——3网
//分配初始化适配器结构
Status = NICAllocAdapter(&Adapter);
// 增加引用计数。这个引用计数对应的在MPHalt中减少。
MP_INC_REF(Adapter);
//获取这个适配器句柄(传入参数)的PDO FDO NDO
NdisMGetDeviceProperty(MiniportAdapterHandle,
&Adapter->Pdo,
&Adapter->Fdo,
&Adapter->NextDeviceObject,
NULL,
NULL);
//获取设备物理描述信息
ntStatus = IoGetDeviceProperty (Adapter->Pdo,
DevicePropertyDeviceDescription,
NIC_ADAPTER_NAME_SIZE,
Adapter->AdapterDesc,
&nameLength);
//获取信息....
生成小端口设备,报道村在Adpater中
最后启动网卡
NICInitializeAdapter(Adapter, WrapperConfigurationContext);