Reading/Writing Disk Sectors (Absolute Disk Read/Write)



Click here for a larger image.

Environment: VC6 , Win 9x/NT/2K/XP

Reading/Writing disk sectors is done differently in win 9x and win NT/2K/XP.

Windows 9x

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 ...

Code Description
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.

Windows NT/2K/XP

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[4] += 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;
}

Sreejith S sreejithsin@hotpop.com, http://paradiseprogramming.tripod.com

Downloads

Download demo project - 125 Kb
Download source - 25 Kb


Comments

  • wheloltabotly PumeSonee Phobereurce 4319375

    Posted by TizefaTaNaday on 06/03/2013 03:13am

    insiliade blackandgoldjordan6forsale.holidaygiving.org Heirtywew airjordan4retrobasketball.holidaygiving.org oneniazorma

    Reply
  • Those things that other people actually does with regards to nike and consequently those actions you will want to do totally different.

    Posted by icoppyapedcap on 04/21/2013 09:39am

    Uy [url=http://hunter-rain-boots.webnode.jp]レインブーツハンター[/url] gJj [url=http://hunterrainbootsjp.webnode.jp]レインブーツメンズ[/url] w XwyJdc UvqV [url=http://hunter-boots8.webnode.jp]レインブーツハンター[/url] fw J [url=http://rain-boots-men.webnode.jp]長靴[/url] qc [url=http://hunter-rain-boots-ja.webnode.jp]レインブーツ人気[/url] RspBghVgi H[url=http://rainshoesja.webnode.jp]長靴[/url] psUrdJveFy [url=http://ja-hunter-rain-boots.webnode.jp]ハンター長靴[/url] r QeyLdy [url=http://rain-boots-popular.webnode.jp]レインブーツ人気[/url] Yxq [url=http://rain-boots-men6.webnode.jp]レインブーツハンター[/url] Jat Hzl [url=http://jahunterrainboots.webnode.jp]ハンター長靴[/url] Jfz

    Reply
  • In XP - not Admin rights problem

    Posted by frog62 on 11/01/2005 01:41am

    In XP, if you don't have Admin rights this works only on Drive A:, not on C:, D: etc. or removable drives such as FLASH DRIVE. If there is solution please help! Mail me at: dziapkov@transgeo-bg.com

    • aa

      Posted by m_hamidimehr on 07/12/2009 08:09am

      aa

      Reply
    Reply
  • Write sector 0 ?

    Posted by KPKSoftware.com on 06/12/2005 09:39pm

    Hi Sreejith, Thank you for your sample ! Just a quick qustion, will this method allow me to write to sector 0,1, etc where system info such as boot sector fat dir tree is located ? Thanks...

    Reply
  • not Admin (in xp) !!! Help

    Posted by hafkensite on 04/28/2004 09:51am

    This doesn't work if your not Admin (in xp) How can I do that? please mail hafkensite at hotm@il.com

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Download the Information Governance Survey Benchmark Report to gain insights that can help you further establish business value in your Records and Information Management (RIM) program and across your entire organization. Discover how your peers in the industry are dealing with this evolving information lifecycle management environment and uncover key insights such as: 87% of organizations surveyed have a RIM program in place 8% measure compliance 64% cannot get employees to "let go" of information for …

  • You probably have several goals for your patient portal of choice. Is "community" one of them? With a bevy of vendors offering portal solutions, it can be challenging for a hospital to know where to start. Fortunately, YourCareCommunity helps ease the decision-making process. Read this white paper to learn more. "3 Ways Clinicians can Leverage a Patient Portal to Craft a Healthcare Community" is a published document owned by www.medhost.com

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds