/* Find CD/DVD disk drive. Binary safe, Unicode aware. input: filename - filename to check return: '\0' - on error (drive not found) 'A'..'Z' - drive letter example of usage: DriveChar = FindDiskDrive(TEXT("Folder1\\Folder2\\FileName.ext")); */ TCHAR FindDiskDrive(TCHAR *filename) { TCHAR path[MAX_PATH], result; DWORD pem, drv; // by default - drive not found result = 0; // sanity check if (filename && *filename) { // surpass system Retry/Abort/Ignore dialog // for GetFileAttributes() on not ready drives pem = SetErrorMode(SEM_FAILCRITICALERRORS); // drive path // note that using lstrcpy() with lstrcat() // instead adds another function to the import // and static data with this string // not to mention lstrcat() is not binary safe // so you can't handle MAX_PATH overflow path[0] = TEXT('A'); path[1] = TEXT(':'); path[2] = TEXT('\\'); // add file path lstrcpyn(&path[3], filename, MAX_PATH - 3); // for each of logical drives drv = GetLogicalDrives(); while (drv) { // drive exists if (drv & 1) { // cut path to drive path[3] = 0; // drop bit of drive if not a CD/DVD-ROM drv ^= (GetDriveType(path) == DRIVE_CDROM) ? 0 : 1; // restore full path for GetFileAttributes() path[3] = filename[0]; // drive is a CD/DVD-ROM and file exists if ((drv & 1) && (GetFileAttributes(path) != INVALID_FILE_ATTRIBUTES)) { result = path[0]; break; } } // next drive path[0]++; drv >>= 1; } // restore system defaults SetErrorMode(pem); } return(result); }
2015.09.04