变态重口极致另类在线-波多久久夜色精品国产-波多野结衣在线观看一区-波多野结衣在线观看一区二区-污污的网站免费阅读-污污视频网址

當前位置: 首頁IT技術 → windows xp下直接寫顯示緩沖區顯示bmp圖片

windows xp下直接寫顯示緩沖區顯示bmp圖片

更多

在dos下可以通過直接填充顯示緩沖區,實現快速繪圖,在windows下能否實現呢?
windows下一般用戶程序運行在ring3下,沒法直接讀寫物理內存,因此只能通過運行在ring0下的驅動來實現。
dos下,圖形模式下顯示緩沖區的地址是0A000H段,長度只有64k,太小了,跨段操作很麻煩。
在windows下,顯卡的顯示緩沖區地址是多少?我們打開設備管理器看看,我的機器上顯卡型號是GeForce 7050,它占用的資源是:內存范圍FD000000-FDFFFFFF D0000000-DFFFFFFF
FC000000-FCFFFFFF  000A0000-000BFFFF,看來dos下0a000段緩沖區還能用,但太小了,每次操作64k很慢,況且也不知道怎么在保護模式下換頁,放棄。
剩下的三段中哪一段是和當前屏幕對應的呢?經過試驗,D0000000-DFFFFFFF這段就是,是連續的256M,不需要換頁。
下面的工作就是寫一個小驅動,直接操作這段內存,讓屏幕上顯示一小幅bmp圖片。

試驗了兩天,已經在1024*768 32位真彩色模式下實現這個功能,以下是小驅動的源碼:
;填充顯示緩沖區,顯示一幅bmp圖片的小驅動 作者:盛玉增 (www.aogosoft.com 電子管)
 ;2010年10月20日 WinXP masm32v8 kmdkit1.8下調試通過。
;@echo off
;goto make
.386
.model flat, stdcall
option casemap:none
include /masm32/include/w2k/ntstatus.inc
include /masm32/include/w2k/ntddk.inc
include /masm32/include/w2k/ntoskrnl.inc
includelib /masm32/lib/w2k/ntoskrnl.lib
.code
DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
           pushad 
           invoke MmMapIoSpace,0d0000000h,0,4*1024*1024,MmNonCached ;物理地址映射為線性地址,長度4M,返回值在eax
                       cmp eax,0   ;eax==0,失敗
                       jz   ta_1
                       cli
                       mov edi,eax    ;eax是顯示緩沖區的首地址
                       mov ecx,320    ;共320行,每行240個像素
                       mov esi,offset bmp_2 ;bmp文件中的像素數據開始地址
            ta_2:      push ecx 
                       mov ecx,960   ;每像素4個字節,240*4=960,圖片一行送顯示緩沖區
                       rep movsb
                       add edi,1024*4-960  ;1024*768顯示模式
                                           ;320*240的bmp圖片,每行占用960個字節
                       pop ecx
                       loop ta_2
                       sti  
            ta_1:
        popad
  mov eax, STATUS_DEVICE_CONFIGURATION_ERROR
  ret

DriverEntry endp;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
.data
  ; 以下為bmp格式的320*240的bmp圖片文件數據 長度307254 bytes
bmp_1  db 66,77,54,176,4,0,0,0,0,0,54,0,0,0,40,0    ;bmp文件頭占用54個字節
  db 0,0,240,0,0,0,64,1,0,0,1,0,32,0,0,0
  db 0,0,0,176,4,0,0,0,0,0,0,0,0,0,0,0
  db 0,0,0,0,0,0
bmp_2 db 229,211,248,0,131,125,242,0,74,103      ;bmp_2為像素數據開始位置,每個像素占用4個字節,順序為藍、綠、紅、保留,保留字節都為0
  db 248,0,45,88,251,0,40,66,255,0,48,71,247,0,63,103
  db 251,0,67,127,251,0,69,106,252,0,42,68,252,0,31,57
  db 255,0,41,76,250,0,44,86,247,0,41,74,254,0,32,57
  db 255,0,30,53,253,0,21,55,245,0,39,78,255,0,51,102
  db 249,0,43,100,233,0,28,74,239,0,27,63,255,0,24,60
;......數據省略

end DriverEntry

:make

set drv=bmp1

/masm32/bin/ml /nologo /c /coff %drv%.bat
/masm32/bin/link /nologo /driver /base:0x10000 /align:32 /out:%drv%.sys /subsystem:native %drv%.obj

