Blame libfreerdp/utils/msusb.c

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