写入物理内存地址

时间:2012-08-03 19:48:40

标签: c windows memory driver wdk

在我的内核模式驱动程序中有以下代码:

PHYSICAL_ADDRESS    physAddr;
PVOID               pvk;
unsigned int        reg_addr; // physical address to write to
unsigned int*       reg_val;  // pointer to value to be written

// assume reg_addr and reg_val are initialized to some values

physAddr.QuadPart = (ULONGLONG)reg_addr;
pvk = MmMapIoSpace(physAddr,sizeof(reg_addr),MmNonCached);
WRITE_REGISTER_ULONG((ULONG*)pvk,(ULONG)&reg_val);

地址没有被写入,我不知道为什么。这是正确的程序还是我错过了一步?另外,我的指针算法可能是错误的吗?我已经尝试了所有排列,但没有一个导致正确的结果。我希望reg_addr指定的物理内存使用reg_val指向的值指定的内容。

1 个答案:

答案 0 :(得分:1)

您的代码有些奇怪/错误: -

首先,PHYSICAL_ADDRESS.QuadPart是一个64位值,但是你要为它分配一个32位的int。你确定那是你想做的吗?

其次,我假设你要映射一个32位的“ULONG”寄存器:

pvk = MmMapIoSpace(physAddr,sizeof(reg_addr),MmNonCached); 

这可能会奏效,但我认为你的意思是这个

pvk = MmMapIoSpace(physAddr, sizeof(ULONG), MmNonCached); 

最后,您将指针变量reg_val地址写入寄存器。您的评论意味着您想要reg_val写下指向的值?如果是这样,请改用它。

WRITE_REGISTER_ULONG((ULONG*)pvk, *reg_val);