开发者

How to access specific address of a USB drive

I need to access the partition table of a USB stick and change the first byte of partition 0 to make it bootable. And I also want to copy a bin file to a specific address of that USB drive. So can any one tell me how to perform these kind of tasks?

I badly in need of some examples... If you could provide any links of such kinds of works it would be great. I am working in C.

I am in the beginning stage. Here is my code:

// DeviceIoControl.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include  <windows.h>
#include <winioctl.h>
#include <stdio.h>

 BOOL GetMBR(PARTITION_INFORMATION *pdg)
 {

    HANDLE hDevice;               // handle to the drive to be examined
 开发者_如何学编程   BOOL bResult;                 // results flag
    DWORD junk;                   // discard results

    hDevice = CreateFile(TEXT("\\\\.\\H:"),     // drive to open
                    GENERIC_READ | GENERIC_WRITE, // no access to the drive
                    FILE_SHARE_READ |           // share mode
                    FILE_SHARE_WRITE,
                    NULL,                       // default security attributes
                    OPEN_EXISTING,              // disposition
                    0,                          // file attributes
                    NULL                        // do not copy file attributes  
              );            

  if (hDevice == INVALID_HANDLE_VALUE)          // cannot open the drive
  {
        printf("CreateFile() failed!\n");
        return (FALSE);
  }

  bResult = DeviceIoControl(
                hDevice,                        // device to be queried
                IOCTL_DISK_GET_PARTITION_INFO,  // operation to perform
                NULL, 0,                        // no input buffer
                pdg, sizeof(*pdg),              // output buffer
                &junk,                          // # bytes returned
                (LPOVERLAPPED) NULL             // synchronous I/O
            );  

  CloseHandle(hDevice);
  return (bResult);

}


int _tmain(int argc, _TCHAR* argv[])
{
    PARTITION_INFORMATION pdg;              // disk drive geometry structure
    BOOL bResult;                           // generic results flag
    ULONGLONG DiskSize;                     // size of the drive, in bytes

    bResult = GetMBR(&pdg);

    if (bResult)
    {
        printf ("BootIndicator          %lld\n", pdg.BootIndicator);
        printf ("HiddenSectors          %lld\n", pdg.HiddenSectors);
        printf ("PartitionLength        %u\n", pdg.PartitionLength);
        printf ("PartitionNumber        %u\n", pdg.PartitionNumber);
        printf ("PartitionType          %x\n", pdg.PartitionType);
        printf ("RecognizedPartition    %s\n", pdg.RecognizedPartition);
        printf ("RewritePartition       %ld.\n", pdg.RewritePartition);
        printf ("StartingOffset         %lld\n", pdg.StartingOffset);
    }

    else
    {
        printf ("PARTITION INFORMATION failed. Error %ld.\n", GetLastError ());
    }

    getchar();

    return ((int)bResult);
}


Do you have to do it in code? You can use the built-in diskpart tool to make a USB drive bootable by following this tutorial.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