1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <ctype.h>
5#include "typeconvert.h"
6#include "usbsock.h"
7#include "wdm-MJMN.h"
8#include "usbdi.h"
9#include "usb.h"
10#include "decode.h"
11#include "urb64.h"
12
13char *MajorFunctionString (PIRP_SAVE irp);
14char *MinorFunctionString (PIRP_SAVE pirp);
15
16#if defined(U2EC_ONPC)
17#	define MAX_PACKET_SIZE MAX_BUF_LEN
18#else
19#	define MAX_PACKET_SIZE 0
20#	undef  MAX_BUFFER_SIZE
21#	define MAX_BUFFER_SIZE 0
22#endif
23
24unsigned char packets[MAX_PACKET_SIZE];
25int plen;
26char pstr[MAX_BUFFER_SIZE];
27char pstr_ascii[MAX_BUFFER_SIZE];
28char pktname[1024];
29
30
31#define IS_IP 	(packets[U2EC_L2_TYPE]==U2EC_L2_TYPE_IP)
32#define IS_TCP 	(packets[U2EC_L3_TYPE]==U2EC_L3_TYPE_TCP)
33#define IS_U2EC_IRP_CLIENT	(packets[U2EC_L3_DST_PORT]==0x0d&&(packets[U2EC_L3_DST_PORT+1]==0xa2||packets[U2EC_L3_DST_PORT+1]==0x42))
34#define IS_U2EC_IRP_SERVER	(packets[U2EC_L3_SRC_PORT]==0x0d&&(packets[U2EC_L3_SRC_PORT+1]==0xa2||packets[U2EC_L3_SRC_PORT+1]==0x42))
35//#define IS_U2EC_IRP_CLIENT	(packets[U2EC_L3_SRC_PORT]==0x04 && packets[U2EC_L3_DST_PORT]==0x0d)		// 3920
36//#define IS_U2EC_IRP_SERVER	(packets[U2EC_L3_SRC_PORT]==0x0d && packets[U2EC_L3_DST_PORT]==0x04)		// 3920
37//#define IS_U2EC_IRP_CLIENT	(packets[U2EC_L3_SRC_PORT+1]==0x84 && packets[U2EC_L3_DST_PORT+1]==0xa2)	// C90
38//#define IS_U2EC_IRP_SERVER	(packets[U2EC_L3_SRC_PORT+1]==0xa2 && packets[U2EC_L3_DST_PORT+1]==0x84)	// C90
39//#define IS_U2EC_IRP_CLIENT	(packets[U2EC_L3_SRC_PORT]==0x04 && packets[U2EC_L3_DST_PORT]==0x0d)		// C90P
40//#define IS_U2EC_IRP_SERVER	(packets[U2EC_L3_SRC_PORT]==0x0d && packets[U2EC_L3_DST_PORT]==0x04)		// C90P
41//#define IS_U2EC_IRP_CLIENT	(packets[U2EC_L3_SRC_PORT]==0x0a && packets[U2EC_L3_DST_PORT]==0x0d)		// C90P2
42//#define IS_U2EC_IRP_SERVER	(packets[U2EC_L3_SRC_PORT]==0x0d && packets[U2EC_L3_DST_PORT]==0x0a)		// C90P2
43//#define IS_U2EC_IRP_CLIENT	(packets[U2EC_L3_SRC_PORT]==0x08 && packets[U2EC_L3_DST_PORT]==0x0d)		// C90C
44//#define IS_U2EC_IRP_SERVER	(packets[U2EC_L3_SRC_PORT]==0x0d && packets[U2EC_L3_DST_PORT]==0x08)		// C90C
45//#define IS_U2EC_IRP_CLIENT	(packets[U2EC_L3_SRC_PORT]==0x04 && packets[U2EC_L3_DST_PORT]==0x0d)		// 5470
46//#define IS_U2EC_IRP_SERVER	(packets[U2EC_L3_SRC_PORT]==0x0d && packets[U2EC_L3_DST_PORT]==0x04)		// 5470
47//#define IS_U2EC_IRP_CLIENT	(packets[U2EC_L3_SRC_PORT]==0x04 && packets[U2EC_L3_DST_PORT]==0x0d)		// 5610
48//#define IS_U2EC_IRP_SERVER	(packets[U2EC_L3_SRC_PORT]==0x0d && packets[U2EC_L3_DST_PORT]==0x04)		// 5610
49#define IS_U2EC_IRP		(IS_U2EC_IRP_CLIENT||IS_U2EC_IRP_SERVER)
50#define IS_U2EC_IRP_CONTENT	(plen >= 158)
51
52void decodeBuf(char *sp, char *buf, int len)
53{
54	int i;
55
56	printf("%sBuffer[%x]:", sp, len);
57	for(i=0;i<len;i++)
58	{
59		if(i%8==0) printf("\n%s%02x", sp, (unsigned char)buf[i]);
60		else printf(" %02x", (unsigned char)buf[i]);
61	}
62	printf("\n");
63}
64
65void inline ppktbuf(char *buf, int size)
66{
67	if(size <= 0)
68		return;
69	int pos;
70	for(pos=0; pos<size; pos++) {
71		if(pos%64 == 0) PDEBUG("\t  ");
72		PDEBUG("%c", (isprint((char)*(buf + pos))) ? (char)*(buf + pos) : '.');
73		if(pos%64 == 63) PDEBUG("\n");
74	}
75	PDEBUG("\n");
76	for(pos=0; pos<size; pos++) {
77		if(pos%16 == 0) PDEBUG("\t");
78		if(pos%8 == 0) PDEBUG("  ");
79		PDEBUG("%2.2x ", (unsigned char)*(buf + pos));
80		if(pos%16 == 15) PDEBUG("\n");
81	}
82	PDEBUG("\n\n");
83}
84
85void inline print_urb(PURB purb)
86{
87	int count;
88	int i;
89	unsigned char *ptr, *urb_ptr;
90	USBD_INTERFACE_INFORMATION *itf;
91
92	PDEBUG("\tURB:\n");
93	PDEBUG("\t  length:	0x%x \n",		purb->UrbHeader.Length);
94	PDEBUG("\t  function:	0x%x \n",		purb->UrbHeader.Function);
95	PDEBUG("\t  status:	0x%x \n",		purb->UrbHeader.Status);
96	PDEBUG("\t  usbdflags:	0x%x \n",		purb->UrbHeader.UsbdFlags);
97
98	switch (purb->UrbHeader.Function){
99	case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
100		PDEBUG("\t  URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE\n");
101		PDEBUG("\t    UrbControlDescriptorRequest.TransferBufferLength: %x\n", purb->UrbControlDescriptorRequest.TransferBufferLength);
102    		PDEBUG("\t    UrbControlDescriptorRequest.Index: %x\n", purb->UrbControlDescriptorRequest.Index);
103    		PDEBUG("\t    UrbControlDescriptorRequest.DescriptorType: %x\n", purb->UrbControlDescriptorRequest.DescriptorType);
104    		PDEBUG("\t    UrbControlDescriptorRequest.LanguageId: %x\n", purb->UrbControlDescriptorRequest.LanguageId);
105    		PDEBUG("\t    UrbControlDescriptorRequest.Reserved: %x\n", (int)purb->UrbControlDescriptorRequest.Reserved);
106    		PDEBUG("\t    UrbControlDescriptorRequest.Reserved0: %x\n", purb->UrbControlDescriptorRequest.Reserved0);
107    		PDEBUG("\t    UrbControlDescriptorRequest.Reserved1: %x\n", purb->UrbControlDescriptorRequest.Reserved1);
108    		PDEBUG("\t    UrbControlDescriptorRequest.Reserved2: %x\n", purb->UrbControlDescriptorRequest.Reserved2);
109    		PDEBUG("\t    UrbControlDescriptorRequest.hca.HcdEndpoint: %x\n", (int)purb->UrbControlDescriptorRequest.hca.HcdEndpoint);
110    		PDEBUG("\t    UrbControlDescriptorRequest.hca.HcdIrp: %x\n", (int)purb->UrbControlDescriptorRequest.hca.HcdIrp);
111    		PDEBUG("\t    UrbControlDescriptorRequest.hca.HcdCurrentIoFlushPointer: %x\n", (int)purb->UrbControlDescriptorRequest.hca.HcdCurrentIoFlushPointer);
112    		PDEBUG("\t    UrbControlDescriptorRequest.hca.HcdExtension: %x\n", (int)purb->UrbControlDescriptorRequest.hca.HcdExtension);
113		break; // end of URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
114	case URB_FUNCTION_SELECT_CONFIGURATION:
115		PDEBUG("\t  URB_FUNCTION_SELECT_CONFIGURATION\n");
116
117#if 0
118		PDEBUG("\t    UrbSelectConfiguration.ConfigurationDescriptor.bLength: %x\n", purb->UrbSelectConfiguration.ConfigurationDescriptor->bLength);
119		PDEBUG("\t    UrbSelectConfiguration.ConfigurationDescriptor.bDescriptorType: %x\n", purb->UrbSelectConfiguration.ConfigurationDescriptor.bDescriptorType);
120		PDEBUG("\t    UrbSelectConfiguration.ConfigurationDescriptor.wTotalLength: %x\n", purb->UrbSelectConfiguration.ConfigurationDescriptor.wTotalLength);
121		PDEBUG("\t    UrbSelectConfiguration.ConfigurationDescriptor.bNumInterfaces: %x\n", purb->UrbSelectConfiguration.ConfigurationDescriptor.bNumInterfaces);
122		PDEBUG("\t    UrbSelectConfiguration.ConfigurationDescriptor.bConfigurationValue: %x\n", purb->UrbSelectConfiguration.ConfigurationDescriptor.bConfigurationValue);
123		PDEBUG("\t    UrbSelectConfiguration.ConfigurationDescriptor.iConfiguration: %x\n", purb->UrbSelectConfiguration.ConfigurationDescriptor.iConfiguration);
124		PDEBUG("\t    UrbSelectConfiguration.ConfigurationDescriptor.bmAttributes: %x\n", purb->UrbSelectConfiguration.ConfigurationDescriptor.bmAttributes);
125		PDEBUG("\t    UrbSelectConfiguration.ConfigurationDescriptor.MaxPower: %x\n", purb->UrbSelectConfiguration.ConfigurationDescriptor.MaxPower);
126#else
127		PDEBUG("\t    UrbSelectConfiguration.ConfigurationDescriptor: %x\n", (int)purb->UrbSelectConfiguration.ConfigurationDescriptor);
128		PDEBUG("\t    UrbSelectConfiguration.ConfigurationHandle: %x\n", (int)purb->UrbSelectConfiguration.ConfigurationHandle);
129#endif
130
131		urb_ptr = (unsigned char*)&purb->UrbSelectConfiguration.ConfigurationDescriptor;
132		ptr = (unsigned char *)&purb->UrbSelectConfiguration.Interface.Length;
133		for(i=0; (ptr-urb_ptr+sizeof(purb->UrbHeader)) < purb->UrbHeader.Length;i++) {
134			itf = (USBD_INTERFACE_INFORMATION *)ptr;
135			ptr += itf->Length;
136			PDEBUG("\t    UrbSelectConfiguration.Interface.Length: %x\n", itf->Length);
137			PDEBUG("\t    UrbSelectConfiguration.Interface.InterfaceNumber: %x\n", itf->InterfaceNumber);
138			PDEBUG("\t    UrbSelectConfiguration.Interface.AlternateSetting: %x\n", itf->AlternateSetting);
139			PDEBUG("\t    UrbSelectConfiguration.Interface.Class: %x\n", itf->Class);
140			PDEBUG("\t    UrbSelectConfiguration.Interface.SubClass: %x\n", itf->SubClass);
141			PDEBUG("\t    UrbSelectConfiguration.Interface.Protocol: %x\n", itf->Protocol);
142			PDEBUG("\t    UrbSelectConfiguration.Interface.Reserved: %x\n", itf->Reserved);
143			PDEBUG("\t    UrbSelectConfiguration.Interface.InterfaceHandle: %x\n", (int)itf->InterfaceHandle);
144			PDEBUG("\t    UrbSelectConfiguration.Interface.NumberOfPipes: %x\n", itf->NumberOfPipes);
145
146			for(count=0;count<itf->NumberOfPipes;count++)
147			{
148				PDEBUG("\t  Pipe : %x\n", count);
149				PDEBUG("\t    UrbSelectConfiguration.Interface.Pipes[%x].MaximumPacketSize: %x\n", count, itf->Pipes[count].MaximumPacketSize);
150				PDEBUG("\t    UrbSelectConfiguration.Interface.Pipes[%x].EndpointAddress: %x\n", count, itf->Pipes[count].EndpointAddress);
151				PDEBUG("\t    UrbSelectConfiguration.Interface.Pipes[%x].Interval: %x\n", count, itf->Pipes[count].Interval);
152				PDEBUG("\t    UrbSelectConfiguration.Interface.Pipes[%x].PipeType: %x\n", count, itf->Pipes[count].PipeType);
153				PDEBUG("\t    UrbSelectConfiguration.Interface.Pipes[%x].PipeHandle: %x\n", count, (int)itf->Pipes[count].PipeHandle);
154				PDEBUG("\t    UrbSelectConfiguration.Interface.Pipes[%x].MaximumTransferSize: %x\n", count, itf->Pipes[count].MaximumTransferSize);
155				PDEBUG("\t    UrbSelectConfiguration.Interface.Pipes[%x].PipeFlags: %x\n", count, itf->Pipes[count].PipeFlags);
156			}
157		}
158		break; // end of URB_FUNCTION_SELECT_CONFIGURATION
159
160	case 0x2a:
161		PDEBUG("\t    URB_FUNCTION_GET_MS_FEATURE_DESCRIPTOR(0x2a)\n");
162		PDEBUG("\t      UrbOsFeatureDescriptorRequest.Reserved: %x\n", (int)purb->UrbControlDescriptorRequest.Reserved);
163		PDEBUG("\t      UrbOsFeatureDescriptorRequest.Reserved0: %x\n", purb->UrbControlDescriptorRequest.Reserved0);
164		PDEBUG("\t      UrbOsFeatureDescriptorRequest.TransferBufferLength: %x\n", purb->UrbControlDescriptorRequest.TransferBufferLength);
165		PDEBUG("\t      UrbOsFeatureDescriptorRequest.TransferBuffer: %x\n", (int)purb->UrbControlDescriptorRequest.TransferBuffer);
166		PDEBUG("\t      UrbOsFeatureDescriptorRequest.TransferBufferMDL: %x\n", (int)purb->UrbControlDescriptorRequest.TransferBufferMDL);
167		PDEBUG("\t      UrbOsFeatureDescriptorRequest.Recipient & Reserved1 & Reserved 2: %x\n", purb->UrbControlDescriptorRequest.Reserved1);
168		PDEBUG("\t      UrbOsFeatureDescriptorRequest.InterfaceNumber: %x\n", purb->UrbControlDescriptorRequest.Index);
169		PDEBUG("\t      UrbOsFeatureDescriptorRequest.MS_PageIdex: %x\n", purb->UrbControlDescriptorRequest.DescriptorType);
170		PDEBUG("\t      UrbOsFeatureDescriptorRequest.MS_FeatureDescriptorIndex: %x\n", purb->UrbControlDescriptorRequest.LanguageId);
171		PDEBUG("\t      UrbOsFeatureDescriptorRequest.Reserved3: %x\n", purb->UrbControlDescriptorRequest.Reserved2);
172		break;
173
174	case URB_FUNCTION_SELECT_INTERFACE:     // 0x0001
175		PDEBUG("\t  URB_FUNCTION_SELECT_INTERFACE\n");
176		PDEBUG("\t    UrbSelectInterface.Interface.Length: %x\n", purb->UrbSelectInterface.Interface.Length);
177		PDEBUG("\t    UrbSelectInterface.Interface.InterfaceNumber: %x\n", purb->UrbSelectInterface.Interface.InterfaceNumber);
178		PDEBUG("\t    UrbSelectInterface.Interface.AlternateSetting: %x\n", purb->UrbSelectInterface.Interface.AlternateSetting);
179		PDEBUG("\t    UrbSelectInterface.Interface.Class: %x\n", purb->UrbSelectInterface.Interface.Class);
180		PDEBUG("\t    UrbSelectInterface.Interface.SubClass: %x\n", purb->UrbSelectInterface.Interface.SubClass);
181		PDEBUG("\t    UrbSelectInterface.Interface.Protocol: %x\n", purb->UrbSelectInterface.Interface.Protocol);
182		PDEBUG("\t    UrbSelectInterface.Interface.Reserved: %x\n", purb->UrbSelectInterface.Interface.Reserved);
183		PDEBUG("\t    UrbSelectInterface.Interface.InterfaceHandle: %x\n", (int)purb->UrbSelectInterface.Interface.InterfaceHandle);
184		PDEBUG("\t    UrbSelectInterface.Interface.NumberOfPipes: %x\n", purb->UrbSelectInterface.Interface.NumberOfPipes);
185
186		for(count=0;count<purb->UrbSelectInterface.Interface.NumberOfPipes;count++)
187		{
188			PDEBUG("\t  Pipe : %x\n", count);
189			PDEBUG("\t    UrbSelectInterface.Interface.Pipes[%x].PipeType: %x\n", count, purb->UrbSelectInterface.Interface.Pipes[count].PipeType);
190			PDEBUG("\t    UrbSelectInterface.Interface.Pipes[%x].PipeHandle: %x\n", count, (int)purb->UrbSelectInterface.Interface.Pipes[count].PipeHandle);
191			PDEBUG("\t    UrbSelectInterface.Interface.Pipes[%x].MaximumTransferSize: %x\n", count, purb->UrbSelectInterface.Interface.Pipes[count].MaximumTransferSize);
192			PDEBUG("\t    UrbSelectInterface.Interface.Pipes[%x].PipeFlags: %x\n", count, purb->UrbSelectInterface.Interface.Pipes[count].PipeFlags);
193			PDEBUG("\t    UrbSelectInterface.Interface.Pipes[%x].MaximumPacketSize: %x\n", count, purb->UrbSelectInterface.Interface.Pipes[count].MaximumPacketSize);
194			PDEBUG("\t    UrbSelectInterface.Interface.Pipes[%x].EndpointAddress: %x\n", count, purb->UrbSelectInterface.Interface.Pipes[count].EndpointAddress);
195			PDEBUG("\t    UrbSelectInterface.Interface.Pipes[%x].Interval: %x\n", count, purb->UrbSelectInterface.Interface.Pipes[count].Interval);
196		}
197		break; // URB_FUNCTION_SELECT_INTERFACE                0x0001
198
199	case URB_FUNCTION_CONTROL_TRANSFER:     // 0x0008
200		PDEBUG("\t  URB_FUNCTION_CONTROL_TRANSFER\n");
201		PDEBUG("\t    UrbControlTransfer.PipeHandle: %x\n", (int)purb->UrbControlTransfer.PipeHandle);
202		PDEBUG("\t    UrbControlTransfer.TransferFlags: %x\n", purb->UrbControlTransfer.TransferFlags);
203		PDEBUG("\t    UrbControlTransfer.TransferBufferLength: %x\n", purb->UrbControlTransfer.TransferBufferLength);
204		PDEBUG("\t    UrbControlTransfer.TransferBuffer: %x\n", (int)purb->UrbControlTransfer.TransferBuffer);
205		PDEBUG("\t    UrbControlTransfer.TransferBufferMDL: %x\n", (int)purb->UrbControlTransfer.TransferBufferMDL);
206		PDEBUG("\t    UrbControlTransfer.UrbLink: %x\n", (int)purb->UrbControlTransfer.UrbLink);
207		PDEBUG("\t    UrbControlTransfer.SetupPacket:");
208
209
210		for(count=0;count<8;count++)
211		{
212			PDEBUG("%02x", purb->UrbControlTransfer.SetupPacket[count]);
213		}
214		PDEBUG("\n");
215		break;
216
217	case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:     // 0x0009
218		PDEBUG("\t  URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER\n");
219		PDEBUG("\t    UrbBulkOrInterruptTransfer.PipeHandle: %x\n", (int)purb->UrbBulkOrInterruptTransfer.PipeHandle);
220		PDEBUG("\t    UrbBulkOrInterruptTransfer.TransferFlags: %x\n", purb->UrbBulkOrInterruptTransfer.TransferFlags);
221		PDEBUG("\t    UrbBulkOrInterruptTransfer.TransferBufferLength: %x\n", purb->UrbBulkOrInterruptTransfer.TransferBufferLength);
222		PDEBUG("\t    UrbBulkOrInterruptTransfer.TransferBuffer: %x\n", (int)purb->UrbBulkOrInterruptTransfer.TransferBuffer);
223		PDEBUG("\t    UrbBulkOrInterruptTransfer.TransferBufferMDL: %x\n", (int)purb->UrbBulkOrInterruptTransfer.TransferBufferMDL);
224		PDEBUG("\t    UrbBulkOrInterruptTransfer.UrbLink: %x\n", (int)purb->UrbBulkOrInterruptTransfer.UrbLink);
225    		PDEBUG("\t    UrbBulkOrInterruptTransfer.hca.HcdEndpoint: %x\n", (int)purb->UrbBulkOrInterruptTransfer.hca.HcdEndpoint);
226    		PDEBUG("\t    UrbBulkOrInterruptTransfer.hca.HcdIrp: %x\n", (int)purb->UrbBulkOrInterruptTransfer.hca.HcdIrp);
227    		PDEBUG("\t    UrbBulkOrInterruptTransfer.hca.HcdCurrentIoFlushPointer: %x\n", (int)purb->UrbBulkOrInterruptTransfer.hca.HcdCurrentIoFlushPointer);
228    		PDEBUG("\t    UrbBulkOrInterruptTransfer.hca.HcdExtension: %x\n", (int)purb->UrbBulkOrInterruptTransfer.hca.HcdExtension);
229		break;
230
231	case URB_FUNCTION_VENDOR_DEVICE:
232	case URB_FUNCTION_VENDOR_INTERFACE:
233	case URB_FUNCTION_VENDOR_ENDPOINT:
234	case URB_FUNCTION_VENDOR_OTHER:
235	case URB_FUNCTION_CLASS_DEVICE:
236	case URB_FUNCTION_CLASS_INTERFACE:
237	case URB_FUNCTION_CLASS_ENDPOINT:
238	case URB_FUNCTION_CLASS_OTHER:
239		if(purb->UrbHeader.Function==URB_FUNCTION_VENDOR_DEVICE)
240			PDEBUG("\t      URB_FUNCTION_VENDOR_DEVICE\n");
241		if(purb->UrbHeader.Function==URB_FUNCTION_VENDOR_INTERFACE)
242			PDEBUG("\t      URB_FUNCTION_VENDOR_INTERFACE\n");
243		if(purb->UrbHeader.Function==URB_FUNCTION_VENDOR_ENDPOINT)
244			PDEBUG("\t      URB_FUNCTION_VENDOR_ENDPOINT\n");
245		if(purb->UrbHeader.Function==URB_FUNCTION_VENDOR_OTHER)
246			PDEBUG("\t      URB_FUNCTION_VENDOR_OTHER\n");
247		if(purb->UrbHeader.Function==URB_FUNCTION_CLASS_DEVICE)
248			PDEBUG("\t      URB_FUNCTION_CLASS_DEVICE\n");
249		if(purb->UrbHeader.Function==URB_FUNCTION_CLASS_INTERFACE)
250			PDEBUG("\t      URB_FUNCTION_CLASS_INTERFACE\n");
251		if(purb->UrbHeader.Function==URB_FUNCTION_CLASS_ENDPOINT)
252			PDEBUG("\t      URB_FUNCTION_CLASS_ENDPOINT\n");
253		if(purb->UrbHeader.Function==URB_FUNCTION_CLASS_OTHER)
254			PDEBUG("\t      URB_FUNCTION_CLASS_OTHER\n");
255		PDEBUG("\t    UrbControlVendorClassRequest.Reserved: %x\n", (int)purb->UrbControlVendorClassRequest.Reserved);
256		PDEBUG("\t    UrbControlVendorClassRequest.TransferFlags: %x\n", purb->UrbControlVendorClassRequest.TransferFlags);
257		PDEBUG("\t    UrbControlVendorClassRequest.TransferBufferLength: %x\n", purb->UrbControlVendorClassRequest.TransferBufferLength);
258		PDEBUG("\t    UrbControlVendorClassRequest.TransferBuffer: %x\n", (int)purb->UrbControlVendorClassRequest.TransferBuffer);
259		PDEBUG("\t    UrbControlVendorClassRequest.TransferBufferMDL: %x\n", (int)purb->UrbControlVendorClassRequest.TransferBufferMDL);
260		PDEBUG("\t    UrbControlVendorClassRequest.UrbLink: %x\n", (int)purb->UrbControlVendorClassRequest.UrbLink);
261		PDEBUG("\t    UrbControlVendorClassRequest.RequestTypeReservedBits: %x\n", purb->UrbControlVendorClassRequest.RequestTypeReservedBits);
262		PDEBUG("\t    UrbControlVendorClassRequest.Request: %x\n", purb->UrbControlVendorClassRequest.Request);
263		PDEBUG("\t    UrbControlVendorClassRequest.Value: %x\n", purb->UrbControlVendorClassRequest.Value);
264		PDEBUG("\t    UrbControlVendorClassRequest.Index: %x\n", purb->UrbControlVendorClassRequest.Index);
265		PDEBUG("\t    UrbControlVendorClassRequest.Reserved1: %x\n", purb->UrbControlVendorClassRequest.Reserved1);
266		break;
267
268	default:
269		PDEBUG("\t  Unknown URB(%x)\n", purb->UrbHeader.Function);
270		break;
271	}
272}
273
274void inline print_urb_64(PURB_64 purb)
275{
276	int count;
277	int i;
278	unsigned char *ptr, *urb_ptr;
279	USBD_INTERFACE_INFORMATION_64 *itf;
280
281	PDEBUG("\tURB_64:\n");
282	PDEBUG("\t  length:	0x%x \n",		purb->UrbHeader.Length);
283	PDEBUG("\t  function:	0x%x \n",		purb->UrbHeader.Function);
284	PDEBUG("\t  status:	0x%x \n",		purb->UrbHeader.Status);
285	PDEBUG("\t  usbdflags:	0x%x \n",		purb->UrbHeader.UsbdFlags);
286
287	switch (purb->UrbHeader.Function){
288	case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
289		PDEBUG("\t  URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE\n");
290		PDEBUG("\t    UrbControlDescriptorRequest.TransferBufferLength: %x\n", purb->UrbControlDescriptorRequest.TransferBufferLength);
291    		PDEBUG("\t    UrbControlDescriptorRequest.Index: %x\n", purb->UrbControlDescriptorRequest.Index);
292    		PDEBUG("\t    UrbControlDescriptorRequest.DescriptorType: %x\n", purb->UrbControlDescriptorRequest.DescriptorType);
293    		PDEBUG("\t    UrbControlDescriptorRequest.LanguageId: %x\n", purb->UrbControlDescriptorRequest.LanguageId);
294    		PDEBUG("\t    UrbControlDescriptorRequest.Reserved: %x\n", (int)purb->UrbControlDescriptorRequest.Reserved);
295    		PDEBUG("\t    UrbControlDescriptorRequest.Reserved0: %x\n", purb->UrbControlDescriptorRequest.Reserved0);
296    		PDEBUG("\t    UrbControlDescriptorRequest.Reserved1: %x\n", purb->UrbControlDescriptorRequest.Reserved1);
297    		PDEBUG("\t    UrbControlDescriptorRequest.Reserved2: %x\n", purb->UrbControlDescriptorRequest.Reserved2);
298    		//PDEBUG("\t    UrbControlDescriptorRequest.hca.HcdEndpoint: %x\n", (int)purb->UrbControlDescriptorRequest.hca.HcdEndpoint);
299    		//PDEBUG("\t    UrbControlDescriptorRequest.hca.HcdIrp: %x\n", (int)purb->UrbControlDescriptorRequest.hca.HcdIrp);
300    		//PDEBUG("\t    UrbControlDescriptorRequest.hca.HcdCurrentIoFlushPointer: %x\n", (int)purb->UrbControlDescriptorRequest.hca.HcdCurrentIoFlushPointer);
301    		//PDEBUG("\t    UrbControlDescriptorRequest.hca.HcdExtension: %x\n", (int)purb->UrbControlDescriptorRequest.hca.HcdExtension);
302		break; // end of URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
303	case URB_FUNCTION_SELECT_CONFIGURATION:
304		PDEBUG("\t  URB_FUNCTION_SELECT_CONFIGURATION\n");
305
306#if 0
307		PDEBUG("\t    UrbSelectConfiguration.ConfigurationDescriptor.bLength: %x\n", purb->UrbSelectConfiguration.ConfigurationDescriptor->bLength);
308		PDEBUG("\t    UrbSelectConfiguration.ConfigurationDescriptor.bDescriptorType: %x\n", purb->UrbSelectConfiguration.ConfigurationDescriptor.bDescriptorType);
309		PDEBUG("\t    UrbSelectConfiguration.ConfigurationDescriptor.wTotalLength: %x\n", purb->UrbSelectConfiguration.ConfigurationDescriptor.wTotalLength);
310		PDEBUG("\t    UrbSelectConfiguration.ConfigurationDescriptor.bNumInterfaces: %x\n", purb->UrbSelectConfiguration.ConfigurationDescriptor.bNumInterfaces);
311		PDEBUG("\t    UrbSelectConfiguration.ConfigurationDescriptor.bConfigurationValue: %x\n", purb->UrbSelectConfiguration.ConfigurationDescriptor.bConfigurationValue);
312		PDEBUG("\t    UrbSelectConfiguration.ConfigurationDescriptor.iConfiguration: %x\n", purb->UrbSelectConfiguration.ConfigurationDescriptor.iConfiguration);
313		PDEBUG("\t    UrbSelectConfiguration.ConfigurationDescriptor.bmAttributes: %x\n", purb->UrbSelectConfiguration.ConfigurationDescriptor.bmAttributes);
314		PDEBUG("\t    UrbSelectConfiguration.ConfigurationDescriptor.MaxPower: %x\n", purb->UrbSelectConfiguration.ConfigurationDescriptor.MaxPower);
315#else
316		PDEBUG("\t    UrbSelectConfiguration.ConfigurationDescriptor: %x\n", (int)purb->UrbSelectConfiguration.ConfigurationDescriptor);
317		PDEBUG("\t    UrbSelectConfiguration.ConfigurationHandle: %x\n", (int)purb->UrbSelectConfiguration.ConfigurationHandle);
318#endif
319
320		urb_ptr = (unsigned char*)&purb->UrbSelectConfiguration.ConfigurationDescriptor;
321		ptr = (unsigned char *)&purb->UrbSelectConfiguration.Interface.Length;
322		for(i=0; (ptr-urb_ptr+sizeof(purb->UrbHeader)) < purb->UrbHeader.Length;i++) {
323			itf = (USBD_INTERFACE_INFORMATION_64 *)ptr;
324			ptr += itf->Length;
325			PDEBUG("\t    UrbSelectConfiguration.Interface.Length: %x\n", itf->Length);
326			PDEBUG("\t    UrbSelectConfiguration.Interface.InterfaceNumber: %x\n", itf->InterfaceNumber);
327			PDEBUG("\t    UrbSelectConfiguration.Interface.AlternateSetting: %x\n", itf->AlternateSetting);
328			PDEBUG("\t    UrbSelectConfiguration.Interface.Class: %x\n", itf->Class);
329			PDEBUG("\t    UrbSelectConfiguration.Interface.SubClass: %x\n", itf->SubClass);
330			PDEBUG("\t    UrbSelectConfiguration.Interface.Protocol: %x\n", itf->Protocol);
331			PDEBUG("\t    UrbSelectConfiguration.Interface.Reserved: %x\n", itf->Reserved);
332			PDEBUG("\t    UrbSelectConfiguration.Interface.InterfaceHandle: %x\n", (int)itf->InterfaceHandle);
333			PDEBUG("\t    UrbSelectConfiguration.Interface.NumberOfPipes: %x\n", itf->NumberOfPipes);
334
335			for(count=0;count<itf->NumberOfPipes;count++)
336			{
337				PDEBUG("\t  Pipe : %x\n", count);
338				PDEBUG("\t    UrbSelectConfiguration.Interface.Pipes[%x].MaximumPacketSize: %x\n", count, itf->Pipes[count].MaximumPacketSize);
339				PDEBUG("\t    UrbSelectConfiguration.Interface.Pipes[%x].EndpointAddress: %x\n", count, itf->Pipes[count].EndpointAddress);
340				PDEBUG("\t    UrbSelectConfiguration.Interface.Pipes[%x].Interval: %x\n", count, itf->Pipes[count].Interval);
341				PDEBUG("\t    UrbSelectConfiguration.Interface.Pipes[%x].PipeType: %x\n", count, itf->Pipes[count].PipeType);
342				PDEBUG("\t    UrbSelectConfiguration.Interface.Pipes[%x].PipeHandle: %x\n", count, (int)itf->Pipes[count].PipeHandle);
343				PDEBUG("\t    UrbSelectConfiguration.Interface.Pipes[%x].MaximumTransferSize: %x\n", count, itf->Pipes[count].MaximumTransferSize);
344				PDEBUG("\t    UrbSelectConfiguration.Interface.Pipes[%x].PipeFlags: %x\n", count, itf->Pipes[count].PipeFlags);
345			}
346		}
347		break; // end of URB_FUNCTION_SELECT_CONFIGURATION
348
349	case 0x2a:
350		PDEBUG("\t    URB_FUNCTION_GET_MS_FEATURE_DESCRIPTOR(0x2a)\n");
351		PDEBUG("\t      UrbOsFeatureDescriptorRequest.Reserved: %x\n", (int)purb->UrbControlDescriptorRequest.Reserved);
352		PDEBUG("\t      UrbOsFeatureDescriptorRequest.Reserved0: %x\n", purb->UrbControlDescriptorRequest.Reserved0);
353		PDEBUG("\t      UrbOsFeatureDescriptorRequest.TransferBufferLength: %x\n", purb->UrbControlDescriptorRequest.TransferBufferLength);
354		PDEBUG("\t      UrbOsFeatureDescriptorRequest.TransferBuffer: %x\n", (int)purb->UrbControlDescriptorRequest.TransferBuffer);
355		PDEBUG("\t      UrbOsFeatureDescriptorRequest.TransferBufferMDL: %x\n", (int)purb->UrbControlDescriptorRequest.TransferBufferMDL);
356		PDEBUG("\t      UrbOsFeatureDescriptorRequest.Recipient & Reserved1 & Reserved 2: %x\n", purb->UrbControlDescriptorRequest.Reserved1);
357		PDEBUG("\t      UrbOsFeatureDescriptorRequest.InterfaceNumber: %x\n", purb->UrbControlDescriptorRequest.Index);
358		PDEBUG("\t      UrbOsFeatureDescriptorRequest.MS_PageIdex: %x\n", purb->UrbControlDescriptorRequest.DescriptorType);
359		PDEBUG("\t      UrbOsFeatureDescriptorRequest.MS_FeatureDescriptorIndex: %x\n", purb->UrbControlDescriptorRequest.LanguageId);
360		PDEBUG("\t      UrbOsFeatureDescriptorRequest.Reserved3: %x\n", purb->UrbControlDescriptorRequest.Reserved2);
361		break;
362
363	case URB_FUNCTION_SELECT_INTERFACE:     // 0x0001
364		PDEBUG("\t  URB_FUNCTION_SELECT_INTERFACE\n");
365		PDEBUG("\t    UrbSelectInterface.Interface.Length: %x\n", purb->UrbSelectInterface.Interface.Length);
366		PDEBUG("\t    UrbSelectInterface.Interface.InterfaceNumber: %x\n", purb->UrbSelectInterface.Interface.InterfaceNumber);
367		PDEBUG("\t    UrbSelectInterface.Interface.AlternateSetting: %x\n", purb->UrbSelectInterface.Interface.AlternateSetting);
368		PDEBUG("\t    UrbSelectInterface.Interface.Class: %x\n", purb->UrbSelectInterface.Interface.Class);
369		PDEBUG("\t    UrbSelectInterface.Interface.SubClass: %x\n", purb->UrbSelectInterface.Interface.SubClass);
370		PDEBUG("\t    UrbSelectInterface.Interface.Protocol: %x\n", purb->UrbSelectInterface.Interface.Protocol);
371		PDEBUG("\t    UrbSelectInterface.Interface.Reserved: %x\n", purb->UrbSelectInterface.Interface.Reserved);
372		PDEBUG("\t    UrbSelectInterface.Interface.InterfaceHandle: %x\n", (int)purb->UrbSelectInterface.Interface.InterfaceHandle);
373		PDEBUG("\t    UrbSelectInterface.Interface.NumberOfPipes: %x\n", purb->UrbSelectInterface.Interface.NumberOfPipes);
374
375		for(count=0;count<purb->UrbSelectInterface.Interface.NumberOfPipes;count++)
376		{
377			PDEBUG("\t  Pipe : %x\n", count);
378			PDEBUG("\t    UrbSelectInterface.Interface.Pipes[%x].PipeType: %x\n", count, purb->UrbSelectInterface.Interface.Pipes[count].PipeType);
379			PDEBUG("\t    UrbSelectInterface.Interface.Pipes[%x].PipeHandle: %x\n", count, (int)purb->UrbSelectInterface.Interface.Pipes[count].PipeHandle);
380			PDEBUG("\t    UrbSelectInterface.Interface.Pipes[%x].MaximumTransferSize: %x\n", count, purb->UrbSelectInterface.Interface.Pipes[count].MaximumTransferSize);
381			PDEBUG("\t    UrbSelectInterface.Interface.Pipes[%x].PipeFlags: %x\n", count, purb->UrbSelectInterface.Interface.Pipes[count].PipeFlags);
382			PDEBUG("\t    UrbSelectInterface.Interface.Pipes[%x].MaximumPacketSize: %x\n", count, purb->UrbSelectInterface.Interface.Pipes[count].MaximumPacketSize);
383			PDEBUG("\t    UrbSelectInterface.Interface.Pipes[%x].EndpointAddress: %x\n", count, purb->UrbSelectInterface.Interface.Pipes[count].EndpointAddress);
384			PDEBUG("\t    UrbSelectInterface.Interface.Pipes[%x].Interval: %x\n", count, purb->UrbSelectInterface.Interface.Pipes[count].Interval);
385		}
386		break; // URB_FUNCTION_SELECT_INTERFACE                0x0001
387
388	case URB_FUNCTION_CONTROL_TRANSFER:     // 0x0008
389		PDEBUG("\t  URB_FUNCTION_CONTROL_TRANSFER\n");
390		PDEBUG("\t    UrbControlTransfer.PipeHandle: %x\n", (int)purb->UrbControlTransfer.PipeHandle);
391		PDEBUG("\t    UrbControlTransfer.TransferFlags: %x\n", purb->UrbControlTransfer.TransferFlags);
392		PDEBUG("\t    UrbControlTransfer.TransferBufferLength: %x\n", purb->UrbControlTransfer.TransferBufferLength);
393		PDEBUG("\t    UrbControlTransfer.TransferBuffer: %x\n", (int)purb->UrbControlTransfer.TransferBuffer);
394		PDEBUG("\t    UrbControlTransfer.TransferBufferMDL: %x\n", (int)purb->UrbControlTransfer.TransferBufferMDL);
395		PDEBUG("\t    UrbControlTransfer.UrbLink: %x\n", (int)purb->UrbControlTransfer.UrbLink);
396		PDEBUG("\t    UrbControlTransfer.SetupPacket:");
397
398
399		for(count=0;count<8;count++)
400		{
401			PDEBUG("%02x", purb->UrbControlTransfer.SetupPacket[count]);
402		}
403		PDEBUG("\n");
404		break;
405
406	case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:     // 0x0009
407		PDEBUG("\t  URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER\n");
408		PDEBUG("\t    UrbBulkOrInterruptTransfer.PipeHandle: %x\n", (int)purb->UrbBulkOrInterruptTransfer.PipeHandle);
409		PDEBUG("\t    UrbBulkOrInterruptTransfer.TransferFlags: %x\n", purb->UrbBulkOrInterruptTransfer.TransferFlags);
410		PDEBUG("\t    UrbBulkOrInterruptTransfer.TransferBufferLength: %x\n", purb->UrbBulkOrInterruptTransfer.TransferBufferLength);
411		PDEBUG("\t    UrbBulkOrInterruptTransfer.TransferBuffer: %x\n", (int)purb->UrbBulkOrInterruptTransfer.TransferBuffer);
412		PDEBUG("\t    UrbBulkOrInterruptTransfer.TransferBufferMDL: %x\n", (int)purb->UrbBulkOrInterruptTransfer.TransferBufferMDL);
413		PDEBUG("\t    UrbBulkOrInterruptTransfer.UrbLink: %x\n", (int)purb->UrbBulkOrInterruptTransfer.UrbLink);
414    		//PDEBUG("\t    UrbBulkOrInterruptTransfer.hca.HcdEndpoint: %x\n", (int)purb->UrbBulkOrInterruptTransfer.hca.HcdEndpoint);
415    		//PDEBUG("\t    UrbBulkOrInterruptTransfer.hca.HcdIrp: %x\n", (int)purb->UrbBulkOrInterruptTransfer.hca.HcdIrp);
416    		//PDEBUG("\t    UrbBulkOrInterruptTransfer.hca.HcdCurrentIoFlushPointer: %x\n", (int)purb->UrbBulkOrInterruptTransfer.hca.HcdCurrentIoFlushPointer);
417    		//PDEBUG("\t    UrbBulkOrInterruptTransfer.hca.HcdExtension: %x\n", (int)purb->UrbBulkOrInterruptTransfer.hca.HcdExtension);
418		break;
419
420	case URB_FUNCTION_VENDOR_DEVICE:
421	case URB_FUNCTION_VENDOR_INTERFACE:
422	case URB_FUNCTION_VENDOR_ENDPOINT:
423	case URB_FUNCTION_VENDOR_OTHER:
424	case URB_FUNCTION_CLASS_DEVICE:
425	case URB_FUNCTION_CLASS_INTERFACE:
426	case URB_FUNCTION_CLASS_ENDPOINT:
427	case URB_FUNCTION_CLASS_OTHER:
428		if(purb->UrbHeader.Function==URB_FUNCTION_VENDOR_DEVICE)
429			PDEBUG("\t      URB_FUNCTION_VENDOR_DEVICE\n");
430		if(purb->UrbHeader.Function==URB_FUNCTION_VENDOR_INTERFACE)
431			PDEBUG("\t      URB_FUNCTION_VENDOR_INTERFACE\n");
432		if(purb->UrbHeader.Function==URB_FUNCTION_VENDOR_ENDPOINT)
433			PDEBUG("\t      URB_FUNCTION_VENDOR_ENDPOINT\n");
434		if(purb->UrbHeader.Function==URB_FUNCTION_VENDOR_OTHER)
435			PDEBUG("\t      URB_FUNCTION_VENDOR_OTHER\n");
436		if(purb->UrbHeader.Function==URB_FUNCTION_CLASS_DEVICE)
437			PDEBUG("\t      URB_FUNCTION_CLASS_DEVICE\n");
438		if(purb->UrbHeader.Function==URB_FUNCTION_CLASS_INTERFACE)
439			PDEBUG("\t      URB_FUNCTION_CLASS_INTERFACE\n");
440		if(purb->UrbHeader.Function==URB_FUNCTION_CLASS_ENDPOINT)
441			PDEBUG("\t      URB_FUNCTION_CLASS_ENDPOINT\n");
442		if(purb->UrbHeader.Function==URB_FUNCTION_CLASS_OTHER)
443			PDEBUG("\t      URB_FUNCTION_CLASS_OTHER\n");
444		PDEBUG("\t    UrbControlVendorClassRequest.Reserved: %x\n", (int)purb->UrbControlVendorClassRequest.Reserved);
445		PDEBUG("\t    UrbControlVendorClassRequest.TransferFlags: %x\n", purb->UrbControlVendorClassRequest.TransferFlags);
446		PDEBUG("\t    UrbControlVendorClassRequest.TransferBufferLength: %x\n", purb->UrbControlVendorClassRequest.TransferBufferLength);
447		PDEBUG("\t    UrbControlVendorClassRequest.TransferBuffer: %x\n", (int)purb->UrbControlVendorClassRequest.TransferBuffer);
448		PDEBUG("\t    UrbControlVendorClassRequest.TransferBufferMDL: %x\n", (int)purb->UrbControlVendorClassRequest.TransferBufferMDL);
449		PDEBUG("\t    UrbControlVendorClassRequest.UrbLink: %x\n", (int)purb->UrbControlVendorClassRequest.UrbLink);
450		PDEBUG("\t    UrbControlVendorClassRequest.RequestTypeReservedBits: %x\n", purb->UrbControlVendorClassRequest.RequestTypeReservedBits);
451		PDEBUG("\t    UrbControlVendorClassRequest.Request: %x\n", purb->UrbControlVendorClassRequest.Request);
452		PDEBUG("\t    UrbControlVendorClassRequest.Value: %x\n", purb->UrbControlVendorClassRequest.Value);
453		PDEBUG("\t    UrbControlVendorClassRequest.Index: %x\n", purb->UrbControlVendorClassRequest.Index);
454		PDEBUG("\t    UrbControlVendorClassRequest.Reserved1: %x\n", purb->UrbControlVendorClassRequest.Reserved1);
455		break;
456
457	default:
458		PDEBUG("\t  Unknown URB(%x)\n", purb->UrbHeader.Function);
459		break;
460	}
461}
462
463
464
465void decodeURB(PURB purb, char *sp)
466{
467	int count;
468	int i;
469	unsigned char *ptr, *urb_ptr;
470	USBD_INTERFACE_INFORMATION *itf;
471
472	printf("%sURB Len:%x\n", sp, purb->UrbHeader.Length);
473	printf("%sURB Fun:%x\n", sp, purb->UrbHeader.Function);
474	printf("%sURB Sts:%x\n", sp, purb->UrbHeader.Status);
475	printf("%sURB DevHnd:%x\n", sp, (int)purb->UrbHeader.UsbdDeviceHandle);
476	printf("%sURB Flg:%x\n", sp, purb->UrbHeader.UsbdFlags);
477
478	switch (purb->UrbHeader.Function){
479	case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
480		printf("\n%sURB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE\n", sp);
481		printf("%sUrbControlDescriptorRequest.TransferBufferLength: %x\n", sp, purb->UrbControlDescriptorRequest.TransferBufferLength);
482    		printf("%sUrbControlDescriptorRequest.Index: %x\n", sp, purb->UrbControlDescriptorRequest.Index);
483    		printf("%sUrbControlDescriptorRequest.DescriptorType: %x\n", sp, purb->UrbControlDescriptorRequest.DescriptorType);
484    		printf("%sUrbControlDescriptorRequest.LanguageId: %x\n", sp, purb->UrbControlDescriptorRequest.LanguageId);
485    		printf("%sUrbControlDescriptorRequest.Reserved: %x\n", sp, (int)purb->UrbControlDescriptorRequest.Reserved);
486    		printf("%sUrbControlDescriptorRequest.Reserved0: %x\n", sp, purb->UrbControlDescriptorRequest.Reserved0);
487    		printf("%sUrbControlDescriptorRequest.Reserved1: %x\n", sp, purb->UrbControlDescriptorRequest.Reserved1);
488    		printf("%sUrbControlDescriptorRequest.Reserved2: %x\n", sp, purb->UrbControlDescriptorRequest.Reserved2);
489    		printf("%sUrbControlDescriptorRequest.hca.HcdEndpoint: %x\n", sp, (int)purb->UrbControlDescriptorRequest.hca.HcdEndpoint);
490    		printf("%sUrbControlDescriptorRequest.hca.HcdIrp: %x\n", sp, (int)purb->UrbControlDescriptorRequest.hca.HcdIrp);
491    		printf("%sUrbControlDescriptorRequest.hca.HcdCurrentIoFlushPointer: %x\n", sp, (int)purb->UrbControlDescriptorRequest.hca.HcdCurrentIoFlushPointer);
492    		printf("%sUrbControlDescriptorRequest.hca.HcdExtension: %x\n", sp, (int)purb->UrbControlDescriptorRequest.hca.HcdExtension);
493		break; // end of URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
494	case URB_FUNCTION_SELECT_CONFIGURATION:
495		printf("\n%sURB_FUNCTION_SELECT_CONFIGURATION\n", sp);
496
497#if 0
498		printf("\n%sUrbSelectConfiguration.ConfigurationDescriptor.bLength: %x\n", sp, purb->UrbSelectConfiguration.ConfigurationDescriptor->bLength);
499		printf("%sUrbSelectConfiguration.ConfigurationDescriptor.bDescriptorType: %x\n", sp, purb->UrbSelectConfiguration.ConfigurationDescriptor.bDescriptorType);
500		printf("%sUrbSelectConfiguration.ConfigurationDescriptor.wTotalLength: %x\n", sp, purb->UrbSelectConfiguration.ConfigurationDescriptor.wTotalLength);
501		printf("%sUrbSelectConfiguration.ConfigurationDescriptor.bNumInterfaces: %x\n", sp, purb->UrbSelectConfiguration.ConfigurationDescriptor.bNumInterfaces);
502		printf("%sUrbSelectConfiguration.ConfigurationDescriptor.bConfigurationValue: %x\n", sp, purb->UrbSelectConfiguration.ConfigurationDescriptor.bConfigurationValue);
503		printf("%sUrbSelectConfiguration.ConfigurationDescriptor.iConfiguration: %x\n", sp, purb->UrbSelectConfiguration.ConfigurationDescriptor.iConfiguration);
504		printf("%sUrbSelectConfiguration.ConfigurationDescriptor.bmAttributes: %x\n", sp, purb->UrbSelectConfiguration.ConfigurationDescriptor.bmAttributes);
505		printf("%sUrbSelectConfiguration.ConfigurationDescriptor.MaxPower: %x\n", sp, purb->UrbSelectConfiguration.ConfigurationDescriptor.MaxPower);
506#else
507		printf("%sUrbSelectConfiguration.ConfigurationDescriptor: %x\n", sp, (int)purb->UrbSelectConfiguration.ConfigurationDescriptor);
508		printf("%sUrbSelectConfiguration.ConfigurationHandle: %x\n", sp, (int)purb->UrbSelectConfiguration.ConfigurationHandle);
509#endif
510
511		urb_ptr = (unsigned char*)&purb->UrbSelectConfiguration.ConfigurationDescriptor;
512		ptr = (unsigned char *)&purb->UrbSelectConfiguration.Interface.Length;
513		for(i=0; (ptr-urb_ptr+sizeof(purb->UrbHeader)) < purb->UrbHeader.Length;i++) {
514			itf = (USBD_INTERFACE_INFORMATION *)ptr;
515			ptr += itf->Length;
516			printf("\n%sUrbSelectConfiguration.Interface.Length: %x\n", sp, itf->Length);
517			printf("%sUrbSelectConfiguration.Interface.InterfaceNumber: %x\n", sp, itf->InterfaceNumber);
518			printf("%sUrbSelectConfiguration.Interface.AlternateSetting: %x\n", sp, itf->AlternateSetting);
519			printf("%sUrbSelectConfiguration.Interface.Class: %x\n", sp, itf->Class);
520			printf("%sUrbSelectConfiguration.Interface.SubClass: %x\n", sp, itf->SubClass);
521			printf("%sUrbSelectConfiguration.Interface.Protocol: %x\n", sp, itf->Protocol);
522			printf("%sUrbSelectConfiguration.Interface.Reserved: %x\n", sp, itf->Reserved);
523			printf("%sUrbSelectConfiguration.Interface.InterfaceHandle: %x\n", sp, (int)itf->InterfaceHandle);
524			printf("%sUrbSelectConfiguration.Interface.NumberOfPipes: %x\n", sp, itf->NumberOfPipes);
525
526			for(count=0;count<itf->NumberOfPipes;count++)
527			{
528				printf("\n%sPipe : %x\n", sp, count);
529				printf("%sUrbSelectConfiguration.Interface.Pipes[%x].MaximumPacketSize: %x\n", sp, count, itf->Pipes[count].MaximumPacketSize);
530				printf("%sUrbSelectConfiguration.Interface.Pipes[%x].EndpointAddress: %x\n", sp, count, itf->Pipes[count].EndpointAddress);
531				printf("%sUrbSelectConfiguration.Interface.Pipes[%x].Interval: %x\n", sp, count, itf->Pipes[count].Interval);
532				printf("%sUrbSelectConfiguration.Interface.Pipes[%x].PipeType: %x\n", sp, count, itf->Pipes[count].PipeType);
533				printf("%sUrbSelectConfiguration.Interface.Pipes[%x].PipeHandle: %x\n", sp, count, (int)itf->Pipes[count].PipeHandle);
534				printf("%sUrbSelectConfiguration.Interface.Pipes[%x].MaximumTransferSize: %x\n", sp, count, itf->Pipes[count].MaximumTransferSize);
535				printf("%sUrbSelectConfiguration.Interface.Pipes[%x].PipeFlags: %x\n", sp, count, itf->Pipes[count].PipeFlags);
536			}
537		}
538		break; // end of URB_FUNCTION_SELECT_CONFIGURATION
539
540	case 0x2a:
541		printf("\n%sURB_FUNCTION_GET_MS_FEATURE_DESCRIPTOR(0x2a)\n", sp);
542		printf("\n%sUrbOsFeatureDescriptorRequest.Reserved: %x\n", sp, (int)purb->UrbControlDescriptorRequest.Reserved);
543		printf("\n%sUrbOsFeatureDescriptorRequest.Reserved0: %x\n", sp, purb->UrbControlDescriptorRequest.Reserved0);
544		printf("\n%sUrbOsFeatureDescriptorRequest.TransferBufferLength: %x\n", sp, purb->UrbControlDescriptorRequest.TransferBufferLength);
545		printf("\n%sUrbOsFeatureDescriptorRequest.TransferBuffer: %x\n", sp, (int)purb->UrbControlDescriptorRequest.TransferBuffer);
546		printf("\n%sUrbOsFeatureDescriptorRequest.TransferBufferMDL: %x\n", sp, (int)purb->UrbControlDescriptorRequest.TransferBufferMDL);
547		printf("\n%sUrbOsFeatureDescriptorRequest.Recipient & Reserved1 & Reserved 2: %x\n", sp, purb->UrbControlDescriptorRequest.Reserved1);
548		printf("\n%sUrbOsFeatureDescriptorRequest.InterfaceNumber: %x\n", sp, purb->UrbControlDescriptorRequest.Index);
549		printf("\n%sUrbOsFeatureDescriptorRequest.MS_PageIdex: %x\n", sp, purb->UrbControlDescriptorRequest.DescriptorType);
550		printf("\n%sUrbOsFeatureDescriptorRequest.MS_FeatureDescriptorIndex: %x\n", sp, purb->UrbControlDescriptorRequest.LanguageId);
551		printf("\n%sUrbOsFeatureDescriptorRequest.Reserved3: %x\n", sp, purb->UrbControlDescriptorRequest.Reserved2);
552		break;
553
554	case URB_FUNCTION_SELECT_INTERFACE:     // 0x0001
555		printf("\n%sURB_FUNCTION_SELECT_INTERFACE\n", sp);
556		printf("\n%sUrbSelectInterface.Interface.Length: %x\n", sp, purb->UrbSelectInterface.Interface.Length);
557		printf("%sUrbSelectInterface.Interface.InterfaceNumber: %x\n", sp, purb->UrbSelectInterface.Interface.InterfaceNumber);
558		printf("%sUrbSelectInterface.Interface.AlternateSetting: %x\n", sp, purb->UrbSelectInterface.Interface.AlternateSetting);
559		printf("%sUrbSelectInterface.Interface.Class: %x\n", sp, purb->UrbSelectInterface.Interface.Class);
560		printf("%sUrbSelectInterface.Interface.SubClass: %x\n", sp, purb->UrbSelectInterface.Interface.SubClass);
561		printf("%sUrbSelectInterface.Interface.Protocol: %x\n", sp, purb->UrbSelectInterface.Interface.Protocol);
562		printf("%sUrbSelectInterface.Interface.Reserved: %x\n", sp, purb->UrbSelectInterface.Interface.Reserved);
563		printf("%sUrbSelectInterface.Interface.InterfaceHandle: %x\n", sp, (int)purb->UrbSelectInterface.Interface.InterfaceHandle);
564		printf("%sUrbSelectInterface.Interface.NumberOfPipes: %x\n", sp, purb->UrbSelectInterface.Interface.NumberOfPipes);
565
566		for(count=0;count<purb->UrbSelectInterface.Interface.NumberOfPipes;count++)
567		{
568			printf("\n%sPipe : %x\n", sp, count);
569			printf("%sUrbSelectInterface.Interface.Pipes[%x].PipeType: %x\n", sp, count, purb->UrbSelectInterface.Interface.Pipes[count].PipeType);
570			printf("%sUrbSelectInterface.Interface.Pipes[%x].PipeHandle: %x\n", sp, count, (int)purb->UrbSelectInterface.Interface.Pipes[count].PipeHandle);
571			printf("%sUrbSelectInterface.Interface.Pipes[%x].MaximumTransferSize: %x\n", sp, count, purb->UrbSelectInterface.Interface.Pipes[count].MaximumTransferSize);
572			printf("%sUrbSelectInterface.Interface.Pipes[%x].PipeFlags: %x\n", sp, count, purb->UrbSelectInterface.Interface.Pipes[count].PipeFlags);
573			printf("%sUrbSelectInterface.Interface.Pipes[%x].MaximumPacketSize: %x\n", sp, count, purb->UrbSelectInterface.Interface.Pipes[count].MaximumPacketSize);
574			printf("%sUrbSelectInterface.Interface.Pipes[%x].EndpointAddress: %x\n", sp, count, purb->UrbSelectInterface.Interface.Pipes[count].EndpointAddress);
575			printf("%sUrbSelectInterface.Interface.Pipes[%x].Interval: %x\n", sp, count, purb->UrbSelectInterface.Interface.Pipes[count].Interval);
576		}
577		break; // URB_FUNCTION_SELECT_INTERFACE                0x0001
578
579	case URB_FUNCTION_CONTROL_TRANSFER:     // 0x0008
580		printf("\n%sURB_FUNCTION_CONTROL_TRANSFER\n", sp);
581		printf("%sUrbControlTransfer.PipeHandle: %x\n", sp, (int)purb->UrbControlTransfer.PipeHandle);
582		printf("%sUrbControlTransfer.TransferFlags: %x\n", sp, purb->UrbControlTransfer.TransferFlags);
583		printf("%sUrbControlTransfer.TransferBufferLength: %x\n", sp, purb->UrbControlTransfer.TransferBufferLength);
584		printf("%sUrbControlTransfer.TransferBuffer: %x\n", sp, (int)purb->UrbControlTransfer.TransferBuffer);
585		printf("%sUrbControlTransfer.TransferBufferMDL: %x\n", sp, (int)purb->UrbControlTransfer.TransferBufferMDL);
586		printf("%sUrbControlTransfer.UrbLink: %x\n", sp, (int)purb->UrbControlTransfer.UrbLink);
587		printf("%sUrbControlTransfer.SetupPacket:", sp);
588
589
590		for(count=0;count<8;count++)
591		{
592			printf("%02x", purb->UrbControlTransfer.SetupPacket[count]);
593		}
594		printf("\n");
595		break;
596
597	case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:     // 0x0009
598		printf("\n%sURB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER\n", sp);
599		printf("%sUrbBulkOrInterruptTransfer.PipeHandle: %x\n", sp, (int)purb->UrbBulkOrInterruptTransfer.PipeHandle);
600		printf("%sUrbBulkOrInterruptTransfer.TransferFlags: %x\n", sp, purb->UrbBulkOrInterruptTransfer.TransferFlags);
601		printf("%sUrbBulkOrInterruptTransfer.TransferBufferLength: %x\n", sp, (int)purb->UrbBulkOrInterruptTransfer.TransferBufferLength);
602		printf("%sUrbBulkOrInterruptTransfer.TransferBuffer: %x\n", sp, (int)purb->UrbBulkOrInterruptTransfer.TransferBuffer);
603		printf("%sUrbBulkOrInterruptTransfer.TransferBufferMDL: %x\n", sp, (int)purb->UrbBulkOrInterruptTransfer.TransferBufferMDL);
604		printf("%sUrbBulkOrInterruptTransfer.UrbLink: %x\n", sp, (int)purb->UrbBulkOrInterruptTransfer.UrbLink);
605    		printf("%sUrbBulkOrInterruptTransfer.hca.HcdEndpoint: %x\n", sp, (int)purb->UrbBulkOrInterruptTransfer.hca.HcdEndpoint);
606    		printf("%sUrbBulkOrInterruptTransfer.hca.HcdIrp: %x\n", sp, (int)purb->UrbBulkOrInterruptTransfer.hca.HcdIrp);
607    		printf("%sUrbBulkOrInterruptTransfer.hca.HcdCurrentIoFlushPointer: %x\n", sp, (int)purb->UrbBulkOrInterruptTransfer.hca.HcdCurrentIoFlushPointer);
608    		printf("%sUrbBulkOrInterruptTransfer.hca.HcdExtension: %x\n", sp, (int)purb->UrbBulkOrInterruptTransfer.hca.HcdExtension);
609		break;
610
611	case URB_FUNCTION_VENDOR_DEVICE:
612	case URB_FUNCTION_VENDOR_INTERFACE:
613	case URB_FUNCTION_VENDOR_ENDPOINT:
614	case URB_FUNCTION_VENDOR_OTHER:
615	case URB_FUNCTION_CLASS_DEVICE:
616	case URB_FUNCTION_CLASS_INTERFACE:
617	case URB_FUNCTION_CLASS_ENDPOINT:
618	case URB_FUNCTION_CLASS_OTHER:
619		if(purb->UrbHeader.Function==URB_FUNCTION_VENDOR_DEVICE)
620			printf("\n%sURB_FUNCTION_VENDOR_DEVICE\n", sp);
621		if(purb->UrbHeader.Function==URB_FUNCTION_VENDOR_INTERFACE)
622			printf("\n%sURB_FUNCTION_VENDOR_INTERFACE\n", sp);
623		if(purb->UrbHeader.Function==URB_FUNCTION_VENDOR_ENDPOINT)
624			printf("\n%sURB_FUNCTION_VENDOR_ENDPOINT\n", sp);
625		if(purb->UrbHeader.Function==URB_FUNCTION_VENDOR_OTHER)
626			printf("\n%sURB_FUNCTION_VENDOR_OTHER\n", sp);
627		if(purb->UrbHeader.Function==URB_FUNCTION_CLASS_DEVICE)
628			printf("\n%sURB_FUNCTION_CLASS_DEVICE\n", sp);
629		if(purb->UrbHeader.Function==URB_FUNCTION_CLASS_INTERFACE)
630			printf("\n%sURB_FUNCTION_CLASS_INTERFACE\n", sp);
631		if(purb->UrbHeader.Function==URB_FUNCTION_CLASS_ENDPOINT)
632			printf("\n%sURB_FUNCTION_CLASS_ENDPOINT\n", sp);
633		if(purb->UrbHeader.Function==URB_FUNCTION_CLASS_OTHER)
634			printf("\n%sURB_FUNCTION_CLASS_OTHER\n", sp);
635		printf("%sUrbControlVendorClassRequest.Reserved: %x\n", sp, (int)purb->UrbControlVendorClassRequest.Reserved);
636		printf("%sUrbControlVendorClassRequest.TransferFlags: %x\n", sp, purb->UrbControlVendorClassRequest.TransferFlags);
637		printf("%sUrbControlVendorClassRequest.TransferBufferLength: %x\n", sp, purb->UrbControlVendorClassRequest.TransferBufferLength);
638		printf("%sUrbControlVendorClassRequest.TransferBuffer: %x\n", sp, (int)purb->UrbControlVendorClassRequest.TransferBuffer);
639		printf("%sUrbControlVendorClassRequest.TransferBufferMDL: %x\n", sp, (int)purb->UrbControlVendorClassRequest.TransferBufferMDL);
640		printf("%sUrbControlVendorClassRequest.UrbLink: %x\n", sp, (int)purb->UrbControlVendorClassRequest.UrbLink);
641		printf("%sUrbControlVendorClassRequest.RequestTypeReservedBits: %x\n", sp, purb->UrbControlVendorClassRequest.RequestTypeReservedBits);
642		printf("%sUrbControlVendorClassRequest.Request: %x\n", sp, purb->UrbControlVendorClassRequest.Request);
643		printf("%sUrbControlVendorClassRequest.Value: %x\n", sp, purb->UrbControlVendorClassRequest.Value);
644		printf("%sUrbControlVendorClassRequest.Index: %x\n", sp, purb->UrbControlVendorClassRequest.Index);
645		printf("%sUrbControlVendorClassRequest.Reserved1: %x\n", sp, purb->UrbControlVendorClassRequest.Reserved1);
646		break;
647
648	default:
649		printf("%sUnknown URB(%x)\n", sp, purb->UrbHeader.Function);
650		break;
651	} // end of switch urb function
652}
653
654void inline print_irp(PIRP_SAVE pirp_save, int flag)
655{
656	if(flag)
657		PDEBUG("\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n");
658	else
659		PDEBUG("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
660	PDEBUG("usb_connection received IRP: irp number: %d\n", pirp_save->Irp);
661	PDEBUG("\tIRP_SAVE:\n");
662	PDEBUG("\t  Size:	\t%d\n",	pirp_save->Size);
663	PDEBUG("\t  NeedSize:	%d\n",		pirp_save->NeedSize);
664	PDEBUG("\t  Device:	%lld\n",	pirp_save->Device);
665	PDEBUG("\t  res1:	\t%d\n",	pirp_save->Res1);
666	PDEBUG("\t  irp number:	%d\n",		pirp_save->Irp);
667	PDEBUG("\t  Status:	%d\n",		pirp_save->Status);
668	PDEBUG("\t  Information:\t%lld\n",	pirp_save->Information);
669	PDEBUG("\t  BufferSize:	%d\n",		pirp_save->BufferSize);
670	PDEBUG("\t  Reserv:	%d\n",		pirp_save->Reserv);
671	PDEBUG("\t  empty: 	%lld\n",	pirp_save->StackLocation.empty);
672	PDEBUG("\t  major function:  %x\n",	pirp_save->StackLocation.MajorFunction);
673	PDEBUG("\t  minor function:  %x\n",	pirp_save->StackLocation.MinorFunction);
674	PDEBUG("\t  Argument1:	%lld\n",	pirp_save->StackLocation.Parameters.Others.Argument1);
675	PDEBUG("\t  Argument2:	%lld\n",	pirp_save->StackLocation.Parameters.Others.Argument2);
676	PDEBUG("\t  Argument3:	%lld\n",	pirp_save->StackLocation.Parameters.Others.Argument3);
677	PDEBUG("\t  Argument4:	%lld\n",	pirp_save->StackLocation.Parameters.Others.Argument4);
678	PDEBUG("\n");
679
680	if(pirp_save->BufferSize) {
681		PDEBUG("\tIRP_SAVE buffer:\n");
682		if(pirp_save->StackLocation.MajorFunction==0x0f) {
683			PDEBUG("\n");
684			PDEBUG("\tURB buffer:\n");
685			if(pirp_save->Is64 == 0){
686				PURB purb = (PURB)pirp_save->Buffer;
687				print_urb(purb);
688				if(pirp_save->BufferSize > purb->UrbHeader.Length)
689					ppktbuf((char*)pirp_save->Buffer + purb->UrbHeader.Length,
690						pirp_save->BufferSize - purb->UrbHeader.Length);
691			} else {
692				PURB_64 purb_64 = (PURB_64)pirp_save->Buffer;
693				print_urb_64(purb_64);
694				if(pirp_save->BufferSize > purb_64->UrbHeader.Length)
695					ppktbuf((char*)pirp_save->Buffer + purb_64->UrbHeader.Length,
696						pirp_save->BufferSize - purb_64->UrbHeader.Length);
697			}
698		}
699		else
700			ppktbuf((char*)pirp_save->Buffer, pirp_save->BufferSize);
701	}
702}
703
704void decodeIRP(char *sp)
705{
706	PIRP_SAVE pirp;
707	PURB purb;
708	int i, j;
709
710	pirp = (PIRP_SAVE)&packets[U2EC_L4_IRP_SAVE];
711
712	printf("%sSize	:%x\n", sp, pirp->Size);
713	printf("%sNeedSize:%x\n", sp, pirp->NeedSize);
714	printf("%sDevice	:%llx\n", sp, pirp->Device);
715	printf("%sIs64	:%x\n", sp, pirp->Is64);
716	printf("%sIsIsoch	:%x\n", sp, pirp->IsIsoch);
717	printf("%sRes1	:%x\n", sp, pirp->Res1);
718	printf("%sIrp	:%x\n", sp, pirp->Irp);
719	printf("%sStatus	:%x\n", sp, pirp->Status);
720	printf("%sInfo	:%llx\n", sp, pirp->Information);
721	printf("%sCancel	:%x\n\n", sp, pirp->Cancel);
722
723	printf("%sIO empty:%llx\n", sp, pirp->StackLocation.empty);
724	printf("%sIO Major:%s(%x)\n", sp, MajorFunctionString(pirp), pirp->StackLocation.MajorFunction);
725	printf("%sIO Minor:%s(%x)\n", sp, MinorFunctionString(pirp), pirp->StackLocation.MinorFunction);
726	printf("%sIO Argu1:%llx\n", sp, pirp->StackLocation.Parameters.Others.Argument1);
727	printf("%sIO Argu2:%llx\n", sp, pirp->StackLocation.Parameters.Others.Argument2);
728	printf("%sIO Argu3:%llx\n", sp, pirp->StackLocation.Parameters.Others.Argument3);
729	printf("%sIO Argu4:%llx\n", sp, pirp->StackLocation.Parameters.Others.Argument4);
730
731	printf("\n%sBuffSize:%x\n", sp, pirp->BufferSize);
732	printf("%sReserv	:%x\n", sp, pirp->Reserv);
733
734	if(pirp->BufferSize)
735	{
736		if(pirp->StackLocation.MajorFunction==0x0f)
737		{
738			purb = (PURB)pirp->Buffer;
739			decodeURB(purb, sp);
740			if(pirp->BufferSize>purb->UrbHeader.Length)
741				decodeBuf(sp, (char*)&pirp->Buffer[purb->UrbHeader.Length], pirp->BufferSize-purb->UrbHeader.Length);
742		}
743		else
744		{
745			j=0;
746			for(i=0;i<pirp->BufferSize&&i<512;i++)
747			{
748				if(i%8==0)
749				{
750					if(i==0)
751						printf("\n%sIRP:%02x", sp, (unsigned char)pirp->Buffer[i]);
752					else printf("\n%s    %02x", sp, (unsigned char)pirp->Buffer[i]);
753				}
754				else printf("%02x", (unsigned char)pirp->Buffer[i]);
755
756				if(i%2==0)
757					pstr_ascii[j++]=pirp->Buffer[i];
758			}
759			printf("\n%s    %s\n", sp, pstr_ascii);
760		}
761	}
762}
763
764
765void decodeU2EC()
766{
767	if(IS_IP&&IS_TCP&&IS_U2EC_IRP&&IS_U2EC_IRP_CONTENT)
768	{
769		if(IS_U2EC_IRP_CLIENT)
770		{
771			printf("\n\n--------------->\n");
772			printf("\t%s\n", pktname);
773			decodeIRP("");
774		}
775		else if(IS_U2EC_IRP_SERVER)
776		{
777			printf("\n\n\t\t<---------------\n");
778			printf("\t\t%s\n", pktname);
779			decodeIRP("\t\t\t");
780		}
781	}
782}
783
784int getpacket(FILE *fp, unsigned char *packets, int *size)
785{
786	char buffer[MAX_BUFFER_SIZE];
787	char hex[10];
788	int j;
789
790	while(fgets(buffer, MAX_BUFFER_SIZE, fp))
791	{
792		if (strcmp(buffer, "\n")==0)
793		{
794		}
795		else if(strstr(buffer, "pkt")) // start to capture
796		{
797			strcpy(pktname, buffer);
798			*size = 0;
799		}
800		else
801		{
802			for(j=0;j<8;j++)
803			{
804				strncpy(hex, buffer+j*6, 4);
805				hex[5] = 0;
806				packets[(*size)++] = strtol(hex, NULL, 16);
807				if(*(buffer+j*6+5)=='}')
808				{
809					return 1;
810				}
811			}
812		}
813	}
814	return 0;
815}
816
817void decode(char *file)
818{
819	FILE *fp;
820
821	printf("decode %s\n", file);
822
823	fp = fopen(file, "r+");
824	while(getpacket(fp, packets, &plen))
825	{
826		decodeU2EC();
827	}
828	fclose(fp);
829}
830