MSUSB_INTERFACE_DESCRIPTOR* msusb_msinterface_read(BYTE* data, UINT32 data_size, int* offset) { MSUSB_INTERFACE_DESCRIPTOR* MsInterface; MsInterface = msusb_msinterface_new(); data_read_UINT16(data, MsInterface->Length); data_read_UINT16(data + 2, MsInterface->NumberOfPipesExpected); data_read_BYTE(data + 4, MsInterface->InterfaceNumber); data_read_BYTE(data + 5, MsInterface->AlternateSetting); data_read_UINT32(data + 8, MsInterface->NumberOfPipes); *offset += 12; MsInterface->InterfaceHandle = 0; MsInterface->bInterfaceClass = 0; MsInterface->bInterfaceSubClass = 0; MsInterface->bInterfaceProtocol = 0; MsInterface->InitCompleted = 0; MsInterface->MsPipes = NULL; if (MsInterface->NumberOfPipes > 0) { MsInterface->MsPipes = msusb_mspipes_read(data+(*offset), data_size-(*offset), MsInterface->NumberOfPipes, offset); } return MsInterface; }
static void func_lock_isoch_mutex(TRANSFER_DATA* transfer_data) { int noAck = 0; IUDEVICE* pdev; UINT32 FunctionId; UINT32 RequestField; UINT16 URB_Function; IUDEVMAN* udevman = transfer_data->udevman; if (transfer_data->cbSize >= 8) { data_read_UINT32(transfer_data->pBuffer + 4, FunctionId); if ((FunctionId == TRANSFER_IN_REQUEST || FunctionId == TRANSFER_OUT_REQUEST) && transfer_data->cbSize >= 16) { data_read_UINT16(transfer_data->pBuffer + 14, URB_Function); if (URB_Function == URB_FUNCTION_ISOCH_TRANSFER && transfer_data->cbSize >= 20) { data_read_UINT32(transfer_data->pBuffer + 16, RequestField); noAck = (RequestField & 0x80000000) >> 31; if (!noAck) { pdev = udevman->get_udevice_by_UsbDevice(udevman, transfer_data->UsbDevice); pdev->lock_fifo_isoch(pdev); } }
MSUSB_CONFIG_DESCRIPTOR* msusb_msconfig_read(BYTE* data, UINT32 data_size, UINT32 NumInterfaces) { int i, offset = 0; UINT16 lenInterface; MSUSB_CONFIG_DESCRIPTOR* MsConfig; BYTE lenConfiguration, typeConfiguration; MsConfig = msusb_msconfig_new(); for(i = 0; i < NumInterfaces; i++) { data_read_UINT16(data + offset, lenInterface); offset += lenInterface; } data_read_BYTE(data + offset, lenConfiguration); data_read_BYTE(data + offset + 1, typeConfiguration); if (lenConfiguration != 0x9 || typeConfiguration != 0x2) { DEBUG_MSUSB("%s: len and type must be 0x9 and 0x2 , but it is 0x%x and 0x%x", lenConfiguration, typeConfiguration); } data_read_UINT16(data + offset + 2, MsConfig->wTotalLength); data_read_BYTE(data + offset + 5, MsConfig->bConfigurationValue); MsConfig->NumInterfaces = NumInterfaces; MsConfig->ConfigurationHandle = 0; MsConfig->InitCompleted = 0; MsConfig->MsOutSize = 0; MsConfig->MsInterfaces = NULL; offset = 0; if (NumInterfaces > 0) { MsConfig->MsInterfaces = msusb_msinterface_read_list(data, data_size, NumInterfaces); } return MsConfig; }