Использование IOCTL_MOUNTMGR_QUERY_POINTS - PullRequest
0 голосов
/ 10 июня 2010

Я не могу знать, как использовать IOCTL_MOUNTMGR_QUERY_POINTS.

Я искал в Интернете и нашел пример кода, чтобы попробовать.

но я не уверен, правильно ли это или нет ....

Подскажите, пожалуйста, как использовать 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;
}

1 Ответ

3 голосов
/ 11 июня 2010

OK! Вот пример кода, но написанный без контроля ошибок, чтобы сделать его короче:

#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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...