Přístup z C# aplikace do framebufferu běžící DOS aplikace

Diskobolos

Tvořím C# aplikaci a ta potřebuje z okna jiné běžící DOSové aplikace přístup k obsahu obrazovky, resp. framebufferu této DOSové aplikace. Jde mi o detekci určité sekvence znaků na konkrétní pozici. Lze toho dosáhnout a jak? Díky za konstruktivní rady/tipy. PS: DOSovou aplikaci nelze přepsat/vyměnit.


Adblocek

Re:Přístup z C# aplikace do framebufferu běžící DOS aplikace
« Odpověď #1 kdy: 30. 07. 2018, 09:01:26 »
Vyfoť si tu sekvenci znaků jako screen, ořízni na tu danou část kterou hledáš a pak procházej pixely v okně dokud nenajdeš shodu.

Youtube: Pixel screen detection c#

Popř. vyměnit DOS appku, nechápu, že to někdo někde ještě musí používat :D

Extrakoder

Re:Přístup z C# aplikace do framebufferu běžící DOS aplikace
« Odpověď #2 kdy: 30. 07. 2018, 09:04:38 »
Sem si ted ze srandy zkusil nasledujici a prekvapive to funguje :)

- nainstaluj si cygwin https://cygwin.com/
- v cygwinu mimo zakladniho prostredi potrebujes screen https://www.gnu.org/software/screen/
- spust cygwin
- v cygwinu zadej prikaz screen a uvnitr screen session spust svoji app (zkusil jsem s psql.exe)

Kód: [Vybrat]
pepa@pepa /cygdrive/c/Program Files/PostgreSQL/9.5/bin
$ ./psql.exe --help

- spust druhej cygwin terminal
- zadej

Kód: [Vybrat]
pepa@pepa ~
$ screen -ls
There are screens on:
        1552.pty1.CZ-LT-1027    (Dead ???)
        4132.pty1.CZ-LT-1027    (Attached)
        7704.pty0.CZ-LT-1027    (Dead ???)
Remove dead screens with 'screen -wipe'.
3 Sockets in /tmp/uscreens/pepa.

Z toho dostanes session ID v nasem pripade 4132 a nasledne udelame dump obsahu

Kód: [Vybrat]
screen -p0 -S 4132 -X hardcopy hardcopy.txt
Svete div se pod C:\Program Files\PostgreSQL\9.5\bin\hardcopy.txt je opravdu vypis helpu k psql :)




MadCatX

Re:Přístup z C# aplikace do framebufferu běžící DOS aplikace
« Odpověď #3 kdy: 30. 07. 2018, 09:19:35 »
Jestli stačí možnost programově pořídit screenshot té aplikace, koukni zde: https://stackoverflow.com/questions/891345/get-a-screenshot-of-a-specific-application

Kdysi jsem o možnosti přímého přístupu k framebufferu ve Win něco četl a je to dost nebezpečné a na novějších Win asi i nefunkční.

Re:Přístup z C# aplikace do framebufferu běžící DOS aplikace
« Odpověď #4 kdy: 30. 07. 2018, 11:16:43 »
Pokud ta aplikace běží v textovém terminálu, šlo by ji pustit v tom terminálu z C# a odkamtud klidně i celou ovládat. Pokud je grafická, šlo by ji spustit ve virtuálu a připojit se pomocí vnc nebo spice a udělat si snímek obrazovky. To by šlo ostatně i bez té virtualizace.


Diskobolos

Re:Přístup z C# aplikace do framebufferu běžící DOS aplikace
« Odpověď #5 kdy: 30. 07. 2018, 11:47:58 »
Pokud ta aplikace běží v textovém terminálu, šlo by ji pustit v tom terminálu z C# a odkamtud klidně i celou ovládat.

Přesně tak to je (aplikace běží v textovém terminálu). Spustit cmd.exe, resp. DOS aplikaci bych z C# uměl, ale jak přistupovat neinvazivě k textu na obrazovce? Lze se pak dostat k paměti s framebufferem?

Mám udělaný prototyp, který detekuje spuštěnou aplikaci, hodí ji do popředí, vyvolá kontextové menu okna a provede výběr celé obrazovky s následným nakopírováním do klipboardu. Je to velmi nešikovné (přemaže obsah klipbooardu, přepíná do popředí okno, závislost na verzi win), nedá se to spouštět periodicky, takže v praxi nepoužitelné.

Kdyby to někoho zajímalo, tak ve zkratce (bez ošetření chyb):

Kód: [Vybrat]
IntPtr myApp = FindWindow("ConsoleWindowClass", "C:\\WINDOWS\\system32\\cmd.exe");
if (myApp == IntPtr.Zero) return;
SetForegroundWindow(myApp);
SendKeys.SendWait("% "); // ALT + space
SendKeys.SendWait("a");
SendKeys.SendWait("a");
SendKeys.SendWait("{ENTER}");
// obsah textu DOS aplikace je v klipboardu

Nápad s cygwinem není špatný, ale jedná se o DOS aplikaci, které je náchylná na nastavení prostředí (sítová a lokální tiskárna), takže mám obavy z běhu mimo stabilní cmd.exe.

borekz

  • ****
  • 492
    • Zobrazit profil
    • E-mail
Re:Přístup z C# aplikace do framebufferu běžící DOS aplikace
« Odpověď #6 kdy: 30. 07. 2018, 11:49:59 »
Musí to být C# ? Na takové věci je C.
A jde skutečně o 16b aplikaci MS-DOS ? Taková nelze spustit v 64b Windows. Nemyslíš náhodou konzolovou Windows aplikaci ?
Pokud by skutečně šlo o 16b aplikaci, bylo by možné např. rozšířit DosBox nebo si napsat rezidentní Dosový program, který spustíš před aplikací a ten ti bude předávat framebuffer do C# přes soket.
« Poslední změna: 30. 07. 2018, 11:53:55 od borekz »

Radovan.

Re:Přístup z C# aplikace do framebufferu běžící DOS aplikace
« Odpověď #7 kdy: 30. 07. 2018, 11:53:21 »
DOSovou aplikaci nelze přepsat/vyměnit.
Ale no! Jak je to dlouho, co M$ patchnul ten editor vzorců v M$ Opici? Zdrojáky nemají, není to jejich kód, tak tam hrábli hexeditorem jak v Pojídačích koláčů ;D

Pokud by to běželo v nějakém virtuálním stroji s DOSem a v textovém režimu, tak tam před tím můžeš spustit nějaký TSR, který bude prostě hlídat pár konkrétních bytů RAM na známé adrese, a o jejich stavu dá někam vědět. Třeba je pošle ven sítí nebo nějakým portem.

borekz

  • ****
  • 492
    • Zobrazit profil
    • E-mail
Re:Přístup z C# aplikace do framebufferu běžící DOS aplikace
« Odpověď #8 kdy: 30. 07. 2018, 12:10:12 »
Třeba je pošle ven sítí nebo nějakým portem.
Tak jsi mě o půl minuty předběhl. Jen nevím, jak posílat z DOSu po síti. Pokud vím, nemá TCP/IP stack jako současné operační systémy. Použití 3rd party stacku nebude triviální.
Pokud by "hostitelský" operační systém byl 32-bitový a aplikace se spouštěla pod NTVDM, bylo by možná jednodušší komunikaci vyřešit instrukcí out na adresu, kterou bude hlídat ovladač VDD.
A pokud je systém Windows XP, nejjednodušší je číst framebuffer funkcí ReadProcessMemory.