⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdbus.cpp

📁 6410BSP3
💻 CPP
📖 第 1 页 / 共 5 页
字号:
            }
        }
        else {
            dwErr = ERROR_INVALID_PARAMETER;
        }
        break;

      case IOCTL_SD_BUS_DRIVER_SLOT_CARD_SELECT:
        if (sizeof(DWORD) == dwLenIn && pBufIn) {
            DWORD dwSlotIndex = *(PDWORD)pBufIn;
            if (!SlotCardSelectDeselect(dwSlotIndex, SlotSelectRequest)) {
                dwErr = ERROR_INVALID_PARAMETER;
            }
        }
        else {
            dwErr = ERROR_INVALID_PARAMETER;
        }
        break;
        
      case IOCTL_SD_BUS_DRIVER_SLOT_CARD_DESELECT:
        if (sizeof(DWORD) == dwLenIn && pBufIn) {
            DWORD dwSlotIndex = *(PDWORD)pBufIn;
            if (!SlotCardSelectDeselect(dwSlotIndex, SlotDeselectRequest)) {
                dwErr = ERROR_INVALID_PARAMETER;
            }
        }
        else {
            dwErr = ERROR_INVALID_PARAMETER;
        }
        break;
 
      default:
        dwErr = ERROR_INVALID_PARAMETER;
        break;
    }

    if (cbActualOut != -1 && pdwActualOut && dwErr == ERROR_SUCCESS) {
        *pdwActualOut = cbActualOut;
    }

    DEBUGMSG(SDCARD_ZONE_FUNC, (TEXT("SDBusDriver: -SDC_IOControl 0x%X\n"), dwErr));
    if (dwErr != ERROR_SUCCESS) {
        SetLastError(dwErr);
        return FALSE;
    }
    else
        return TRUE;
}

