在我的内核模式驱动程序中有以下代码:
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)®_val);
地址没有被写入,我不知道为什么。这是正确的程序还是我错过了一步?另外,我的指针算法可能是错误的吗?我已经尝试了所有排列,但没有一个导致正确的结果。我希望reg_addr
指定的物理内存使用reg_val
指向的值指定的内容。
答案 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);