Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WiAPI C++获得当前物理驱动器号_C++_Winapi - Fatal编程技术网

WiAPI C++获得当前物理驱动器号

WiAPI C++获得当前物理驱动器号,c++,winapi,C++,Winapi,我有一个函数 DWORD GetPhysicalDriveSerialNumber(UINT nDriveNumber, CString& strSerialNumber) { DWORD dwResult = NO_ERROR; strSerialNumber.Empty(); // Format physical drive path (may be '\\.\PhysicalDrive0', '\\.\PhysicalDrive1' and so on).

我有一个函数

DWORD GetPhysicalDriveSerialNumber(UINT nDriveNumber, CString& strSerialNumber)
{
    DWORD dwResult = NO_ERROR;
    strSerialNumber.Empty();

    // Format physical drive path (may be '\\.\PhysicalDrive0', '\\.\PhysicalDrive1' and so on).
    CString strDrivePath;
    strDrivePath.Format(_T("\\\\.\\PhysicalDrive%u"), nDriveNumber);

    // call CreateFile to get a handle to physical drive
    HANDLE hDevice = ::CreateFile(strDrivePath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL, OPEN_EXISTING, 0, NULL);

    if (INVALID_HANDLE_VALUE == hDevice)
        return ::GetLastError();

    // set the input STORAGE_PROPERTY_QUERY data structure
    STORAGE_PROPERTY_QUERY storagePropertyQuery;
    ZeroMemory(&storagePropertyQuery, sizeof(STORAGE_PROPERTY_QUERY));
    storagePropertyQuery.PropertyId = StorageDeviceProperty;
    storagePropertyQuery.QueryType = PropertyStandardQuery;

    // get the necessary output buffer size
    STORAGE_DESCRIPTOR_HEADER storageDescriptorHeader = { 0 };
    DWORD dwBytesReturned = 0;
    if (!::DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY,
        &storagePropertyQuery, sizeof(STORAGE_PROPERTY_QUERY),
        &storageDescriptorHeader, sizeof(STORAGE_DESCRIPTOR_HEADER),
        &dwBytesReturned, NULL))
    {
        dwResult = ::GetLastError();
        ::CloseHandle(hDevice);
        return dwResult;
    }

    // allocate the necessary memory for the output buffer
    const DWORD dwOutBufferSize = storageDescriptorHeader.Size;
    BYTE* pOutBuffer = new BYTE[dwOutBufferSize];
    ZeroMemory(pOutBuffer, dwOutBufferSize);

    // get the storage device descriptor
    if (!::DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY,
        &storagePropertyQuery, sizeof(STORAGE_PROPERTY_QUERY),
        pOutBuffer, dwOutBufferSize,
        &dwBytesReturned, NULL))
    {
        dwResult = ::GetLastError();
        delete[]pOutBuffer;
        ::CloseHandle(hDevice);
        return dwResult;
    }

    // Now, the output buffer points to a STORAGE_DEVICE_DESCRIPTOR structure
    // followed by additional info like vendor ID, product ID, serial number, and so on.
    STORAGE_DEVICE_DESCRIPTOR* pDeviceDescriptor = (STORAGE_DEVICE_DESCRIPTOR*)pOutBuffer;
    const DWORD dwSerialNumberOffset = pDeviceDescriptor->SerialNumberOffset;
    if (dwSerialNumberOffset != 0)
    {
        // finally, get the serial number
        strSerialNumber = CString(pOutBuffer + dwSerialNumberOffset);
    }

    // perform cleanup and return
    delete[]pOutBuffer;
    ::CloseHandle(hDevice);
    return dwResult;
}
我想获取位于中的程序的当前驱动器号驱动器号 例如,对于我的系统: 如果我要在磁盘c上运行porgram,它必须返回0hdd 0 如果要在磁盘d或e上运行progrman,它必须返回1hdd 1 闪存驱动器2等。
我该怎么做

运行计算机管理应用程序,然后选择磁盘管理器。检查驱动器列表中的驱动器号是否符合您的要求。我有一个多引导系统,XP,XP X64和Win7。在Win 7中,驱动器在我运行操作系统时重新编号。引导过程、XP和XP X64将使用与BIOS驱动器号相对应的驱动器号,但Win 7有时会在引导并运行后对驱动器重新编号

我想知道您从代码中获得的物理驱动器号是否对应于驱动器的BIOS顺序或Windows顺序

如果安装在BIOS驱动器0(主分区0)以外的其他设备上,Win 7的默认行为是将其分区号更改为C,并从驱动器0(主分区0)中删除驱动器号。如果Win7是从XP X64或Win7的另一个实例安装的,那么它不会更改其分区号


到目前为止,我还不知道有什么方法可以防止Windows10在安装过程中将分区字母改为C。它不会从XP X64安装,尝试从Win7安装似乎默认为在Win7分区上进行升级安装。干净的安装允许您选择要安装的驱动器/分区,但它会将该分区的字母更改为C。如果多次启动,其他操作系统将看到未更改的分区字母。

这是一段相当多的代码。。。你能更具体地说明问题出在哪里吗?这将增加有人能够提供一个有用答案的机会,与此不同我添加了此代码只是为了让人们理解为什么我要在函数中发送驱动器号通过驱动器获取序列号我确实希望在函数调用之前执行GetPhysicalDriveSerialNumberDriveNumber GETED这样的操作,Str_to_save_hhd_serial_如果您的程序从类似于此\\servername\sharename的位置运行,该怎么办?