$include (..\lib\compStch.ext) /* *============================================================================ * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE * * Permission to use for any purpose, modify, copy, and make enhancements * and derivative works of the software is granted if attribution is given to * R.M. Gillmore, dba the ACME Software Deli, as the author * * While the ACME Software Deli does not work for money, there is nonetheless * a significant amount of work involved. The ACME Software Deli maintains the * rights to all code written, though it may be used and distributed as long as * the following conditions are maintained. * * 1. The copyright statement at the top of each code block is maintained in * your distribution. * 2. You do not identify yourself as the ACME Software Deli * 3. Any changes made to the software are sent to the ACME Software Deli *============================================================================ */ unameModule: do; $if not noID declare IDString (*) byte data ( '@(#)uname.p86 $Author: rmgillmore $ $Date:: 2025-05-04 19:35:39#$:', 0 ); $endif $include (..\lib\comnDefs.ext) $include (..\lib\string.ext) $include (..\lib\numStrs.ext) $include (..\lib\debugHlp.ext) $set ( unameSource ) $include (..\lib\sysCalls.ext) osVersion: procedure word reentrant public; declare cpuRegisters, returningVersion word; $if 1 /* * Notes: * This function always returns the true version number, unlike AH=30h, * whose return value may be changed with SETVER. Because of the conflict * from the CBIS redirector (see next entry), programs should check whether * BH is less than 100 (64h) and BL is at least 5 before accepting the * returned BX as the true version number; however, even this is not * entirely reliable when that redirector is loaded. Under MS-DOS/PC DOS, * DR DOS, PTS-DOS, S/DOS this function does not use any of the DOS * internal stacks and thus is fully reentrant. OS/2 v2.1 will return * BX=0A14h (version 20.10). Windows 95 and Windows 95 SP1 return version * 7.00; Windows 95 OSR2 and OPK3 (OSR2.5) return version MS 7.10.. The * Windows NT DOS box returns BX=3205h (version 5.50). Novell DOS 7 returns * IBM v6.00, which some software displays as IBM DOS v6.10 (because of * the version mismatch in true IBM DOS mentioned for INT 21/AH=30h); * versions through Update 15 all return revision code 00h. Windows95 and * Windows95 SP1 return version 7.00; Windows95 OSR2 returns version 7.10. * * Heiko Goeman's Advanced WinDOS 2.10/2.11/2.21 returns DOS 5.00, revision * 0.. Novell DOS 7, OpenDOS 7.01, DR-OpenDOS 7.02, DR-DOS 7.02, * DR-DOS 7.03 all return IBM 6.00, which some software displays as IBM * DOS 6.10 (because of the version mismatch in true IBM DOS mentioned for * INT 21/AH=30h); versions through Novell DOS 7 Update 15.2 (01/1996) all * return revision code 00h. The DOS revision is stored in bits 7-0 of the * "patch_version" field in the PCM_HEADER structure in the IBMDOS.COM file * (see also INT 21/AX=4452h !!!). The version flags (DH) are stored in * bits 15-8 of "patch_version", but is updated at runtime to reflect the * actual status. "patch_version" is also reported as DX in * INT 21/AX=4452h.. Unlike MS-DOS, under Novell DOS 7+ IBMDOS.COM will * also allow to SETVER the returned "true" DOS version same as with * INT 21/AX=3000h and INT 21/AX=3001h.. DR-DOS 7.02+ IBMDOS.COM (since * 1998-01-10) now recognizes optional paths to filenames stored in the * SETVER list. Previously such entries were never found. This enables a * three staged model of SETVERed versions: highest priority = entry with * path is matching. middle priority = entry without path is matching. * lowest priority = use global version (SETVER /G).. The DR-DOS 7.02+ * SETVER 1.01+ (1998-01-12) has also been enhanced to allow BDOS and DOS * version faking (see INT 21/AX=4452h). In /X mode, a set sub-version of * y = 128..255 will be reported as 0..127 DOS sub-version, sub-versions * of y = 100..127 will be used to report this value as BDOS version * (64h..7Fh) with INT 21/AX=4452h instead while bits 6-0 of the DOS * revision stored in PCM_HEADER in the IBMDOS.COM file will be used to * report the BH DOS sub-version 0..127 (usually this holds 0, but it can * be patched to other values).. DR-DOS SHARE 2.05 (1998-01-05) has relaxed * version checking now, and will install on any DOS revision 0..127 * (formerly it was bound to DOS revision 0 only), as long as run on a * DR-DOS 72h or 73h BDOS kernel. Hence, if there will be changes in the * SHARE implementation without changing the BDOS version, DR-DOS SHARE * 2.05 can still be stopped from installing by changing the DOS revision * in PCM_HEADER to something in the range 128..255.. Under Novell DOS 7+, * the version SETVERing also affects the version number WORD stored at * offset +40h in each program's PSP (see Table xxxx at INT 21/AH=26h). * This holds true even for special sub-versions of 100..255 * (see INT 21/AX=4452h).. S/DOS 1.0 (1995) returns a DOS revision of 9, * while its own PTS OEM revision still defaults to 0 (see also * INT 21/AH=20h"S/DOS"). */ wordRegs.Ax = 3306h; call int86( DOS_CALL, @wordRegs ); $if 0 /* this code substitutes the version flags for the minor version. Not the * most correct information */ byteRegs.Bh = byteRegs.Dh; $endif returningVersion = wordRegs.Bx; $else wordRegs.Ax = 3001h; call int86( DOS_CALL, @wordRegs ); byteRegs.Ah = byteRegs.Bh; returningVersion = wordRegs.Ax; $endif return returningVersion; end osVersion; uname: procedure ( stringPtr, maxStringLength ) reentrant public; declare stringPtr pointer, maxStringLength word, osVersionString based stringPtr ( * ) byte, osVersionWord word, stringLength word, tempString ( 10 ) byte; osVersionString( 0 ) = NUL; call strcat( @osVersionString, @( 'DOS(', 0 ) ); osVersionWord = osVersion; call byteToDecimalString( low( osVersionWord ), @tempString ); call strcat( @osVersionString, @tempString ); call strcat( @osVersionString, @( '.', 0 ) ); call byteToDecimalString( high( osVersionWord ), @tempString ); call strcat( @osVersionString, @tempString ); call strcat( @osVersionString, @( ')', 0 ) ); end uname; end unameModule;