home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9303 / asmtrick / si.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-03  |  7.6 KB  |  268 lines

  1. /*========================================================*/
  2. /*                            SI.C                        */
  3. /*             (C) 1993 Tilo Batsch & DMV-Verlag          */
  4. /* SI.C liefert einige Informationen über das OS/2-System */
  5. /*              Compiler: C6.00A unter OS/2 1.30          */
  6. /*========================================================*/
  7.  
  8. #define INCL_NOCOMM
  9. #define INCL_BASE
  10. #include <os2.h>
  11. #include <stdio.h>
  12. #include <string.h>
  13. #include <stdlib.h>
  14. #include <conio.h>
  15.  
  16. void hdinfo (void);
  17. void fdinfo (void);
  18. void videoinfo (void);
  19. void pinfo (void);
  20.  
  21. extern unsigned cdecl _cpu_typ(void);
  22.  
  23. void OS2Err(USHORT rc, unsigned line, char *file);
  24.  
  25. main()
  26. {
  27.   USHORT  usVersion;
  28.   ULONG   ulAvailMem;
  29.   BYTE    bDevInfo;
  30.   CHAR    cModel[20];
  31.   SHORT   cpu;
  32.  
  33.   printf("%30s %s %s \n\n", "System-Information: ",
  34.      __DATE__, __TIME__);
  35.     
  36.   DosDevConfig(&bDevInfo, DEVINFO_MODEL, 0);
  37.  
  38.   switch(bDevInfo)
  39.   {
  40.     case 0xff: strcpy(cModel, "IBM PC");       break;
  41.     case 0xfe:
  42.     case 0xfb: strcpy(cModel, "IBM XT");       break;
  43.     case 0xfd: strcpy(cModel, "IBM PCjr");     break;
  44.     case 0xfc: strcpy(cModel, "IBM AT");       break;
  45.     case 0xfa: strcpy( cModel, "IBM 30");      break;
  46.     case 0xf9: strcpy( cModel, "Convertible"); break;
  47.     default:   strcpy( cModel, "Unbekannt");
  48.   }
  49.  
  50.   printf("%30s %s\n", "Computer-Name: ", cModel);
  51.  
  52.   DosGetVersion(&usVersion);
  53.   printf("%30s OS/2 %d.%d\n", "Betriebssystem: ",
  54.   HIBYTE(usVersion) / 10, LOBYTE(usVersion) / 10);
  55.  
  56.   cpu = _cpu_typ();
  57.   printf("%30s %ld\n", "Prozessor: ",
  58.   cpu == 2 ? 80286L : cpu == 3 ? 80386L : 80486L);
  59.  
  60.    /* nicht bei 80486 auf Koprozessor prüfen */
  61.    if (cpu != 4)
  62.    {
  63.      DosDevConfig(&bDevInfo, DEVINFO_COPROCESSOR, 0);
  64.      printf("%30s %svorhanden\n", "Koprozessor: ", 
  65.         bDevInfo ? "" : "nicht ");
  66.    }
  67.  
  68.    videoinfo();
  69.     
  70.    DosDevConfig(&bDevInfo, DEVINFO_PRINTER, 0);
  71.    printf("%30s %d\n", "Parallele Schnittstelle(n): ", 
  72.       bDevInfo);
  73.  
  74.    DosDevConfig(&bDevInfo, DEVINFO_RS232, 0);
  75.    printf("%30s %d\n", "Serielle Schnittstelle(n): ", 
  76.    bDevInfo);
  77.  
  78.    fdinfo();
  79.    hdinfo();
  80.    pinfo();
  81.  
  82.    /* Größten freien Speicherblock ermitteln */
  83.    DosMemAvail(&ulAvailMem);
  84.         
  85.    printf("\n%35s %ld KB\n", 
  86.       "Größter freier Speicherblock: ", 
  87.       ulAvailMem / 1024);
  88. }
  89.  
  90. /*  Ermittle Disklaufwerktypen direkt über das CMOS-RAM   */
  91. void fdinfo (void)
  92. {
  93.   BYTE bDiskTyp, bDiskTypA, bDiskTypB;
  94.  
  95.   outp(0x70, 0x10);
  96.   bDiskTyp = inp(0x71);
  97.  
  98.   bDiskTypA = (bDiskTyp & 0xf0) >> 4;
  99.   bDiskTypB = bDiskTyp & 0xf;
  100.  
  101.   printf ("\n%42s \n", "--- Diskettenlaufwerk(e) ---");
  102.  
  103.   if (bDiskTypA)
  104.     printf("%30s %s\n", "Disklaufwerk A: ",
  105.        bDiskTypA == 4 ? "3,5'' 1,44M" :
  106.        bDiskTypA == 3 ? "3,5'' 720K" :
  107.        bDiskTypA == 2 ? "5,25'' 1,2M" : "5,25'' 360K");
  108.  
  109.   if (bDiskTypB)
  110.     printf("%30s %s\n\n", "Disklaufwerk B: ",
  111.        bDiskTypB == 4 ? "3,5'' 1,44M" :
  112.        bDiskTypB == 3 ? "3,5'' 720K" :
  113.        bDiskTypB == 2 ? "5,25'' 1,2M" : "5,25'' 360K");
  114. }
  115.  
  116. /*  Ausgabe der Informationen über angeschlossen Platten  */
  117. void hdinfo (void)
  118. {
  119.   static DEVICEPARAMETERBLOCK bBlock;
  120.   USHORT       usDataBuffer;
  121.   BYTE         bCommand=0;
  122.   HFILE        hDevice;
  123.   CHAR         szHd[]="1:";
  124.   SEL          selGlobalSeg, selLocalSeg;
  125.   GINFOSEG FAR *pgis;
  126.   PBYTE        pFSAttBuf;
  127.   USHORT       cbAttBuf, rc;
  128.  
  129.   printf ("%46s\n", "--- Partitionierbare Platte(n) ---");
  130.  
  131.   /*   Ermittlung der Anzahl partitionierbarer Platten    */
  132.   DosPhysicalDisk(INFO_COUNT_PARTITIONABLE_DISKS, 
  133.          (PBYTE) &usDataBuffer, 2, NULL, 0);
  134.  
  135.   while (usDataBuffer--)
  136.   {
  137.     /*      Hole Handle für physikalisches Laufwerk       */
  138.     OS2Err(DosPhysicalDisk(INFO_GETIOCTLHANDLE, (PBYTE) 
  139.        &hDevice, 2, szHd, sizeof szHd), __LINE__, 
  140.        __FILE__);
  141.  
  142.     /*     Ermittle physikalische Parameter der Platte    */
  143.     OS2Err(DosDevIOCtl(&bBlock, &bCommand, 0x0063, 0x0009,
  144.        MAKETYPE(hDevice, HFILE)), __LINE__, __FILE__);
  145.  
  146.     printf("   Festplatte %d: Zylinder: %4u, Köpfe: %2u,", 
  147.        szHd[0]-'0', bBlock.cCylinders, bBlock.cHeads);    
  148.     printf("Sektoren/Spur: %2u\n", bBlock.cSectorsPerTrack);
  149.  
  150.     /*                  Handle zurückgeben                */
  151.     OS2Err(DosPhysicalDisk(INFO_FREEIOCTLHANDLE, NULL, 0,
  152.       (PBYTE) &hDevice, 2), __LINE__, __FILE__);
  153.     szHd[0]++;
  154.   }
  155.   printf("\n%40s", "--- Logische Laufwerke ---\n");
  156.  
  157.   OS2Err(DosGetInfoSeg(&selGlobalSeg, &selLocalSeg),
  158.      __LINE__, __FILE__);
  159.                         
  160.   pgis = MAKEPGINFOSEG (selGlobalSeg);
  161.   printf("%30s %c:\n", "Bootlaufwerk ", 
  162.     pgis -> bootdrive + 'A' - 1);
  163.         
  164.   if ((pFSAttBuf = (PBYTE) malloc (1024)) == NULL) return;
  165.  
  166.   szHd[0] = 'C';
  167.   cbAttBuf = 1024;
  168.  
  169.   /*    Ermittle Dateisystem aller logischen Laufwerke    */
  170.   while ((rc = DosQFSAttach (szHd, 0, FSAIL_QUERYNAME,
  171.      pFSAttBuf, &cbAttBuf, 0L)) == 0)
  172.   {
  173.     printf("%21s %s, %s%Fs\n", "Laufwerk", szHd,
  174.        "Dateisystem: ", pFSAttBuf + 7 + 
  175.        *((PUSHORT)pFSAttBuf + 1));
  176.     szHd[0]++; 
  177.     cbAttBuf = 1024;
  178.   }
  179. }
  180.  
  181. /*   Ermittelt den aktiven Videoadapter und den aktiven   */
  182. /*                        Videomodus                      */
  183. void videoinfo (void)
  184. {
  185.   VIOCONFIGINFO vioci;
  186.   VIOMODEINFO   viomi;
  187.   char          *szBuf;
  188.   USHORT        us2Pot;
  189.  
  190.   /*            Ermittle aktiven Videoadapter             */
  191.   vioci.cb = sizeof vioci;
  192.   VioGetConfig(0, &vioci, 0);
  193.     
  194.   switch(vioci.adapter)
  195.   {
  196.     case DISPLAY_MONOCHROME: szBuf = "Monochrom";  break;
  197.     case DISPLAY_CGA:        szBuf = "CGA";        break;
  198.     case DISPLAY_EGA:        szBuf = "EGA";        break;
  199.     case DISPLAY_VGA:        szBuf = "VGA";        break;
  200.     case DISPLAY_8514A:      szBuf = "8514/A";     break;
  201.     default:                 szBuf = "Unbekannt";  break;
  202.   }
  203.   printf ("%30s %s", "Aktive Video-Karte: ", szBuf);
  204.     
  205.   /*            Ermittle aktiven Videomodus               */
  206.   viomi.cb = sizeof viomi;
  207.   VioGetMode(&viomi, 0);
  208.   printf(" %dx%d ", viomi.col, viomi.row);
  209.   if (viomi.color == 0)
  210.     printf ("Monochrom\n");
  211.   else 
  212.   {
  213.     /* Die Anzahl der Farben ist gleich der Anzahl mit    */
  214.     /* viomi.color Bits darstellbaren Farben, also        */
  215.     /* 2^viomi.color                                      */
  216.     us2Pot = 2;     
  217.     while (--viomi.color) us2Pot <<= 1;
  218.                 
  219.     printf ("%d Farben\n", us2Pot);
  220.   }
  221. }
  222.  
  223. /*    Ermittlung einiger Informationen aus dem globalen   */
  224. /*                         Info.-segment                  */
  225. void pinfo(void)
  226. {
  227.   SEL             selGlobalSeg, selLocalSeg;
  228.   GINFOSEG FAR    *pgis;
  229.  
  230.   printf("\n%46s\n", 
  231.      "--- Prozeß und Thread-Informationen ---");
  232.  
  233.   OS2Err(DosGetInfoSeg(&selGlobalSeg, &selLocalSeg),
  234.      __LINE__, __FILE__);
  235.                         
  236.   pgis = MAKEPGINFOSEG (selGlobalSeg);
  237.  
  238.   printf("%30s %d\n", "Bildschirmgruppen-ID: ", 
  239.      (USHORT)pgis->sgCurrent);
  240.   printf("%30s %d\n", "Max. Bildschirmgruppen: ", 
  241.      (USHORT)pgis->sgMax);
  242.   printf("%30s %s\n", "DOS-Emulation: ", 
  243.      pgis->fProtectModeOnly == 0 ?
  244.      "verfügbar" : "nicht verfügbar");
  245.   printf("%30s %s\n", "Dynam. Priorität: ", 
  246.      pgis->fDynamicSched == 0 ?
  247.      "nicht erlaubt" : "erlaubt");
  248.   printf("%30s %ds\n", "Max. Wartezeit: ", 
  249.      pgis->csecMaxWait);
  250.   printf("%30s %dms\n", "Max. Zeitscheibe: ", 
  251.      pgis->cmsecMaxSlice);
  252.   printf("%30s %dms\n", "Min. Zeitscheibe: ", 
  253.      pgis->cmsecMinSlice);
  254. }
  255.  
  256. void OS2Err (USHORT rc, unsigned line, char *file)
  257. {
  258.   if (rc)
  259.   {
  260.     printf("OS/2-Fehler: Code: %X, Zeile: %u, Datei: %s\n",
  261.        rc, line, file);
  262.     exit(-1);
  263.   }
  264. }
  265.  
  266. /*========================================================*/
  267. /*                       Ende von SI.C                    */
  268.