static void msusb_msinterface_free_list(MSUSB_INTERFACE_DESCRIPTOR** MsInterfaces, UINT32 NumInterfaces) { int inum = 0; if (MsInterfaces) { for (inum = 0; inum < NumInterfaces; inum++) { msusb_msinterface_free(MsInterfaces[inum]); } zfree(MsInterfaces); } }
MSUSB_INTERFACE_DESCRIPTOR* msusb_msinterface_read(BYTE* data, UINT32 data_size, int* offset) { MSUSB_INTERFACE_DESCRIPTOR* MsInterface; MsInterface = msusb_msinterface_new(); if (!MsInterface) return NULL; 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); if (!MsInterface->MsPipes) goto out_error; } return MsInterface; out_error: msusb_msinterface_free(MsInterface); return NULL; }
void msusb_msinterface_replace(MSUSB_CONFIG_DESCRIPTOR* MsConfig, BYTE InterfaceNumber, MSUSB_INTERFACE_DESCRIPTOR* NewMsInterface) { msusb_msinterface_free(MsConfig->MsInterfaces[InterfaceNumber]); MsConfig->MsInterfaces[InterfaceNumber] = NewMsInterface; }