Winapi 确定可移动磁盘的驱动器号(dos名称)

Winapi 确定可移动磁盘的驱动器号(dos名称),winapi,c++14,Winapi,C++14,我有一个卷路径\\?\USBSTOR\Disk&venu SanDisk&Prod\u Ultra\u Fit&revu 1.00\4C530000260829120162&0{53f56307-b6bf-11d0-94f2-00a0c91efb8b},我想确定路径的dos位置(c:/d:/…)。 我从以下位置获取路径: PDEV_BROADCAST_DEVICEINTERFACE lpdbv = (PDEV_BROADCAST_DEVICEINTERFACE)lpdb; lpdbv->d

我有一个卷路径
\\?\USBSTOR\Disk&venu SanDisk&Prod\u Ultra\u Fit&revu 1.00\4C530000260829120162&0{53f56307-b6bf-11d0-94f2-00a0c91efb8b}
,我想确定路径的dos位置(c:/d:/…)。 我从以下位置获取路径:

PDEV_BROADCAST_DEVICEINTERFACE lpdbv = (PDEV_BROADCAST_DEVICEINTERFACE)lpdb;
lpdbv->dbcc_name <---path
是否需要帮助?

为此,您需要

(1)在设备上打开文件

(2)通过

此ioctl没有输入缓冲区和返回

mount manager客户端返回类型为的可变长度结构 ,在Mountmgr.h中定义

如果输出缓冲区太小,无法容纳设备名称,则装载 manager客户端必须将信息字段设置为
sizeof(MOUNTDEV\u NAME)
状态字段
状态\u缓冲区\u溢出
。此外,mount manager客户端将填写
MOUNTDEV\u NAME
结构

STATUS\u BUFFER\u OVERFLOW
已转换为
ERROR\u MORE\u DATA
win32 ERROR。如果
DeviceIoControl
返回此错误,我们可以获得所需的缓冲区大小

FIELD_OFFSET(MOUNTDEV_NAME, Name) + pmdn->NameLength;
(3)使用
IOCTL\u MOUNTMGR\u query\u DOS\u VOLUME\u路径查询装载管理器设备

此ioct将我们在步骤2获得的
MOUNTDEV\u NAME
作为输入,并返回
MOUNTMGR\u VOLUME\u路径
(在MOUNTMGR.h中阅读此内容)

那么最后的代码呢

#include <mountmgr.h>

inline ULONG BOOL_TO_ERROR(BOOL f)
{
    return f ? NOERROR : GetLastError();
}

ULONG GetDosVolumePath(PCWSTR InterfaceLink, PWSTR* ppszDosPath)
{
    *ppszDosPath = 0;

    HANDLE hFile = CreateFileW(InterfaceLink, 0, FILE_SHARE_VALID_FLAGS, 0, OPEN_EXISTING, 0, 0);

    if (hFile == INVALID_HANDLE_VALUE) return GetLastError();

    union {
        PVOID buf;
        PMOUNTDEV_NAME pmdn;
    };

    ULONG dwError;

    PVOID stack = alloca(guz);
    ULONG cb = 0, rcb = sizeof(MOUNTDEV_NAME) + 0x10, InputBufferLength;

    do 
    {
        if (cb < rcb)
        {
            cb = RtlPointerToOffset(buf = alloca(rcb - cb), stack);
        }

        dwError = BOOL_TO_ERROR(DeviceIoControl(hFile, IOCTL_MOUNTDEV_QUERY_DEVICE_NAME, 0, 0, pmdn, cb, &rcb, 0));

        rcb = FIELD_OFFSET(MOUNTDEV_NAME, Name) + pmdn->NameLength;

    } while ( dwError == ERROR_MORE_DATA);

    CloseHandle(hFile);

    if (dwError == NOERROR)
    {
        hFile = CreateFileW(MOUNTMGR_DOS_DEVICE_NAME, 0, 0, 0, OPEN_EXISTING, 0, 0);

        if (hFile != INVALID_HANDLE_VALUE)
        {
            union {
                PVOID pv;
                PMOUNTMGR_VOLUME_PATHS pmvp;
            };

            InputBufferLength = rcb, cb = 0, rcb = sizeof(MOUNTMGR_VOLUME_PATHS) + 0x4;

            do 
            {
                if (cb < rcb)
                {
                    cb = RtlPointerToOffset(pv = alloca(rcb - cb), pmdn);
                }

                dwError = BOOL_TO_ERROR(DeviceIoControl(hFile, 
                    IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATH, 
                    pmdn, InputBufferLength, pmvp, cb, &rcb, 0));

                if (dwError == NOERROR)
                {
                    *ppszDosPath = _wcsdup(pmvp->MultiSz);
                }

                rcb = FIELD_OFFSET(MOUNTMGR_VOLUME_PATHS, MultiSz) + pmvp->MultiSzLength;

            } while (dwError == ERROR_MORE_DATA);

            CloseHandle(hFile);
        }
    }

    return dwError;
}

    PWSTR pszDosPath;
    if (GetDosVolumePath(L"\\\\?\\USBSTOR#Disk&Ven_SanDisk&Prod_Ultra_Fit&Rev_1.00#4C530000260829120162&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}", &pszDosPath) == NOERROR)
    {
        DbgPrint("%S\n", pszDosPath);
        free(pszDosPath);
    }
