2012-03-14 24 views
3

私は、フレームバッファにデータを直接書き込むことができるドライバを書いているので、ユーザ空間のアプリケーションが画面上に秘密のメッセージを表示することはできませんそれ。私のコードは、フレームバッファに値を書き込もうとしていますが、フレームバッファに値を書き込んだ後、フレームバッファから取得した値はすべて0です。Windowsのドライバのフレームバッファに直接書き込む方法

私は困惑しています?または、ユーザー空間のアプリケーションがメッセージの内容を取得できない間に、誰かが画面にメッセージを表示する方法を知っていますか?どうもありがとう!

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

答えて

0

デバイスの起動時に共有メモリをマップする必要があります。私は起動時にshowMessageが呼び出されないと仮定します。詳細はhereをご覧ください。

画面上にメッセージを表示する場合、GUIはユーザー空間コンポーネントなので、ユーザー空間のやりとりが必要です。他のアプリケーションの関与なしでGUIリスナーに通知できると思います。

0

メモリマップされたIOは、メモリとまったく同じように動作するようには設計されていません(格納された同じフォームに配置されたデータを取り出す)。 0xA0000 +範囲への書き込みは、ビデオデバイスのIO空間のPORTSへの書き込みです(その視点から)。適切な書き込みによって適切なピクセルが点灯する限り、ビデオデバイスは画面レンダリングのためのドライバを書いている人の観点から仕事をしています(または、メモリがフリーであった古いDOSコードユーザ空間/カーネル空間分割)。しかし、このようなコードでは、後にビデオセグメントから取得されるデータを格納する必要はありませんでした。したがって、典型的なメモリセマンティクスは一般に実装されていない(ハードウェアと労力の浪費)。ここでは、これらの無秩序について話しています: Magic number with MmMapIoSpace

関連する問題