首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

获得irp缓冲区的疑问解决思路

2012-03-18 
获得irp缓冲区的疑问最近刚开始看驱动开发,,在获取irp缓冲区的地方很困惑阿,请高手指教寒江独钓里第49

获得irp缓冲区的疑问
最近刚开始看驱动开发,,在获取irp缓冲区的地方很困惑阿,请高手指教

<<寒江独钓>>里第49-50页说IRP结构里面一共有三个地方可以描述缓冲区,
irp->DMLAddress
irp->UserBuffer
irp->AssociatedIrp.SystemBuffer


这样就能准确地取到缓冲区的内容

C/C++ code
               PUCHAR buf = NULL;                if(irp->MdlAddress != NULL)                    buf = (PUCHAR)MmGetSystemAddressForMdlSafe(irp->MdlAddress,NormalPagePriority);                else                    buf = (PUCHAR)irp->UserBuffer;                if(buf == NULL)                    buf = (PUCHAR)irp->AssociatedIrp.SystemBuffer;
 

但是这段代码我有点疑惑。
  当取irp->MdlAddress 缓冲区内的时候
这样子用
C/C++ code
buf = (PUCHAR)MmGetSystemAddressForMdlSafe(irp->MdlAddress,NormalPagePriority);

调用了MmGetSystemAddressForMdlSafe宏

MmGetSystemAddressForMdlSafe的定义如下
C/C++ code
#define MmGetSystemAddressForMdlSafe(MDL, PRIORITY)                    \     (((MDL)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA |                    \                        MDL_SOURCE_IS_NONPAGED_POOL)) ?                \                             ((MDL)->MappedSystemVa) :                 \                             (MmMapLockedPagesSpecifyCache((MDL),      \                                                           KernelMode, \                                                           MmCached,   \                                                           NULL,       \                                                           FALSE,      \                                                           (PRIORITY))))


结果还是调用了MmMapLockedPagesSpecifyCache这个函数,

疑惑就在这了,,

MmMapLockedPagesSpecifyCache的返回值是一个PVOID,

那岂不是最后 
C/C++ code
 buf = (PUCHAR)MmGetSystemAddressForMdlSafe(irp->MdlAddress,NormalPagePriority);

这句会
buf = (PUCHAR)PVOID

????????

因此疑惑,,这语句是能编译通过的,说明没问题,望高手指教,指点迷津



[解决办法]
(PUCHAR)PVOID前面的重新定义的类型符用来进行强制类型转换就是地址指针转换,后面应该是一个VOID类型的指针。
[解决办法]
PVOID可以就是个指针,当你不知道是CHAR还是INT指针时,就用这个种指针。
[解决办法]
指令之间是可以互相转换的,当然你必须是很清楚你在做什么

热点排行