Blame channels/urbdrc/common/msusb.c

Packit Service 5a9772
/**
Packit Service 5a9772
 * FreeRDP: A Remote Desktop Protocol Implementation
Packit Service 5a9772
 * RemoteFX USB Redirection
Packit Service 5a9772
 *
Packit Service 5a9772
 * Copyright 2012 Atrust corp.
Packit Service 5a9772
 * Copyright 2012 Alfred Liu <alfred.liu@atruscorp.com>
Packit Service 5a9772
 *
Packit Service 5a9772
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit Service 5a9772
 * you may not use this file except in compliance with the License.
Packit Service 5a9772
 * You may obtain a copy of the License at
Packit Service 5a9772
 *
Packit Service 5a9772
 *	 http://www.apache.org/licenses/LICENSE-2.0
Packit Service 5a9772
 *
Packit Service 5a9772
 * Unless required by applicable law or agreed to in writing, software
Packit Service 5a9772
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit Service 5a9772
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit Service 5a9772
 * See the License for the specific language governing permissions and
Packit Service 5a9772
 * limitations under the License.
Packit Service 5a9772
 */
Packit Service 5a9772
Packit Service 5a9772
#include <stdio.h>
Packit Service 5a9772
#include <stdlib.h>
Packit Service 5a9772
#include <string.h>
Packit Service 5a9772
Packit Service 5a9772
#include <freerdp/log.h>
Packit Service 5a9772
#include <msusb.h>
Packit Service 5a9772
Packit Service 5a9772
#define TAG FREERDP_TAG("utils")
Packit Service 5a9772
Packit Service 5a9772
static MSUSB_PIPE_DESCRIPTOR* msusb_mspipe_new()
Packit Service 5a9772
{
Packit Service 5a9772
	return (MSUSB_PIPE_DESCRIPTOR*)calloc(1, sizeof(MSUSB_PIPE_DESCRIPTOR));
Packit Service 5a9772
}
Packit Service 5a9772
Packit Service 5a9772
static void msusb_mspipes_free(MSUSB_PIPE_DESCRIPTOR** MsPipes, UINT32 NumberOfPipes)
Packit Service 5a9772
{
Packit Service 5a9772
	UINT32 pnum = 0;
Packit Service 5a9772
Packit Service 5a9772
	if (MsPipes)
Packit Service 5a9772
	{
Packit Service 5a9772
		for (pnum = 0; pnum < NumberOfPipes && MsPipes[pnum]; pnum++)
Packit Service 5a9772
			free(MsPipes[pnum]);
Packit Service 5a9772
Packit Service 5a9772
		free(MsPipes);
Packit Service 5a9772
	}
Packit Service 5a9772
}
Packit Service 5a9772
Packit Service 5a9772
BOOL msusb_mspipes_replace(MSUSB_INTERFACE_DESCRIPTOR* MsInterface,
Packit Service 5a9772
                           MSUSB_PIPE_DESCRIPTOR** NewMsPipes, UINT32 NewNumberOfPipes)
