1

関数を使用して、ドライブがシステム予約ドライブ (PhysicalDrive0またはC-Drive)であるかどうかを識別しようとしていDeviceIoControlます。ただし、私のコードは常にすべてのドライブに対して true を返します。

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は常に 0 を返し、関数が成功したことを示します。
  • pdg->PartitionTypeジャンク情報があっても返品不可true
4

1 に答える 1

0

bResult は常に 0 を返し、関数が成功したことを示します。

単純に間違っています。ドキュメントには、操作が正常に完了した場合、戻り値はゼロ以外であると記載されています。多くのことが間違っている可能性があります.少なくともあなたのパラメータは正しくなく、GetLastError返されたでしょうERROR_INSUFFICIENT_BUFFER:


初期化されていないポインタを指定していますが、この場合は へのポインタのサイズを持つバッファDeviceIoControlを指していると予想されます。ワイルド ポインターを逆参照すると、未定義の動作が発生します。また、awaitsのドキュメントによると、構造がそうですpdgPARTITION_INFORMATION_MBR DeviceIoControlOCTL_DISK_GET_PARTITION_INFOPARTITION_INFORMATION_EX


変化する

PARTITION_INFORMATION_MBR *pdg(;)

PARTITION_INFORMATION_EX pdg;

したがって、演算子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
    );  
于 2016-07-25T08:13:13.660 に答える