home *** CD-ROM | disk | FTP | other *** search
- /*========================================================*/
- /* SI.C */
- /* (C) 1993 Tilo Batsch & DMV-Verlag */
- /* SI.C liefert einige Informationen über das OS/2-System */
- /* Compiler: C6.00A unter OS/2 1.30 */
- /*========================================================*/
-
- #define INCL_NOCOMM
- #define INCL_BASE
- #include <os2.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <conio.h>
-
- void hdinfo (void);
- void fdinfo (void);
- void videoinfo (void);
- void pinfo (void);
-
- extern unsigned cdecl _cpu_typ(void);
-
- void OS2Err(USHORT rc, unsigned line, char *file);
-
- main()
- {
- USHORT usVersion;
- ULONG ulAvailMem;
- BYTE bDevInfo;
- CHAR cModel[20];
- SHORT cpu;
-
- printf("%30s %s %s \n\n", "System-Information: ",
- __DATE__, __TIME__);
-
- DosDevConfig(&bDevInfo, DEVINFO_MODEL, 0);
-
- switch(bDevInfo)
- {
- case 0xff: strcpy(cModel, "IBM PC"); break;
- case 0xfe:
- case 0xfb: strcpy(cModel, "IBM XT"); break;
- case 0xfd: strcpy(cModel, "IBM PCjr"); break;
- case 0xfc: strcpy(cModel, "IBM AT"); break;
- case 0xfa: strcpy( cModel, "IBM 30"); break;
- case 0xf9: strcpy( cModel, "Convertible"); break;
- default: strcpy( cModel, "Unbekannt");
- }
-
- printf("%30s %s\n", "Computer-Name: ", cModel);
-
- DosGetVersion(&usVersion);
- printf("%30s OS/2 %d.%d\n", "Betriebssystem: ",
- HIBYTE(usVersion) / 10, LOBYTE(usVersion) / 10);
-
- cpu = _cpu_typ();
- printf("%30s %ld\n", "Prozessor: ",
- cpu == 2 ? 80286L : cpu == 3 ? 80386L : 80486L);
-
- /* nicht bei 80486 auf Koprozessor prüfen */
- if (cpu != 4)
- {
- DosDevConfig(&bDevInfo, DEVINFO_COPROCESSOR, 0);
- printf("%30s %svorhanden\n", "Koprozessor: ",
- bDevInfo ? "" : "nicht ");
- }
-
- videoinfo();
-
- DosDevConfig(&bDevInfo, DEVINFO_PRINTER, 0);
- printf("%30s %d\n", "Parallele Schnittstelle(n): ",
- bDevInfo);
-
- DosDevConfig(&bDevInfo, DEVINFO_RS232, 0);
- printf("%30s %d\n", "Serielle Schnittstelle(n): ",
- bDevInfo);
-
- fdinfo();
- hdinfo();
- pinfo();
-
- /* Größten freien Speicherblock ermitteln */
- DosMemAvail(&ulAvailMem);
-
- printf("\n%35s %ld KB\n",
- "Größter freier Speicherblock: ",
- ulAvailMem / 1024);
- }
-
- /* Ermittle Disklaufwerktypen direkt über das CMOS-RAM */
- void fdinfo (void)
- {
- BYTE bDiskTyp, bDiskTypA, bDiskTypB;
-
- outp(0x70, 0x10);
- bDiskTyp = inp(0x71);
-
- bDiskTypA = (bDiskTyp & 0xf0) >> 4;
- bDiskTypB = bDiskTyp & 0xf;
-
- printf ("\n%42s \n", "--- Diskettenlaufwerk(e) ---");
-
- if (bDiskTypA)
- printf("%30s %s\n", "Disklaufwerk A: ",
- bDiskTypA == 4 ? "3,5'' 1,44M" :
- bDiskTypA == 3 ? "3,5'' 720K" :
- bDiskTypA == 2 ? "5,25'' 1,2M" : "5,25'' 360K");
-
- if (bDiskTypB)
- printf("%30s %s\n\n", "Disklaufwerk B: ",
- bDiskTypB == 4 ? "3,5'' 1,44M" :
- bDiskTypB == 3 ? "3,5'' 720K" :
- bDiskTypB == 2 ? "5,25'' 1,2M" : "5,25'' 360K");
- }
-
- /* Ausgabe der Informationen über angeschlossen Platten */
- void hdinfo (void)
- {
- static DEVICEPARAMETERBLOCK bBlock;
- USHORT usDataBuffer;
- BYTE bCommand=0;
- HFILE hDevice;
- CHAR szHd[]="1:";
- SEL selGlobalSeg, selLocalSeg;
- GINFOSEG FAR *pgis;
- PBYTE pFSAttBuf;
- USHORT cbAttBuf, rc;
-
- printf ("%46s\n", "--- Partitionierbare Platte(n) ---");
-
- /* Ermittlung der Anzahl partitionierbarer Platten */
- DosPhysicalDisk(INFO_COUNT_PARTITIONABLE_DISKS,
- (PBYTE) &usDataBuffer, 2, NULL, 0);
-
- while (usDataBuffer--)
- {
- /* Hole Handle für physikalisches Laufwerk */
- OS2Err(DosPhysicalDisk(INFO_GETIOCTLHANDLE, (PBYTE)
- &hDevice, 2, szHd, sizeof szHd), __LINE__,
- __FILE__);
-
- /* Ermittle physikalische Parameter der Platte */
- OS2Err(DosDevIOCtl(&bBlock, &bCommand, 0x0063, 0x0009,
- MAKETYPE(hDevice, HFILE)), __LINE__, __FILE__);
-
- printf(" Festplatte %d: Zylinder: %4u, Köpfe: %2u,",
- szHd[0]-'0', bBlock.cCylinders, bBlock.cHeads);
- printf("Sektoren/Spur: %2u\n", bBlock.cSectorsPerTrack);
-
- /* Handle zurückgeben */
- OS2Err(DosPhysicalDisk(INFO_FREEIOCTLHANDLE, NULL, 0,
- (PBYTE) &hDevice, 2), __LINE__, __FILE__);
- szHd[0]++;
- }
- printf("\n%40s", "--- Logische Laufwerke ---\n");
-
- OS2Err(DosGetInfoSeg(&selGlobalSeg, &selLocalSeg),
- __LINE__, __FILE__);
-
- pgis = MAKEPGINFOSEG (selGlobalSeg);
- printf("%30s %c:\n", "Bootlaufwerk ",
- pgis -> bootdrive + 'A' - 1);
-
- if ((pFSAttBuf = (PBYTE) malloc (1024)) == NULL) return;
-
- szHd[0] = 'C';
- cbAttBuf = 1024;
-
- /* Ermittle Dateisystem aller logischen Laufwerke */
- while ((rc = DosQFSAttach (szHd, 0, FSAIL_QUERYNAME,
- pFSAttBuf, &cbAttBuf, 0L)) == 0)
- {
- printf("%21s %s, %s%Fs\n", "Laufwerk", szHd,
- "Dateisystem: ", pFSAttBuf + 7 +
- *((PUSHORT)pFSAttBuf + 1));
- szHd[0]++;
- cbAttBuf = 1024;
- }
- }
-
- /* Ermittelt den aktiven Videoadapter und den aktiven */
- /* Videomodus */
- void videoinfo (void)
- {
- VIOCONFIGINFO vioci;
- VIOMODEINFO viomi;
- char *szBuf;
- USHORT us2Pot;
-
- /* Ermittle aktiven Videoadapter */
- vioci.cb = sizeof vioci;
- VioGetConfig(0, &vioci, 0);
-
- switch(vioci.adapter)
- {
- case DISPLAY_MONOCHROME: szBuf = "Monochrom"; break;
- case DISPLAY_CGA: szBuf = "CGA"; break;
- case DISPLAY_EGA: szBuf = "EGA"; break;
- case DISPLAY_VGA: szBuf = "VGA"; break;
- case DISPLAY_8514A: szBuf = "8514/A"; break;
- default: szBuf = "Unbekannt"; break;
- }
- printf ("%30s %s", "Aktive Video-Karte: ", szBuf);
-
- /* Ermittle aktiven Videomodus */
- viomi.cb = sizeof viomi;
- VioGetMode(&viomi, 0);
- printf(" %dx%d ", viomi.col, viomi.row);
- if (viomi.color == 0)
- printf ("Monochrom\n");
- else
- {
- /* Die Anzahl der Farben ist gleich der Anzahl mit */
- /* viomi.color Bits darstellbaren Farben, also */
- /* 2^viomi.color */
- us2Pot = 2;
- while (--viomi.color) us2Pot <<= 1;
-
- printf ("%d Farben\n", us2Pot);
- }
- }
-
- /* Ermittlung einiger Informationen aus dem globalen */
- /* Info.-segment */
- void pinfo(void)
- {
- SEL selGlobalSeg, selLocalSeg;
- GINFOSEG FAR *pgis;
-
- printf("\n%46s\n",
- "--- Prozeß und Thread-Informationen ---");
-
- OS2Err(DosGetInfoSeg(&selGlobalSeg, &selLocalSeg),
- __LINE__, __FILE__);
-
- pgis = MAKEPGINFOSEG (selGlobalSeg);
-
- printf("%30s %d\n", "Bildschirmgruppen-ID: ",
- (USHORT)pgis->sgCurrent);
- printf("%30s %d\n", "Max. Bildschirmgruppen: ",
- (USHORT)pgis->sgMax);
- printf("%30s %s\n", "DOS-Emulation: ",
- pgis->fProtectModeOnly == 0 ?
- "verfügbar" : "nicht verfügbar");
- printf("%30s %s\n", "Dynam. Priorität: ",
- pgis->fDynamicSched == 0 ?
- "nicht erlaubt" : "erlaubt");
- printf("%30s %ds\n", "Max. Wartezeit: ",
- pgis->csecMaxWait);
- printf("%30s %dms\n", "Max. Zeitscheibe: ",
- pgis->cmsecMaxSlice);
- printf("%30s %dms\n", "Min. Zeitscheibe: ",
- pgis->cmsecMinSlice);
- }
-
- void OS2Err (USHORT rc, unsigned line, char *file)
- {
- if (rc)
- {
- printf("OS/2-Fehler: Code: %X, Zeile: %u, Datei: %s\n",
- rc, line, file);
- exit(-1);
- }
- }
-
- /*========================================================*/
- /* Ende von SI.C */
-