我正在编写可以直接将数据写入帧缓冲区的驱动程序,这样我就可以在用户空间中的应用程序无法获取时在屏幕上显示秘密消息。下面是我试图将值写入帧缓冲区的代码,但在将值写入帧缓冲区后,从帧缓冲区中检索到的值都是0。
我很困惑,有谁知道原因?或者任何人都知道如何在用户空间中的应用程序无法获取消息内容时在屏幕上显示消息?非常感谢!
#define FRAME_BUFFER_PHYSICAL_ADDRESS 0xA0000
#define BUFFER_SIZE 0x20000
void showMessage()
{
int i;
int *vAddr;
PHYSICAL_ADDRESS pAddr;
pAddr.QuadPart = FRAME_BUFFER_PHYSICAL_ADDRESS;
vAddr = (int *)MmMapIoSpace(pAddr, BUFFER_SIZE, MmNonCached);
KdPrint(("Virtual address is %p", vAddr));
for(i = 0; i < BUFFER_SIZE / 4; i++)
{
vAddr[i] = 0x11223344;
}
for(i = 0; i < 0x80; i++)
{
KdPrint(("Value: %d", vAddr[i])); // output are all zero
}
MmUnmapIoSpace(vAddr, BUFFER_SIZE);
}
答案 0 :(得分:0)
您必须在设备启动期间映射共享内存。我假设在启动期间没有调用showMessage
。查看更多here。
关于在屏幕上显示消息 - 它必须涉及用户空间交互,因为GUI是用户空间组件。我想你可以在没有其他应用程序参与的情况下通知某些GUI监听器。
答案 1 :(得分:0)
内存映射IO并非设计为与内存完全相同(以与存储的格式相同的形式检索放置在那里的数据)。写入0xA0000 +范围是写入视频设备IO空间中的PORTS(从其角度来看);只要适当的写入导致适当的像素点亮,那么视频设备就从编写用于屏幕呈现的驱动程序(或者内存是免费的旧DOS代码)的人的角度完成了它的工作。 - 没有用户空间/内核空间划分的所有人)。但是这样的代码从来不需要存储稍后将从视频片段中检索的数据。因此,通常不会实现典型的存储器语义(浪费硬件和工作量)。在这里,这些randoms谈论它: Magic number with MmMapIoSpace