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

4

1 回答 1

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);
于 2012-08-03T22:43:05.600 回答