-2

I am newbie. The code is that I copied on internet. And I don't really understand it.

I'm learning C ++, so even though the code is C, I want to switch to C ++. I need to understand the code and output the screen:

  • Partition Styles/Scheme: is MBR disk/drive // is GPT disk/drive // or is RAW disk/drive
  • Partition Number of a Disk/Drive

I put breakpoint at line below, press F5 on Visual Studio 2013 (run as admin):

DWORD part_num = szPartINF.PartitionNumber;

If I leave:

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

the code runs successfully (part_num have value = 2 . It is right, because my Disk0 have 2 partitions)

And, I change to:

hDevice = CreateFile(L"\\\\.\\PhysicalDrive0", 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);

the code runs fails/unsuccess (part_num = 0)

I need to use "\\\.\\PhysicalDrive0" rather than "\\\.\\C:".

I still have another problem: I use the clean command in DiskPart for My Hard Drive. When I ran the test, the code did not recognize PartitionStyle RAW correctly, because this time my hard drive was RAW DISK (and certainly not PartitionStyle MBR or PartitionStyle GPT).

Please help me. Thanks.

#include "windows.h"
#include <stdio.h>
#include <iostream>
//////// ok, go ///////////
int main(int argc, char* argv[])
{
    HANDLE  hDevice = INVALID_HANDLE_VALUE;
    PARTITION_INFORMATION_EX szPartINF;
    DWORD cbReturned = 0;

    __try
    {
hDevice = CreateFile(L"\\\\.\\PhysicalDrive0", 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
        //hDevice = CreateFile(L"\\\\.\\C:", 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
        if (hDevice == INVALID_HANDLE_VALUE) { return FALSE; }

        RtlZeroMemory(&szPartINF, sizeof(szPartINF));
        if (FALSE != DeviceIoControl(hDevice, IOCTL_DISK_GET_PARTITION_INFO_EX, NULL, 0, (LPVOID)&szPartINF, sizeof(PARTITION_INFORMATION_EX), &cbReturned, NULL))
        {
            DWORD part_num = szPartINF.PartitionNumber;
DWORD part_style = szPartINF.PartitionStyle;
            return TRUE;
        }
        else
        {
            cbReturned = GetLastError();
            wprintf(L"\n%08X (%d)\n", cbReturned, cbReturned);
        }
    }
    __finally
    {
        if (hDevice != INVALID_HANDLE_VALUE) { CloseHandle(hDevice); }
    }

    return FALSE;

    bool success;
    cin >> success; //for wait to close cmd.
}
Orion8
  • 41
  • 9
  • Do you have more than 1 disk? Perhaps \\.\PhysicalDrive0 is not C: Related: [https://stackoverflow.com/questions/327718/how-to-list-physical-disks/11683906](https://stackoverflow.com/questions/327718/how-to-list-physical-disks/11683906) – drescherjm Jul 31 '20 at 12:35

1 Answers1

1

"\\\\.\PhysicalDrive0" is not necessarily "\\\\.\\C:".

You can check This PC->Manage->Storage->Disk Management: enter image description here

The Disk 0 means PhysicalDrive0.If you need the corresponding physical disk.You can refer to How to list physical disks?

Zeus
  • 3,703
  • 3
  • 7
  • 20