#include #include #include typedef struct _MOUNTMGR_MOUNT_POINT { ULONG SymbolicLinkNameOffset; USHORT SymbolicLinkNameLength; ULONG UniqueIdOffset; USHORT UniqueIdLength; ULONG DeviceNameOffset; USHORT DeviceNameLength; } 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; VOID PrintHex(PBYTE Data, ULONG dwBytes) { for (ULONG i = 0; i < dwBytes; i += 16) { printf("%.8x: ", i); for (ULONG j = 0; j < 16; j++) { if (i + j < dwBytes) { printf("%.2x ", Data[i + j]); } else { printf("?? "); } } for (ULONG j = 0; j < 16; j++) { if (i + j < dwBytes && Data[i + j] >= 0x20 && Data[i + j] <= 0x7e) { printf("%c", Data[i + j]); } else { printf("."); } } printf("\n"); } } int main() { // Open mount point manager. HANDLE hMntPointMgr = CreateFile(L"\\\\.\\MountPointManager", 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hMntPointMgr == INVALID_HANDLE_VALUE) { printf("CreateFile failed, %d\n", GetLastError()); return 1; } // Request data, assuming it fits into the 4096-byte buffer. MOUNTMGR_MOUNT_POINT mnt_point; RtlZeroMemory(&mnt_point, sizeof(mnt_point)); BYTE OutputBuffer[4096]; DWORD BytesReturned; if (!DeviceIoControl(hMntPointMgr, 0x6D0008, &mnt_point, sizeof(mnt_point), OutputBuffer, sizeof(OutputBuffer), &BytesReturned, NULL)) { printf("DeviceIoControl failed, %d\n", GetLastError()); CloseHandle(hMntPointMgr); return 1; } PrintHex(OutputBuffer, BytesReturned); CloseHandle(hMntPointMgr); return 0; }