Packit Service 5a9772
{
Packit Service 5a9772
	if (!MsInterface || !NewMsPipes)
Packit Service 5a9772
		return FALSE;
Packit Service 5a9772
Packit Service 5a9772
	/* free orignal MsPipes */
Packit Service 5a9772
	msusb_mspipes_free(MsInterface->MsPipes, MsInterface->NumberOfPipes);
Packit Service 5a9772
	/* And replace it */
Packit Service 5a9772
	MsInterface->MsPipes = NewMsPipes;
Packit Service 5a9772
	MsInterface->NumberOfPipes = NewNumberOfPipes;
Packit Service 5a9772
	return TRUE;
Packit Service 5a9772
}
Packit Service 5a9772
Packit Service 5a9772
static MSUSB_PIPE_DESCRIPTOR** msusb_mspipes_read(wStream* s, UINT32 NumberOfPipes)
Packit Service 5a9772
{
Packit Service 5a9772
	UINT32 pnum;
Packit Service 5a9772
	MSUSB_PIPE_DESCRIPTOR** MsPipes;
Packit Service 5a9772
Packit Service 5a9772
	if (Stream_GetRemainingCapacity(s) / 12 < NumberOfPipes)
Packit Service 5a9772
		return NULL;
Packit Service 5a9772
Packit Service 5a9772
	MsPipes = (MSUSB_PIPE_DESCRIPTOR**)calloc(NumberOfPipes, sizeof(MSUSB_PIPE_DESCRIPTOR*));
Packit Service 5a9772
Packit Service 5a9772
	if (!MsPipes)
Packit Service 5a9772
		return NULL;
Packit Service 5a9772
Packit Service 5a9772
	for (pnum = 0; pnum < NumberOfPipes; pnum++)
Packit Service 5a9772
	{
Packit Service 5a9772
		MSUSB_PIPE_DESCRIPTOR* MsPipe = msusb_mspipe_new();
Packit Service 5a9772
Packit Service 5a9772
		if (!MsPipe)
Packit Service 5a9772
			goto out_error;
Packit Service 5a9772
Packit Service 5a9772
		Stream_Read_UINT16(s, MsPipe->MaximumPacketSize);
Packit Service 5a9772
		Stream_Seek(s, 2);
Packit Service 5a9772
		Stream_Read_UINT32(s, MsPipe->MaximumTransferSize);
Packit Service 5a9772
		Stream_Read_UINT32(s, MsPipe->PipeFlags);
Packit Service 5a9772
		/* Already set to zero by memset
Packit Service 5a9772
		        MsPipe->PipeHandle	   = 0;
Packit Service 5a9772
		        MsPipe->bEndpointAddress = 0;
Packit Service 5a9772
		        MsPipe->bInterval		= 0;
Packit Service 5a9772
		        MsPipe->PipeType		 = 0;
Packit Service 5a9772
		        MsPipe->InitCompleted	= 0;
Packit Service 5a9772
		*/
Packit Service 5a9772
		MsPipes[pnum] = MsPipe;
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	return MsPipes;
Packit Service 5a9772
out_error:
Packit Service 5a9772
Packit Service 5a9772
	for (pnum = 0; pnum < NumberOfPipes; pnum++)
Packit Service 5a9772
		free(MsPipes[pnum]);
Packit Service 5a9772
Packit Service 5a9772
	free(MsPipes);
Packit Service 5a9772
	return NULL;
Packit Service 5a9772
}
Packit Service 5a9772
Packit Service 5a9772
static MSUSB_INTERFACE_DESCRIPTOR* msusb_msinterface_new()
Packit Service 5a9772
{
Packit Service 5a9772
	return (MSUSB_INTERFACE_DESCRIPTOR*)calloc(1, sizeof(MSUSB_INTERFACE_DESCRIPTOR));
Packit Service 5a9772
}
Packit Service 5a9772
Packit Service 5a9772
static void msusb_msinterface_free(MSUSB_INTERFACE_DESCRIPTOR* MsInterface)
Packit Service 5a9772
{
Packit Service 5a9772
	if (MsInterface)
Packit Service 5a9772
	{
Packit Service 5a9772
		msusb_mspipes_free(MsInterface->MsPipes, MsInterface->NumberOfPipes);
Packit Service 5a9772
		MsInterface->MsPipes = NULL;
Packit Service 5a9772
		free(MsInterface);
Packit Service 5a9772
	}
Packit Service 5a9772
}
Packit Service 5a9772
Packit Service 5a9772
static void msusb_msinterface_free_list(MSUSB_INTERFACE_DESCRIPTOR** MsInterfaces,
Packit Service 5a9772
                                        UINT32 NumInterfaces)
Packit Service 5a9772
{
Packit Service 5a9772
	UINT32 inum = 0;
Packit Service 5a9772
Packit Service 5a9772
	if (MsInterfaces)
Packit Service 5a9772
	{
Packit Service 5a9772
		for (inum = 0; inum < NumInterfaces; inum++)
Packit Service 5a9772
		{
Packit Service 5a9772
			msusb_msinterface_free(MsInterfaces[inum]);
Packit Service 5a9772
		}
Packit Service 5a9772
Packit Service 5a9772
		free(MsInterfaces);
Packit Service 5a9772
	}
Packit Service 5a9772
}
Packit Service 5a9772
Packit Service 5a9772
BOOL msusb_msinterface_replace(MSUSB_CONFIG_DESCRIPTOR* MsConfig, BYTE InterfaceNumber,
Packit Service 5a9772
                               MSUSB_INTERFACE_DESCRIPTOR* NewMsInterface)
Packit Service 5a9772
{
Packit Service 5a9772
	if (!MsConfig || !MsConfig->MsInterfaces)
Packit Service 5a9772
		return FALSE;
Packit Service 5a9772
Packit Service 5a9772
	msusb_msinterface_free(MsConfig->MsInterfaces[InterfaceNumber]);
Packit Service 5a9772
	MsConfig->MsInterfaces[InterfaceNumber] = NewMsInterface;
Packit Service 5a9772
	return TRUE;
Packit Service 5a9772
}
Packit Service 5a9772
Packit Service 5a9772
MSUSB_INTERFACE_DESCRIPTOR* msusb_msinterface_read(wStream* s)
Packit Service 5a9772
{
Packit Service 5a9772
	MSUSB_INTERFACE_DESCRIPTOR* MsInterface;
Packit Service 5a9772
Packit Service 5a9772
	if (Stream_GetRemainingCapacity(s) < 12)
Packit Service 5a9772
		return NULL;
Packit Service 5a9772
Packit Service 5a9772
	MsInterface = msusb_msinterface_new();
Packit Service 5a9772
Packit Service 5a9772
	if (!MsInterface)
Packit Service 5a9772
		return NULL;
Packit Service 5a9772
Packit Service 5a9772
	Stream_Read_UINT16(s, MsInterface->Length);
Packit Service 5a9772
	Stream_Read_UINT16(s, MsInterface->NumberOfPipesExpected);
Packit Service 5a9772
	Stream_Read_UINT8(s, MsInterface->InterfaceNumber);
Packit Service 5a9772
	Stream_Read_UINT8(s, MsInterface->AlternateSetting);
Packit Service 5a9772
	Stream_Seek(s, 2);
Packit Service 5a9772
	Stream_Read_UINT32(s, MsInterface->NumberOfPipes);
Packit Service 5a9772
	MsInterface->InterfaceHandle = 0;
Packit Service 5a9772
	MsInterface->bInterfaceClass = 0;
Packit Service 5a9772
	MsInterface->bInterfaceSubClass = 0;
Packit Service 5a9772
	MsInterface->bInterfaceProtocol = 0;
Packit Service 5a9772
	MsInterface->InitCompleted = 0;
Packit Service 5a9772
	MsInterface->MsPipes = NULL;
Packit Service 5a9772
Packit Service 5a9772
	if (MsInterface->NumberOfPipes > 0)
Packit Service 5a9772
	{
Packit Service 5a9772
		MsInterface->MsPipes = msusb_mspipes_read(s, MsInterface->NumberOfPipes);
Packit Service 5a9772
Packit Service 5a9772
		if (!MsInterface->MsPipes)
Packit Service 5a9772
			goto out_error;
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	return MsInterface;
Packit Service 5a9772
out_error:
Packit Service 5a9772
	msusb_msinterface_free(MsInterface);
Packit Service 5a9772
	return NULL;
Packit Service 5a9772
}
Packit Service 5a9772
Packit Service 5a9772
BOOL msusb_msinterface_write(MSUSB_INTERFACE_DESCRIPTOR* MsInterface, wStream* out)
Packit Service 5a9772
{
Packit Service 5a9772
	MSUSB_PIPE_DESCRIPTOR** MsPipes;
Packit Service 5a9772
	MSUSB_PIPE_DESCRIPTOR* MsPipe;
Packit Service 5a9772
	UINT32 pnum = 0;
Packit Service 5a9772
Packit Service 5a9772
	if (!MsInterface)
Packit Service 5a9772
		return FALSE;
Packit Service 5a9772
Packit Service 5a9772
	if (!Stream_EnsureRemainingCapacity(out, 16 + MsInterface->NumberOfPipes * 20))
Packit Service 5a9772
		return FALSE;
Packit Service 5a9772
Packit Service 5a9772
	/* Length */
Packit Service 5a9772
	Stream_Write_UINT16(out, MsInterface->Length);
Packit Service 5a9772
	/* InterfaceNumber */
Packit Service 5a9772
	Stream_Write_UINT8(out, MsInterface->InterfaceNumber);
Packit Service 5a9772
	/* AlternateSetting */
Packit Service 5a9772
	Stream_Write_UINT8(out, MsInterface->AlternateSetting);
Packit Service 5a9772
	/* bInterfaceClass */
Packit Service 5a9772
	Stream_Write_UINT8(out, MsInterface->bInterfaceClass);
Packit Service 5a9772
	/* bInterfaceSubClass */
Packit Service 5a9772
	Stream_Write_UINT8(out, MsInterface->bInterfaceSubClass);
Packit Service 5a9772
	/* bInterfaceProtocol */
Packit Service 5a9772
	Stream_Write_UINT8(out, MsInterface->bInterfaceProtocol);
Packit Service 5a9772
	/* Padding */
Packit Service 5a9772
	Stream_Write_UINT8(out, 0);
Packit Service 5a9772
	/* InterfaceHandle */
Packit Service 5a9772
	Stream_Write_UINT32(out, MsInterface->InterfaceHandle);
Packit Service 5a9772
	/* NumberOfPipes */
Packit Service 5a9772
	Stream_Write_UINT32(out, MsInterface->NumberOfPipes);
Packit Service 5a9772
	/* Pipes */
Packit Service 5a9772
	MsPipes = MsInterface->MsPipes;
Packit Service 5a9772
Packit Service 5a9772
	for (pnum = 0; pnum < MsInterface->NumberOfPipes; pnum++)
Packit Service 5a9772
	{
Packit Service 5a9772
		MsPipe = MsPipes[pnum];
Packit Service 5a9772
		/* MaximumPacketSize */
Packit Service 5a9772
		Stream_Write_UINT16(out, MsPipe->MaximumPacketSize);
Packit Service 5a9772
		/* EndpointAddress */
Packit Service 5a9772
		Stream_Write_UINT8(out, MsPipe->bEndpointAddress);
Packit Service 5a9772
		/* Interval */
Packit Service 5a9772
		Stream_Write_UINT8(out, MsPipe->bInterval);
Packit Service 5a9772
		/* PipeType */
Packit Service 5a9772
		Stream_Write_UINT32(out, MsPipe->PipeType);
Packit Service 5a9772
		/* PipeHandle */
Packit Service 5a9772
		Stream_Write_UINT32(out, MsPipe->PipeHandle);
Packit Service 5a9772
		/* MaximumTransferSize */
Packit Service 5a9772
		Stream_Write_UINT32(out, MsPipe->MaximumTransferSize);
Packit Service 5a9772
		/* PipeFlags */
Packit Service 5a9772
		Stream_Write_UINT32(out, MsPipe->PipeFlags);
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	return TRUE;
Packit Service 5a9772
}
Packit Service 5a9772
Packit Service 5a9772
static MSUSB_INTERFACE_DESCRIPTOR** msusb_msinterface_read_list(wStream* s, UINT32 NumInterfaces)
Packit Service 5a9772
{
Packit Service 5a9772
	UINT32 inum;
Packit Service 5a9772
	MSUSB_INTERFACE_DESCRIPTOR** MsInterfaces;
Packit Service 5a9772
	MsInterfaces =
Packit Service 5a9772
	    (MSUSB_INTERFACE_DESCRIPTOR**)calloc(NumInterfaces, sizeof(MSUSB_INTERFACE_DESCRIPTOR*));
Packit Service 5a9772
Packit Service 5a9772
	if (!MsInterfaces)
Packit Service 5a9772
		return NULL;
Packit Service 5a9772
Packit Service 5a9772
	for (inum = 0; inum < NumInterfaces; inum++)
Packit Service 5a9772
	{
Packit Service 5a9772
		MsInterfaces[inum] = msusb_msinterface_read(s);
Packit Service 5a9772
Packit Service 5a9772
		if (!MsInterfaces[inum])
Packit Service 5a9772
			goto fail;
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	return MsInterfaces;
Packit Service 5a9772
fail:
Packit Service 5a9772
Packit Service 5a9772
	for (inum = 0; inum < NumInterfaces; inum++)
Packit Service 5a9772
		msusb_msinterface_free(MsInterfaces[inum]);
Packit Service 5a9772
Packit Service 5a9772
	free(MsInterfaces);
Packit Service 5a9772
	return NULL;
Packit Service 5a9772
}
Packit Service 5a9772
Packit Service 5a9772
BOOL msusb_msconfig_write(MSUSB_CONFIG_DESCRIPTOR* MsConfg, wStream* out)
Packit Service 5a9772
{
Packit Service 5a9772
	UINT32 inum = 0;
Packit Service 5a9772
	MSUSB_INTERFACE_DESCRIPTOR** MsInterfaces;
Packit Service 5a9772
	MSUSB_INTERFACE_DESCRIPTOR* MsInterface;
Packit Service 5a9772
Packit Service 5a9772
	if (!MsConfg)
Packit Service 5a9772
		return FALSE;
Packit Service 5a9772
Packit Service 5a9772
	if (!Stream_EnsureRemainingCapacity(out, 8))
Packit Service 5a9772
		return FALSE;
Packit Service 5a9772
Packit Service 5a9772
	/* ConfigurationHandle*/
Packit Service 5a9772
	Stream_Write_UINT32(out, MsConfg->ConfigurationHandle);
Packit Service 5a9772
	/* NumInterfaces*/
Packit Service 5a9772
	Stream_Write_UINT32(out, MsConfg->NumInterfaces);
Packit Service 5a9772
	/* Interfaces */
Packit Service 5a9772
	MsInterfaces = MsConfg->MsInterfaces;
Packit Service 5a9772
Packit Service 5a9772
	for (inum = 0; inum < MsConfg->NumInterfaces; inum++)
Packit Service 5a9772
	{
Packit Service 5a9772
		MsInterface = MsInterfaces[inum];
Packit Service 5a9772
Packit Service 5a9772
		if (!msusb_msinterface_write(MsInterface, out))
Packit Service 5a9772
			return FALSE;
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	return TRUE;
Packit Service 5a9772
}
Packit Service 5a9772
Packit Service 5a9772
MSUSB_CONFIG_DESCRIPTOR* msusb_msconfig_new(void)
Packit Service 5a9772
{
Packit Service 5a9772
	return (MSUSB_CONFIG_DESCRIPTOR*)calloc(1, sizeof(MSUSB_CONFIG_DESCRIPTOR));
Packit Service 5a9772
}
Packit Service 5a9772
Packit Service 5a9772
void msusb_msconfig_free(MSUSB_CONFIG_DESCRIPTOR* MsConfig)
Packit Service 5a9772
{
Packit Service 5a9772
	if (MsConfig)
Packit Service 5a9772
	{
Packit Service 5a9772
		msusb_msinterface_free_list(MsConfig->MsInterfaces, MsConfig->NumInterfaces);
Packit Service 5a9772
		MsConfig->MsInterfaces = NULL;
Packit Service 5a9772
		free(MsConfig);
Packit Service 5a9772
	}
Packit Service 5a9772
}
Packit Service 5a9772
Packit Service 5a9772
MSUSB_CONFIG_DESCRIPTOR* msusb_msconfig_read(wStream* s, UINT32 NumInterfaces)
Packit Service 5a9772
{
Packit Service 5a9772
	MSUSB_CONFIG_DESCRIPTOR* MsConfig;
Packit Service 5a9772
	BYTE lenConfiguration, typeConfiguration;
Packit Service 5a9772
Packit Service 5a9772
	if (Stream_GetRemainingCapacity(s) < 6ULL + NumInterfaces * 2ULL)
Packit Service 5a9772
		return NULL;
Packit Service 5a9772
Packit Service 5a9772
	MsConfig = msusb_msconfig_new();
Packit Service 5a9772
Packit Service 5a9772
	if (!MsConfig)
Packit Service 5a9772
		goto fail;
Packit Service 5a9772
Packit Service 5a9772
	MsConfig->MsInterfaces = msusb_msinterface_read_list(s, NumInterfaces);
Packit Service 5a9772
Packit Service 5a9772
	if (!MsConfig->MsInterfaces)
Packit Service 5a9772
		goto fail;
Packit Service 5a9772
Packit Service 5a9772
	Stream_Read_UINT8(s, lenConfiguration);
Packit Service 5a9772
	Stream_Read_UINT8(s, typeConfiguration);
Packit Service 5a9772
Packit Service 5a9772
	if (lenConfiguration != 0x9 || typeConfiguration != 0x2)
Packit Service 5a9772
	{
Packit Service 5a9772
		WLog_ERR(TAG, "len and type must be 0x9 and 0x2 , but it is 0x%" PRIx8 " and 0x%" PRIx8 "",
Packit Service 5a9772
		         lenConfiguration, typeConfiguration);
Packit Service 5a9772
		goto fail;
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	Stream_Read_UINT16(s, MsConfig->wTotalLength);
Packit Service 5a9772
	Stream_Seek(s, 1);
Packit Service 5a9772
	Stream_Read_UINT8(s, MsConfig->bConfigurationValue);
Packit Service 5a9772
	MsConfig->NumInterfaces = NumInterfaces;
Packit Service 5a9772
	return MsConfig;
Packit Service 5a9772
fail:
Packit Service 5a9772
	msusb_msconfig_free(MsConfig);
Packit Service 5a9772
	return NULL;
Packit Service 5a9772
}
Packit Service 5a9772
Packit Service 5a9772
void msusb_msconfig_dump(MSUSB_CONFIG_DESCRIPTOR* MsConfig)
Packit Service 5a9772
{
Packit Service 5a9772
	MSUSB_INTERFACE_DESCRIPTOR** MsInterfaces;
Packit Service 5a9772
	MSUSB_INTERFACE_DESCRIPTOR* MsInterface;
Packit Service 5a9772
	MSUSB_PIPE_DESCRIPTOR** MsPipes;
Packit Service 5a9772
	MSUSB_PIPE_DESCRIPTOR* MsPipe;
Packit Service 5a9772
	UINT32 inum = 0, pnum = 0;
Packit Service 5a9772
	WLog_INFO(TAG, "=================MsConfig:========================");
Packit Service 5a9772
	WLog_INFO(TAG, "wTotalLength:%" PRIu16 "", MsConfig->wTotalLength);
Packit Service 5a9772
	WLog_INFO(TAG, "bConfigurationValue:%" PRIu8 "", MsConfig->bConfigurationValue);
Packit Service 5a9772
	WLog_INFO(TAG, "ConfigurationHandle:0x%08" PRIx32 "", MsConfig->ConfigurationHandle);
Packit Service 5a9772
	WLog_INFO(TAG, "InitCompleted:%d", MsConfig->InitCompleted);
Packit Service 5a9772
	WLog_INFO(TAG, "MsOutSize:%d", MsConfig->MsOutSize);
Packit Service 5a9772
	WLog_INFO(TAG, "NumInterfaces:%" PRIu32 "", MsConfig->NumInterfaces);
Packit Service 5a9772
	MsInterfaces = MsConfig->MsInterfaces;
Packit Service 5a9772
Packit Service 5a9772
	for (inum = 0; inum < MsConfig->NumInterfaces; inum++)
Packit Service 5a9772
	{
Packit Service 5a9772
		MsInterface = MsInterfaces[inum];
Packit Service 5a9772
		WLog_INFO(TAG, "	Interface: %" PRIu8 "", MsInterface->InterfaceNumber);
Packit Service 5a9772
		WLog_INFO(TAG, "	Length: %" PRIu16 "", MsInterface->Length);
Packit Service 5a9772
		WLog_INFO(TAG, "	NumberOfPipesExpected: %" PRIu16 "",
Packit Service 5a9772
		          MsInterface->NumberOfPipesExpected);
Packit Service 5a9772
		WLog_INFO(TAG, "	AlternateSetting: %" PRIu8 "", MsInterface->AlternateSetting);
Packit Service 5a9772
		WLog_INFO(TAG, "	NumberOfPipes: %" PRIu32 "", MsInterface->NumberOfPipes);
Packit Service 5a9772
		WLog_INFO(TAG, "	InterfaceHandle: 0x%08" PRIx32 "", MsInterface->InterfaceHandle);
Packit Service 5a9772
		WLog_INFO(TAG, "	bInterfaceClass: 0x%02" PRIx8 "", MsInterface->bInterfaceClass);
Packit Service 5a9772
		WLog_INFO(TAG, "	bInterfaceSubClass: 0x%02" PRIx8 "", MsInterface->bInterfaceSubClass);
Packit Service 5a9772
		WLog_INFO(TAG, "	bInterfaceProtocol: 0x%02" PRIx8 "", MsInterface->bInterfaceProtocol);
Packit Service 5a9772
		WLog_INFO(TAG, "	InitCompleted: %d", MsInterface->InitCompleted);
Packit Service 5a9772
		MsPipes = MsInterface->MsPipes;
Packit Service 5a9772
Packit Service 5a9772
		for (pnum = 0; pnum < MsInterface->NumberOfPipes; pnum++)
Packit Service 5a9772
		{
Packit Service 5a9772
			MsPipe = MsPipes[pnum];
Packit Service 5a9772
			WLog_INFO(TAG, "		Pipe: %d", pnum);
Packit Service 5a9772
			WLog_INFO(TAG, "		MaximumPacketSize: 0x%04" PRIx16 "", MsPipe->MaximumPacketSize);
Packit Service 5a9772
			WLog_INFO(TAG, "		MaximumTransferSize: 0x%08" PRIx32 "",
Packit Service 5a9772
			          MsPipe->MaximumTransferSize);
Packit Service 5a9772
			WLog_INFO(TAG, "		PipeFlags: 0x%08" PRIx32 "", MsPipe->PipeFlags);
Packit Service 5a9772
			WLog_INFO(TAG, "		PipeHandle: 0x%08" PRIx32 "", MsPipe->PipeHandle);
Packit Service 5a9772
			WLog_INFO(TAG, "		bEndpointAddress: 0x%02" PRIx8 "", MsPipe->bEndpointAddress);
Packit Service 5a9772
			WLog_INFO(TAG, "		bInterval: %" PRIu8 "", MsPipe->bInterval);
Packit Service 5a9772
			WLog_INFO(TAG, "		PipeType: 0x%02" PRIx8 "", MsPipe->PipeType);
Packit Service 5a9772
			WLog_INFO(TAG, "		InitCompleted: %d", MsPipe->InitCompleted);
Packit Service 5a9772
		}
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	WLog_INFO(TAG, "==================================================");
Packit Service 5a9772
}