del %drv%.obj

echo.
pause

圖片在屏幕的左上角顯示,發現圖像是上下顛倒的。原來bmp文件中的數據是從下向上保存的,并不是從左上角到右下角,而是從左下角開始,逐行到最上一行。
為了顯示美觀,我的圖片是事先顛倒過的。
(順便說一句,圖片的作者是云門光影,一個攝影愛好者,版權所有,圖片不得用于其它目的,哈哈)

加載這個小驅動用了kmdkit中的beeper中的小程序scp.exe,稍微改了一下。也可以用其它加載驅動的程序,注冊這個驅動后,start就能顯示圖片。
加載驅動的小程序源碼如下:
;加載驅動程序的代碼 電子管(qq5611409) 2010年10月20日在winxp masm32v8 kmdkit1.8下調試通過
.386
.model flat, stdcall
option casemap:none
include /masm32/include/windows.inc
include /masm32/include/kernel32.inc
include /masm32/include/user32.inc
include /masm32/include/advapi32.inc
includelib /masm32/lib/kernel32.lib
includelib /masm32/lib/user32.lib
includelib /masm32/lib/advapi32.lib
include /masm32/Macros/Strings.mac
.code
start proc
local hSCManager:HANDLE
local hService:HANDLE
local acDriverPath[MAX_PATH]:CHAR
  invoke OpenSCManager, NULL, NULL, SC_MANAGER_CREATE_SERVICE
  .if eax != NULL
    mov hSCManager, eax
    push eax
    invoke GetFullPathName, $CTA0("bmp1.sys"), sizeof acDriverPath, addr 

acDriverPath, esp
      pop eax
    ; Register driver in SCM active database
    invoke CreateService, hSCManager, $CTA0("bemp1"), $CTA0("Nice Melody bmp1"), 

/
        SERVICE_START + DELETE, SERVICE_KERNEL_DRIVER, 

SERVICE_DEMAND_START, /
        SERVICE_ERROR_IGNORE, addr acDriverPath, NULL, NULL, NULL, 

NULL, NULL
    .if eax != NULL
      mov hService, eax
      invoke StartService, hService, 0, NULL
      invoke DeleteService, hService
      invoke CloseServiceHandle, hService
    .else
      invoke MessageBox, NULL, $CTA0("注冊驅動失敗."), NULL, MB_ICONSTOP
    .endif
    invoke CloseServiceHandle, hSCManager
  .else
    invoke MessageBox, NULL, $CTA0("Can't connect to Service Control Manager."), 

/
              NULL, MB_ICONSTOP
  .endif
  invoke ExitProcess, 0
start endp
end start

熱門評論
最新評論
昵稱:
表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
字數: 0/500 (您的評論需要經過審核才能顯示)
主站蜘蛛池模板: 521a久久九九久久精品 | 在线黄色免费看 | 特黄特级高清免费视频毛片 | 成人精品在线视频 | 三区在线视频 | 怡红院视频在线 | 美女黄频a美女大全免费皮 美女黄免费网站 | 快播视频在线观看 | 久草视屏 | 成人午夜视频免费 | 成人在线免费 | 国产精品欧美日韩一区二区 | 成人短视频在线在线观看 | a在线观看欧美在线观看 | 免费看欧美一级特黄α大片 | 成人羞羞 | 成在线人免费视频一区二区三区 | 精品在线视频免费 | 国内精品 大秀视频 日韩精品 | 外国黄色毛片 | 亚洲线精品久久一区二区三区 | 色在线网| 日韩欧美国产精品第一页不卡 | 黄色一级毛片免费看 | 曰曰摸天天摸人人看久久久 | 国产精品入口麻豆免费看 | 美女高清特黄a大片 | 精品国产欧美 | 精品国产一区二区三区麻豆小说 | 免费无遮挡嘿嘿嘿视频动态 | 337p欧洲亚大胆精品 | 一区二区三区亚洲 | 欧美综合亚洲图片综合区 | 色播在线永久免费视频 | 久久天天躁狠狠躁夜夜不卡 | 亚洲综合涩 | 2022久久国产精品免费热麻豆 | 亚洲成人免费在线 | 欧美人成一本免费观看视频 | 男女视频免费网站 | 久久久久久久性高清毛片 |