CSDDevice * CSDHostContainer::GetDeviceByDevice(HANDLE hDevice)
{
    SDBUS_DEVICE_HANDLE deviceHandle;
    deviceHandle.hValue = hDevice;
    
    CSDDevice * pReturn = NULL;
    CSDHost *pHost = GetSDHost(deviceHandle.bit.sdBusIndex);
    if (hDevice!=NULL && deviceHandle.bit.sdF == 0xf) {
        if (pHost) {
            CSDSlot * pSlot = pHost->GetSlot(deviceHandle.bit.sdSlotIndex);
            if (pSlot) {
                pReturn = pSlot->GetFunctionDevice(deviceHandle.bit.sdFunctionIndex,deviceHandle.bit.sdRandamNumber);
                
            }
            pHost->DeRef();
        }
    }
    return pReturn;
}
CSDDevice * CSDHostContainer::GetDeviceByRequest(HANDLE hRequest)
{
    SDBUS_REQUEST_HANDLE requestHandle;
    requestHandle.hValue = hRequest;
    
    CSDDevice * pReturn = NULL;
    CSDHost *pHost = GetSDHost(requestHandle.bit.sdBusIndex);
    if (hRequest!=NULL && requestHandle.bit.sd1f == 0x1f) {
        if (pHost) {
            CSDSlot * pSlot = pHost->GetSlot(requestHandle.bit.sdSlotIndex);
            if (pSlot) {
                pReturn = pSlot->GetFunctionDevice(requestHandle.bit.sdFunctionIndex);                
            }
            pHost->DeRef();
        }
    }
    else
        ASSERT(FALSE);
    return pReturn;
}
BOOL 
CSDHostContainer::IOControl(DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut,
                      PDWORD pdwActualOut)
{
    BOOL fRet = FALSE;

    switch (dwCode) {
    case IOCTL_BUS_TRANSLATE_BUS_ADDRESS:        
    case IOCTL_BUS_TRANSLATE_SYSTEM_ADDRESS:
    case IOCTL_BUS_ACTIVATE_CHILD:
    case IOCTL_BUS_DEACTIVATE_CHILD:
    case IOCTL_BUS_IS_CHILD_REMOVED:
    case IOCTL_BUS_GET_CONFIGURE_DATA:        
    case IOCTL_BUS_SET_CONFIGURE_DATA:
        SetLastError(ERROR_NOT_SUPPORTED);
        fRet = FALSE;
        break;
    case IOCTL_BUS_SD_SET_CARD_FEATURE:
        if (pBufIn && dwLenIn>=sizeof(IO_SD_SET_CARD_FEATURE) ) {
            SD_API_STATUS status = SD_API_STATUS_INVALID_PARAMETER; 
            IO_SD_SET_CARD_FEATURE SdSetCardFeature = *(PIO_SD_SET_CARD_FEATURE) pBufIn;
            CSDDevice * pDevice = GetDeviceByDevice (SdSetCardFeature.hDevice);
            if (pDevice) {
                MarshalledBuffer_t UserBuffer((PVOID) SdSetCardFeature.pInBuf,SdSetCardFeature.nInBufSize,ARG_I_PTR, FALSE, FALSE);
                status = pDevice->SDSetCardFeature_I(SdSetCardFeature.CardFeature,UserBuffer.ptr(),SdSetCardFeature.nInBufSize) ;
                pDevice->DeRef();
            }
            SetLastError(status);
            fRet = SD_API_SUCCESS(status);
        }
        else 
            SetLastError(SD_API_STATUS_INVALID_PARAMETER);
        break;
    case IOCTL_BUS_SD_READ_WRITE_REGISTERS_DIRECT: 
        if (pBufIn && dwLenIn>= sizeof(IO_SD_CARD_INFO_QUERY)) {
            SD_API_STATUS status = SD_API_STATUS_INVALID_PARAMETER; 
            IO_SD_READ_WRITE_REGISTERS_DIRECT ReadWriteRegisterDirect = *(PIO_SD_READ_WRITE_REGISTERS_DIRECT) pBufIn;
            CSDDevice * pDevice = GetDeviceByDevice(ReadWriteRegisterDirect.hDevice);
            if (pDevice) {
                DWORD dwArg = (ReadWriteRegisterDirect.ReadWrite==SD_IO_WRITE? ARG_I_PTR: ARG_O_PTR);
                if (ReadWriteRegisterDirect.ReadAfterWrite)
                    dwArg|= ARG_O_PTR ;
                MarshalledBuffer_t UserBuffer((PVOID)ReadWriteRegisterDirect.pBuffer,ReadWriteRegisterDirect.Length,dwArg,FALSE,FALSE);
                DEBUGMSG(SDCARD_ZONE_ERROR && (ReadWriteRegisterDirect.pBuffer!=NULL && UserBuffer.ptr()==0 ), 
                    (TEXT("IOCTL_BUS_SD_READ_WRITE_REGISTERS_DIRECT: Failed to marshal point 0x%x \n"),ReadWriteRegisterDirect.pBuffer));
                status = pDevice->SDReadWriteRegistersDirect_I(ReadWriteRegisterDirect.ReadWrite,
                            ReadWriteRegisterDirect.Address,ReadWriteRegisterDirect.ReadAfterWrite,
                            (PUCHAR)UserBuffer.ptr(),ReadWriteRegisterDirect.Length);
                pDevice->DeRef();
            }
            SetLastError(status);
            fRet = SD_API_SUCCESS(status);
        }
        else 
            SetLastError(SD_API_STATUS_INVALID_PARAMETER);
        break;         
    case IOCTL_BUS_SD_REGISTER_CLIENT:
        if (pBufIn && dwLenIn>=sizeof(IO_SD_REGISTERCLIENTDEVICE)) {
            IO_SD_REGISTERCLIENTDEVICE RegisterClientDriver = *(PIO_SD_REGISTERCLIENTDEVICE) pBufIn;
            SD_API_STATUS status = SD_API_STATUS_INVALID_PARAMETER; 
            CSDDevice * pDevice = GetDeviceByDevice(RegisterClientDriver.hDevice);
            if (pDevice) {
                status = pDevice->RegisterClient(RegisterClientDriver.hCallbackAPI,
                    RegisterClientDriver.pDeviceContext, &RegisterClientDriver.sdClientRegistrationInfo);
                if (status != SD_API_STATUS_SUCCESS) {
                    DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("SDRegisterClient: Failed to register client 0x%08X \n"),status));
                }
                pDevice->DeRef();
            }
            SetLastError(status);
            fRet = SD_API_SUCCESS(status);
            
        }
        else
            SetLastError(SD_API_STATUS_INVALID_PARAMETER);
        break;
    case IOCTL_BUS_SD_SYNCHRONOUS_BUS_REQUEST:
        if (pBufIn && dwLenIn>= sizeof(IO_SD_SYNCHRONOUS_BUS_REQUEST)) {
            SD_API_STATUS status = SD_API_STATUS_INVALID_PARAMETER; 
            IO_SD_SYNCHRONOUS_BUS_REQUEST SdSyncBusRequest = *(PIO_SD_SYNCHRONOUS_BUS_REQUEST)pBufIn;
            SD_COMMAND_RESPONSE sdResponse;
            // Mapping Embedded pointer.
            CSDDevice * pDevice = GetDeviceByDevice(SdSyncBusRequest.hDevice);
            if (pDevice) {
                MarshalledBuffer_t UserBuffer((PVOID)SdSyncBusRequest.pBuffer,
                    SdSyncBusRequest.BlockSize* SdSyncBusRequest.NumBlocks,
                    SdSyncBusRequest.TransferClass==SD_READ ? ARG_O_PTR: ARG_I_PTR, FALSE, TRUE); // no duplicate and Async(because it could call BusRequest , read & write.            
                DEBUGMSG(SDCARD_ZONE_ERROR && (SdSyncBusRequest.pBuffer!=NULL && UserBuffer.ptr()==0 ), 
                    (TEXT("IOCTL_BUS_SD_SYNCHRONOUS_BUS_REQUEST: Failed to marshal point 0x%x \n"),SdSyncBusRequest.pBuffer));
                status =  pDevice->SDSynchronousBusRequest_I(
                    SdSyncBusRequest.Command,SdSyncBusRequest.Argument,
                    SdSyncBusRequest.TransferClass,SdSyncBusRequest.ResponseType,&sdResponse,
                    SdSyncBusRequest.NumBlocks,SdSyncBusRequest.BlockSize,(PUCHAR)UserBuffer.ptr(),
                    SdSyncBusRequest.Flags &~SD_BUS_REQUEST_PHYS_BUFFER, 0, NULL);
                if (pBufOut && dwLenOut>= sizeof(SD_COMMAND_RESPONSE)) { // Response can be optional.
                    *(PSD_COMMAND_RESPONSE)pBufOut = sdResponse ;
                }
                pDevice->DeRef();
            }
            SetLastError(status);
            fRet = SD_API_SUCCESS(status);
        }
        else
            SetLastError(SD_API_STATUS_INVALID_PARAMETER);
        break;
    case IOCTL_BUS_SD_BUS_REQUEST:
        if (pBufIn && dwLenIn>= sizeof(IO_SD_BUS_REQUEST) && pBufOut && dwLenOut>= sizeof(HANDLE)) {
            SD_API_STATUS status = SD_API_STATUS_INVALID_PARAMETER; 
            IO_SD_BUS_REQUEST SdBusRequest = *(PIO_SD_BUS_REQUEST)pBufIn;
            HANDLE hBusRequest = NULL ;
            // Mapping Embedded pointer.
            CSDDevice * pDevice = GetDeviceByDevice(SdBusRequest.hDevice);
            if (pDevice) {
                MarshalledBuffer_t UserBuffer((PVOID)SdBusRequest.pBuffer,
                    SdBusRequest.BlockSize* SdBusRequest.NumBlocks,
                    SdBusRequest.TransferClass==SD_READ ? ARG_O_PTR: ARG_I_PTR, FALSE,FALSE); // no duplicate and no Async , read & write.
                DEBUGMSG(SDCARD_ZONE_ERROR && (SdBusRequest.pBuffer!=NULL && UserBuffer.ptr()==0 ), 
                    (TEXT("IOCTL_BUS_SD_BUS_REQUEST: Failed to marshal point 0x%x \n"),SdBusRequest.pBuffer));
                ASSERT(pDevice->GetCallbackHandle()!= NULL);
                status =  pDevice->SDBusRequest_I(SdBusRequest.Command,SdBusRequest.Argument,
                    SdBusRequest.TransferClass,SdBusRequest.ResponseType,
                    SdBusRequest.NumBlocks,SdBusRequest.BlockSize,(PUCHAR)UserBuffer.ptr(),
                    SdBusRequest.ceDriverCallbackParam.pRequestCallback, SdBusRequest.ceDriverCallbackParam.dwRequestParam,
                    &hBusRequest,SdBusRequest.Flags & ~SD_BUS_REQUEST_PHYS_BUFFER, 0, NULL);
                pDevice->DeRef();
                * (HANDLE *)pBufOut  = hBusRequest ;
            }
            SetLastError(status);
            fRet = SD_API_SUCCESS(status);
        }
        else
            SetLastError(SD_API_STATUS_INVALID_PARAMETER);
        break;
    case IOCTL_BUS_SD_SYNCHRONOUS_BUS_REQUEST_EX:
        if (pBufIn && dwLenIn>= sizeof(IO_SD_SYNCHRONOUS_BUS_REQUEST_EX)) {
            SD_API_STATUS status = SD_API_STATUS_INVALID_PARAMETER; 
            IO_SD_SYNCHRONOUS_BUS_REQUEST_EX SdSyncBusRequest = *(PIO_SD_SYNCHRONOUS_BUS_REQUEST_EX)pBufIn;
            SD_COMMAND_RESPONSE sdResponse;
            // Mapping Embedded pointer.
            CSDDevice * pDevice = GetDeviceByDevice(SdSyncBusRequest.hDevice);
            if (pDevice) {
                MarshalledBuffer_t UserBuffer((PVOID)SdSyncBusRequest.pBuffer,
                    SdSyncBusRequest.BlockSize* SdSyncBusRequest.NumBlocks,
                    SdSyncBusRequest.TransferClass==SD_READ ? ARG_O_PTR: ARG_I_PTR, FALSE, TRUE); // no duplicate and Async(because it could call BusRequest , read & write.            
                MarshalledBuffer_t UserDmaBuffer (SdSyncBusRequest.pPhysBuffList,SdSyncBusRequest.cbSize,ARG_I_PTR,FALSE,FALSE);
                DEBUGMSG(SDCARD_ZONE_ERROR && (SdSyncBusRequest.pBuffer!=NULL && UserBuffer.ptr()==0 ), 
                    (TEXT("IOCTL_BUS_SD_SYNCHRONOUS_BUS_REQUEST: Failed to marshal point 0x%x \n"),SdSyncBusRequest.pBuffer));
                status =  pDevice->SDSynchronousBusRequest_I(
                    SdSyncBusRequest.Command,SdSyncBusRequest.Argument,
                    SdSyncBusRequest.TransferClass,SdSyncBusRequest.ResponseType,&sdResponse,
                    SdSyncBusRequest.NumBlocks,SdSyncBusRequest.BlockSize,(PUCHAR)UserBuffer.ptr(),
                    SdSyncBusRequest.Flags,SdSyncBusRequest.cbSize, (PPHYS_BUFF_LIST)UserDmaBuffer.ptr());
                if (pBufOut && dwLenOut>= sizeof(SD_COMMAND_RESPONSE)) { // Response can be optional.
                    *(PSD_COMMAND_RESPONSE)pBufOut = sdResponse ;
                }
                pDevice->DeRef();
            }
            SetLastError(status);
            fRet = SD_API_SUCCESS(status);
        }
        else
            SetLastError(SD_API_STATUS_INVALID_PARAMETER);
        break;
    case IOCTL_BUS_SD_BUS_REQUEST_EX:
        if (pBufIn && dwLenIn>= sizeof(IO_SD_BUS_REQUEST_EX) && pBufOut && dwLenOut>= sizeof(HANDLE)) {
            SD_API_STATUS status = SD_API_STATUS_INVALID_PARAMETER; 
            IO_SD_BUS_REQUEST_EX SdBusRequest = *(PIO_SD_BUS_REQUEST_EX)pBufIn;
            HANDLE hBusRequest = NULL ;
            // Mapping Embedded pointer.
            CSDDevice * pDevice = GetDeviceByDevice(SdBusRequest.hDevice);
            if (pDevice) {
                MarshalledBuffer_t UserBuffer((PVOID)SdBusRequest.pBuffer,
                    SdBusRequest.BlockSize* SdBusRequest.NumBlocks,
                    SdBusRequest.TransferClass==SD_READ ? ARG_O_PTR: ARG_I_PTR, FALSE,FALSE); // no duplicate and no Async , read & write.
                MarshalledBuffer_t UserDmaBuffer (SdBusRequest.pPhysBuffList,SdBusRequest.cbSize,ARG_I_PTR,FALSE,FALSE);
                    
                DEBUGMSG(SDCARD_ZONE_ERROR && (SdBusRequest.pBuffer!=NULL && UserBuffer.ptr()==0 ), 
                    (TEXT("IOCTL_BUS_SD_BUS_REQUEST: Failed to marshal point 0x%x \n"),SdBusRequest.pBuffer));
                ASSERT(pDevice->GetCallbackHandle()!= NULL);
                status =  pDevice->SDBusRequest_I(SdBusRequest.Command,SdBusRequest.Argument,
                    SdBusRequest.TransferClass,SdBusRequest.ResponseType,
                    SdBusRequest.NumBlocks,SdBusRequest.BlockSize,(PUCHAR)UserBuffer.ptr(),
                    SdBusRequest.ceDriverCallbackParam.pRequestCallback, SdBusRequest.ceDriverCallbackParam.dwRequestParam,
                    &hBusRequest,SdBusRequest.Flags,SdBusRequest.cbSize,(PPHYS_BUFF_LIST)UserDmaBuffer.ptr() );
                pDevice->DeRef();
                * (HANDLE *)pBufOut  = hBusRequest ;
            }
            SetLastError(status);
            fRet = SD_API_SUCCESS(status);
        }
        else
            SetLastError(SD_API_STATUS_INVALID_PARAMETER);
        break;
    case IOCTL_BUS_SD_FREE_BUS_REQUEST: 
        if (pBufIn && dwLenIn>= sizeof(HANDLE)) {
            HANDLE hRequest = *(HANDLE *)pBufIn;
            CSDDevice * pDevice =  GetDeviceByRequest(hRequest);
            if (pDevice) {
                pDevice->SDFreeBusRequest_I(hRequest );
                pDevice->DeRef();
                fRet = TRUE;
            }
        }
        break;
    case IOCTL_BUS_SD_REQUEST_RESPONSE: 
        if (pBufIn && dwLenIn>= sizeof(HANDLE) && pBufOut && dwLenOut>=sizeof(SD_COMMAND_RESPONSE)) {
            SD_API_STATUS status = SD_API_STATUS_INVALID_PARAMETER; 
            HANDLE hRequest = *(HANDLE *)pBufIn;
            SD_COMMAND_RESPONSE Response;
            CSDDevice * pDevice =  GetDeviceByRequest(hRequest);
            if (pDevice) {
                status = pDevice->SDBusRequestResponse_I(hRequest,&Response );
                pDevice->DeRef();
                if (SD_API_SUCCESS(status)) {
                    *(PSD_COMMAND_RESPONSE)pBufOut = Response;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -