问题使用DeviceIoControl函数读取MBR

时间:2010-07-29 11:35:41

标签: c++ winapi

调用DeviceIoControl函数读取可移动设备的MBR时出错。错误代码是5.这意味着拒绝访问!我正在使用windows xp sp2。

#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("\\\\.\\G:"),     // drive to open
                    0,                          // 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)
    {

    }

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

    getchar();

    return ((int)bResult);
}

1 个答案:

答案 0 :(得分:3)

使用FILE_READ_ATTRIBUTES打开它。