HOST_OS.CPP
上传用户:datang2001
上传日期:2007-02-01
资源大小:53269k
文件大小:2k
源码类别:

操作系统开发

开发平台:

C/C++

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