如何在Windows驱动程序中直接向帧缓冲区写入数据

5
我正在编写一种驱动程序,可以直接将数据写入帧缓冲区,这样我就可以在屏幕上显示秘密信息,而用户空间中的应用程序无法获得它。下面是我的代码,试图将值写入帧缓冲区,但在我将值写入帧缓冲区后,从帧缓冲区检索到的值都为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);
}
2个回答

1
Memory mapped IO并不是为了像内存一样工作(以与存储在其中的数据相同的形式检索数据)。0xA0000+范围内的写入是写入视频设备IO空间中的端口(从其角度来看)。只要适当的写入导致适当的像素点亮起来,那么从编写屏幕渲染驱动程序的人的角度来看,视频设备已经完成了其工作(或者旧的DOS代码,其中内存是没有用户空间/内核空间划分的自由)。但是这样的代码从来没有需要存储稍后将从视频段检索的数据。因此,通常不会实现典型的内存语义(硬件和精力的浪费)。这里,这些随机人谈论它:使用MmMapIoSpace进行魔术数字

1

在设备启动期间,您必须映射共享内存。我假设在启动期间不会调用showMessage。请在此处查看更多信息。

关于在屏幕上显示消息 - 它必须涉及用户空间交互,因为GUI是用户空间组件。我想您可以通知一些GUI监听器而无需其他应用程序的参与。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接