Solved

re-writing number of series using C?

Posted on 1999-01-05
7
205 Views
Last Modified: 2010-04-15
hi experts!

  I use Borland C 3.1 and I need change the number of series of my 3.5" microdisk(disquettes).  (what interruption is and what service?)

What can I do??
(please write me a small sample skeletor source code )

Thanks again for all!
0
Comment
Question by:nowait
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
7 Comments
 
LVL 11

Accepted Solution

by:
alexo earned 150 total points
ID: 1255565
Quoting from MS KB article Q69223:

----------------------------------------------------------------------
The information in this article applies to:
 
 - The C Run-time (CRT) included with:
 
    - Microsoft C for MS-DOS, versions 5.1, 6.0, 6.0a, and 6.0ax
    - Microsoft C/C++ for MS-DOS, version 7.0
    - Microsoft Visual C++ for Windows, versions 1.0 and 1.5
----------------------------------------------------------------------
 
SUMMARY
=======
 
Beginning with MS-DOS version 4.0, a semi-random 32-bit binary
identification number (ID) is assigned to each disk that MS-DOS
formats. The volume serial number (or ID) is stored at offset 27H to
2AH in the boot sector of each disk.
 
NOTE: code compiled with Visual C++ version 1.5 may yield the following
message from Windows NT:
 
   An applicaion has attempted to directly access the hard disk, which
   cannot be supported. This may cause the application to function
   incorrectly.
 
It provides Terminate and Ignore buttons. If the user is logged on with
Administrative privileges, this will succeed for a FAT partition, else it
fails for a FAT partition. It always fails for an NTFS partition. After
clicking Terminate or Ignore the program returns with the error message
that has been coded (error on int 25).
 
MORE INFORMATION
================
 
The following program illustrates how to retrieve this information:
 
/***************************************************************/
/*                                                             */
/* This program reads the volume serial number (or ID) from    */
/* the boot sector of a specified disk. The DOS interrupt 25   */
/* Absolute Disk Read is used to read in the boot sector.      */
/*                                                             */
/* Note: The volume ID is only implemented from MS-DOS 4.0     */
/*       and later.                                            */
/*                                                             */
/* The output consists of the OEM name and version of the      */
/* disk-formatting program (stored at offset 03H to 0AH in the */
/* boot sector), the disk volume label, and the disk-volume    */
/* serial number.                                              */
/*                                                             */
/***************************************************************/
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>
#include <conio.h>
 
char bootsector[1024];
char volume[12];
char ver[9];
char block[10];
 
void main(void)
{
   int ax, _far *p, drive;
   struct find_t fileinfo;
   char filename[13], _far *myvar, _far *q;
   union REGS inregs, outregs;
   struct SREGS segregs;
 
   printf("Enter drive number (0=A,1=B,2=C, ...): ");
   drive = getche() - '0';
 
   /**************************************/
   /* Parameter block for int 25H        */
   /* Bytes    Description               */
   /* -------  -----------               */
   /* 00H-03H  32-bit sector number      */
   /* 04H-05H  Number of sectors to read */
   /* 06H-07H  Offset of buffer          */
   /* 08H-09H  Segment of buffer         */
   /**************************************/
 
   block[0] = block[1] = block[2] = block[3] = 0;
   block[4] = 1;
   block[5] = 0;
 
   myvar = bootsector;
 
   p = (int *)&block[6];
   *p = FP_OFF(myvar);
 
   p = (int *)&block[8];
   *p = FP_SEG(myvar);
 
   q = block;
   inregs.h.al = (char)drive;
   inregs.x.cx = -1;
   inregs.x.bx = FP_OFF(q);
   segregs.ds = FP_SEG(q);
   ax = int86x(0x25, &inregs, &outregs, &segregs);
 
   /*** Error routine ***/
 
   if (outregs.x.cflag)
   {
      printf("\n\nerror on int 25\n");
      printf("this is AX:%04X", ax);
      exit(-1);
   }
 
   /*** Output ***/
 
   printf("\n\nDrive %c\n-------\n\n", drive +'A');
 
   strncpy(ver, &bootsector[3], 8);
   printf("OEM name and version: %s\n", ver);
 
   /* Use _dos_findfirst for the volume label */
 
   filename[0] = (char)(drive + 'A');
   filename[1] = '\0';
   strcat(filename, ":\\*.*");
   if(!_dos_findfirst(filename, _A_VOLID, &fileinfo))
   printf("Volume name         : %s\n", fileinfo.name);
 
   /* Before printing serial number, check if version >= 4.x */
 
   if ((ver[6] == '.') && (ver[5] >= '4') && (ver[5] <= '9'))
      printf("Serial number       : %02X%02X-%02X%02X\n\n",
                              (unsigned char) bootsector[0x2a],
                              (unsigned char) bootsector[0x29],
                              (unsigned char) bootsector[0x28],
                              (unsigned char) bootsector[0x27]);
}
 

0
 

Author Comment

by:nowait
ID: 1255566

excellent answer!!
Thanks Alexo!!
0
 
LVL 11

Expert Comment

by:alexo
ID: 1255567
Also check http://support.microsoft.com/support/kb/articles/q137/3/67.asp
(May require a one-time registration process)

Have fun!
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:nowait
ID: 1255568
thanks again!!!!
0
 

Author Comment

by:nowait
ID: 1255569
thanks alexo!!!! but your sorce code read the serial number but I need write a NEW serial number !!

What can I do? Please alexo!!
thanks again!
0
 
LVL 11

Expert Comment

by:alexo
ID: 1255570
Well, INT 25h reads from the disk and INT 26h writes to the disk so after reading the boot sector, just change the 4 bytes at offset 0x27 and up and write them again.

One more thing, there are functions that are easier to use than int86x().  Here are some options:

1. Read the boot sector with absread() and write it with abswrite().
2. Use biosdisk().  Command 2 to read and command 3 to write.

The first option implicitly uses INT 25h and INT26h, the second uses INT 13h.
0
 

Author Comment

by:nowait
ID: 1255571
Thanks Again Alexo!!
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Have you thought about creating an iPhone application (app), but didn't even know where to get started? Here's how: ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Important pre-programming comments: I’ve never tri…
Preface I don't like visual development tools that are supposed to write a program for me. Even if it is Xcode and I can use Interface Builder. Yes, it is a perfect tool and has helped me a lot, mainly, in the beginning, when my programs were small…
The goal of this video is to provide viewers with basic examples to understand recursion in the C programming language.
The goal of this video is to provide viewers with basic examples to understand opening and reading files in the C programming language.

623 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question