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);
}