我需要确定两个dos设备是相同的。
例如
\Device\Harddisk0\Partition1
\Device\HarddiskVolume2
如何解决?
最终目标是从Dos设备名称中获取卷名称。
但这是不可能的,所以我尝试通过FindFirstVolume比较它。
(更详细)
我需要从Dos设备名称中找到卷名称。
例如\ Device \ Harddisk0 \ Partition1到\?\ Volume {316eddba-0000-0000-0000-100000000000}。
QueryDosDevice函数可以从卷名获取Dos设备名。但是相反的是不能。
所以,我试图做到这一点。
现在,步骤2是问题所在。
终于,我通过下面得到了想要的结果!
谢谢大家
#include <stdio.h>
#include <Windows.h>
#define MOUNTMGRCONTROLTYPE 0x0000006D// 'm'
#define MOUNTDEVCONTROLTYPE ((ULONG) 'M')
#define IOCTL_MOUNTMGR_QUERY_POINTS CTL_CODE(MOUNTMGRCONTROLTYPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_MOUNTDEV_QUERY_DEVICE_NAME CTL_CODE(MOUNTDEVCONTROLTYPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct _MOUNTDEV_NAME {
USHORT NameLength;
WCHAR Name[1];
} MOUNTDEV_NAME, *PMOUNTDEV_NAME;
typedef struct _MOUNTMGR_MOUNT_POINT {
ULONG SymbolicLinkNameOffset;
USHORT SymbolicLinkNameLength;
USHORT Reserved1;
ULONG UniqueIdOffset;
USHORT UniqueIdLength;
USHORT Reserved2;
ULONG DeviceNameOffset;
USHORT DeviceNameLength;
USHORT Reserved3;
} MOUNTMGR_MOUNT_POINT, *PMOUNTMGR_MOUNT_POINT;
typedef struct _MOUNTMGR_MOUNT_POINTS {
ULONG Size;
ULONG NumberOfMountPoints;
MOUNTMGR_MOUNT_POINT MountPoints[1];
} MOUNTMGR_MOUNT_POINTS, *PMOUNTMGR_MOUNT_POINTS;
#pragma comment(lib, "Crypt32.lib")
int main() {
HANDLE hDevice, hMountMgr;
BYTE byBuffer[1024];
PMOUNTDEV_NAME pMountDevName;
DWORD cbBytesReturned, dwInBuffer, dwOutBuffer, ccb;
PMOUNTMGR_MOUNT_POINT pMountPoint;
BOOL bSuccess;
PBYTE pbyInBuffer, pbyOutBuffer;
LPTSTR pszLogicalDrives, pszDriveRoot;
// MOUNTMGR_DOS_DEVICE_NAME is defined as L"\\\\.\\MountPointManager"
hMountMgr = CreateFile(_T("\\\\.\\MountPointManager"),
0, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);
if (hMountMgr == INVALID_HANDLE_VALUE)
return 1;
LPCTSTR DOS_SYM_LINK = _T("\\\\?\\GLOBALROOT\\Device\\Harddisk0\\Partition1");
//LPCTSTR DOS_SYM_LINK = _T("\\\\?\\GLOBALROOT\\Device\\HarddiskVolume1");
hDevice = CreateFile(DOS_SYM_LINK, 0,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);
bSuccess = DeviceIoControl(hDevice,
IOCTL_MOUNTDEV_QUERY_DEVICE_NAME,
NULL, 0,
(LPVOID) byBuffer, sizeof(byBuffer),
&cbBytesReturned,
(LPOVERLAPPED) NULL);
pMountDevName = (PMOUNTDEV_NAME) byBuffer;
_tprintf(TEXT("\n%.*ls\n"), pMountDevName->NameLength / sizeof(TCHAR), pMountDevName->Name);
CloseHandle(hDevice);
dwInBuffer = pMountDevName->NameLength + sizeof(MOUNTMGR_MOUNT_POINT);
pbyInBuffer = (PBYTE) LocalAlloc(LMEM_ZEROINIT, dwInBuffer);
pMountPoint = (PMOUNTMGR_MOUNT_POINT) pbyInBuffer;
pMountPoint->DeviceNameLength = pMountDevName->NameLength;
pMountPoint->DeviceNameOffset = sizeof(MOUNTMGR_MOUNT_POINT);
CopyMemory(pbyInBuffer + sizeof(MOUNTMGR_MOUNT_POINT), pMountDevName->Name, pMountDevName->NameLength);
dwOutBuffer = 1024 + sizeof(MOUNTMGR_MOUNT_POINTS);
pbyOutBuffer = (PBYTE) LocalAlloc(LMEM_ZEROINIT, dwOutBuffer);
bSuccess = DeviceIoControl(hMountMgr,
IOCTL_MOUNTMGR_QUERY_POINTS,
pbyInBuffer, dwInBuffer,
(LPVOID) pbyOutBuffer, dwOutBuffer,
&cbBytesReturned,
(LPOVERLAPPED) NULL);
PMOUNTMGR_MOUNT_POINTS mount_points = (PMOUNTMGR_MOUNT_POINTS) pbyOutBuffer;
printf("RESULT, %d: count = %d\n", bSuccess, mount_points->NumberOfMountPoints);
for (int i = 0; i < mount_points->NumberOfMountPoints; i++) {
auto item = mount_points->MountPoints[i];
_tprintf(TEXT(" mountpoints[%d]: device name = %.*ls\n"), i, item.DeviceNameLength / sizeof(TCHAR), (LPCTSTR)(pbyOutBuffer + item.DeviceNameOffset));
_tprintf(TEXT(" mountpoints[%d]: symbolic name = %.*ls\n"), i, item.SymbolicLinkNameLength/ sizeof(TCHAR), (LPCTSTR)(pbyOutBuffer + item.SymbolicLinkNameOffset));
}
return 0;
}
\Device\HarddiskVolume1
RESULT, 1: count = 1
mountpoints[0]: device name = \Device\HarddiskVolume1
mountpoints[0]: symbolic name = \??\Volume{0613c9d3-0000-0000-0000-100000000000}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句