2012-08-03 35 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