Как напрямую записать в буфер кадров в драйвере Windows - PullRequest
4 голосов
/ 14 марта 2012

Я пишу драйвер, который может напрямую записывать данные в буфер кадра, чтобы я мог показывать секретное сообщение на экране, пока приложения в пользовательском пространстве не могут его получить.Ниже приведен мой код, который пытается записать значение в буфер кадра, но после того, как я записал значение в буфер кадра, все значения, которые я извлек из буфера кадра, равны 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 голос
/ 08 сентября 2014

Операции ввода-вывода с отображением в память не предназначены для работы точно так же, как память (извлечение данных, размещенных там в той же форме, в которой они были сохранены).Записи в диапазоне 0xA0000 + - это записи в PORTS в пространстве ввода-вывода видеоустройства (с его точки зрения);До тех пор, пока соответствующие записи приводят к тому, что соответствующие пиксели загораются, видеоустройство выполняет свою работу с точки зрения людей, которые пишут драйверы для экрана рендеринга (или старого кода DOS, где память быладля всех без разделения пространства пользователя / пространства ядра).Но в таком коде никогда не было необходимости хранить данные, которые впоследствии будут извлечены из сегмента видео.Поэтому типичная семантика памяти, как правило, не была бы реализована (потеря оборудования и усилий).Вот эти случайности говорят об этом: Магическое число с MmMapIoSpace

1 голос
/ 23 октября 2012

Вы должны отобразить общую память во время запуска устройства.Я предполагаю, что showMessage не вызывается во время запуска.Подробнее здесь .

Относительно отображения сообщения на экране - оно должно включать взаимодействие с пространством пользователя, поскольку GUI является компонентом пространства пользователя.Я полагаю, вы могли бы уведомить некоторых слушателей GUI без участия других приложений.

...