最近刚开始看驱动开发,,在获取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指针时,就用这个种指针。
------解决方案--------------------
指令之间是可以互相转换的,当然你必须是很清楚你在做什么