Click here to Skip to main content
Click here to Skip to main content

Reading and Writing to Raw Disk Sectors

By , 2 Aug 2008
 

Introduction

This is a tool to read and write raw disk sectors on Windows systems (NT5.0, 5.1 kernels)
Inspiration to write this tool came to me when I had my laptop infected with some malware which was sitting on top of disk class driver as an upper filter and not allowing me to write to disk sectors using user mode disk editing tools like WinHex.

After a few days, I thought I should write a utility to read and write raw disk sectors by directly
communicating with disk class driver.

Background

To understand this article, one should have knowledge of C Programming and Windows Driver Programming.

We will go through the following topics to understand the utility in a better way:

  1. Device stack for storage drivers
  2. Enumerating device objects representing disks and partitions
  3. How to read/write to sectors

1. Device Stack for Storage Drivers

Microsoft provides generic storage drivers for managing the storage on a logical level and thus abstracting hardware details from upper level file system and other file drivers. This is called disk class driver (a driver to handle disk class of hardware, i.e. "disk.sys").

Similarly to handle SCSI, IDE hardware devices, Microsoft provides generic port interface drivers to which drivers supplied by specific vendors for their disk devices can be dynamically linked.

E.g. scsiport.sys (old interface) storport.sys (new interface) is used as an interface to SCSI port while Pciidex.sys is used as an interface to IDE port.

2. Enumerating Device Objects Representing Disks and Partitions

There is a question which needs to be answered first.

How does the OS come to know that a harddisk has been attached to the system?

Whenever a new disk device is attached to the system, SCSI and IDE port drivers create device object (although PCI driver is the first one which comes into the picture) to represent a SCSI/IDE device and inform I/O manager about it. I/O manager in turn queries the devices to know their device id and vendor id. Depending on dev id and vendor id, I/O manager decides (through registry or INF file mechanism) which driver is suitable to handle this device (driver supplied by vendor) and loads the hardware device driver which creates device objects representing the Functions device objects for the device and attaches itself to lower devices created by respective port drivers.

I/O manager informs disk class driver (disk.sys) of new disks added into the system. Disk class driver then creates the device objects representing the raw disks.

If a valid partition is present on the system, then it creates device objects for the respective partitions too.

E.g. Device objects created by disk class driver are as follows:

  • \Device\Harddisk0\DR(0) --> Represents Raw Harddisk 0
  • \Device\Harddisk0\DP(1)0x7e000-0x7ff50c00+2 --> Represents partition 2 of disk 0

The first hexadecimal digit shows the start and thsecond shows the length of partition.

That means all the device objects representing disks and partitions are chained in driver object of disk class driver (i.e. disk.sys).

Now to enumerate the device objects created, you first need to have access to the driver object of disk class driver.

The solution is to use undocumented Object management kernel function "ObReferenceObjectByName" prototype:

NTSTATUS ObReferenceObjectByName(
        PUNICODE_STRING, 
        DWORD, 
        PACCESS_STATE, 
        ACCESS_MASK,
        POBJECT_TYPE,
        KPROCESSOR_MODE,
        PVOID,
        PVOID *Object); 

The first argument is a Unicode string, i.e. "\Driver\disk", object receives the pointer to the DRIVER_OBJECT of disk.sys.

From DRIVER_OBJECT, you can enumerate all the device objects created by disk class driver and store pointer to device objects responsible for raw disks and partitions. The following snippet will clear the things:

PDEVICE_OBJECT pDeviceObject;
  ..... 
// DeviceType 7 corresponds to FILE_DISK_DEVICE Type Device Object and

 // It should have name too that's why Flags checks for 0x40 (DO_DEVICE_HAS_NAME )

                if (pDeviceObject->DeviceType == 7
                        && (pDeviceObjectTemp->Flags & 0x40))

3. How to Read/Write to Sectors

Once you have pointers to device objects for raw disks and partitions, reading and writing to those raw disks/partitions is not a difficult thing. You only have to do a IoCallDriver on the respective device object with IRP_MJ_READ/IRP_MJ_WRITE function codes initialized in the IRPs.

The following code will make things clear:

LARGET_INTEGER lDiskOffset; 

PDEVICE_OBJECT pDevObj; //Device object representing disk/partition

KEVENT Event; 

// Trying to read some arbitrary sector number 1169944 and 
// by default assuming sector size 

// 512 

..........

..........

        lDiskOffset.QuadPart = 1169944*512;
        sBuf = ExAllocatePool(NonPagedPool, size);
        
        if (!sBuf) {
            ObDereferenceObject(pFileObj);
            return STATUS_INSUFFICIENT_RESOURCES;
        }
        KeInitializeEvent(&Event, NotificationEvent, FALSE);
        memset(sBuf, '0x00', size);
        pIrp = IoBuildSynchronousFsdRequest(IRP_MJ_WRITE/*IRP_MJ_READ*/, 
			pDevObj, sBuf, size, &lDiskOffset, &Event, &ioStatus);
        
        
        if (!pIrp) {
            ExFreePool(sBuf);
            return STATUS_INSUFFICIENT_RESOURCES;
        }
        
        status = IoCallDriver(pDevObj, pIrp);

        if (status == STATUS_PENDING) {
            KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE,    NULL);
            status = ioStatus.Status;
        }
        ExFreePool(sBuf);

.......... 

Given above is just a sample code for sending a write operation to sector number 1169944.

Points of Interest

While writing the code, I was just doing a READ operation for verifying my results. I didn't take care while passing data buffer for write operations in the design (Please see driver code for more explanations). So I implemented an ugly hack for passing user mode buffer for write operations. I will improve it in future releases.

History

  • 2nd August, 2008: Initial post

