2012-03-14 2 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에 대한 쓰기 (관점에서)입니다. 적절한 쓰기가 적절한 픽셀을 점등 시키면, 비디오 장치는 화면 렌더링을위한 드라이버를 작성하는 사람의 관점에서 작업을 수행합니다 (또는 메모리는 모두 무료입니다). 사용자 공간/커널 공간 분할). 그러나 이러한 코드는 나중에 비디오 세그먼트에서 검색 할 데이터를 저장할 필요가 없었습니다. 따라서 일반적인 메모리 의미론은 일반적으로 구현되지 않았습니다 (하드웨어 및 노력 낭비). 여기에서 이러한 무분별한 이야기가 있습니다. Magic number with MmMapIoSpace

관련 문제