如何确定两个DOS设备是否相等?

用户名

我需要确定两个dos设备是相同的。

例如

\Device\Harddisk0\Partition1
\Device\HarddiskVolume2

如何解决?

最终目标是从Dos设备名称中获取卷名称。

但这是不可能的,所以我尝试通过FindFirstVolume比较它。


(更详细)

我需要从Dos设备名称中找到卷名称。

例如\ Device \ Harddisk0 \ Partition1到\?\ Volume {316eddba-0000-0000-0000-100000000000}。

QueryDosDevice函数可以从卷名获取Dos设备名。但是相反的是不能。

所以,我试图做到这一点。

  1. 通过FindFirstVolume枚举所有卷。
  2. 通过QueryDosDevice从卷名称中找到每个Dos设备名称。
  3. 通过将找到的Dos设备名称与输入的Dos设备名称进行比较,找到所需的卷名称(2)。

现在,步骤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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章