-
-
[求助] Windows WDK MmGetPhysicalAddress 问题
-
发表于:
2018-4-4 12:56
8298
-
[求助] Windows WDK MmGetPhysicalAddress 问题
目前程序需要可以发
SMM (SMI) ,现在在32位的windows/linux都可以正常工作.
但是在64位系统上面会出问题.(64位4.x的linux kernel 没问题 ,3.x的kernel有问题)
关键问题在于SMM响应的代码,只能访问实际的物理内存地址,不能使用OS里面内存管理的虚拟内存地址.
SMM里面的参数实际是一个结构体,所以我们需要把USER APP里面的结构体地址对应的物理地址给SMM code
32位win7,使用 WDK编译驱动 ,调用 API MmGetPhysicalAddress,可以获取 USER APP 里面普通成员变量的物理内存地址,然后把这个地址做为 SMM代码需要的参数.这样是没有任何问题的
64位win7 使用32位win7同样的方法,就行不通, SMM代码读到的结构体地址是我们传入的值,这个没有问题,说明参数传入是成功的,但首地址里面结构体的成员变量的值是错误的.这个就有点郁闷了.一直找不到原因.所以个人猜测是
MmGetPhysicalAddress 在64位win7获取的值不太对.
然后上网搜索到了如下链接 https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/performing-dma-in-64-bit-windows
但看不明白. 有大神遇到类似问题,或者帮小弟支下招吗?
结构体类似如下定义
typedef struct __SMM_API__
{
UINT32 Var1;这个其实也应该是物理内存的地址,里面的内容是字符串,BIOS 里面的代码访问的地址就是 DWORD32的,而不是DWORD64,
UINT32 Var2;
UINT32 Var3;
}
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!