program ashot; // by cHackAll
uses Windows, WinSock, Messages;
function _itoa(Value: Integer; lpBuffer: PChar; Radix: Integer): PChar; cdecl external 'ntdll';
function strstr(str, strSearch: PChar): PChar; cdecl external 'ntdll';
type
argb = packed record
b, g, r, a: Byte;
end;
var
Value, Index, hWnd, Version, hScreen, hCanvas, hdibCanvas, w, h, y, x, Pixel: Integer;
lpBuffer, lpType, lpDevice: PChar;
Buffer, Device: ShortString;
WndClass: TWndClass;
WSData: TWSAData;
Msg: TMsg;
Header: packed record
bpp, size, width, height, red_offset, red_length, blue_offset, blue_length, green_offset, green_length, alpha_offset, alpha_length: Integer;
end;
name: TSockAddrIn;
hSocket: Integer;
lpCanvas: PIntegerArray;
lpPixel: Pointer;
PaintStruct: TPaintStruct;
isDown, isSwap: LongBool;
BitmapInfo: TBitmapInfo;
Pos, Cursor: TPoint;
function read(const lpBuffer: PChar; const uBytes: Integer): Integer;
var Count: Integer;
begin
Result := 0;
while Result < uBytes do
begin
Count := recv(hSocket, lpBuffer[Result], uBytes - Result, 0);
if Count > 0 then Inc(Result, Count) else Break;
end;
end;
function write(const lpBuffer: PChar): LongBool;
var len: Integer;
begin
len := lstrlen(lpBuffer);
if len = 0 then Inc(len);
Result := (send(hSocket, lstrcat(_itoa(len or $10000, @Buffer, 16), lpBuffer)[1], len + 4, 0) = len + 4) and
(read(@Result, SizeOf(Result)) = SizeOf(Result)) and
(Integer(Result) = PInteger(PChar('OKAY'))^);
end;
begin
CreateMutex(nil, False, 'nil');
if GetLastError <> 0 then Exit;
WinExec('adb start-server', SW_HIDE);
WndClass.lpszClassName := 'nil';
WndClass.lpfnWndProc := @DefWindowProc;
WndClass.hCursor := CreateCursor(HInstance, 5, 5, 9, 9, PChar(#255#255#255#255#255#255#255#255#247#255#255#255#255#255#255#255#255#255), PChar(#8#8#8#8#8#8#28#28#247#128#28#8#8#8#8#8#8#8));
hWnd := CreateWindowEx(WS_EX_TOOLWINDOW or WS_EX_TOPMOST or WS_EX_LAYERED, Ptr(RegisterClass(WndClass)), nil, WS_POPUP, 0, 0, 0, 0, 0, 0, HInstance, nil);
SetLayeredWindowAttributes(hWnd, 0, 232, LWA_ALPHA);
isDown := False;
isSwap := False;
WSAStartup($0101, WSData);
name.sin_family := AF_INET;
name.sin_port := htons(5037);
name.sin_addr.S_addr := inet_addr('127.0.0.1');
with BitmapInfo.bmiHeader do
begin
biSize := SizeOf(BitmapInfo.bmiHeader);
biPlanes := 1;
biBitCount := 32;
biCompression := BI_RGB;
end;
lstrcpy(@Device, 'host:transport:');
repeat
Sleep($7F);
lpDevice := nil;
hSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
DispatchMessage(Msg);
if connect(hSocket, name, SizeOf(name)) = 0 then
if write('host:track-devices') then
while not Assigned(lpDevice) and (read(@Buffer, 4) = 4) do
if PInteger(@Buffer)^ <> PInteger(PChar('0000'))^ then
begin
Value := 0;
for Index := 0 to 3 do
begin
if Buffer[Index] > '9' then
Buffer[Index] := Chr((Ord(Buffer[Index]) or 32) - 39);
Value := (Value shl 4) or (Ord(Buffer[Index]) - Ord('0'));
end;
lpBuffer := @Buffer;
if read(lpBuffer, Value) = Value then
begin lpBuffer[Value] := #0;
while lpBuffer[0] <> #0 do
begin
Value := Length('host:transport:');
lpType := @Device;
repeat
if lpBuffer[0] > #10 then
Device[Value] := lpBuffer[0]
else
Device[Value] := #0;
Inc(Value);
if lpBuffer[0] = #9 then
lpType := @Device[Value]
else
if (lpBuffer[0] = #10) and (lstrcmpi(lpType, 'device') = 0) then
lpDevice := @Device;
Inc(lpBuffer);
until (lpBuffer[-1] = #10) or Assigned(lpDevice);
end;
end;
end;
closesocket(hSocket);
while Assigned(lpDevice) and IsWindow(hWnd) do
begin
hSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (connect(hSocket, name, SizeOf(name)) = 0) and write(lpDevice) and write('framebuffer:') and (read(@Version, SizeOf(Version)) = SizeOf(Version)) then
begin
Header.size := 0;
if Version = 16 then
begin
Header.bpp := 16;
read(@Header.size, 3 * 4);
Header.red_offset := 11;
Header.red_length := 5;
Header.green_offset := 5;
Header.green_length := 6;
Header.blue_offset := 0;
Header.blue_length := 5;
Header.alpha_offset := 0;
Header.alpha_length := 0;
end
else if Version = 1 then
read(@Header, 12 * 4);
if Header.size > 0 then
begin
lpBuffer := Ptr(LocalAlloc(0, Header.size));
if read(lpBuffer, Header.size) = Header.size then
with BitmapInfo.bmiHeader do
begin
w := Header.width;
h := Header.height;
if isSwap then
begin
w := h;
h := Header.width;
end;
if (biWidth <> w) or (biHeight <> h) then
begin
if biWidth * biHeight <> w * h then
begin
Pos.X := (GetSystemMetrics(SM_CXSCREEN) - w) div 2;
Pos.Y := (GetSystemMetrics(SM_CYSCREEN) - h) div 2;
end;
biWidth := w;
biHeight := h;
biSizeImage := w * 4 * h;
isDown := False;
end
else if isDown then
if (GetKeyState(VK_LBUTTON) and $80) = 0 then isDown := False else
begin
GetCursorPos(Pos);
Dec(Pos.X, Cursor.X);
Dec(Pos.Y, Cursor.Y);
end;
hScreen := GetDC(0);
hdibCanvas := CreateDIBSection(hScreen, BitmapInfo, DIB_RGB_COLORS, Pointer(lpCanvas), 0, 0);
hCanvas := CreateCompatibleDC(0);
SelectObject(hCanvas, hdibCanvas);
ReleaseDC(0, hScreen);
Dec(Header.width);
Dec(Header.height);
lpPixel := lpBuffer;
for y := 0 to Header.height do
for x := 0 to Header.width do
begin
Pixel := PCardinal(lpPixel)^;
Inc(Cardinal(lpPixel), Header.bpp div 8);
if isSwap then Value := y + (x * biWidth) else
Value := ((Header.height - y) * biWidth) + x;
with argb(lpCanvas[Value]) do
begin
r := ((Pixel shr Header.red_offset) and ((1 shl Header.red_length) - 1)) shl (8 - Header.red_length);
g := ((Pixel shr Header.green_offset) and ((1 shl Header.green_length) - 1)) shl (8 - Header.green_length);
b := ((Pixel shr Header.blue_offset) and ((1 shl Header.blue_length) - 1)) shl (8 - Header.blue_length);
a := ((Pixel shr Header.alpha_offset) and ((1 shl Header.alpha_length) - 1)) shl (8 - Header.alpha_length);
end;
end;
SetWindowPos(hWnd, HWND_TOPMOST, Pos.X, Pos.Y, w, h, SWP_SHOWWINDOW);
InvalidateRect(hWnd, nil, False);
BitBlt(BeginPaint(hWnd, PaintStruct), 0, 0, biWidth, biHeight, hCanvas, 0, 0, SRCCOPY);
EndPaint(hWnd, PaintStruct);
DeleteObject(hdibCanvas);
DeleteObject(hCanvas);
end;
LocalFree(Cardinal(lpBuffer));
end;
end
else
lpDevice := nil;
closesocket(hSocket);
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
if Msg.message = WM_RBUTTONDOWN then isSwap := not isSwap else
if Msg.message = WM_LBUTTONUP then isDown := False else
if Msg.message = WM_LBUTTONDOWN then
begin
GetCursorPos(Cursor);
Dec(Cursor.X, Pos.X);
Dec(Cursor.Y, Pos.Y);
isDown := True;
end
else
DispatchMessage(Msg);
end;
ShowWindow(hWnd, SW_HIDE);
until not IsWindow(hWnd);
end.