Changeset 6036 for trunk/src


Ignore:
Timestamp:
Jun 17, 2001, 3:58:32 PM (24 years ago)
Author:
sandervl
Message:

IOCTL_SCSI_PASS_THROUGH_DIRECT implemented

File:
1 edited

Legend:

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

    r6029 r6036  
    1 /* $Id: hmdisk.cpp,v 1.8 2001-06-16 16:10:12 sandervl Exp $ */
     1/* $Id: hmdisk.cpp,v 1.9 2001-06-17 13:58:32 sandervl Exp $ */
    22
    33/*
     
    2424#define DBG_LOCALLOG    DBG_hmdisk
    2525#include "dbglocal.h"
     26
     27static HINSTANCE hInstAspi                           = 0;
     28static DWORD (WIN32API *GetASPI32SupportInfo)()      = NULL;
     29static DWORD (CDECL *SendASPI32Command)(LPSRB lpSRB) = NULL;
    2630
    2731HMDeviceDiskClass::HMDeviceDiskClass(LPCSTR lpDeviceName) : HMDeviceKernelObjectClass(lpDeviceName)
     
    117121            pHMHandleData->dwUserData = pHMHandleData->dwUserData - ((int)'a' - (int)'A');
    118122        }
     123
     124        if(GetDriveTypeA(lpFileName) == DRIVE_CDROM && hInstAspi == NULL) {
     125            hInstAspi = LoadLibraryA("WNASPI32.DLL");
     126            if(hInstAspi == NULL) {
     127                return ERROR_INVALID_PARAMETER;
     128            }
     129            *(FARPROC *)&GetASPI32SupportInfo = GetProcAddress(hInstAspi, "GetASPI32SupportInfo");
     130            *(FARPROC *)&SendASPI32Command    = GetProcAddress(hInstAspi, "SendASPI32Command");
     131        }
    119132        return (NO_ERROR);
    120133    }
     
    299312    {
    300313        PDISK_GEOMETRY pGeom = (PDISK_GEOMETRY)lpOutBuffer;
    301         if(nOutBufferSize < sizeof(DISK_GEOMETRY)) {
     314        if(nOutBufferSize < sizeof(DISK_GEOMETRY) || !pGeom) {
    302315            SetLastError(ERROR_INSUFFICIENT_BUFFER);
    303316            return FALSE;
     
    312325            *lpBytesReturned = sizeof(DISK_GEOMETRY);
    313326        }
     327        SetLastError(ERROR_SUCCESS);
    314328        return TRUE;
    315329    }
     
    347361    case IOCTL_SCSI_GET_INQUIRY_DATA:
    348362    case IOCTL_SCSI_GET_CAPABILITIES:
     363        break;
     364
    349365    case IOCTL_SCSI_PASS_THROUGH_DIRECT:
    350         break;
    351 
     366    {
     367        PSCSI_PASS_THROUGH_DIRECT pPacket = (PSCSI_PASS_THROUGH_DIRECT)lpOutBuffer;
     368        SRB_ExecSCSICmd *psrb;
     369
     370        if(nOutBufferSize < sizeof(SCSI_PASS_THROUGH_DIRECT) ||
     371           !pPacket || pPacket->Length < sizeof(SCSI_PASS_THROUGH_DIRECT))
     372        {
     373            SetLastError(ERROR_INSUFFICIENT_BUFFER);
     374            return FALSE;
     375        }
     376        if(lpBytesReturned) {
     377            *lpBytesReturned = 0;
     378        }
     379        psrb = (SRB_ExecSCSICmd *)alloca(sizeof(SRB_ExecSCSICmd)+pPacket->SenseInfoLength);
     380        if(psrb == NULL) {
     381            dprintf(("not enough memory!!"));
     382            SetLastError(ERROR_NOT_ENOUGH_MEMORY);
     383            return FALSE;
     384        }
     385        memset(psrb, 0, sizeof(*psrb));
     386        psrb->SRB_Cmd        = SC_EXEC_SCSI_CMD;
     387        psrb->SRB_Status     = pPacket->ScsiStatus;
     388        psrb->SRB_HaId       = pPacket->PathId;
     389        psrb->SRB_Target     = pPacket->TargetId;
     390        psrb->SRB_Lun        = pPacket->Lun;
     391        psrb->SRB_BufLen     = pPacket->DataTransferLength;
     392        psrb->SRB_SenseLen   = pPacket->SenseInfoLength;
     393        psrb->SRB_CDBLen     = pPacket->CdbLength;
     394        switch(pPacket->DataIn) {
     395        case SCSI_IOCTL_DATA_OUT:
     396             psrb->SRB_Flags = 0x2 << 3;
     397             break;
     398        case SCSI_IOCTL_DATA_IN:
     399             psrb->SRB_Flags = 0x1 << 3;
     400             break;
     401        case SCSI_IOCTL_DATA_UNSPECIFIED:
     402             psrb->SRB_Flags = 0x3 << 3;
     403             break;
     404        }
     405        if(pPacket->CdbLength > 16) {
     406             SetLastError(ERROR_INVALID_PARAMETER);
     407             return FALSE;
     408        }
     409        psrb->SRB_BufPointer = (BYTE *)pPacket->DataBuffer;
     410        memcpy(&psrb->CDBByte[0], &pPacket->Cdb[0], 16);
     411        if(psrb->SRB_SenseLen) {
     412            memcpy(&psrb->SenseArea[0], (char *)pPacket + pPacket->SenseInfoOffset, psrb->SRB_SenseLen);
     413        }
     414        //TODO: pPacket->TimeOutValue ignored
     415        int rc = SendASPI32Command((LPSRB)psrb);
     416        if(rc != SS_COMP) {
     417            dprintf(("SendASPI32Command failed with error %d", rc));
     418            if(rc == SS_ERR) {
     419                 SetLastError(ERROR_ADAP_HDW_ERR); //returned by NT4, SP6
     420            }
     421            else SetLastError(ERROR_GEN_FAILURE);
     422            return FALSE;
     423        }
     424        pPacket->ScsiStatus = rc;
     425        if(lpBytesReturned) {
     426            *lpBytesReturned = 0;
     427        }
     428        pPacket->DataTransferLength = psrb->SRB_BufLen;
     429        if(psrb->SRB_SenseLen) {
     430            memcpy((char *)pPacket + pPacket->SenseInfoOffset, &psrb->SenseArea[0], psrb->SRB_SenseLen);
     431        }
     432        SetLastError(ERROR_SUCCESS);
     433        return TRUE;
     434    }
    352435    case IOCTL_SCSI_GET_ADDRESS:
    353436    {
    354         HINSTANCE hInstAspi;
    355         DWORD (WIN32API *GetASPI32SupportInfo)();
    356         DWORD (CDECL *SendASPI32Command)(LPSRB lpSRB);
    357437        DWORD numAdapters, rc;
    358438        SRB   srb;
     
    367447        addr->PortNumber = 0;
    368448        addr->PathId     = 0;
    369         hInstAspi = LoadLibraryA("WNASPI32.DLL");
    370         if(hInstAspi == NULL) {
    371             SetLastError(ERROR_INVALID_PARAMETER); //todo
    372             return FALSE;
    373         }
    374         *(FARPROC *)&GetASPI32SupportInfo = GetProcAddress(hInstAspi, "GetASPI32SupportInfo");
    375         *(FARPROC *)&SendASPI32Command    = GetProcAddress(hInstAspi, "SendASPI32Command");
    376449        numAdapters = GetASPI32SupportInfo();
    377450        if(LOBYTE(numAdapters) == 0) goto failure;
     
    412485        }
    413486        else    SetLastError(ERROR_FILE_NOT_FOUND); //todo
    414         FreeLibrary(hInstAspi);
    415487        return TRUE;
    416488failure:
    417         FreeLibrary(hInstAspi);
    418489        SetLastError(ERROR_INVALID_PARAMETER); //todo
    419490        return FALSE;
Note: See TracChangeset for help on using the changeset viewer.