Ndis驱动的一些API .1

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

 

posted @ 2020-10-30 10:38  一条小鳄鱼  阅读(404)  评论(0)    收藏  举报