views:

142

answers:

1

Dear all,

I am not able to know how to use the IOCTL_MOUNTMGR_QUERY_POINTS .

I have searched the internet and found some sample code to try with.

but i am not sure whether its correct or not....

can you please let me know how to use the IOCTL_MOUNTMGR_QUERY_POINTS to get the drive letter

Thank you for your time

below is my source coode

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;
}
+2  A: 

OK! Here is a code example, but written without any error control to make it shorter:

#include <windows.h>
#include <C:\WinDDK\7600.16385.1\inc\ddk\mountmgr.h>
#include <tchar.h>
#include <stdio.h>

int main()
{
    TCHAR chDrive = 'N';
    TCHAR szDeviceName[7] = _T("\\\\.\\");
    HANDLE hDevice, hMountMgr; 
    BYTE byBuffer[1024];
    PMOUNTDEV_NAME pMountDevName;
    DWORD cbBytesReturned, dwInBuffer, dwOutBuffer;
    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');

        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++) {
                printf ("#%i:\n", i);
                printf ("    Device=%.*ls\n",
                        pMountPoints->MountPoints[i].DeviceNameLength/sizeof(WCHAR),
                        pbyOutBuffer + pMountPoints->MountPoints[i].DeviceNameOffset);
                printf ("    SymbolicLink=%.*ls\n",
                        pMountPoints->MountPoints[i].SymbolicLinkNameLength/sizeof(WCHAR),
                        pbyOutBuffer + pMountPoints->MountPoints[i].SymbolicLinkNameOffset);
                printf ("    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;
}

if produce on my computer the output like

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

...

\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}
Oleg
Sorry, but your question was how to use `IOCTL_MOUNTMGR_QUERY_POINTS`. Your original code was wrong. First of all you should use L"\\\\.\\MountPointManager" as a device name and not hUsbDevice. Second you should fill input buffer `MOUNTMGR_MOUNT_POINT` with a special way which I showed you in the example. But now you asked me the same question which is already answered in http://stackoverflow.com/questions/2995957/how-to-map-drive-letter-to-devicepath! If you do not understand how to get the drive letter for DevicePath of a USB stick I can explain it you, but it is quite another question.
Oleg
@Oleg : reallydo not understand how to get the drive letter for DevicePath of a USB stick .can you pls explain it to me
barbgal
OK! I will write a small test program. What is you original requirement? Do you want enumerate all USB devices (or other bus like firewire) or Removable devices or Storage devices or devices which has a Volume mounted and show drive letter and storage device name or it's parent USB device name (which can be removed)? Or you have another starting point and want display another information?
Oleg
Thanks for your reply..i want to get the vid,pid and drive letter for all the usb mass storage devices plugged in the system. also if new usb mass storage device is plugged or removed from the system i need to get the vid,pid and drive letter
barbgal
I wrote a program which do what you want, but I am not sure where I should post it. All questions has the name which is not corresponds my answer and it will makes difficult for other reader to read it. So probably the best way if you open one more question and ask how to get to all drive letters on a computer information about VendorId, ProductId, Hardware ID and whether the drive is removable. My program will display a little more additional information, but it is not important. I will post a full source code which do this. To compile this code you will need Windows DDK headers and libs.
Oleg