2012-09-19 2 views
0

DeviceIoControl 기능을 사용하여 드라이브가 시스템 예약 드라이브 (PhysicalDrive0 또는 C-Drive)인지 식별하려고합니다. 그러나 내 코드는 항상 모든 드라이브에 대해 true를 반환합니다.C에서 DeviceIoControl 기능을 사용하여 시스템 예약 드라이브 식별

HANDLE hDevice;    // handle to the drive to be examined 
BOOL bResult;     // results flag 
DWORD junk;     // discard results 

PARTITION_INFORMATION_MBR *pdg 

hDevice = CreateFile(TEXT("\\\\.\\C:"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | 
     FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); 


bResult = DeviceIoControl(
      hDevice,      // device to be queried 
      IOCTL_DISK_GET_PARTITION_INFO_EX, // operation to perform 
      NULL, 0,      // no input buffer 
      pdg, sizeof(*pdg),    // output buffer 
      &junk,       // # bytes returned 
      (LPOVERLAPPED) NULL    // synchronous I/O 
     ); 
  • bResult isalways 함수가 성공한 것을 나타내는 0을 반환.
  • 심지어 pdg->PartitionType에는 정크 정보가 있고 true을 반환하지 않습니다.
+0

자세한 내용은 다음을 참조하십시오. * 반환 값 : 작업이 성공적으로 완료되면 반환 값은 0이 아닙니다. 작업이 실패하거나 보류중인 경우 반환 값은 0입니다. 자세한 오류 정보를 얻으려면 GetLastError. * – chris

+0

을 호출하십시오. DeviceIoControl이 파티션 정보를 성공적으로 가져 왔고 (PARTITION_INFORMATION_EX 구조체에 저장되어 있으므로) 0 (성공)을 반환했습니다. 이제는 'PARTITION_INFORMATION_EX' 구조를보고 요청한 정보가 있는지 확인해야합니다. –

답변

0

bResult isalways는 함수가 성공했음을 나타내는 0을 반환합니다.

일반 오류, the documentation states 작업이 성공적으로 완료되면 반환 값은 0이 아닙니다. ,


당신은 DeviceIoControl 초기화되지 않은 포인터를 제공하고 있지만,이 경우, 버퍼에 그 pdg 점을 예상 : 많은 것들이 적어도 당신의 매개 변수를 잘 작성하지, 잘못 될 수 및 GetLastErrorERROR_INSUFFICIENT_BUFFER을 반환 것 포인터의 크기는 PARTITION_INFORMATION_MBR입니다. Dereferencing 와일드 포인터는 정의되지 않은 동작을 호출합니다. 또한, the documentation에 따라 OCTL_DISK_GET_PARTITION_INFODeviceIoControl 그렇게


변경

PARTITION_INFORMATION_MBR *pdg(;) 

는 자동 스토리지와 구조하는 당신이 줄 수있어 그래서

PARTITION_INFORMATION_EX pdg; 

PARTITION_INFORMATION_EX 구조를 기다립니다 DeviceIoControl은 임시 포인터이고 & 연산자입니다.

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