License

This article, along with any associated source code and files, is licensed under The GNU General Public License (GPLv3)

About the Author

dkg0414
Software Developer
India India
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
QuestionRead Muliple SectorsmemberAlistair Budd24 Mar '13 - 14:54 
QuestionC#membermr_rastegari4 Dec '12 - 5:46 
QuestionQuestionmemberRomTibi27 Jan '12 - 21:55 
QuestionWindows 7 x64membercmleevt17 Nov '11 - 8:57 
GeneralHello If I want to read and write F: how to write the contents of disk!memberajmajm15 May '11 - 23:23 
GeneralLook at it from the other anglememberWill228 Apr '11 - 1:15 
GeneralRead/Write 1-2 Bytes in MBR onlymemberBrianPeterson19 Nov '09 - 18:44 
GeneralRe: Read/Write 1-2 Bytes in MBR onlymemberdkg041419 Nov '09 - 19:04 
QuestionRe: Read/Write 1-2 Bytes in MBR only [modified]memberBrianPeterson25 Mar '10 - 14:10 
AnswerRe: Read/Write 1-2 Bytes in MBR onlymemberdkg041426 Mar '10 - 8:20 
GeneralRe: Read/Write 1-2 Bytes in MBR onlymemberBrianPeterson26 Mar '10 - 10:05 
GeneralRe: Read/Write 1-2 Bytes in MBR onlymemberBrianPeterson26 Mar '10 - 15:11 
GeneralRe: Read/Write 1-2 Bytes in MBR onlymemberdkg041426 Mar '10 - 18:37 
GeneralRe: Read/Write 1-2 Bytes in MBR only [modified]memberBrianPeterson26 Mar '10 - 18:59 
GeneralRe: Read/Write 1-2 Bytes in MBR onlymemberBrianPeterson26 Mar '10 - 21:28 
GeneralRe: Read/Write 1-2 Bytes in MBR onlymemberdkg041426 Mar '10 - 23:22 
QuestionRe: Read/Write 1-2 Bytes in MBR onlymemberBrianPeterson27 Mar '10 - 8:52 
GeneralDisk/Partition Sectorsmembertrlacey28 Oct '09 - 8:23 
GeneralRe: Disk/Partition Sectorsmemberdkg041429 Oct '09 - 20:11 
GeneralRe: Disk/Partition Sectorsmembertrlacey30 Oct '09 - 7:48 
GeneralRe: Disk/Partition Sectorsmemberdkg041431 Oct '09 - 20:29 
GeneralRe: Disk/Partition Sectorsmembertrlacey1 Nov '09 - 3:58 
GeneralRe: Disk/Partition Sectorsmemberdkg04141 Nov '09 - 18:35 
GeneralRe: Disk/Partition Sectorsmembertrlacey2 Nov '09 - 5:00 
GeneralRe: Disk/Partition Sectorsmemberdkg04142 Nov '09 - 6:19 
GeneralRe: Disk/Partition Sectorsmembertrlacey2 Nov '09 - 6:25 
GeneralRe: Disk/Partition Sectorsmemberdkg04142 Nov '09 - 6:36 
GeneralRe: Disk/Partition Sectorsmembertrlacey2 Nov '09 - 6:37 
GeneralRe: Disk/Partition Sectorsmemberdkg04142 Nov '09 - 6:43 
GeneralRe: Disk/Partition Sectorsmembertrlacey2 Nov '09 - 7:09 
GeneralRe: Disk/Partition Sectorsmembertrlacey2 Nov '09 - 7:17 
GeneralReading from pendrive and sd cardmemberpawloch10 Oct '09 - 4:43 
GeneralBuild error with DDK 7600.16385.0memberysahn17 Sep '09 - 8:05 
GeneralRe: Build error with DDK 7600.16385.0memberdkg041417 Sep '09 - 8:27 
GeneralRe: Build error with DDK 7600.16385.0memberMember 231037926 Oct '09 - 7:06 
GeneralAccess to \\.\PhysicalDrive0memberjurasix24 Jun '09 - 0:09 
GeneralRe: Access to \\.\PhysicalDrive0memberdkg041424 Jun '09 - 5:25 
GeneralRe: Access to \\.\PhysicalDrive0memberjurasix24 Jun '09 - 9:22 
GeneralRe: Access to \\.\PhysicalDrive0memberdkg041424 Jun '09 - 9:51 
GeneralLocked file and rootkits hooking IRP'smemberMy2Cents7 Apr '09 - 14:45 
GeneralRe: Locked file and rootkits hooking IRP'smemberdkg041424 Jun '09 - 10:14 
GeneralRe: Locked file and rootkits hooking IRP'smemberVicSmurf4 Oct '09 - 9:08 
GeneralRe: Locked file and rootkits hooking IRP'smemberdkg04146 Oct '09 - 8:38 
GeneralNew Program Using This CodememberRickLeinecker5 Mar '09 - 12:20 
GeneralRe: New Program Using This CodememberMy2Cents7 Apr '09 - 14:46 
QuestionDoes this solve thrashing problems in XP?memberMikael Sundström11 Oct '08 - 2:30 
AnswerRe: Does this solve thrashing problems in XP?memberdkg041411 Oct '08 - 3:43 
AnswerRe: Does this solve thrashing problems in XP?memberRay Yang2 Feb '09 - 15:54 
GeneralWriting Sectors in VistamemberRickLeinecker11 Sep '08 - 9:42 
GeneralRe: Writing Sectors in Vistamemberdkg041417 Sep '08 - 8:20 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web04 | 2.6.130516.1 | Last Updated 2 Aug 2008
Article Copyright 2008 by dkg0414
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid