Microsoft KB Archive/120565

= How to Read Text Mode Screen of MS-DOS Session in Windows =

Article ID: 120565

Article Last Modified on 5/24/2004

-

APPLIES TO


 * Microsoft Windows Device Development Kit (DDK) for Windows 3.1

-



This article was previously published under Q120565



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.

