DriverEntry ---> WDF_DRIVER_CONFIG_INIT( 驱动程序初始化
&config,
MouFilter_EvtDeviceAdd
);
---> MouFilter_EvtDeviceAdd 创建设备对象作为目标的I/O设备 并添加到设备堆栈
---> WdfDriverCreate(DriverObject, 创建driver对象(config)
RegistryPath,
WDF_NO_OBJECT_ATTRIBUTES,
&config,
WDF_NO_HANDLE);
MouFilter_EvtDeviceAdd --->status = WdfDeviceCreate 创建设备对象
---> WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&ioQueueConfig,
WdfIoQueueDispatchParallel); 初始化默认I/O队列,I/O请求分发方式设置为并行
--->ioQueueConfig.EvtIoInternalDeviceControl = MouFilter_EvtIoInternalDeviceControl;
设置EvtIoInternalDeviceControl,处理应用程序的DeviceIoControl()的调用
--->status = WdfIoQueueCreate(hDevice, 创建I/O队列(IoQueueConfig)
&ioQueueConfig,
WDF_NO_OBJECT_ATTRIBUTES,
WDF_NO_HANDLE // pointer to default queue
);
MouFilter_EvtIoInternalDeviceControl --->switch (IoControlCode) { 入口
case IOCTL_INTERNAL_MOUSE_CONNECT:
---> status = WdfRequestRetrieveInputBuffer(Request,
sizeof(CONNECT_DATA),
&connectData,
&length); 获得输入缓冲区地址buffer
---> connectData->ClassService = MouFilter_ServiceCallback; 回调函数,当鼠标向下层发送数据包时调用,处理数据包
MouFilter_ServiceCallback
--->IN PMOUSE_INPUT_DATA InputDataStart, 指向第一个数据包
--->IN PMOUSE_INPUT_DATA InputDataEnd, 指向最后一个数据包
IN PMOUSE_INPUT_DATA 在这里对数据包进行处理就好了。