Radmin的抓屏和顯屏API程式碼部分分析
分析了Radmin的抓屏和顯屏API程式碼,抓屏它採用的是逐行掃描,顯屏它採用的是全屏顯示。就是不知道他使用的什麼壓縮,他傳送時好像沒有用記憶體XOR運算髮送不同的資料,但不知道他使用什麼壓縮方法傳送的。
r_server
SRCCOPY = $00CC0020; { dest = source
function CreateDCA(lpszDriver, lpszDevice, lpszOutput: PAnsiChar;
lpdvmInit: PDeviceModeA): HDC; stdcall;
lpszDriver 'DISPLAY'
lpszDevice nil
lpszOutput nil
lpdvmInit nil
function GetDeviceCaps(DC: HDC; Index: Integer): Integer; stdcall;
DC CreateDCA 的返回值
Index RASTERCAPS = 38; { Bitblt capabilities
function CreateCompatibleDC(DC: HDC): HDC; stdcall;
DC CreateDCA 的返回值
function GetDeviceCaps(DC: HDC; Index: Integer): Integer; stdcall;
DC CreateDCA 的返回值
Index HORZRES = 8; { Horizontal width in pixels
function GetDeviceCaps(DC: HDC; Index: Integer): Integer; stdcall;
DC CreateDCA 的返回值
Index VERTRES = 10; { Vertical height in pixels
function CreateCompatibleBitmap(DC: HDC; Width, Height: Integer): HBITMAP; stdcall;
DC CreateDCA 的返回值
Width GetDeviceCaps HORZRES的返回值
Height 0x00000001
function GetObjectA(p1: HGDIOBJ; p2: Integer; p3: Pointer): Integer; stdcall;
p1 CreateCompatibleBitmap 的返回值
p2 ?24
p3 ?
function GetDeviceCaps(DC: HDC; Index: Integer): Integer; stdcall;
DC CreateCompatibleDC 的返回值
Index RASTERCAPS = 38; { Bitblt capabilities
function GetDeviceCaps(DC: HDC; Index: Integer): Integer; stdcall;
DC CreateCompatibleDC 的返回值
Index BITSPIXEL = 12; { Number of bits per pixel
function CreateBitmap(Width, Height: Integer; Planes, BitCount: Longint;
Bits: Pointer): HBITMAP; stdcall;
Width 5
Height 1
Planes 1
BitCount 10
Bits 0
function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall;
DC CreateCompatibleDC 的返回值
p2 CreateBitmap 的返回值
function SetPixel(DC: HDC; X, Y: Integer; Color: COLORREF): COLORREF; stdcall;
DC CreateCompatibleDC 的返回值
X 0x00000000
Y 0x00000000
Color 0x000000FF
function GetBitmapBits(Bitmap: HBITMAP; Count: Longint;
Bits: Pointer): Longint; stdcall;
Bitmap CreateBitmap 的返回值
Count 0x00000002
Bits
function SetPixel(DC: HDC; X, Y: Integer; Color: COLORREF): COLORREF; stdcall;
DC CreateCompatibleDC 的返回值
X 0x00000000
Y 0x00000000
Color 0x0000FF00
function GetBitmapBits(Bitmap: HBITMAP; Count: Longint;
Bits: Pointer): Longint; stdcall;
Bitmap CreateBitmap 的返回值
Count 0x00000002
Bits
function SetPixel(DC: HDC; X, Y: Integer; Color: COLORREF): COLORREF; stdcall;
DC CreateCompatibleDC 的返回值
X 0x00000000
Y 0x00000000
Color 0x00FF0000
function GetBitmapBits(Bitmap: HBITMAP; Count: Longint;
Bits: Pointer): Longint; stdcall;
Bitmap CreateBitmap 的返回值
Count 0x00000002
Bits
function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall;
DC CreateCompatibleDC 的返回值
p2 SelectObject 的返回值
function DeleteObject(p1: HGDIOBJ): BOOL; stdcall;
p1 CreateBitmap 的返回值
function CreateCompatibleBitmap(DC: HDC; Width, Height: Integer): HBITMAP; stdcall;
DC CreateDCA 的返回值
Width 0x00000400
Height 0x00000015
function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall;
DC CreateCompatibleDC 的返回值
p2 CreateCompatibleBitmap 的返回值
function BitBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC;
XSrc, YSrc: Integer; Rop: DWORD): BOOL; stdcall;
DestDC CreateCompatibleDC 的返回值
X 0x00000000
Y 0x00000000
Width 0x00000400
Height 0x00000001 變
SrcDC CreateDCA 的返回值
XSrc 0x00000000 變
YSrc 0x0000000F 變
Rop SRCCOPY
function GetDIBits(DC: HDC; Bitmap: HBitmap; StartScan, NumScans: UINT;
Bits: Pointer; var BitInfo: TBitmapInfo; Usage: UINT): Integer; stdcall;
DC CreateCompatibleDC 的返回值
Bitmap CreateCompatibleBitmap 的返回值
StartScan 0x00000000
NumScans 0x00000001
Bits
BitInfo
Usage 0x00000000
function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall;
DC CreateCompatibleDC 的返回值
p2 CreateCompatibleBitmap 的返回值
function DeleteDC(DC: HDC): BOOL; stdcall;
DC CreateDCA 的返回值
function DeleteDC(DC: HDC): BOOL; stdcall;
DC CreateCompatibleDC 的返回值
function DeleteObject(p1: HGDIOBJ): BOOL; stdcall;
p1 SelectObject 的返回值
radmin
function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall;
DC
p2
function ExtCreateRegion(XForm: PXForm; Count: DWORD; const RgnData: TRgnData): HRGN; stdcall;
XForm nil 單元轉換
Count 資料大小
RgnData 資料
function SelectClipRgn(DC: HDC; Region: HRGN): Integer; stdcall; -> ->
DC SelectObject 的DC
Region ExtCreateRegion 的返回值
返回值 COMPLEXREGION = 3
function SetDIBitsToDevice(DC: HDC; DestX, DestY: Integer; Width, Height: DWORD;
SrcX, SrcY: Integer; nStartScan, NumScans: UINT; Bits: Pointer;
var BitsInfo: TBitmapInfo; Usage: UINT): Integer; stdcall;
DC SelectObject 的DC
DestX 0 服務端螢幕X
DestY 0 服務端螢幕Y
Width $320 服務端螢幕Width
Height $258 服務端螢幕Height
SrcX 0
SrcY 0
nStartScan 0
NumScans $258
Bits 資料?
BitsInfo
Usage 不知道DIB_RGB_COLORS
function SelectClipRgn(DC: HDC; Region: HRGN): Integer; stdcall; ->
DC SelectObject 的DC
Region 0
返回值 SIMPLEREGION = 2
function DeleteObject(p1: HGDIOBJ): BOOL; stdcall;
p1 ExtCreateRegion 的返回值
function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall;
DC 原 SelectObject 的DC
p2 上一個 SelectObject 的返回值
function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall;
DC 原 SelectObject 的DC
p2 上一個 SelectObject 的返回值
普通模式
function BitBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC;
XSrc, YSrc: Integer; Rop: DWORD): BOOL; stdcall;
DestDC
X 0 服務端螢幕X
Y 0 服務端螢幕Y
Width $320 服務端螢幕Width
Height $258 服務端螢幕Height
SrcDC 上一個 SelectObject 的返回值 = 上一個 SelectObject 的DC= 原 SelectObject 的DC
XSrc 0
YSrc 0
Rop SRCCOPY
伸拉模式
function SetStretchBltMode(DC: HDC; StretchMode: Integer): Integer; stdcall;
DC
StretchMode
function StretchBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC;
XSrc, YSrc, SrcWidth, SrcHeight: Integer; Rop: DWORD): BOOL; stdcall;
DestDC
X
Y
Width
Height
SrcDC
XSrc
YSrc
SrcWidth
SrcHeight
Rop
function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall;
DC 上一個 SelectObject 的返回值 = 上一個 SelectObject 的DC= 原 SelectObject 的DC
p2 上一個 SelectObject 的返回值
上面是Radmin和R_server所用抓屏和顯屏的API函式
某網友的分析,我還不知如何分析