【问题标题】:How to directly write to the frame buffer in windows driver如何在 Windows 驱动程序中直接写入帧缓冲区
【发布时间】:2012-03-30 22:56:43
【问题描述】:

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

【问题讨论】:

    标签: windows driver device-driver


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      内存映射 IO 的设计并不完全像内存一样(检索以与存储相同的形式放置在那里的数据)。写入 0xA0000+ 范围是写入视频设备 IO 空间中的 PORTS(从其角度来看);只要适当的写入导致适当的像素点亮,那么从为屏幕渲染(或内存是空闲的旧 DOS 代码)编写驱动程序的人的角度来看,视频设备已经完成了它的工作-for-all 没有用户空间/内核空间划分)。但是这样的代码从来不需要存储以后会从视频片段中检索到的数据。因此,通常不会实现典型的内存语义(浪费硬件和精力)。在这里,这些随机数谈论它: Magic number with MmMapIoSpace

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-22
        • 2017-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多