/**************************************************************************** * * FUNCTION: ReInitUSB_Disk_Letter() * * PURPOSE: get the usb disks, and filling the 'szMoveDiskName' with them * ****************************************************************************/ void ReInitUSB_Disk_Letter(char * szMoveDiskName) { int k = 0; DWORD MaxDriveSet, CurDriveSet; DWORD drive, drivetype; TCHAR szBuf[300]; HANDLE hDevice; PSTORAGE_DEVICE_DESCRIPTOR pDevDesc; for(k=0; k<26; k++) szMoveDiskName[k] = '\0'; k = 0; // Get available drives we can monitor MaxDriveSet = CurDriveSet = 0; MaxDriveSet = GetLogicalDrives(); CurDriveSet = MaxDriveSet; char szDrvName[33]; for ( drive = 0; drive < 32; ++drive ) { if ( MaxDriveSet & (1 << drive) ) { DWORD temp = 1<<drive; _stprintf( szDrvName, _T("%c:\\"), 'A'+drive ); switch ( GetDriveType( szDrvName ) ) { case 0: // The drive type cannot be determined. case 1: // The root directory does not exist. drivetype = DRVUNKNOWN; break; case DRIVE_REMOVABLE: // The drive can be removed from the drive. drivetype = DRVREMOVE; szMoveDiskName[k] = chFirstDriveFromMask(temp); k++; break; case DRIVE_CDROM: // The drive is a CD-ROM drive. break; case DRIVE_FIXED: // The disk cannot be removed from the drive. drivetype = DRVFIXED; sprintf(szBuf, "\\\\?\\%c:", 'A'+drive); hDevice = CreateFile(szBuf, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL); if (hDevice != INVALID_HANDLE_VALUE) { pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)new BYTE[sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1]; pDevDesc->Size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1; if(GetDisksProperty(hDevice, pDevDesc)) { if(pDevDesc->BusType == CP_BusTypeUsb) { szMoveDiskName[k] = chFirstDriveFromMask(temp); k++; } } delete pDevDesc; CloseHandle(hDevice); } break; case DRIVE_REMOTE: // The drive is a remote (network) drive. drivetype = DRVREMOTE; szMoveDiskName[k] = chFirstDriveFromMask(temp); k++; break; case DRIVE_RAMDISK: // The drive is a RAM disk. drivetype = DRVRAM; break; } } } }
bool checkDriveType(char *name, ULONG *pid) { HANDLE hDevice; PSTORAGE_DEVICE_DESCRIPTOR pDevDesc; DEVICE_NUMBER deviceInfo; bool retVal = false; char *nameWithSlash; char *nameNoSlash; int driveType; DWORD cbBytesReturned; // some calls require no tailing slash, some require a trailing slash... if ( !(slashify(name, &nameWithSlash, &nameNoSlash)) ) { return(retVal); } driveType = GetDriveType(nameWithSlash); switch( driveType ) { case DRIVE_REMOVABLE: // The media can be removed from the drive. case DRIVE_FIXED: // The media cannot be removed from the drive. hDevice = CreateFile(nameNoSlash, FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hDevice == INVALID_HANDLE_VALUE) { //printf("error - not able to get handle on device"); //setbuf(stdout, NULL); } else { int arrSz = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1; pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)new BYTE[arrSz]; pDevDesc->Size = arrSz; // get the device number if the drive is // removable or (fixed AND on the usb bus, SD, or MMC (undefined in XP/mingw)) if(GetDisksProperty(hDevice, pDevDesc, &deviceInfo) && ( ((driveType == DRIVE_REMOVABLE) && (pDevDesc->BusType != BusTypeSata)) || ( (driveType == DRIVE_FIXED) && ((pDevDesc->BusType == BusTypeUsb) || (pDevDesc->BusType == /*BusTypeSd*/0xC ) || (pDevDesc->BusType == /*BusTypeMmc*/0xD )) ) ) ) { // ensure that the drive is actually accessible // multi-card hubs were reporting "removable" even when empty if(DeviceIoControl(hDevice, IOCTL_STORAGE_CHECK_VERIFY2, NULL, 0, NULL, 0, &cbBytesReturned, (LPOVERLAPPED) NULL)) { *pid = deviceInfo.DeviceNumber; retVal = true; } else // IOCTL_STORAGE_CHECK_VERIFY2 fails on some devices under XP/Vista, try the other (slower) method, just in case. { CloseHandle(hDevice); hDevice = CreateFile(nameNoSlash, FILE_READ_DATA, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if(DeviceIoControl(hDevice, IOCTL_STORAGE_CHECK_VERIFY, NULL, 0, NULL, 0, &cbBytesReturned, (LPOVERLAPPED) NULL)) { *pid = deviceInfo.DeviceNumber; retVal = true; } } } delete[] pDevDesc; CloseHandle(hDevice); } break; default: retVal = false; } // free the strings allocated by slashify free(nameWithSlash); free(nameNoSlash); return(retVal); }