1. NdisMRegisterInterruptEx 注册一个中断,这里MPIsr里面只做了关闭中断的工作,然后就返回,目的是为节省cpu资源,
真正的处理过程都在InterruptDpcHandler里慢慢处理,处理完以后再开中断。
Interrupt.InterruptHandler = MPIsr; // 中断处理函数
Interrupt.InterruptDpcHandler = MPHandleInterrupt; // 中断处理函数Dpc
Interrupt.DisableInterruptHandler = NULL;
Interrupt.EnableInterruptHandler = NULL;
Status = NdisMRegisterInterruptEx(Adapter->AdapterHandle,
Adapter,
&Interrupt,
&Adapter->NdisInterruptHandle // 返回一个中断Handle
===
2. NdisMRegisterScatterGatherDma注册DMA的callback, 之后如果在驱动里
使用了NdisMAllocateSharedMemoryAsyncEx函数,之后会自动调用MPAllocateComplete这个callback
使用了NdisMAllocateNetBufferSGList这个函数,之后会自动调用MpProcessSGList这个callback。
好处是可以马上返回,具体功能由callback在后面慢慢执行
例如:当上层一个数据包(net_buffer_list)传递下来后,驱动里使用NdisMAllocateNetBufferSGList(net_buffer_list)函数,
之后系统HAL自动调用MpProcessSGList去慢慢发包
DmaDescription.ProcessSGListHandler = MpProcessSGList; //
DmaDescription.SharedMemAllocateCompleteHandler = MPAllocateComplete;
Status = NdisMRegisterScatterGatherDma( Adapter->AdapterHandle,
&DmaDescription,
&Adapter->NdisMiniportDmaHandle);
==
3. 其他慢慢补充
NdisMIndicateReceiveNetBufferLists // 数据包传给上层( 自下而上mininport -> ndis -> protocol, 之后还有一个从上而下return相应过程 )
// 正常情况下,ndis会一直监管向上传和向下回应这个流程,像tcp3次握手,此函数有个参数ReceiveFlags
// 如ReceiveFlags==NDIS_RECEIVE_FLAGS_RESOURCE,则ndis传上去就不管了,协议驱动copy一份去处理,
// 像udp,传出去就算完,不用等待对方回应,大概是这个意思
NdisMAllocateSharedMemory
NdisAllocateMdl
NdisMMapIoSpace