使用IOCTL_MOUNTMGR_QUERY_POINTS

我无法知道如何使用IOCTL_MOUNTMGR_QUERY_POINTS。

我search了互联网,并find一些示例代码来尝试。

但我不确定是否正确….

可以请让我知道如何使用IOCTL_MOUNTMGR_QUERY_POINTS获取驱动器号

感谢您的时间

下面是我的源代码

HANDLE hUsbDevice = CreateFile( pDetData->DevicePath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); UCHAR Bytes[10000]; PMOUNTMGR_MOUNT_POINTS pMntPoints = (PMOUNTMGR_MOUNT_POINTS) Bytes; MOUNTMGR_MOUNT_POINT mntPoint, *pmnt; DWORD bytesReturned; if (hUsbDevice == INVALID_HANDLE_VALUE) { qDebug()<<"CreateFile failed with error: %d\n"<<GetLastError(); } else { qDebug ()<<"VALID DEVICE"; BOOL status = DeviceIoControl( hUsbDevice, IOCTL_MOUNTMGR_QUERY_POINTS, &mntPoint, sizeof(MOUNTMGR_MOUNT_POINT), pMntPoints, 10000, &bytesReturned, NULL); wprintf(L"\tBOOL VALUE : %d\n", status); qDebug ()<<pMntPoints->MountPoints; } 

好! 这里是一个代码示例,但是没有任何错误控制来缩短它:

 #include <windows.h> #include <C:\WinDDK\7600.16385.1\inc\ddk\mountmgr.h> #include <tchar.h> #include <stdio.h> #pragma comment(lib, "Crypt32.lib") int main() { TCHAR chDrive = 'N', szUniqueId[128]; TCHAR szDeviceName[7] = _T("\\\\.\\"); 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 (MOUNTMGR_DOS_DEVICE_NAME, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hMountMgr == INVALID_HANDLE_VALUE) return 1; cbBytesReturned = GetLogicalDriveStrings (0, NULL); pszLogicalDrives = (LPTSTR) LocalAlloc (LMEM_ZEROINIT, cbBytesReturned*sizeof(TCHAR)); cbBytesReturned = GetLogicalDriveStrings (cbBytesReturned, pszLogicalDrives); for (pszDriveRoot = pszLogicalDrives; *pszDriveRoot != TEXT('\0'); pszDriveRoot += lstrlen(pszDriveRoot) + 1) { szDeviceName[4] = pszDriveRoot[0]; szDeviceName[5] = _T(':'); szDeviceName[6] = _T('\0'); //lstrcpy (&szDeviceName[4], TEXT("\\??\\USBSTOR\\DISK&VEN_SANDISK&PROD_CRUZER&REV_8.01\\1740030578903736&0")); hDevice = CreateFile (szDeviceName, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hDevice == INVALID_HANDLE_VALUE) return 1; 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(WCHAR), pMountDevName->Name); bSuccess = 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); if (bSuccess) { ULONG i; PMOUNTMGR_MOUNT_POINTS pMountPoints = (PMOUNTMGR_MOUNT_POINTS) pbyOutBuffer; for (i=0; i<pMountPoints->NumberOfMountPoints; i++) { _tprintf (TEXT("#%i:\n"), i); _tprintf (TEXT(" Device=%.*ls\n"), pMountPoints->MountPoints[i].DeviceNameLength/sizeof(WCHAR), pbyOutBuffer + pMountPoints->MountPoints[i].DeviceNameOffset); _tprintf (TEXT(" SymbolicLink=%.*ls\n"), pMountPoints->MountPoints[i].SymbolicLinkNameLength/sizeof(WCHAR), pbyOutBuffer + pMountPoints->MountPoints[i].SymbolicLinkNameOffset); ccb = sizeof(szUniqueId)/sizeof(szUniqueId[0]); if (CryptBinaryToString (pbyOutBuffer + pMountPoints->MountPoints[i].UniqueIdOffset, pMountPoints->MountPoints[i].UniqueIdLength, CRYPT_STRING_BASE64, szUniqueId, &ccb)) _tprintf (TEXT(" UniqueId=%s\n"), szUniqueId); else _tprintf (TEXT(" UniqueId=%.*ls\n"), pMountPoints->MountPoints[i].UniqueIdLength/sizeof(WCHAR), pbyOutBuffer + pMountPoints->MountPoints[i].UniqueIdOffset); } } pbyInBuffer = (PBYTE) LocalFree (pbyInBuffer); pbyOutBuffer = (PBYTE) LocalFree (pbyOutBuffer); } pszLogicalDrives = (LPTSTR) LocalFree (pszLogicalDrives); bSuccess = CloseHandle (hMountMgr); return 0; } 

如果在我的电脑上产生像这样的输出

 \Device\HarddiskVolume3 #0: Device=\Device\HarddiskVolume3 SymbolicLink=\DosDevices\C: UniqueId=O5TWlQAAwBRIAAAA #1: Device=\Device\HarddiskVolume3 SymbolicLink=\??\Volume{12703dc4-bf56-11db-8c6c-806e6f6e6963} UniqueId=O5TWlQAAwBRIAAAA 

 \Device\CdRom2 #0: Device=\Device\CdRom2 SymbolicLink=\DosDevices\L: UniqueId=\??\USBSTOR#CdRom&Ven_HL-DT-ST&Prod_DVDRAM_GE20LU11&Rev_CL01#0010101640008B615&0#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b} #1: Device=\Device\CdRom2 SymbolicLink=\??\Volume{2c5f6a93-2b50-11df-aa6a-005056c00008} UniqueId=\??\USBSTOR#CdRom&Ven_HL-DT-ST&Prod_DVDRAM_GE20LU11&Rev_CL01#0010101640008B615&0#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b} \Device\HarddiskVolume8 #0: Device=\Device\HarddiskVolume8 SymbolicLink=\DosDevices\N: UniqueId=_??_USBSTOR#Disk&Ven_SanDisk&Prod_Cruzer&Rev_8.01#1740030578903736&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} #1: Device=\Device\HarddiskVolume8 SymbolicLink=\??\Volume{ae08a3c8-71cf-11de-bc1d-005056c00008} UniqueId=_??_USBSTOR#Disk&Ven_SanDisk&Prod_Cruzer&Rev_8.01#1740030578903736&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}