我正在编写可以直接将数据写入帧缓冲区的驱动程序,以便可以在屏幕上显示 secret 消息,而用户空间中的应用程序无法获取该消息。下面是我的代码,试图将值写入帧缓冲区,但是在将值写入帧缓冲区后,我从帧缓冲区检索到的值都为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);
}

最佳答案

您必须在设备启动期间映射共享内存。我假设在启动过程中未调用showMessage。查看更多here

关于在屏幕上显示消息-由于GUI是用户空间组件,因此它必须涉及用户空间交互。我想您可以在不涉及其他应用程序的情况下通知一些GUI监听器。

10-06 01:53