home *** CD-ROM | disk | FTP | other *** search
/ M.u.C.S. Disc 2000 / MUCS2000.iso / anwend / bigdos / xhditest.c < prev    next >
C/C++ Source or Header  |  1996-12-22  |  10KB  |  299 lines

  1. /* TABSIZE 4
  2.  * @(#)XHDItest.c
  3.  *
  4.  * Public domain
  5.  *
  6.  * 1995-05-27 von Rainer Seitel, Rastatt, DE.
  7.  * 1995-07-28 Zweisprachig: deutsch wenn _AKP = $??????01??, sonst englisch.
  8.  * 1995-10-17 Alte DOS-Limits werden beim Programmende restauriert.
  9.  * 1995-11-26 Ausgabeumleitung mit dem letzten Argument »>[Datei]«.
  10.  *            Ohne Laufwerkskennung werden alle angezeigt.
  11.  *            Zusätzlich wird Getbpb() benutzt.
  12.  * 1995-11-30 Ohne den Cookie _AKP wird sysbase->os_conf als Sprache benutzt.
  13.  *            Name und Version des XHDI-Plattentreibers wird ausgegeben.
  14.  * 1995-12-14 Der BPB wird geprüft wie in Big-DOS und Fehler angezeigt.
  15.  *            Für die Laufwerke hinter Z: kann auch 1: bis 6: übergeben werden.
  16.  * 1996-12-22 Der BPB wird geprüft wie im neuen Big-DOS.
  17.  *            Laufwerk B: wird nur befragt, wenn es laut _nflops vorhanden ist.
  18.  */
  19.  
  20.  
  21. #include <stdio.h>
  22. #include <string.h>
  23. #include "xhdi.h"  /* »static« bei getcookie() auskommentieren */
  24.  
  25.  
  26. #define E_OK 0
  27. #define EDRVNR -2
  28. #define EINVFN -32
  29. #define FIRST_CLUSTER 2
  30. #define NUM_DRIVES 32
  31. #define DL_FILESYS ('D' << 8 | 15)  /* (XBRA-)Kennung des Dateisystems */
  32. #define DL_VERSION ('D' << 8 | 16)  /* Version des Dateisystems */
  33.  
  34. #ifndef Dcntl
  35. #define Dcntl(cmd, name, arg) gemdos(0x130, (short)cmd, name, (long)arg)
  36. #endif
  37.  
  38.  
  39. long get_os_conf( void )
  40. {
  41. #ifdef __TURBOC__
  42. #define sysbase (*(SYSHDR **)0x4F2)
  43.     return sysbase->os_base->os_palmode;
  44. #else
  45. #define sysbase (*(OSHEADER **)0x4F2)
  46.     return sysbase->os_beg->os_conf;
  47. #endif
  48. }
  49.  
  50.  
  51. long get_nflops( void )
  52. {
  53. #define _nflops (*(short *)0x4A6)
  54.     return _nflops;
  55. }
  56.  
  57.  
  58. int main( int argc, unsigned char *argv[] )
  59. {
  60.     long german = 0, r, handle = 0, mint = 0, bigdos = 0;
  61.     LONG old_secsiz, old_minfat, old_maxfat, old_minspc, old_maxspc, old_clusts,
  62.          old_maxsec, old_drives;
  63.     UWORD dos_version, xhdi, major, minor, drive;
  64.     ULONG start_sector = 0, blocks = 0;
  65.     const BPB bpb, *p_bpb;
  66.     unsigned char partid[4];
  67.     unsigned char name[17], version[7] = "";
  68.     UWORD bps, clusiz;
  69.  
  70.  
  71.     /* Landessprache bestimmen */
  72.     if (getcookie(0x5F414B50L, &german))  /* _AKP */
  73.         german = (german & 0xFF00) == 0x100;
  74.     else {
  75.         german = Supexec(get_os_conf) >> 1;
  76.         german = german == 1 || german == 8;
  77.     }
  78.  
  79.     /* Beginnt das letzte Argument mit »>« Standardausgabe umleiten. */
  80.     if (argc > 1 && argv[argc - 1][0] == '>') {
  81.         argc--;
  82.         if (argv[argc][1] == '\0' || argv[argc][1] == '\r')
  83.             handle = Fcreate("xhditest.log", 0);
  84.         else
  85.             handle = Fcreate(&argv[argc][1], 0);
  86.         if (handle < 0)
  87.             if (german)
  88.                 printf("Kann Protokolldatei nicht öffnen! (%ld)\n", handle);
  89.             else
  90.                 printf("Can't open log file! (%ld)\n", handle);
  91.         else
  92.             Fforce(1, handle);
  93.     }
  94.  
  95.     dos_version = Sversion();
  96.     getcookie(0x4D694E54L, &mint);  /* MiNT */
  97.     if (Dcntl(DL_FILESYS, ".", NULL) == 'BDOS') {
  98.         bigdos = Dcntl(DL_VERSION, ".", NULL);
  99.     }
  100.     printf("XHDI-Test 1996-12-22 Rainer Seitel\n\n"\
  101.            "GEMDOS Version %x.%02x, Big-DOS %ld, MiNT Version %x.%02x\n\n",
  102.            dos_version & 0xFF, dos_version >> 8, bigdos, (int)mint >> 8, (int)mint & 0xFF);
  103.  
  104.     if (german)
  105.         strcpy(name, "Plattentreiber");
  106.     else
  107.         strcpy(name, "Hard disk driver");
  108.     xhdi = XHGetVersion();
  109.     if (xhdi)
  110.         XHInqDriver('C'-'A', name, version, NULL, NULL, NULL);
  111.     if (german)
  112.         printf("%s %s hat XHDI %x.%02x", name, version, xhdi >> 8, xhdi & 0xFF);
  113.     else
  114.         printf("%s %s has XHDI %x.%02x", name, version, xhdi >> 8, xhdi & 0xFF);
  115.  
  116.     if (xhdi) {
  117.         /* Aktuelle DOS-Limits ausgeben. */
  118.         old_secsiz = XHDOSLimits(XH_DL_SECSIZ, 0);
  119.         old_minfat = XHDOSLimits(XH_DL_MINFAT, 0);
  120.         old_maxfat = XHDOSLimits(XH_DL_MAXFAT, 0);
  121.         old_minspc = XHDOSLimits(XH_DL_MINSPC, 0);
  122.         old_maxspc = XHDOSLimits(XH_DL_MAXSPC, 0);
  123.         old_clusts = XHDOSLimits(XH_DL_CLUSTS, 0);
  124.         old_maxsec = XHDOSLimits(XH_DL_MAXSEC, 0);
  125.         old_drives = XHDOSLimits(XH_DL_DRIVES, 0);
  126.  
  127.         printf(", XHDOSLimits :-");
  128.         if (XHDOSLimits(XH_DL_MAXSEC, 0xFFFFFFL) == EINVFN)
  129.             printf("(");
  130.         else if (XHDOSLimits(XH_DL_MAXSEC, 0xFFFFFFL) != 0xFFFFFFL)
  131.             printf("/");
  132.         else
  133.             printf(")");
  134.  
  135.         printf("\nXHDI-DOS-Limits XH_DL_SECSIZ: %ld\n", old_secsiz);
  136.         printf("XHDI-DOS-Limits XH_DL_MINFAT: %ld\n", old_minfat);
  137.         printf("XHDI-DOS-Limits XH_DL_MAXFAT: %ld\n", old_maxfat);
  138.         printf("XHDI-DOS-Limits XH_DL_MINSPC: %ld\n", old_minspc);
  139.         printf("XHDI-DOS-Limits XH_DL_MAXSPC: %ld\n", old_maxspc);
  140.         printf("XHDI-DOS-Limits XH_DL_CLUSTS: %ld\n", old_clusts);
  141.         printf("XHDI-DOS-Limits XH_DL_MAXSEC: %ld\n", old_maxsec);
  142.         printf("XHDI-DOS-Limits XH_DL_DRIVES: %ld\n", old_drives);
  143.  
  144.         /* Bei Plattentreiber mit XHDI 1.20 DOS-Limits einstellen. */
  145.         if (xhdi >= 0x120) {
  146.             if (german)
  147.                 printf("XHDI ≥ 1.20, versuche Big-DOS-Werte einzustellen:\n");
  148.             else
  149.                 printf("XHDI ≥ 1.20, try to set Big-DOS limits:\n");
  150.             XHDOSLimits(XH_DL_SECSIZ, 32768L);
  151.             XHDOSLimits(XH_DL_MINFAT, 1);
  152.             XHDOSLimits(XH_DL_MAXFAT, 2);
  153.             XHDOSLimits(XH_DL_MINSPC, 1);
  154.             XHDOSLimits(XH_DL_MAXSPC, 64);
  155.             XHDOSLimits(XH_DL_CLUSTS, 0xFFF0L-FIRST_CLUSTER);
  156.             XHDOSLimits(XH_DL_MAXSEC, 0xFFFFFFL);
  157.             XHDOSLimits(XH_DL_DRIVES, NUM_DRIVES);
  158.             printf("XHDI-DOS-Limits XH_DL_SECSIZ: %ld\n", XHDOSLimits(XH_DL_SECSIZ, old_secsiz));
  159.             printf("XHDI-DOS-Limits XH_DL_MINFAT: %ld\n", XHDOSLimits(XH_DL_MINFAT, old_minfat));
  160.             printf("XHDI-DOS-Limits XH_DL_MAXFAT: %ld\n", XHDOSLimits(XH_DL_MAXFAT, old_maxfat));
  161.             printf("XHDI-DOS-Limits XH_DL_MINSPC: %ld\n", XHDOSLimits(XH_DL_MINSPC, old_minspc));
  162.             printf("XHDI-DOS-Limits XH_DL_MAXSPC: %ld\n", XHDOSLimits(XH_DL_MAXSPC, old_maxspc));
  163.             printf("XHDI-DOS-Limits XH_DL_CLUSTS: %ld\n", XHDOSLimits(XH_DL_CLUSTS, old_clusts));
  164.             printf("XHDI-DOS-Limits XH_DL_MAXSEC: %ld\n", XHDOSLimits(XH_DL_MAXSEC, old_maxsec));
  165.             printf("XHDI-DOS-Limits XH_DL_DRIVES: %ld\n", XHDOSLimits(XH_DL_DRIVES, old_drives));
  166.         }
  167.     } else  /* if (!xhdi) */
  168.         printf("\n");
  169.  
  170.     /* Die Laufwerkskennungen 1: bis 6: liegen hinter Z:. */
  171.     if (argc > 1 && argv[1][0] >= '1' && argv[1][0] <= '6')
  172.         argv[1][0] += 'Z'-'0';
  173.  
  174.     for (drive = 0; drive < NUM_DRIVES; drive++) {
  175.         /* Mit _nflops testen ob B: vorhanden ist. */
  176.         if (drive == 1 && (short)Supexec(get_nflops) < 2)
  177.             continue;
  178.         if (argc > 1 && ((argv[1][0] & 0xDF) - 'A') != drive)
  179.             continue;
  180.  
  181.         if (xhdi) {  /* Ab XHDI 1.10 */
  182.             r = XHInqDev2(drive, &major, &minor, &start_sector, &bpb, &blocks, partid);
  183.             if (r == E_OK || r == EDRVNR) {
  184.                 if (partid[0] == 0 && partid[1] == 'D') {  /* MS-DOS-Partition */
  185.                     partid[0] = ' ';
  186.                     partid[2] += '0';
  187.                 }
  188.                 if (german)
  189.                     printf("\nLaufwerk %c: major %u, minor %u, Start %ld, Grö₧e %lu, ID %s,\n",
  190.                            drive + 'A', major, minor, start_sector, blocks, partid);
  191.                 else
  192.                     printf("\nDrive %c: major %u, minor %u, start %ld, size %lu, ID %s,\n",
  193.                            drive + 'A', major, minor, start_sector, blocks, partid);
  194.                 if (r == E_OK) {
  195.                     printf("BPB recsiz %u, ", bpb.recsiz);
  196.                     printf("BPB clsiz %d, ", bpb.clsiz);
  197.                     printf("BPB clsizb %u, ", bpb.clsizb);
  198.                     printf("BPB rdlen %d,\n", bpb.rdlen);
  199.                     printf("BPB fsiz %d, ", bpb.fsiz);
  200.                     printf("BPB fatrec %d, ", bpb.fatrec);
  201.                     printf("BPB datrec %d, ", bpb.datrec);
  202.                     printf("BPB numcl %u, ", bpb.numcl);
  203.                     printf("BPB bflags %d\n", bpb.bflags);
  204.                 }
  205.             }
  206.         }
  207.  
  208.         p_bpb = Getbpb(drive);
  209.         if (p_bpb) {
  210.             if (german)
  211.                 printf("\nLaufwerk %c: ", drive + 'A');
  212.             else
  213.                 printf("\nDrive %c: ", drive + 'A');
  214.             printf("BPB recsiz %u, ", p_bpb->recsiz);
  215.             printf("BPB clsiz %d, ", p_bpb->clsiz);
  216.             printf("BPB clsizb %u, ", p_bpb->clsizb);
  217.             printf("BPB rdlen %d,\n", p_bpb->rdlen);
  218.             printf("BPB fsiz %d, ", p_bpb->fsiz);
  219.             printf("BPB fatrec %d, ", p_bpb->fatrec);
  220.             printf("BPB datrec %d, ", p_bpb->datrec);
  221.             printf("BPB numcl %u, ", p_bpb->numcl);
  222.             printf("BPB bflags %d\n", p_bpb->bflags);
  223.  
  224.             /* BPB wie in Big-DOS auf sinnvolle Werte testen. */
  225.  
  226.             bps    = p_bpb->recsiz;
  227.             clusiz = p_bpb->clsiz;
  228.  
  229.             if (bps < 128 || (bps & (bps - 1)))  /* Zweierpotenz ab 128 */
  230.                 if (german)
  231.                     printf("Sektorgrö₧e ungültig!\n");
  232.                 else
  233.                     printf("Sector size invalid!\n");
  234.  
  235.             if (clusiz != 1 && clusiz != 2 && clusiz != 4 && clusiz != 8
  236.                && clusiz != 16 && clusiz != 32 && clusiz != 64)
  237.                 if (german)
  238.                     printf("Sektoren pro Cluster ungültig!\n");
  239.                 else
  240.                     printf("Sectors per cluster invalid!\n");
  241.  
  242.             if (bps * clusiz != p_bpb->clsizb)
  243.                 printf("BPB.recsiz * BPB.clsiz != BPB.clsizb\n");
  244.  
  245.             if (p_bpb->rdlen > 14 * clusiz)
  246.                 printf("BPB.rdlen > 14 * BPB.clsiz\n");
  247.  
  248.             if (bps / 32 * p_bpb->rdlen > 2032)
  249.                 printf("BPB.recsiz / 32 * BPB.rdlen > 2032\n");
  250.  
  251.             if (p_bpb->fatrec + p_bpb->fsiz + p_bpb->rdlen != p_bpb->datrec)
  252.                 printf("BPB.fatrec + BPB.fsiz + BPB.rdlen != BPB.datrec\n");
  253.  
  254.             if (!(p_bpb->bflags & 1)) {
  255.                 if (p_bpb->fsiz < (p_bpb->numcl + FIRST_CLUSTER
  256.                              + (p_bpb->numcl + FIRST_CLUSTER) / 2 + bps - 1) / bps)
  257.                     if (german)
  258.                         printf("Grö₧e der 12-Bit-FAT zu klein! Minix-Dateisystem oder TSFM.CPX?\n");
  259.                     else
  260.                         printf("Size of 12-bit FAT too small! Minix file system or TSFM.CPX?\n");
  261.             } else
  262.                 if (p_bpb->fsiz < ((p_bpb->numcl + FIRST_CLUSTER) * 2L + bps - 1) / bps)
  263.                     if (german)
  264.                         printf("Grö₧e der 16-Bit-FAT zu klein! Minix-Dateisystem?\n");
  265.                     else
  266.                         printf("Size of 16-bit FAT too small! Minix file system?\n");
  267.  
  268.             if (p_bpb->fsiz > 256)
  269.                 printf("BPB.fsiz > 256\n");
  270.  
  271.             if (p_bpb->numcl == 0)  /* Fehler in HDDRIVER bis 4.50 */
  272.                 printf("BPB.numcl = 0! HDDRIVER ≤ 4.50?\n");
  273.  
  274.             if (!(p_bpb->bflags & 1) && p_bpb->numcl > 0xFF0-FIRST_CLUSTER)
  275.                 if (german)
  276.                     printf("Zu viele Cluster für eine 12-Bit-FAT!\n");
  277.                 else
  278.                     printf("Too many clusters for a 12-bit FAT!\n");
  279.  
  280.             if (p_bpb->numcl > 0xFFF0U-FIRST_CLUSTER)
  281.                 if (german)
  282.                     printf("Zu viele Cluster für eine 16-Bit-FAT!\n");
  283.                 else
  284.                     printf("Too many clusters for a 16-bit FAT!\n");
  285.  
  286.             if (p_bpb->bflags & ~3)
  287.                 if (german)
  288.                     printf("BPB.bflags ungültig!\n");
  289.                 else
  290.                     printf("BPB.bflags invalid!\n");
  291.         }
  292.     }  /* for (drive) */
  293.  
  294.     /* Wenn keine Ausgabeumleitung, dann auf Tastendruck warten. */
  295.     if (handle <= 0)  Cconin();  /* braucht 700 Byte weniger als getchar() */
  296.  
  297.     return 0;
  298. }
  299.