MirrorDriver從0開始到抓屏

2021-10-04 17:19:02 字數 1675 閱讀 1030

google關鍵字"mirrordriver",大部分的可以看到一些應用層的**,但是驅動層的**寥寥無幾,實際上只有mirrordriver vnc和qemu的顯示卡驅動有相關**。但實際上從微軟的sample code修改一下就可以很快實現乙個自己的mirrordriver

mirrordriver在xp時代是最有效的轉屏方式,原理是直接從gdi桌面混合器中直接獲取影象資料。那麼如果獲取影象資料又有兩種方式嗎,一種是使用檔案,另外一種是客戶端先分配一段記憶體然後通過驅動程式讓mirrordriver在這段記憶體中寫入影象資料。

1、在檔案driver.h中新增

pvoid   pvtmpbuffer;

// ptr to mirrsurf bits for screen su***ce

2、在drvenablesu***ce函式中 flhooks |= ***lobalhooks 後的**替換成一下**,實際上,engcreatedevicesu***ce和engcreatebitmap從文件上看沒有什麼差別,都可以。

mirrorsize =

(ulong)

(ppdev-

>cxscreen * ppdev-

>cyscreen * bitsperpel)

;ppdev-

>pvtmpbuffer =

engmapfile

(l"\\??\\c:\\video.dat"

, mirrorsize,

&ppdev-

;hsurf =

(hsurf)

engcreatebitmap

(sizl,

ppdev-

>ldeltascreen,

ulbitmaptype,0,

(pvoid)

(ppdev-

>pvtmpbuffer));

if(hsurf ==

(hsurf)0)

if(!engassociatesu***ce

(hsurf, ppdev-

>hdeveng, flhooks)

)return

(hsurf)

;

3、參考原始碼,修改drvcopybits、drvbitblt、drvtextout等函式,直接呼叫底層eng*函式,讓驅動直接往下執行。

4、修改sreen.c檔案,整體替換就行了。原理可能需要了解gdi內部繪圖方式了。

5、編譯安裝重啟後,驅動會在c盤下新建檔案video.dat檔案,檔案內容就是桌面的映象畫面,實際上就是rgba資料

1、獲取共享記憶體檔案的內容的指標。

pchar videomemory_getsharedmemory

(void

)closehandle

(hfile);}

return pvideomemory;

}

void

capturescreenframe

(int width,

int height,rect cropregin, pchar myframebuffer,

int index)

**已開源

從0開擼C (四) 函式過載和運算子過載

本期主題 c 中的函式過載和運算子過載 2.過載加號運算子 person person person person string name person person intmain void gary ubuntu workspaces cpp study 2.6.operator overloa...

從0開始 二

slam是指當某種移動裝置 如機械人 無人機 手機等 從乙個未知環境裡的未知地點出發,在運動過程中通過感測器 如雷射雷達 攝像頭等 觀測定位自身位置 姿態 運動軌跡,再根據自身位置進行增量式的地圖構建,從而達到同時定位和地圖構建的目的。sfm structure from motion 是一種和sl...

從settings檔案建立django開發索引

新增的配置 django專案的開發過程中,在對整個框架不夠了解之前,內容僅靠模糊的記憶可能會導致一系列的未知問題 例如乙個字母寫錯 全域性配置檔案settings中的配置,往往可以對映整個專案所需要的內容。django版本1.11 其實不算是預設的,只是在建立專案之後,已經為我們寫了一些配置 當然,...