Ticket #45: cdflop-avail-upd.diff

File cdflop-avail-upd.diff, 3.8 KB (added by Valery V. Sedletski, 8 years ago)

Enhanced floppy detection code

  • src/VBox/Main/src-server/HostImpl.cpp

     
    20982103            ComObjPtr<Medium> hostCDDriveObj;
    20992104            rc = hostCDDriveObj.createObject();
    21002105            if (SUCCEEDED(rc))
     2106            {
    21012107                rc = hostCDDriveObj->init(m->pParent, DeviceType_DVD, Bstr(driveName));
    2102             if (SUCCEEDED(rc))
    21032108                list.push_back(hostCDDriveObj);
     2109            }
    21042110        }
    21052111
    21062112#elif defined(RT_OS_SOLARIS)
     
    21852191        while (*p);
    21862192        delete[] hostDrives;
    21872193#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;
    21882203        ULONG num = 0, map = 0;
    21892204        wchar_t driveName[3] = { '?', ':', '\0' };
    21902205        DosQueryCurrentDisk(&num, &map);
    2191         for (int drv = 0; drv < 2; drv++)
     2206        for (int drv = 0; drv < 'z' - 'a' + 1; drv++)
    21922207        {
    21932208            driveName[0] = 'A' + drv;
    21942209
     2210            // skip if the drive is not in map
    21952211            if ((map & (drv + 1)) == 0)
    21962212                continue;
    21972213
     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
    21982260            ComObjPtr<Medium> hostFloppyDriveObj;
    21992261            rc = hostFloppyDriveObj.createObject();
    22002262            if (SUCCEEDED(rc))
     2263            {
    22012264                rc = hostFloppyDriveObj->init(m->pParent, DeviceType_Floppy, Bstr(driveName));
    2202             if (SUCCEEDED(rc))
    22032265                list.push_back(hostFloppyDriveObj);
     2266            }
    22042267        }
    22052268#elif defined(RT_OS_LINUX)
    22062269        if (RT_SUCCESS(m->hostDrives.updateFloppies()))