Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Diskobolos 30. 07. 2018, 08:39:06

Název: Přístup z C# aplikace do framebufferu běžící DOS aplikace
Přispěvatel: Diskobolos 30. 07. 2018, 08:39:06
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.
Název: Re:Přístup z C# aplikace do framebufferu běžící DOS aplikace
Přispěvatel: Adblocek 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
Název: Re:Přístup z C# aplikace do framebufferu běžící DOS aplikace
Přispěvatel: Extrakoder 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 :)



Název: Re:Přístup z C# aplikace do framebufferu běžící DOS aplikace
Přispěvatel: MadCatX 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í.
Název: Re:Přístup z C# aplikace do framebufferu běžící DOS aplikace
Přispěvatel: Ondrej Nemecek 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.
Název: Re:Přístup z C# aplikace do framebufferu běžící DOS aplikace
Přispěvatel: Diskobolos 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.
Název: Re:Přístup z C# aplikace do framebufferu běžící DOS aplikace
Přispěvatel: borekz 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.
Název: Re:Přístup z C# aplikace do framebufferu běžící DOS aplikace
Přispěvatel: Radovan. 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.
Název: Re:Přístup z C# aplikace do framebufferu běžící DOS aplikace
Přispěvatel: borekz 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.