Ticket #45: cdflop-avail-upd.diff
File cdflop-avail-upd.diff, 3.8 KB (added by , 8 years ago) |
---|
-
src/VBox/Main/src-server/HostImpl.cpp
2098 2103 ComObjPtr<Medium> hostCDDriveObj; 2099 2104 rc = hostCDDriveObj.createObject(); 2100 2105 if (SUCCEEDED(rc)) 2106 { 2101 2107 rc = hostCDDriveObj->init(m->pParent, DeviceType_DVD, Bstr(driveName)); 2102 if (SUCCEEDED(rc))2103 2108 list.push_back(hostCDDriveObj); 2109 } 2104 2110 } 2105 2111 2106 2112 #elif defined(RT_OS_SOLARIS) … … 2185 2191 while (*p); 2186 2192 delete[] hostDrives; 2187 2193 #elif defined(RT_OS_OS2) 2194 /* parameter packet */ 2195 #pragma pack(1) 2196 struct PARM { 2197 unsigned char command; 2198 unsigned char drive; 2199 } parm; 2200 #pragma pack() 2201 /* data packet */ 2202 BIOSPARAMETERBLOCK bpb; 2188 2203 ULONG num = 0, map = 0; 2189 2204 wchar_t driveName[3] = { '?', ':', '\0' }; 2190 2205 DosQueryCurrentDisk(&num, &map); 2191 for (int drv = 0; drv < 2; drv++)2206 for (int drv = 0; drv < 'z' - 'a' + 1; drv++) 2192 2207 { 2193 2208 driveName[0] = 'A' + drv; 2194 2209 2210 // skip if the drive is not in map 2195 2211 if ((map & (drv + 1)) == 0) 2196 2212 continue; 2197 2213 2214 parm.command = 0; 2215 parm.drive = drv; 2216 ULONG parmlen = sizeof(parm); 2217 ULONG datalen = sizeof(bpb); 2218 2219 // skip if we fail to get an BPB 2220 if ( (rc = DosDevIOCtl(-1, IOCTL_DISK, DSK_GETDEVICEPARAMS, 2221 &parm, parmlen, &parmlen, &bpb, datalen, &datalen)) ) 2222 continue; 2223 2224 char szDevName[4] = "A:"; 2225 char fsqbuf2[sizeof(FSQBUFFER2) + 3 * CCHMAXPATH]; 2226 PFSQBUFFER2 pfsqbuf2 = (PFSQBUFFER2)fsqbuf2; 2227 ULONG cbData; 2228 2229 switch (bpb.bDeviceType) 2230 { 2231 case 5: // Fixed disk 2232 case 6: // Tape drive 2233 case 8: // R/W optical disk 2234 continue; 2235 2236 case 7: // Other (includes 3.5" diskette drive) 2237 szDevName[0] += drv; 2238 cbData = sizeof(fsqbuf2); 2239 // disable error popups 2240 DosError(FERR_DISABLEEXCEPTION | FERR_DISABLEHARDERR); 2241 if (! DosQueryFSAttach(szDevName, 0L, FSAIL_QUERYNAME, (PFSQBUFFER2)&fsqbuf2, &cbData) ) 2242 { 2243 if (pfsqbuf2->iType == FSAT_REMOTEDRV) 2244 continue; // skip remote drives 2245 else if (pfsqbuf2->iType == FSAT_LOCALDRV) 2246 { 2247 PSZ pszFSName = (PSZ)pfsqbuf2->szName + pfsqbuf2->cbName + 1; 2248 if (strcmp(pszFSName, "FAT") || bpb.usBytesPerSector != 512) // optical 2249 continue; // skip non-fat drives 2250 } 2251 } 2252 // enable error popups 2253 DosError(FERR_ENABLEEXCEPTION | FERR_ENABLEHARDERR); 2254 break; 2255 2256 default: 2257 break; 2258 } 2259 2198 2260 ComObjPtr<Medium> hostFloppyDriveObj; 2199 2261 rc = hostFloppyDriveObj.createObject(); 2200 2262 if (SUCCEEDED(rc)) 2263 { 2201 2264 rc = hostFloppyDriveObj->init(m->pParent, DeviceType_Floppy, Bstr(driveName)); 2202 if (SUCCEEDED(rc))2203 2265 list.push_back(hostFloppyDriveObj); 2266 } 2204 2267 } 2205 2268 #elif defined(RT_OS_LINUX) 2206 2269 if (RT_SUCCESS(m->hostDrives.updateFloppies()))