2012-08-03 84 views
1

在我的内核模式驱动程序是下面的代码:写入物理内存地址

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

有一些看起来很奇怪/你的代码错误的几件事情: -

首先,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); 
+0

好点,谢谢。我最终修复了它,最后的评论是我实施的修复。我真的很困惑一段时间,因为没有写入任何东西,甚至不正确的值。原来我试图写入RO内存:-X – wanovak 2012-08-03 22:45:22