home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 August / PCWorld_1999-08_cd.bin / dosutils / fips15c / source / host_os.cpp < prev    next >
C/C++ Source or Header  |  1997-12-20  |  2KB  |  120 lines

  1. // host_os.cpp    host operating system classes
  2. //        dave mccaldon (d.mccalden@staffordshire.ac.uk)
  3.  
  4. #include "host_os.h"
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <dos.h>
  9.  
  10. char *msdos_info (void)
  11. {
  12.     return ("MS-DOS version %d.%d");
  13. };
  14.  
  15. char *dosemu_info (void)
  16. {
  17.     return ("Linux dosemu version %d.%d");
  18. };
  19.  
  20. char *mswindows_info (void)
  21. {
  22.     return ("MS-Windows version %d.%d");
  23. };
  24.  
  25. char *desqview_info (void)
  26. {
  27.     return ("Desq-View version %d.%d");
  28. };
  29.  
  30. host_os::host_os (void)
  31. {
  32.     status = NOT_OK;
  33.     if (mswindows_detect () == true) format = mswindows_info;
  34. //    else if (dosemu_detect () == true) format = dosemu_info;
  35.     else if (desqview_detect () == true) format = desqview_info;
  36.     else
  37.     {
  38.         status = OK;
  39.         msdos_version ();
  40.         format = msdos_info;
  41.     }
  42. }
  43.  
  44.  
  45. char *host_os::information( char *p )
  46. {
  47.     if( p == NULL )
  48.         p = (char *) malloc( strlen( format() ) + 12 );
  49.     sprintf( p, format(), ver_major, ver_minor );
  50.  
  51.     return p;
  52. }
  53.  
  54. void host_os::msdos_version()
  55. {
  56. #if 0
  57.     ver_major = _osmajor;            // borlandc constants
  58.     ver_minor = _osminor;
  59. #else
  60.     ver_major = 7;
  61.     ver_minor = 0;
  62. #endif
  63. }
  64.  
  65. boolean host_os::mswindows_detect()
  66. {
  67.     union   REGS r;
  68.  
  69.     r.x.ax = 0x1600;
  70.     int86( 0x2F, &r, &r );
  71.     if( r.h.al & 0x7F )
  72.     {
  73.         ver_major = r.h.al;
  74.         ver_minor = r.h.ah;
  75.         return (true);
  76.     }
  77.  
  78.     return (false);
  79. }
  80.  
  81. boolean host_os::dosemu_detect()
  82. {
  83.     union   REGS r;
  84.  
  85.     // this is slightly more difficult than just calling the dosemu
  86.     // interrupt (0xE5), we need to check if the interrupt has a
  87.     // handler, as DOS and BIOS don't establish a default handler
  88.  
  89.     if( getvect( 0xE5 ) == NULL )
  90.         return (false);
  91.     r.x.ax = 0;
  92.     int86( 0xE5, &r, &r );
  93.     if( r.x.ax == 0xAA55 )            // check signature
  94.     {
  95.         ver_major = r.h.bh;
  96.         ver_minor = r.h.bl;
  97.         return (true);
  98.     }
  99.  
  100.     return (false);
  101. }
  102.  
  103. boolean host_os::desqview_detect()
  104. {
  105.     union   REGS r;
  106.  
  107.     r.x.ax = 0x2B01;                // AL=01 => get desqview version
  108.     r.x.cx = 0x4445;        // CX = 'DE'
  109.     r.x.dx = 0x5351;        // DX = 'SQ'
  110.     int86( 0x21, &r, &r );
  111.     if( r.h.al != 0xFF )
  112.     {
  113.         ver_major = r.h.bh;
  114.         ver_minor = r.h.bl;
  115.         return (true);
  116.     }
  117.  
  118.     return (false);
  119. }
  120.