如何获得驱动器号和名称

时间:2014-01-29 13:57:45

标签: winapi

我想获得驾驶信和姓名。 出于这个原因,我使用了“DeviceIoControl”和“IOCTL_DISK_GET_DRIVE_LAYOUT_EX”。我使用的是Microsoft Visual C ++终极版。

#define wszDrive L"\\\\.\\PhysicalDrive0"

BOOL GetDriveParition(LPWSTR wszPath, DRIVE_LAYOUT_INFORMATION_EX *pdg)
{
  HANDLE hDevice = INVALID_HANDLE_VALUE;  // handle to the drive to be examined 
  BOOL bResult   = FALSE;                 // results flag
  DWORD junk     = 0;                     // discard results

  hDevice = CreateFileW(wszPath,          // 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
  {
    return (FALSE);
  }


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

  CloseHandle(hDevice);

  return (bResult);
}

int wmain(int argc, wchar_t *argv[])
{

  DRIVE_LAYOUT_INFORMATION_EX pdg; // disk drive partition structure
  BOOL bResult = FALSE;      // generic results flag

  bResult = GetDriveParition (wszDrive, &pdg);


  if (bResult) 
  {
    wprintf(L"Drive path            = %ws\n",   wszDrive);
    wprintf(L"Partition Style       = %I64d\n", pdg.PartitionStyle);
    wprintf(L"Partition Count       = %ld\n",   pdg.PartitionCount);
  } 
  else 
  {
    wprintf (L"GetDrivePartition  failed. Error %ld.\n", GetLastError ());
  }

  getch();
}

但是当我表演时,我遇到了一个错误,即“错误122”。

1 个答案:

答案 0 :(得分:2)

我认为您的意思是说错误代码122而不是22.错误是ERROR_INSUFFICIENT_BUFFER。作为documented,您需要分配更大的缓冲区并重试。

这里的要点是结构是一个可变大小的结构。您需要分配足够大的动态内存来保存所有分区的信息。

这样的事情会让你朝着正确的方向前进:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

#define wszDrive L"\\\\.\\PhysicalDrive0"

BOOL GetDriveParition(LPWSTR wszPath, DRIVE_LAYOUT_INFORMATION_EX *pdg, size_t size)
{
  HANDLE hDevice = INVALID_HANDLE_VALUE;  // handle to the drive to be examined 
  BOOL bResult   = FALSE;                 // results flag
  DWORD junk     = 0;                     // discard results

  hDevice = CreateFileW(wszPath,          // 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
  {
    return (FALSE);
  }


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

  CloseHandle(hDevice);

  return (bResult);
}

int wmain(int argc, wchar_t *argv[])
{

  DRIVE_LAYOUT_INFORMATION_EX* pdg; // disk drive partition structure
  BOOL bResult = FALSE;      // generic results flag

  size_t size = sizeof(DRIVE_LAYOUT_INFORMATION_EX) + 10*sizeof(PARTITION_INFORMATION_EX);
  pdg = (DRIVE_LAYOUT_INFORMATION_EX*) malloc(size);
  bResult = GetDriveParition (wszDrive, pdg, size);

  if (bResult) 
  {
    wprintf(L"Drive path            = %ws\n",   wszDrive);
    wprintf(L"Partition Style       = %I64d\n", pdg->PartitionStyle);
    wprintf(L"Partition Count       = %ld\n",   pdg->PartitionCount);
  } 
  else 
  {
    wprintf (L"GetDrivePartition  failed. Error %ld.\n", GetLastError ());
  }

  free(pdg);
}

我已经转换了malloc的返回值,因为你声明你正在使用C ++编译器。

相关问题