DOCUMENT:Q120565 06-NOV-1999 [win16ddk] TITLE :How to Read Text Mode Screen of MS-DOS Session in Windows PRODUCT :Microsoft Windows Device Driver Kit PROD/VER::3.1 OPER/SYS: KEYWORDS: ====================================================================== ------------------------------------------------------------------------------- The information in this article applies to: - Microsoft Windows Device Development Kit (DDK) for Windows, version 3.1 ------------------------------------------------------------------------------- SUMMARY ======= Sometimes it is necessary to read the text from the screen of an MS-DOS session running under Windows version 3.1 in 386 Enhanced mode. Use a simple VxD to read the screen in an MS-DOS session. You don't need to access the MS-DOS session screen through the VDD or GRABBER to read it. MORE INFORMATION ================ In a VxD, by using VM Control Block (handle) for the virtual machine (VM) that contains the MS-DOS session, you can obtain the base linear address of the VM from the CB_High_Linear member of the control block. CB_High_Linear will contain the linear address of "virtual 0000:0000" for the MS-DOS session. Use this linear address to offset to [CB_High_Linear + 0400h] in the VM to poke around in the BIOS DATA area. Information such as what video mode is active, how many screen columns are active, and so on can be found in the BIOS DATA area. You can use this data to determine the address and the size of the text screen in the MS-DOS session. Then you can use the address and size to read the whole screen or a portion of it. By using MEMORY.LST included with Ralf Brown's Interrupt List compilation, or by using a good BIOS DATA reference found in many books, you can get this information: =========================================================================== Format of BIOS Data Segment at segment 40h: {items in curly braces not documented by IBM} Offset Size Description . . . 49h BYTE Video current mode 4Ah WORD Video columns on screen 4Ch WORD Video page (regen buffer) size in bytes 4Eh WORD Video current page start address in regen buffer 50h 16 BYTEs Video cursor position (col, row) for eight pages, 0 based 60h WORD Video cursor type, 6845 compatible, hi=startline, lo=endline 62h BYTE Video current page number 63h WORD Video CRT controller base address: color=03D4h, mono=03B4h 65h BYTE Video current setting of mode select register 03D8h/03B8h 66h BYTE Video current setting of CGA palette register 03D9h =========================================================================== By reading at [CB_High_Linear + 449h], for example, you can determine the screen mode active in the MS-DOS session. If it is 7, it is text mode on an MDA adapter, and the text screen buffer is at [CB_High_Linear + 0B000h]. Otherwise, if it is a text video mode number, a color text mode is in use in the MS-DOS session, and the text screen buffer is at [CB_High_Linear + 0B800h]. If you determine that a color text mode is in use, the adapter could be CGA, EGA, or VGA, so the MS-DOS session could be in either 25-, 43-, or 50-line mode. The size of the screen regenerate buffer is stored at [CB_High_Linear + 044Ch]. Based on the number of bytes the screen takes and the number of screen columns, you can determine the number of screen rows. The screen regenerate buffer will typically contain one of the following values: On CGA (25 lines, 40 columns), the buffer size will be 0800h (2048d) On CGA (25 lines, 80 columns), the buffer size will be 1000h (4096d) On EGA (43 lines, 80 columns), the buffer size will be 1BE0h (7136d) On VGA (50 lines, 80 columns), the buffer size will be 2040h (8256d) The number of columns on the screen is stored at [CB_High_Linear + 044Ah]. By dividing the buffer size by the number of columns, then dividing by two (unless screen attributes need to be read, too), you can determine the number of rows on the screen: Buffer size Number of columns Skip Attribs Result ------------------------------------------------------- 2048 / 40 / 2 25.6 4096 / 80 / 2 25.6 7136 / 80 / 2 44.6 8256 / 80 / 2 51.6 NOTE: the results are not exact. Therefore, if the regenerate buffer is greater than 4096 bytes or if the number of screen columns is not equal to 25, the result must be decremented by 1 to get the real number of screen lines. Once you determine the screen buffer offset, number of columns, and size of text screen, you can read the screen by dereferencing to the screen buffer and reading the characters out of the screen buffer memory. REFERENCES ========== Windows 3.1 Device Driver Kit "Virtual Device Adaptation Guide" Microsoft Developers Network "Developers Library" CD Additional query words: 3.10 VxD VDD DISPLAY ====================================================================== Keywords : Technology : kbAudDeveloper kbWin3xSearch kbWinDDKSearch kbWinDDK310 Version : :3.1 ============================================================================= THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY. Copyright Microsoft Corporation 1999.