相当于API来MmGetPhysicalAddress在WEC7

问题描述:

我要移植Windows 7网络驱动程序代码WEC7。我陷入了API MmGetPhysicalAddress。在WEC7中我没有找到与此相对应的API。任何人都可以帮助进一步...相当于API来MmGetPhysicalAddress在WEC7

谢谢。

MmGetPhysicalAddress不是在Windows CE,但您可能不需要也无妨。

InitializeHandlerEx回调的某处,驱动程序应该调用NdisMAllocateSharedMemory来分配RX/TX缓冲区。

NdisMAllocateSharedMemory同时返回分配缓冲区的虚拟地址和物理地址,因此您可以保留物理地址,并且不需要从操作系统请求它。

通常的物理地址将与虚拟缓冲器地址一起被保持在一个特定的驱动程序,每个缓冲结构。

你可以找到这C:\WINCE700\public\COMMON\oak\drivers\netcard\e100bex\60一个样本实现。在mp_init.c中,请注意NICAllocAdapterMemory如何调用NdisMAllocateSharedMemory并将每个缓冲区的物理地址存储在pMpTxbuf->BufferPa中。

+0

我的要求是发送一些命令给固件,为此我在低层分配一个缓冲区。我没有使用InitializeHandlerEx中分配的缓冲区(tx/rx)向FW发送命令。由于我的网络适配器是PCI,我需要将虚拟地址映射到MDL的物理地址。我如何获得分配的MDL的物理地址? –

+0

你也许可以用'LockPages'由瓦尔特的建议脱身,但如果缓冲区是使用非NDIS函数分配你需要确保它在物理上是连续的,假设你要做一个DMA传输 –

你可以看看LockPages: https://msdn.microsoft.com/en-us/library/ee482989.aspx 但如果使用NDIS功能没有分配的缓冲区它可能不是在物理内存中完全连续的,所以你可能需要检查。

+0

我使用下面的代码来替换Windows 7代码: DWORD pfn,offset_addr; (LockPages(data,length,&pfn,(LOCKFLAG_READ | LOCKFLAG_WRITE)))printk(“LockPages failed for block buffer \ r \ n”);} offset_addr = pfn wb_mapped_pa​​ddr_lo [0] = offset_addr +((DWORD)NET_BUFFER_DATA_OFFSET(os_buf));我不确定它是否正确?你能检查一下吗? –

+0

我不明白你的代码,缺少一些变量的含义,没有很好的格式化。 你是否收到一个调用LockPages的错误? –