1. 程式人生 > >遍歷所有盤符和對應的設備

遍歷所有盤符和對應的設備

all water root -o ado idl num poi tst

mountmgr.h下載
https://github.com/haidragon/wrk-v1.2/tree/master/public/sdk/inc/mountmgr.h

#include "stdafx.h"
#include <windows.h>
#include "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;

        _tprintf(TEXT("szDeviceName %s\n"), szDeviceName);
        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;
}

技術分享圖片技術分享圖片

遍歷所有盤符和對應的設備