首页
社区
课程
招聘
[求助] Windows WDK MmGetPhysicalAddress 问题
发表于: 2018-4-4 12:56 8299

[求助] Windows WDK MmGetPhysicalAddress 问题

2018-4-4 12:56
8299
 目前程序需要可以发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;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
2
Map成内核内存再get物理地址,基本操作,基本操作,基本操作



2018-4-4 15:17
0
雪    币: 4
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
@cvcvxk  谢谢你的回答,我还是不太明白,可以把相关函数告诉一下吗?非常感谢.
2018-4-4 16:42
0
雪    币: 4
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
pMDL = IoAllocateMdl(dwVirtualPoint, sizeof(GET_SMBIOS_STRUCTURE), FALSE, TRUE, Irp);
//MmProbeAndLockPages(pMDL, KernelMode, IoWriteAccess | IoReadAccess);
//MmBuildMdlForNonPagedPool(pMDL);
pSysAddr = MmGetSystemAddressForMdlSafe(pMDL, LowPagePriority);
phyAddr = MmGetPhysicalAddress(pSysAddr);
dwVirtualPoint 是APP的变量地址(虚拟内存地址)

这些代码会导致 机器 直接 蓝屏
2018-4-4 17:45
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
5
wx会飞的鱼 pMDL = IoAllocateMdl(dwVirtualPoint, sizeof(GET_SMBIOS_STRUCTURE),&nb ...
baidu搜索mdl内存访问,然后就懂了,从你的代码看,你不适合你的工作,还是好好baidu学习吧


最后于 2018-4-4 21:11 被cvcvxk编辑 ,原因:
2018-4-4 20:56
0
雪    币: 4
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
@cvcvxk  我就是因为不明白原因才来这里请教,我看到这里对驱动研究比较多,所以选择来这里请教,你可以选择回答(我很感激你),你也可以选择不回答,.
你们牛X,只有你们适合写驱动相关的是吧,术业有专攻,每个人研究的方向不一样,专注也不一样,但你上面的回答真的合适吗? 
2018-4-8 08:32
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
7
wx会飞的鱼 @cvcvxk 我就是因为不明白原因才来这里请教,我看到这里对驱动研究比较多,所以选择来这里请教,你可以选择回答(我很感激你),你也可以选择不回答,. 你们牛X,只有你们适合写驱动相关的是吧,术业有 ...
工作发帖求助...baidu需要术业专攻?懒得口水了。你要觉得我说话很重,是我说话重了,我的错。

最后于 2018-4-8 20:22 被cvcvxk编辑 ,原因:
2018-4-8 20:21
0
雪    币: 58
活跃值: (1135)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
wx会飞的鱼 @cvcvxk 我就是因为不明白原因才来这里请教,我看到这里对驱动研究比较多,所以选择来这里请教,你可以选择回答(我很感激你),你也可以选择不回答,. 你们牛X,只有你们适合写驱动相关的是吧,术业有 ...
你丫的跑这里来问了,分配MDL,虚拟地址跟MDL关联起来,然后获得虚拟地址,再Get物理地址。
2018-4-8 21:57
0
雪    币: 4
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
cvcvxk wx会飞的鱼 @cvcvxk 我就是因为不明白原因才来这里请教,我看到这里对驱动研究比较多,所以选择来这里请教,你可以选择回答(我很感激你),你也可以选择不回 ...
这里不允许发贴求助吗?或者不允许发贴讨论吗?那这个BBS是做什么用的?  再说了,工作发贴请求别人帮助,这个有问题吗?
我也不想和你口水,本来上想来这个网站看的,一个群的朋友居然也来这看到我发的贴了.....所以点进来了.

Android  group上面,全是发贴问ANDROID相关问题的,那也是不应该了?
不懂就问,向别人请教,这个多么正常的事,可以说你是多么的不要脸.  不知道你的9级到底有多少水份.
2018-4-9 08:03
0
雪    币: 199
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
楼主你好!我最近也遇到了类似的问题,能请教下linux下应该如何获得user app的物理地址吗?
2019-4-4 17:28
0
雪    币: 12
活跃值: (220)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
少一个WCHAR* dwVirtualPoint2 = MmMapLockedPagesSpecifyCache(mdl,
另外/MmProbeAndLockPages不要注掉

你自己分配的内核地址对应物理地址可能是分页,不连续的,用于os/driver 低irq没问题,因为有分页机制(缺页中断)
但到了硬件设备层面(dma或者smi handler/bios)只能访问连续的物理地址,碰到地址断档(空地址)就挂了
所以map的目的就是把它整成连续的非分页物理内存对应内核地址再获取起物理首地址

其实更好的是自己MmAllocateContiguousMemor,到需要自己对内存结构和偏移进行微操

其实最后多说一句,在windows平台 call bios do 的最好做法不是发smi,而是call acpi method
2021-3-19 14:47
0
雪    币: 107
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
学习学习,这东西我看的也是一头污水
2022-5-17 15:45
0
游客
登录 | 注册 方可回帖
返回
//