Changeset 6978 for trunk/src


Ignore:
Timestamp:
Oct 10, 2001, 1:01:17 PM (24 years ago)
Author:
phaller
Message:

added further IOCTL_STORAGE and IOCTL_CDROM calls

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/hmdisk.cpp

    r6977 r6978  
    1 /* $Id: hmdisk.cpp,v 1.13 2001-10-10 10:21:31 phaller Exp $ */
     1/* $Id: hmdisk.cpp,v 1.14 2001-10-10 11:01:17 phaller Exp $ */
    22
    33/*
     
    177177//******************************************************************************
    178178//******************************************************************************
     179
     180// this helper function just calls the specified
     181// ioctl function for the CDROM manager with no
     182// parameter packet other than the CD01 signature
     183// and no data packet.
     184static BOOL ioctlCDROMSimple(PHMHANDLEDATA pHMHandleData,
     185                             DWORD dwCategory,
     186                             DWORD dwFunction,
     187                             LPDWORD lpBytesReturned)
     188{
     189  DWORD dwParameterSize = 4;
     190  DWORD dwDataSize      = 0;
     191  DWORD ret;
     192
     193  if(lpBytesReturned)
     194    *lpBytesReturned = 0;
     195
     196  ret = OSLibDosDevIOCtl(pHMHandleData->hHMHandle,
     197                         dwCategory,
     198                         dwFunction,
     199                         "CD01",
     200                         4,
     201                         &dwParameterSize,
     202                         NULL,
     203                         0,
     204                         &dwDataSize);
     205  if(ret)
     206  {
     207    SetLastError(error2WinError(ret));
     208    return FALSE;
     209  }
     210  SetLastError(ERROR_SUCCESS);
     211  return TRUE;
     212}
     213
     214
     215// this helper function just calls the specified
     216// ioctl function for the DISK manager with the
     217// specified function codes
     218static BOOL ioctlDISKUnlockEject(PHMHANDLEDATA pHMHandleData,
     219                                 DWORD dwCommand,
     220                                 DWORD dwDiskHandle,
     221                                 LPDWORD lpBytesReturned)
     222{
     223#pragma pack(1)
     224  struct
     225  {
     226    BYTE ucCommand;
     227    BYTE ucHandle;
     228  } ParameterBlock;
     229#pragma pack()
     230 
     231  DWORD dwParameterSize = sizeof( ParameterBlock );
     232  DWORD dwDataSize      = 0;
     233  DWORD ret;
     234 
     235  ParameterBlock.ucCommand = dwCommand;
     236  ParameterBlock.ucHandle  = dwDiskHandle;
     237 
     238  if(lpBytesReturned)
     239    *lpBytesReturned = 0;
     240
     241  ret = OSLibDosDevIOCtl(pHMHandleData->hHMHandle,
     242                         0x08,       // IOCTL_DISK
     243                         0x40,       // DSK_UNLOCKEJECTMEDIA
     244                         &ParameterBlock,
     245                         sizeof( ParameterBlock ),
     246                         &dwParameterSize,
     247                         NULL,
     248                         0,
     249                         &dwDataSize);
     250  if(ret)
     251  {
     252    SetLastError(error2WinError(ret));
     253    return FALSE;
     254  }
     255  SetLastError(ERROR_SUCCESS);
     256  return TRUE;
     257}
     258
     259
     260
    179261BOOL HMDeviceDiskClass::DeviceIoControl(PHMHANDLEDATA pHMHandleData, DWORD dwIoControlCode,
    180262                             LPVOID lpInBuffer, DWORD nInBufferSize,
     
    442524    case IOCTL_SERIAL_LSRMST_INSERT:
    443525        break;
     526     
     527     
     528    // -----------
     529    // CDROM class
     530    // -----------
    444531
    445532    case IOCTL_CDROM_UNLOAD_DRIVER:
     
    448535    case IOCTL_CDROM_PLAY_AUDIO_MSF:
    449536    case IOCTL_CDROM_SEEK_AUDIO_MSF:
     537        break;
     538
     539    case IOCTL_CDROM_PAUSE_AUDIO:
     540      // NO BREAK CASE
     541      // Note: for OS/2, pause and stop seems to be the same!
     542     
    450543    case IOCTL_CDROM_STOP_AUDIO:
    451     case IOCTL_CDROM_PAUSE_AUDIO:
     544    {
     545      dprintf(("Stop / pause CDROM audio playback"));
     546      return ioctlCDROMSimple(pHMHandleData,
     547                              0x81,   // IOCTL_CDROMAUDIO
     548                              0x51,   // CDROMAUDIO_STOPAUDIO
     549                              lpBytesReturned);
     550    }
     551     
    452552    case IOCTL_CDROM_RESUME_AUDIO:
    453         break;
     553    {
     554      dprintf(("Resume CDROM audio playback"));
     555      return ioctlCDROMSimple(pHMHandleData,
     556                              0x81,   // IOCTL_CDROMAUDIO
     557                              0x52,   // CDROMAUDIO_RESUMEAUDIO
     558                              lpBytesReturned);
     559    }
    454560
    455561    case IOCTL_CDROM_GET_VOLUME:
     
    531637    case IOCTL_CDROM_EJECT_MEDIA:
    532638    {
    533       DWORD dwParameterSize = 4;
    534       DWORD dwDataSize      = 0;
    535       DWORD ret;
    536      
    537       if(lpBytesReturned)
    538         *lpBytesReturned = 0;
    539 
    540       dprintf(("Eject CD media"));
    541       ret = OSLibDosDevIOCtl(pHMHandleData->hHMHandle,
    542                              0x80,   // IOCTL_CDROM
    543                              0x44,   // CDROMDISK_EJECTDISK
    544                              "CD01",
    545                              4,
    546                              &dwParameterSize,
    547                              NULL,
    548                              0,
    549                              &dwDataSize);
    550       if(ret)
    551       {
    552         SetLastError(error2WinError(ret));
    553         return FALSE;
    554       }
    555       SetLastError(ERROR_SUCCESS);
    556       return TRUE;
     639      dprintf(("Eject CDROM media"));
     640      return ioctlCDROMSimple(pHMHandleData,
     641                              0x80,   // IOCTL_CDROM
     642                              0x44,   // CDROMDISK_EJECTDISK
     643                              lpBytesReturned);
    557644    }
    558645     
    559646    case IOCTL_CDROM_LOAD_MEDIA:
     647    {
     648      dprintf(("Loading CDROM media"));
     649      return ioctlCDROMSimple(pHMHandleData,
     650                              0x80,   // IOCTL_CDROM
     651                              0x45,   // CDROMDISK_CLOSETRAY
     652                              lpBytesReturned);
     653    }
     654     
    560655    case IOCTL_CDROM_RESERVE:
    561656    case IOCTL_CDROM_RELEASE:
    562657    case IOCTL_CDROM_FIND_NEW_DEVICES:
    563658        break;
    564 
     659     
     660     
     661    // -------------
     662    // STORAGE class
     663    // -------------
     664     
    565665    case IOCTL_STORAGE_CHECK_VERIFY:
    566666        if(lpBytesReturned) {
     
    576676
    577677    case IOCTL_STORAGE_EJECT_MEDIA:
     678    {
     679      dprintf(("Ejecting storage media"));
     680      return ioctlDISKUnlockEject(pHMHandleData,
     681                                  0x02, // EJECT media
     682                                  -1,
     683                                  lpBytesReturned);
     684    }
     685     
     686    case IOCTL_STORAGE_GET_MEDIA_TYPES:
    578687         break;
    579688     
    580     case IOCTL_STORAGE_GET_MEDIA_TYPES:
    581689    case IOCTL_STORAGE_LOAD_MEDIA:
     690    // case IOCTL_STORAGE_LOAD_MEDIA2:
     691    {
     692      dprintf(("Loading storage media"));
     693      return ioctlDISKUnlockEject(pHMHandleData,
     694                                  0x03, // LOAD media
     695                                  -1,
     696                                  lpBytesReturned);
     697    }
     698     
     699    // case IOCTL_STORAGE_EJECTION_CONTROL:
    582700    case IOCTL_STORAGE_MEDIA_REMOVAL:
    583         break;
     701         break;
     702     
     703     
     704    // -------------------
     705    // SCSI passthru class
     706    // -------------------
     707     
    584708    case IOCTL_SCSI_PASS_THROUGH:
    585709    case IOCTL_SCSI_MINIPORT:
Note: See TracChangeset for help on using the changeset viewer.