Sådan skriver du direkte til rammebufferen i Windows-driveren

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skriver driveren, som direkte kan skrive data til rammebufferen, så jeg kan vise den hemmelige besked på skærmen, mens applikationerne i brugerrummet ikke kan få det. Herunder er min kode, der forsøger at skrive værdien til ram buffer, men efter at jeg har skrevet værdien til rammebufferen, er de værdier, jeg hentede fra rammebufferen, alle 0.


Jeg er forvirret, nogen kender årsagen? Eller nogen ved, hvordan man viser en besked på skærmen, mens applikationerne i brugerrummet ikke kan få indholdet af meddelelsen? Mange tak!


#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);
}

Bedste reference


Du skal kortlægge den delte hukommelse under opstart af enheden. Jeg går ud fra, at showMessage ikke hedder under opstart. Se mere her. [3]


Med hensyn til visning af besked på skærmen - det skal involvere brugerrumsinteraktion, da GUI er en bruger-rumkomponent. Jeg formoder, at du kunne underrette nogle GUI-lytter uden andre applikationsinddragelse.

Andre referencer 1


Hukommelseskortet IO er ikke beregnet til at virke præcis som hukommelse (hentning af data, der er placeret der i samme form, den blev gemt). Skriverne i 0xA0000 + -området skriver i PORTS i videoenhedens IO-rum (fra sit perspektiv ); Så længe de relevante skrivninger resulterer i passende pixels lyser op, har videoenheden gjort sit job ud fra perspektivet af personer, der skriver drivere til skærm rendering (eller gammel DOS-kode, hvor hukommelsen var fri -for-alle uden en bruger-plads/kernel-rum division). Men sådan kode har aldrig haft behov for at gemme data, der senere skulle hentes fra videosegmentet. Derfor ville typisk hukommelsessemantik generelt ikke være implementeret (spild af hardware og indsats). Her snakker disse randoms om det:
Magic nummer med MmMapIoSpace