(From Marc Reinig) Look at the code that Devcon.exe (from the DDK) uses in Devcon.exe find =diskdrive This will give you the instance ID of the disks present on the system, in order of their disk number. 0, 1, 2, 3, … . So now you know what the disk number is for your device. Then, using the code below, loop through all possible 26 logical drives, using strings that look like “C:” for szDriveLetter. When you get an sdnDevNumber.DeviceNumber that matches the disk number you are looking for, you have found your drive letter, szDriveLetter: Code: char szDriveLetter [ 3 ]; char * pszDrive; STORAGE_DEVICE_NUMBER sdnDevNumber; BOOL fResult; fResult = GetBasicDiskDriveMapping ( szDriveLetter, &sdnDevNumber ); // sdnDevNumber.DeviceNumber will contain the drive number you want // sdnDevNumber.PartitionNumber will contain the partition for your reference BOOL GetBasicDiskDriveMapping ( LPCSTR pszDrive, STORAGE_DEVICE_NUMBER *psdn ) { BOOL fResult; char szDriveName [ 7 ]; HANDLE hDrive; DWORD dwBytesReturned; __try { lstrcpy ( szDriveName, "\\\\.\\" ); lstrcat ( szDriveName, pszDrive ); // Open the volume to which the drive letter refers and get // the physical drive on which the volume resides. hDrive = CreateFile ( szDriveName, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0 ); if ( INVALID_HANDLE_VALUE != hDrive ) fResult = DeviceIoControl ( hDrive, IOCTL_STORAGE_GET_DEVICE_NUMBER, 0, 0, psdn, sizeof (STORAGE_DEVICE_NUMBER), &dwBytesReturned, 0 ); else fResult = false; } __except ( EXCEPTION_EXECUTE_HANDLER ) { // if we get here, one of the arguments probably // points to not enough memory. SetLastError ( ERROR_INVALID_PARAMETER ); fResult = false; } CloseHandle ( hDrive ); return ( fResult ); }