C++ 我仍然有这个问题:C++;获取分区样式

C++ 我仍然有这个问题:C++;获取分区样式,c++,winapi,C++,Winapi,我是C/C++新手。这是一个练习。我真的不明白。上面的代码是我在网上复制的 我正在学习C++,所以即使代码是C,我还是想切换回C++ 我需要理解代码并输出屏幕: 是MBR磁盘/驱动器吗 是GPT磁盘/驱动器吗 或者是原始磁盘/驱动器 在C/C++中检索有关硬盘分区类型的信息时遇到问题 我在Visual Studio 2013上按了F5,收到通知: 使用变量“partitions\u style”时未初始化 我还有另一个问题:我对我的硬盘使用DiskPart中的clean命令。当我运行测试时,

我是C/C++新手。这是一个练习。我真的不明白。上面的代码是我在网上复制的

我正在学习C++,所以即使代码是C,我还是想切换回C++

我需要理解代码并输出屏幕:

  • 是MBR磁盘/驱动器吗
  • 是GPT磁盘/驱动器吗
  • 或者是原始磁盘/驱动器
在C/C++中检索有关硬盘分区类型的信息时遇到问题

我在Visual Studio 2013上按了F5,收到通知:

使用变量“partitions\u style”时未初始化

我还有另一个问题:我对我的硬盘使用DiskPart中的clean命令。当我运行测试时,我发现IOCTL\u DISK\u GET\u DRIVE\u LAYOUT\u EX没有正确识别PartitionStyle RAW,因为这次我的硬盘是RAW DISK(当然不是PartitionStyle MBR或PartitionStyle GPT)

请帮帮我。 谢谢

#包括“windows.h”
#包括
#包括
使用名称空间std;
BOOL Get_Partition_样式(LPWSTR wszPath、PDRIVE_LAYOUT_INFORMATION_EX p_LAYOUT_INFORMATION_EX)
{
DWORD partitionsSize=sizeof(驱动器布局信息)+127*sizeof(分区信息);
p_布局_信息_EX=(p驱动_布局_信息_EX)malloc(分区);
HANDLE hDevice=无效的\u HANDLE\u值;
BOOL-bResult=FALSE;
德沃德垃圾=0;
hDevice=CreateFileW(wszPath,
0,                          
文件共享读取
文件共享写入,
无效的
开放式,
0,                          
无效);
if(hDevice==无效的句柄值)
{
返回(假);
}
bResult=设备控制(hDevice,
IOCTL\u磁盘\u获取\u驱动器\u布局\u EX,
NULL,0,
p_布局_信息_EX,partitionsSize,
&垃圾,
(重叠)空);
闭合手柄(hDevice);
返回(bResult);
}
void enum_分区()
{
对于(int i=0;i++)
{ 
WCHAR卷[最大路径];
wsprintf(卷,L“\\.\\PhysicalDrive%d”,i);
HANDLE h=CreateFile(卷,0,文件共享,读取,文件共享,写入,NULL,打开,0,0);
bool success=h!=无效的句柄值;
如果(!成功)
打破

wcout您将一个
PDRIVE\u LAYOUT\u INFORMATION\u EX
传递给
Get\u Partition\u Styles()
,但在函数中您说
p\u LAYOUT\u INFORMATION\u EX=(PDRIVE\u layou INFORMATION\u EX)malloc(partitionsSize);
所以您刚刚覆盖了传入的值

由于您是通过值传递的,因此更新的版本在调用方中不可见,因此调用方中的版本永远不会设置为值。(被调用函数中的版本可能是内存泄漏,因为存在malloc,但没有空闲)

作为旁注:C还是C++?< /P>

如果你在C++中,你可以通过一个引用,但是为什么你使用Maloc?< /P>


如果您使用的是C语言,那么您可以传递一个要填充的指针(传递引用的旧版本:-)。

请阅读。该代码存在内存泄漏问题。无论
malloc
成功与否,您都应该将
free()
放在
for{}
中,因为
分区样式的生命周期是
for{}
,我建议将
malloc
作为free()放在相同的
{}
中,而不是放在函数中。此外,使用变量'partitions\u style'时没有初始化。这意味着您需要像
PDRIVE\u layou INFORMATION\u EX partitions\u style=NULL;
#include "windows.h"
#include <stdio.h>
#include <iostream>
using namespace std;

BOOL Get_Partition_Styles(LPWSTR wszPath, PDRIVE_LAYOUT_INFORMATION_EX p_LAYOUT_INFORMATION_EX)
{
    DWORD partitionsSize = sizeof(DRIVE_LAYOUT_INFORMATION_EX)+127 * sizeof(PARTITION_INFORMATION_EX);
    p_LAYOUT_INFORMATION_EX = (PDRIVE_LAYOUT_INFORMATION_EX)malloc(partitionsSize);
    HANDLE hDevice = INVALID_HANDLE_VALUE;  
    BOOL bResult = FALSE;                  
    DWORD junk = 0;                        
    hDevice = CreateFileW(wszPath,  
        0,                          
        FILE_SHARE_READ |           
        FILE_SHARE_WRITE,
        NULL,                       
        OPEN_EXISTING,             
        0,                          
        NULL);                      
    if (hDevice == INVALID_HANDLE_VALUE)
    {
        return (FALSE);
    }
    bResult = DeviceIoControl(hDevice,     
        IOCTL_DISK_GET_DRIVE_LAYOUT_EX,   
        NULL, 0,                          
        p_LAYOUT_INFORMATION_EX, partitionsSize,
        &junk,                         
        (LPOVERLAPPED)NULL);
    CloseHandle(hDevice);
    return (bResult);
}

void enum_Partitions()
{
    for (int i = 0;; i++)
    { 
        WCHAR volume[MAX_PATH];
        wsprintf(volume, L"\\\\.\\PhysicalDrive%d", i);
        HANDLE h = CreateFile(volume, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
        bool success = h != INVALID_HANDLE_VALUE;
        if (!success)
            break;
        wcout << endl << endl << endl << L"Disk #" << i << endl;

        PDRIVE_LAYOUT_INFORMATION_EX partitions_style; // disk drive geometry structure
        BOOL bResult = FALSE;             // generic results flag
        bResult = Get_Partition_Styles(volume, partitions_style);
        if (!bResult)
        {
            wcout << L"Partition Style: " << partitions_style->PartitionStyle << endl;
        }
        else
        {
            wcout << L"Get_Partition_Styles failed. Error: " << GetLastError() << endl;
        }
        CloseHandle(h);
    }

    free(partitions_style);
}

int main(int argc, char* argv[])
{
    enum_Partitions();
    bool success_nh;
    cin >> success_nh;
    return 0;
}