home *** CD-ROM | disk | FTP | other *** search
- /* ------------------------------------------------------ */
- /* SNR.C */
- /* Lesen und verändern der Seriennummer */
- /* des aktuellen Laufwerks ab MS-/PC-DOS 4.0 */
- /* (c) 1992 Michael Winter & DMV-Verlag */
- /* ------------------------------------------------------ */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <dos.h>
-
- struct infotype
- {
- unsigned int level;
- unsigned int snumber1;
- unsigned int snumber2;
- char label[11];
- char sys[8];
- };
-
- struct infotype di;
-
- char *number;
-
- /* --- Funktionsprototypen ------------------------------ */
-
- int main( int argc, char *argv[] );
- void ende( void );
- void getsnr( void );
- void setsnr( char *number );
- void shownumber( int z1, int z2 );
- void fehler( int error );
- int dr_dos();
-
- /* --- Funktionen --------------------------------------- */
-
- int main( int argc, char *argv[] )
- {
- puts("\nSNR - (c) 1992 Michael Winter & DMV-Verlag\n");
- if ( ( _osmajor < 4 ) || dr_dos() )
- {
- puts("\nDieses Programm benötigt MS-/PC-DOS ab 4.0.");
- exit(1);
- }
- if ( argc > 2 )
- ende();
- if ( argc == 1 )
- getsnr();
- else
- {
- number = (char *)strupr(argv[1]);
- if ( strlen( number ) != 9 )
- ende();
- if ( number[4] != '-' )
- ende();
- setsnr( number );
- }
- }
-
- /* --- Ungültige Seriennummer angegeben ----------------- */
-
- void ende( void )
- {
- puts("\nAufruf : SNR [XXXX-XXXX]\n");
- puts("\n X ::= 0 | 1 | ... | F\n\n");
- exit(1);
- }
-
- /* --- Seriennummer lesen ------------------------------- */
-
- void getsnr( void )
- {
- struct infotype _far *ptr;
-
- union REGS regs;
- struct SREGS sregs;
-
- ptr = &di;
-
- regs.h.ah = 0x69;
- regs.h.al = 0x00;
- regs.h.bl = 0x00;
- sregs.ds = FP_SEG( ptr );
- regs.x.dx = FP_OFF( ptr );
-
- intdosx( ®s, ®s, &sregs );
-
- if ( regs.x.cflag == 0 )
- shownumber( di.snumber1, di.snumber2 );
- else
- fehler( regs.x.ax );
- }
-
- /* --- Neue Serienummer schreiben ----------------------- */
-
- void setsnr( char *number )
- {
- struct infotype _far *ptr;
- char z1[5], z2[5], *stopzfolge;
- int i;
-
- union REGS regs;
- struct SREGS sregs;
-
- di.level = 0;
-
- strncpy( z1, number, 4);
-
- di.snumber2 = strtol( z1, &stopzfolge, 16 );
-
- if ( *stopzfolge != '\0' )
- ende();
-
- for (i = 5; i <= 9 ; i++)
- z2[i-5] = number[i];
-
- di.snumber1 = strtol( z2, &stopzfolge, 16 );
-
- if ( *stopzfolge != '\0' )
- ende();
-
- ptr = &di;
-
- regs.h.ah = 0x69;
- regs.h.al = 0x01;
- regs.h.bl = 0x00;
- sregs.ds = FP_SEG( ptr );
- regs.x.dx = FP_OFF( ptr );
-
- intdosx( ®s, ®s, &sregs );
-
- if ( regs.x.cflag == 0 )
- {
- printf("Neue ");
- shownumber( di.snumber1, di.snumber2 );
- }
- else
- fehler( regs.x.ax );
- }
-
- /* --- Nummer formatiert anzeigen ----------------------- */
-
- void shownumber( int z1, int z2 )
- {
- printf("Seriennummer : %4.4X-%4.4X\n\n", z2, z1);
- }
-
- /* --- Fehler beim Ermitteln oder Lesen der Seriennummer */
-
- void fehler( int error )
- {
- switch ( error )
- {
- case 0x0005 : {
- puts("Diskette besitzt keinen erweiterten BSB\n");
- break;
- }
- case 0x0001 : {
- puts("Netzwerklaufwerke werden nicht unterstützt\n");
- break;
- }
- default : {
- puts("Funktion konnte nicht ausgeführt werden\n");
- break;
- }
- }
- exit(1);
- }
-
- /* --- DR-DOS oder MS-/PC-DOS --------------------------- */
-
- int dr_dos()
- {
- union REGS regs;
-
- regs.x.ax = 0x4452;
- intdos( ®s, ®s );
- return !regs.x.cflag;
- }
- /* ------------------------------------------------------ */
- /* Ende von SNR.C */
-