Reading / Writing Disk Sectors (Absolute Disk Read / Write)
Windows 9x provides a vxd called vwin32.vxd using which msdos functions including absolute disk read / write can be performed. A handle to vwin32.vxd must be first created using the CreateFile function. After creating the handle DeviceIoControl function must be used with the correct control code to read or write from the disk drives. The control code depends on the type of the function you want to perform.
The control codes for vwin32.vxd are ...
|VWIN32_DIOC_DOS_IOCTL (1)||Interrupt 21h Function 4400h through 4411h|
|VWIN32_DIOC_DOS_INT25 (2)||Performs the Absolute Disk Read command (Interrupt 25h)|
|VWIN32_DIOC_DOS_INT26 (3)||Performs the Absolute Disk Write command (Interrupt 25h)|
|VWIN32_DIOC_DOS_INT13 (4)||Performs Interrupt 13h commands|
|VWIN32_DIOC_DOS_DRIVEINFO (6)||Interrupt 21h Function 730X commands|
The lpvInBuffer & lpvOutBuffer params of DeviceIoControl function must point to addresses of DIOC_REGISTERS structures. This structure contains the state of the processor registers before ioctl and after ioctl.
In Windows NT/2K/XP the CreateFile function can be used to open a disk drive or a partition on it. After getting a handle to the disk drive using CreateFile function the ReadFile function can be used to read sectors and the WriteFile function can be used to write to the drive.If you want to open a logical drive give the filename param of the CreateFile function as "\ \ \ \. \ \ a:" or "\ \ \ \. \ \ c:" ... etc. and if you want to open a physical drive for raw reading / writing give the filename param as "\ \ \ \. \ \ PhysicalDrive0" or "\ \ \ \. \ \ PhysicalDrive1" ... etc
Code to read disk sectors from win 9x/NT/2K/XP
Reads [numberofsectors] disk sectors from [drive (0 = A, 1 = B, 2 = C, ...}] drive starting from [startinglogicalsector]
To read sectors from win 9x int 21h''''s 7305h extention is used (Extended Absolute Disk Read / Write). For more info about int 21h''''s 7305h extention refer Ralf Brown''''s interrupt list.
char * ReadSectors (int drive, DWORD startinglogicalsector, int numberofsectors) (/ / All msdos data structures must be packed on a 1 byte boundary # pragma pack (1) struct (DWORD StartingSector; WORD NumberOfSectors; DWORD pBuffer;) ControlBlock; # pragma pack () # pragma pack (1) typedef struct _DIOC_REGISTERS (DWORD reg_EBX; DWORD reg_EDX; DWORD reg_ECX; DWORD reg_EAX; DWORD reg_EDI; DWORD reg_ESI; DWORD reg_Flags;) DIOC_REGISTERS; # pragma pack () char * buffer = (char *) malloc (512 * numberofsectors); HANDLE hDevice; DIOC_REGISTERS reg; BOOL fResult; DWORD cb; / / Creating handle to vwin32.vxd (win 9x) hDevice = CreateFile ( "\ \ \ \. \ \ vwin32", 0, 0, NULL, 0, FILE_FLAG_DELETE_ON_CLOSE, NULL); if (hDevice == INVALID_HANDLE_VALUE) (/ / win NT/2K/XP code HANDLE hDevice; DWORD bytesread; char _devicename  = "\ \ \ \. \ \ A:"; _devicename  + = drive; / / Creating a handle to disk drive using CreateFile () function .. hDevice = CreateFile (_devicename, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hDevice == INVALID_HANDLE_VALUE) return NULL; / / Setting the pointer to point to the start of the sector we want to read .. SetFilePointer (hDevice, (startinglogicalsector * 512), NULL, FILE_BEGIN); if (! ReadFile (hDevice, buffer, 512 * numberofsectors, & bytesread, NULL)) return NULL;) else (/ / code for win 95/98 ControlBlock.StartingSector = (DWORD) startinglogicalsector; ControlBlock.NumberOfSectors = (DWORD) numberofsectors; ControlBlock.pBuffer = (DWORD) buffer; / / -- -------------------------------------------------- ------- / / SI contains read / write mode flags / / SI = 0h for read and SI = 1h for write / / CX must be equal to ffffh for / / int 21h''''s 7305h extention / / DS: BX -> base addr of the / / control block structure / / DL must contain the drive number / / (01h = A:, 02h = B: etc) //----------- ------------------------------------------------ reg. reg_ESI = 0x00; reg.reg_ECX = -1; reg.reg_EBX = (DWORD) (& ControlBlock); reg.reg_EDX = drive +1; reg.reg_EAX = 0x7305; / / 6 == VWIN32_DIOC_DOS_DRIVEINFO fResult = DeviceIoControl (hDevice, 6, & (reg), sizeof (reg), & (reg), sizeof (reg), & cb, 0); if (! fResult | | (reg.reg_Flags & 0x0001)) return NULL;) CloseHandle (hDevice); return buffer ;)
C/C++ Tutorial Articles
- C + + design patterns of the Adapter
- USB port anomaly and C + + & Java
- Windows Media Format SDK System Overview
- Good books: Accelerated C + +
- boiz in C + + memorandum (1)
- Point to Point voice communication
- How do I customize the dialog box ENTER
- Interrelated design of the drop-down box control
- Visual C + + programming file operations
- Visual C + + programming file operations
- Member function pointers with a high-performance C + + commission (Part)
- Member function pointer and high-performance C + + commission ()
- Member function pointer and high-performance C + + commission (Part)
- IPv6 name to address translation function getaddrinfo () Detailed
- [Translation] C + + in the file input / output: some useful function
- With ENTER button to switch the focus of control and simulation of key
- Learning C + + the way smooth
- C + + frequently cited category of how to avoid unnecessary re-compile
- A realization of the type of HTTP FTP
- CListCtrl landscaping shown in the focus of Bank
Can't Find What You're Looking For?
Rating: Not yet rated