home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9203 / ctrick / snr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-04-14  |  3.7 KB  |  182 lines

  1. /* ------------------------------------------------------ */
  2. /*                      SNR.C                             */
  3. /*         Lesen und verändern der Seriennummer           */
  4. /*       des aktuellen Laufwerks ab MS-/PC-DOS 4.0        */
  5. /*        (c) 1992 Michael Winter & DMV-Verlag            */
  6. /* ------------------------------------------------------ */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <dos.h>
  11.  
  12. struct infotype
  13. {
  14.   unsigned int level;
  15.   unsigned int snumber1;
  16.   unsigned int snumber2;
  17.   char label[11];
  18.   char sys[8];
  19. };
  20.  
  21. struct infotype di;
  22.  
  23. char *number;
  24.  
  25. /* --- Funktionsprototypen ------------------------------ */
  26.  
  27. int main( int argc, char *argv[] );
  28. void ende( void );
  29. void getsnr( void );
  30. void setsnr( char *number );
  31. void shownumber( int z1, int z2 );
  32. void fehler( int error );
  33. int dr_dos();
  34.  
  35. /* --- Funktionen --------------------------------------- */
  36.  
  37. int main( int argc, char *argv[] )
  38. {
  39.   puts("\nSNR - (c) 1992 Michael Winter & DMV-Verlag\n");
  40.   if ( ( _osmajor < 4 ) || dr_dos() )
  41.   {
  42.     puts("\nDieses Programm benötigt MS-/PC-DOS ab 4.0.");
  43.     exit(1);
  44.   }
  45.   if ( argc > 2 )
  46.     ende();
  47.   if ( argc == 1 )
  48.     getsnr();
  49.   else
  50.   {
  51.     number = (char *)strupr(argv[1]);
  52.     if ( strlen( number ) != 9 )
  53.       ende();
  54.     if ( number[4] != '-' )
  55.       ende();
  56.     setsnr( number );
  57.   }
  58. }
  59.  
  60. /* --- Ungültige Seriennummer angegeben ----------------- */
  61.  
  62. void ende( void )
  63. {
  64.   puts("\nAufruf : SNR [XXXX-XXXX]\n");
  65.   puts("\n         X ::= 0 | 1 | ... | F\n\n");
  66.   exit(1);
  67. }
  68.  
  69. /* --- Seriennummer lesen ------------------------------- */
  70.  
  71. void getsnr( void )
  72. {
  73.   struct infotype _far *ptr;
  74.  
  75.   union REGS regs;
  76.   struct SREGS sregs;
  77.  
  78.   ptr = &di;
  79.  
  80.   regs.h.ah = 0x69;
  81.   regs.h.al = 0x00;
  82.   regs.h.bl = 0x00;
  83.   sregs.ds =  FP_SEG( ptr );
  84.   regs.x.dx = FP_OFF( ptr );
  85.  
  86.   intdosx( ®s, ®s, &sregs );
  87.  
  88.   if ( regs.x.cflag == 0 )
  89.     shownumber( di.snumber1, di.snumber2 );
  90.   else
  91.     fehler( regs.x.ax );
  92. }
  93.  
  94. /* --- Neue Serienummer schreiben ----------------------- */
  95.  
  96. void setsnr( char *number )
  97. {
  98.   struct infotype _far *ptr;
  99.   char z1[5], z2[5], *stopzfolge;
  100.   int i;
  101.  
  102.   union REGS regs;
  103.   struct SREGS sregs;
  104.  
  105.   di.level = 0;
  106.  
  107.   strncpy( z1, number, 4);
  108.  
  109.   di.snumber2 = strtol( z1, &stopzfolge, 16 );
  110.  
  111.   if ( *stopzfolge != '\0' )
  112.     ende();
  113.  
  114.   for (i = 5; i <= 9 ; i++)
  115.     z2[i-5] = number[i];
  116.  
  117.   di.snumber1 = strtol( z2, &stopzfolge, 16 );
  118.  
  119.   if ( *stopzfolge != '\0' )
  120.     ende();
  121.  
  122.   ptr = &di;
  123.  
  124.   regs.h.ah = 0x69;
  125.   regs.h.al = 0x01;
  126.   regs.h.bl = 0x00;
  127.   sregs.ds =  FP_SEG( ptr );
  128.   regs.x.dx = FP_OFF( ptr );
  129.  
  130.   intdosx( ®s, ®s, &sregs );
  131.  
  132.   if ( regs.x.cflag == 0 )
  133.   {
  134.     printf("Neue ");
  135.     shownumber( di.snumber1, di.snumber2 );
  136.   }
  137.   else
  138.     fehler( regs.x.ax );
  139. }
  140.  
  141. /* --- Nummer formatiert anzeigen ----------------------- */
  142.  
  143. void shownumber( int z1, int z2 )
  144. {
  145.   printf("Seriennummer : %4.4X-%4.4X\n\n", z2, z1);
  146. }
  147.  
  148. /* --- Fehler beim Ermitteln oder Lesen der Seriennummer  */
  149.  
  150. void fehler( int error )
  151. {
  152.   switch ( error )
  153.   {
  154.     case  0x0005 : {
  155.       puts("Diskette besitzt keinen erweiterten BSB\n");
  156.       break;
  157.     }
  158.     case  0x0001 : {
  159.       puts("Netzwerklaufwerke werden nicht unterstützt\n");
  160.       break;
  161.     }
  162.     default      : {
  163.       puts("Funktion konnte nicht ausgeführt werden\n");
  164.       break;
  165.     }
  166.   }
  167.   exit(1);
  168. }
  169.  
  170. /* --- DR-DOS oder MS-/PC-DOS --------------------------- */
  171.  
  172. int dr_dos()
  173. {
  174.   union REGS regs;
  175.  
  176.   regs.x.ax = 0x4452;
  177.   intdos( ®s, ®s );
  178.   return !regs.x.cflag;
  179. }
  180. /* ------------------------------------------------------ */
  181. /*                  Ende von SNR.C                        */
  182.