#包括
内联ULONG布尔值到布尔值错误(布尔值f)
{
返回f?无错误:GetLastError();
}
ULONG GetDosVolumePath(PCWSTR接口链路、PWSTR*ppszDosPath)
{
*ppszDosPath=0;
HANDLE hFile=CreateFileW(接口链接,0,文件共享,有效标志,0,打开,0,0);
如果(hFile==无效的_句柄_值)返回GetLastError();
联合{
pvoidbuf;
PMOUNTDEV_名称pmdn;
};
乌隆误差;
PVOID stack=alloca(guz);
ULONG cb=0,rcb=sizeof(MOUNTDEV_NAME)+0x10,InputBufferLength;
做
{
如果(cbNameLength;
}while(dwError==ERROR\u MORE\u DATA);
闭合手柄(hFile);
if(dwError==NOERROR)
{
hFile=CreateFileW(MOUNTMGR\u DOS\u DEVICE\u NAME,0,0,OPEN\u EXISTING,0,0);
if(hFile!=无效的句柄值)
{
联合{
pvoidpv;
PMOUNTMGR\u VOLUME\u路径pmvp;
};
InputBufferLength=rcb,cb=0,rcb=sizeof(MOUNTMGR\u VOLUME\u路径)+0x4;
做
{
如果(cbMultiSz);
}
rcb=字段偏移量(MOUNTMGR\u卷路径,MultiSz)+pmvp->MultiSzLength;
}while(dwError==ERROR\u MORE\u DATA);
闭合手柄(hFile);
}
}
返回dwError;
}
PWSTR-pszDosPath;
如果(GetDosVolumePath(L“\\\?\\USBSTOR#Disk&venu SanDisk&Prod#u Ultra#Fit&Rev#u 1.00#4C530000260829120162&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b},&PSZDOPATH)=无错误)
{
DbgPrint(“%S\n”,pszdopath);
免费(pszDosPath);
}

这个问题解决了吗?
#include <mountmgr.h>

inline ULONG BOOL_TO_ERROR(BOOL f)
{
    return f ? NOERROR : GetLastError();
}

ULONG GetDosVolumePath(PCWSTR InterfaceLink, PWSTR* ppszDosPath)
{
    *ppszDosPath = 0;

    HANDLE hFile = CreateFileW(InterfaceLink, 0, FILE_SHARE_VALID_FLAGS, 0, OPEN_EXISTING, 0, 0);

    if (hFile == INVALID_HANDLE_VALUE) return GetLastError();

    union {
        PVOID buf;
        PMOUNTDEV_NAME pmdn;
    };

    ULONG dwError;

    PVOID stack = alloca(guz);
    ULONG cb = 0, rcb = sizeof(MOUNTDEV_NAME) + 0x10, InputBufferLength;

    do 
    {
        if (cb < rcb)
        {
            cb = RtlPointerToOffset(buf = alloca(rcb - cb), stack);
        }

        dwError = BOOL_TO_ERROR(DeviceIoControl(hFile, IOCTL_MOUNTDEV_QUERY_DEVICE_NAME, 0, 0, pmdn, cb, &rcb, 0));

        rcb = FIELD_OFFSET(MOUNTDEV_NAME, Name) + pmdn->NameLength;

    } while ( dwError == ERROR_MORE_DATA);

    CloseHandle(hFile);

    if (dwError == NOERROR)
    {
        hFile = CreateFileW(MOUNTMGR_DOS_DEVICE_NAME, 0, 0, 0, OPEN_EXISTING, 0, 0);

        if (hFile != INVALID_HANDLE_VALUE)
        {
            union {
                PVOID pv;
                PMOUNTMGR_VOLUME_PATHS pmvp;
            };

            InputBufferLength = rcb, cb = 0, rcb = sizeof(MOUNTMGR_VOLUME_PATHS) + 0x4;

            do 
            {
                if (cb < rcb)
                {
                    cb = RtlPointerToOffset(pv = alloca(rcb - cb), pmdn);
                }

                dwError = BOOL_TO_ERROR(DeviceIoControl(hFile, 
                    IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATH, 
                    pmdn, InputBufferLength, pmvp, cb, &rcb, 0));

                if (dwError == NOERROR)
                {
                    *ppszDosPath = _wcsdup(pmvp->MultiSz);
                }

                rcb = FIELD_OFFSET(MOUNTMGR_VOLUME_PATHS, MultiSz) + pmvp->MultiSzLength;

            } while (dwError == ERROR_MORE_DATA);

            CloseHandle(hFile);
        }
    }

    return dwError;
}

    PWSTR pszDosPath;
    if (GetDosVolumePath(L"\\\\?\\USBSTOR#Disk&Ven_SanDisk&Prod_Ultra_Fit&Rev_1.00#4C530000260829120162&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}", &pszDosPath) == NOERROR)
    {
        DbgPrint("%S\n", pszDosPath);
        free(pszDosPath);
    }