阅读:5283回复:3
求助:MmGetSystemAddressForMdlSafe与MmGetMdlVirtualAddress的区别?
各位大侠,小弟刚学NDIS不久,很多东西感觉不是太清楚,
我看了PACKET的代码, 发现MmGetSystemAddressForMdlSafe和MmGetMdlVirtualAddress两个函数的功能都一样,都是返回MDL的虚地址,但是就不明白它们两之间有什么差别,什么情况下用第一个,什么情况下用第二个,请各位帮帮忙!多谢! |
|
沙发#
发布于:2007-07-25 15:32
1.如果要支持98,只能用MmGetMdlVirtualAddress. 如果是2000以上的系统,用MmGetSystemAddressForMdlSafe
2.二者的区别是失败的时候,MmGetSystemAddressForMdlSafe返回NULL,MmGetMdlVirtualAddress会bugcheck. ddk里都有详细的说明,提问之前,认真看看ddk |
|
板凳#
发布于:2007-07-26 10:37
多谢大侠指点,我看DDK上是这样说的,
Windows 98 does not support MmGetSystemAddressForMdlSafe. Use MmGetSystemAddressForMdl instead. 关于MmGetSystemAddressForMdlSafe与MmGetMdlVirtualAddress的区别DDK上没有明显比较两者的差别。所以来这里求助了! |
|
地板#
发布于:2007-08-07 11:26
创建MDL如下:
if (NDIS_STATUS_SUCCESS == NdisAllocateMemoryWithTag(&Pmemory,1514,'BHH')) { if (PBuffer=IoAllocateMdl(Pmemory,1514,FALSE,FALSE,NULL)) { DebugPrint (("NdisAllocateMemory:IoAllocateMdl:success\n")); } } 后来的代码要使用PBuffer来保存数据,比如调用NdisMoveMappedMemory, 那是应该NdisMoveMappedMemory( MmGetSystemAddressForMdlSafe(PBuffer,NormalPagePriority), pSource,len) 还是这样调用NdisMoveMappedMemory( MmGetMdlVirtualAddress(PBuffer), pSource,len)??? 请指点!!! |
|