Ignore:
Timestamp:
Jun 23, 2001, 9:43:50 PM (24 years ago)
Author:
sandervl
Message:

added cdrom get/setvolume ioctls

File:
1 edited

Legend:

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

    r6053 r6086  
    1 /* $Id: hmdisk.cpp,v 1.11 2001-06-20 20:51:57 sandervl Exp $ */
     1/* $Id: hmdisk.cpp,v 1.12 2001-06-23 19:43:50 sandervl Exp $ */
    22
    33/*
     
    2525#include "dbglocal.h"
    2626
    27 static HINSTANCE hInstAspi                           = 0;
    28 static DWORD (WIN32API *GetASPI32SupportInfo)()      = NULL;
    29 static DWORD (CDECL *SendASPI32Command)(LPSRB lpSRB) = NULL;
     27typedef struct
     28{
     29    HINSTANCE hInstAspi;
     30    DWORD (WIN32API *GetASPI32SupportInfo)();
     31    DWORD (CDECL *SendASPI32Command)(LPSRB lpSRB);
     32    ULONG     driveLetter;
     33    CHAR      signature[8];
     34} DRIVE_INFO;
    3035
    3136HMDeviceDiskClass::HMDeviceDiskClass(LPCSTR lpDeviceName) : HMDeviceKernelObjectClass(lpDeviceName)
     
    117122        else pHMHandleData->hHMHandle  = hFile;
    118123
    119         pHMHandleData->dwUserData = *lpFileName; //save drive letter
    120         if(pHMHandleData->dwUserData >= 'a') {
    121             pHMHandleData->dwUserData = pHMHandleData->dwUserData - ((int)'a' - (int)'A');
    122         }
    123 
    124         if(GetDriveTypeA(lpFileName) == DRIVE_CDROM && hInstAspi == NULL) {
    125             hInstAspi = LoadLibraryA("WNASPI32.DLL");
    126             if(hInstAspi == NULL) {
     124        DRIVE_INFO *drvInfo = (DRIVE_INFO *)malloc(sizeof(DRIVE_INFO));
     125        if(drvInfo == NULL) {
     126             if(pHMHandleData->hHMHandle) OSLibDosClose(pHMHandleData->hHMHandle);
     127             return ERROR_OUTOFMEMORY;
     128        }
     129        pHMHandleData->dwUserData = (DWORD)drvInfo;
     130
     131        memset(drvInfo, 0, sizeof(DRIVE_INFO));
     132        drvInfo->driveLetter = *lpFileName; //save drive letter
     133        if(drvInfo->driveLetter >= 'a') {
     134            drvInfo->driveLetter = drvInfo->driveLetter - ((int)'a' - (int)'A');
     135        }
     136
     137        if(GetDriveTypeA(lpFileName) == DRIVE_CDROM) {
     138            drvInfo->hInstAspi = LoadLibraryA("WNASPI32.DLL");
     139            if(drvInfo->hInstAspi == NULL) {
     140                if(pHMHandleData->hHMHandle) OSLibDosClose(pHMHandleData->hHMHandle);
     141                free(drvInfo);
    127142                return ERROR_INVALID_PARAMETER;
    128143            }
    129             *(FARPROC *)&GetASPI32SupportInfo = GetProcAddress(hInstAspi, "GetASPI32SupportInfo");
    130             *(FARPROC *)&SendASPI32Command    = GetProcAddress(hInstAspi, "SendASPI32Command");
     144            *(FARPROC *)&drvInfo->GetASPI32SupportInfo = GetProcAddress(drvInfo->hInstAspi, "GetASPI32SupportInfo");
     145            *(FARPROC *)&drvInfo->SendASPI32Command    = GetProcAddress(drvInfo->hInstAspi, "SendASPI32Command");
     146   
     147            //get cdrom signature (TODO: why doesn't this work???)
     148            DWORD parsize = 4;
     149            DWORD datasize = 4;
     150            strcpy(drvInfo->signature, "CD01");
     151            OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x81, 0x60, &drvInfo->signature[0], 4, &parsize,
     152                             &drvInfo->signature[0], 4, &datasize);
    131153        }
    132154        return (NO_ERROR);
     
    141163BOOL HMDeviceDiskClass::CloseHandle(PHMHANDLEDATA pHMHandleData)
    142164{
     165    BOOL ret = TRUE;
     166
    143167    if(pHMHandleData->hHMHandle) {
    144         return OSLibDosClose(pHMHandleData->hHMHandle);
    145     }
    146     return TRUE;
     168        ret = OSLibDosClose(pHMHandleData->hHMHandle);
     169    }
     170    if(pHMHandleData->dwUserData) {
     171       DRIVE_INFO *drvInfo = (DRIVE_INFO*)pHMHandleData->dwUserData;
     172       if(drvInfo->hInstAspi)    FreeLibrary(drvInfo->hInstAspi);
     173       free(drvInfo);
     174    }
     175    return ret;
    147176}
    148177//******************************************************************************
     
    349378    }
    350379    if(msg) {
    351         dprintf(("HMDeviceDiskClass::DeviceIoControl %s", msg));
     380        dprintf(("HMDeviceDiskClass::DeviceIoControl %s %x %d %x %d %x %x", msg, lpInBuffer, nInBufferSize,
     381                 lpOutBuffer, nOutBufferSize, lpBytesReturned, lpOverlapped));
    352382    }
    353383#endif
    354384
     385    DRIVE_INFO *drvInfo = (DRIVE_INFO*)pHMHandleData->dwUserData;
     386    if(drvInfo == NULL) {
     387        dprintf(("ERROR: DeviceIoControl: drvInfo == NULL!!!"));
     388        DebugInt3();
     389        SetLastError(ERROR_INVALID_HANDLE);
     390        return FALSE;
     391    }
    355392    switch(dwIoControlCode)
    356393    {
     
    385422            *lpBytesReturned = 0;
    386423        }
    387         if(OSLibDosGetDiskGeometry(pHMHandleData->hHMHandle, pHMHandleData->dwUserData, pGeom) == FALSE) {
     424        if(OSLibDosGetDiskGeometry(pHMHandleData->hHMHandle, drvInfo->driveLetter, pGeom) == FALSE) {
    388425            return FALSE;
    389426        }
     
    414451    case IOCTL_CDROM_PAUSE_AUDIO:
    415452    case IOCTL_CDROM_RESUME_AUDIO:
     453        break;
     454
    416455    case IOCTL_CDROM_GET_VOLUME:
     456    {
     457        PVOLUME_CONTROL pVol = (PVOLUME_CONTROL)lpOutBuffer;
     458        char volbuf[8];
     459        DWORD parsize, datasize, ret;
     460
     461        if(nOutBufferSize < sizeof(VOLUME_CONTROL) || !pVol) {
     462            SetLastError(ERROR_INSUFFICIENT_BUFFER);
     463            return FALSE;
     464        }
     465        if(lpBytesReturned) {
     466            *lpBytesReturned = 0;
     467        }
     468        parsize = 4;
     469        datasize = 8;
     470        ret = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x81, 0x60, "CD01", 4, &parsize,
     471                               volbuf, 8, &datasize);
     472
     473        if(ret) {
     474            SetLastError(error2WinError(ret));
     475            return FALSE;
     476        }
     477        if(lpBytesReturned) {
     478            *lpBytesReturned = sizeof(VOLUME_CONTROL);
     479        }
     480        pVol->PortVolume[0] = volbuf[1];
     481        pVol->PortVolume[1] = volbuf[3];
     482        pVol->PortVolume[2] = volbuf[5];
     483        pVol->PortVolume[3] = volbuf[7];
     484        SetLastError(ERROR_SUCCESS);
     485        return TRUE;
     486    }
     487
    417488    case IOCTL_CDROM_SET_VOLUME:
     489    {
     490        PVOLUME_CONTROL pVol = (PVOLUME_CONTROL)lpInBuffer;
     491        char volbuf[8];
     492        DWORD parsize, datasize, ret;
     493
     494        if(nInBufferSize < sizeof(VOLUME_CONTROL) || !pVol) {
     495            SetLastError(ERROR_INSUFFICIENT_BUFFER);
     496            return FALSE;
     497        }
     498        if(lpBytesReturned) {
     499            *lpBytesReturned = 0;
     500        }
     501        parsize = 4;
     502        datasize = 8;
     503        volbuf[0] = 0;
     504        volbuf[1] = pVol->PortVolume[0];
     505        volbuf[2] = 1;
     506        volbuf[3] = pVol->PortVolume[1];
     507        volbuf[4] = 2;
     508        volbuf[5] = pVol->PortVolume[2];
     509        volbuf[6] = 3;
     510        volbuf[7] = pVol->PortVolume[3];
     511        dprintf(("Set CD volume (%d,%d)(%d,%d)", pVol->PortVolume[0], pVol->PortVolume[1], pVol->PortVolume[2], pVol->PortVolume[3]));
     512        ret = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, 0x81, 0x40, "CD01", 4, &parsize,
     513                               volbuf, 8, &datasize);
     514
     515        if(ret) {
     516            SetLastError(error2WinError(ret));
     517            return FALSE;
     518        }
     519        SetLastError(ERROR_SUCCESS);
     520        return TRUE;
     521    }
    418522    case IOCTL_CDROM_READ_Q_CHANNEL:
    419523    case IOCTL_CDROM_GET_LAST_SESSION:
     
    432536    case IOCTL_STORAGE_CHECK_VERIFY:
    433537        if(lpBytesReturned) {
    434             lpBytesReturned = 0;
     538            *lpBytesReturned = 0;
    435539        }
    436540        //TODO: check if disk has been inserted or removed
     
    458562        SRB_ExecSCSICmd *psrb;
    459563
    460         if(hInstAspi == NULL) {
     564        if(drvInfo->hInstAspi == NULL) {
    461565            SetLastError(ERROR_ACCESS_DENIED);
    462566            return FALSE;
     
    508612        }
    509613        //TODO: pPacket->TimeOutValue ignored
    510         int rc = SendASPI32Command((LPSRB)psrb);
     614        int rc = drvInfo->SendASPI32Command((LPSRB)psrb);
    511615        if(rc != SS_COMP) {
    512616            dprintf(("SendASPI32Command failed with error %d", rc));
     
    542646        addr->PortNumber = 0;
    543647        addr->PathId     = 0;
    544         numAdapters = GetASPI32SupportInfo();
     648        numAdapters = drvInfo->GetASPI32SupportInfo();
    545649        if(LOBYTE(numAdapters) == 0) goto failure;
    546650
    547651        memset(&srb, 0, sizeof(srb));
    548652        srb.common.SRB_Cmd = SC_HA_INQUIRY;
    549         rc = SendASPI32Command(&srb);
     653        rc = drvInfo->SendASPI32Command(&srb);
    550654
    551655        char drivename[3];
    552         drivename[0] = (char)pHMHandleData->dwUserData;
     656        drivename[0] = (char)drvInfo->driveLetter;
    553657        drivename[1] = ':';
    554658        drivename[2] = 0;
     
    562666                    srb.devtype.SRB_Target = j;
    563667                    srb.devtype.SRB_Lun    = k;
    564                     rc = SendASPI32Command(&srb);
     668                    rc = drvInfo->SendASPI32Command(&srb);
    565669                    if(rc == SS_COMP) {
    566670                        if(srb.devtype.SRB_DeviceType == SS_DEVTYPE_CDROM &&
Note: See TracChangeset for help on using the changeset viewer.