1 /* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 // This file contains implementation of a test application that tests 18 // functionality of AdbWinApi interface. In this test we will use AdbWinApi 19 // interface in order to enumerate USB interfaces for Android ADB class, and 20 // for each interface found we will test USB I/O on that interface by sending 21 // a simple "hand shake" message to the device connected via this interface. 22 23 #include "stdafx.h" 24 25 #ifdef _DEBUG 26 #define new DEBUG_NEW 27 #endif 28 29 // Android ADB interface identifier 30 const GUID kAdbInterfaceId = ANDROID_USB_CLASS_ID; 31 32 // Number of interfaces detected in TestEnumInterfaces. 33 int interface_count = 0; 34 35 // Constants used to initialize a "handshake" message 36 #define MAX_PAYLOAD 4096 37 #define A_SYNC 0x434e5953 38 #define A_CNXN 0x4e584e43 39 #define A_OPEN 0x4e45504f 40 #define A_OKAY 0x59414b4f 41 #define A_CLSE 0x45534c43 42 #define A_WRTE 0x45545257 43 #define A_VERSION 0x01000000 44 45 // Formats message sent to USB device 46 struct message { 47 unsigned int command; /* command identifier constant */ 48 unsigned int arg0; /* first argument */ 49 unsigned int arg1; /* second argument */ 50 unsigned int data_length; /* length of payload (0 is allowed) */ 51 unsigned int data_crc32; /* crc32 of data payload */ 52 unsigned int magic; /* command ^ 0xffffffff */ 53 }; 54 55 // 56 // Test routines declarations. 57 // 58 59 // Tests interface enumeration. 60 bool TestEnumInterfaces(); 61 62 // Tests all interfaces detected for our device class. 63 bool TestInterfaces(); 64 65 // Tests interface addressed by the given device name. 66 bool TestInterface(const wchar_t* device_name); 67 68 // Tests interface opened with ADB API. 69 bool TestInterfaceHandle(ADBAPIHANDLE interface_handle); 70 71 // Sends a "handshake" message to the given interface. 72 bool DeviceHandShake(ADBAPIHANDLE adb_interface); 73 int __cdecl _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { 75 // Test enum interfaces. 76 if (!TestEnumInterfaces()) 77 return -1; 78 79 if (0 == interface_count) { 80 printf("\nNo ADB interfaces found. Make sure that device is " 81 "connected to USB port and is powered on."); 82 return 1; 83 } 84 85 // Test each interface found in the system 86 if (!TestInterfaces()) 87 return -2; 88 89 return 0; 90 } 91 92 bool TestEnumInterfaces() { 93 // Enumerate interfaces 94 ADBAPIHANDLE enum_handle = 95 AdbEnumInterfaces(kAdbInterfaceId, true, true, true); 96 if (NULL == enum_handle) { 97 printf("\nEnum interfaces failure:"); 98 printf("\nUnable to enumerate ADB interfaces: %u", GetLastError()); 99 return false; 100 } 101 102 // Unite interface info structure and buffer big enough to contain the 103 // largest structure. 104 union { 105 AdbInterfaceInfo interface_info; 106 char buf[4096]; 107 }; 108 unsigned long buf_size = sizeof(buf); 109 110 // Enumerate (and count) interfaces, printing information for each found 111 // interface. 112 interface_count = 0; 113 while (AdbNextInterface(enum_handle, &interface_info, &buf_size)) { 114 interface_count++; 115 printf("\nFound interface %ws:", interface_info.device_name); 116 if (interface_info.flags & SPINT_ACTIVE) 117 printf(" ACTIVE"); 118 if (interface_info.flags & SPINT_DEFAULT) 119 printf(" DEFAULT"); 120 if (interface_info.flags & SPINT_REMOVED) 121 printf(" REMOVED"); 122 123 buf_size = sizeof(buf);; 124 }; 125 126 AdbCloseHandle(enum_handle); 127 return true; 128 } 129 130 bool TestInterfaces() { 131 // Enumerate interfaces 132 ADBAPIHANDLE enum_handle = 133 AdbEnumInterfaces(kAdbInterfaceId, true, true, true); 134 if (NULL == enum_handle) { 135 printf("\nTest interfaces failure:"); 136 printf("\nUnable to enumerate ADB interfaces: %u", GetLastError()); 137 return false; 138 } 139 140 // Unite interface info structure and buffer big enough to contain the 141 // largest structure. 142 union { 143 AdbInterfaceInfo interface_info; 144 char buf[4096]; 145 }; 146 unsigned long buf_size = sizeof(buf); 147 148 // Test each found interface 149 while (AdbNextInterface(enum_handle, &interface_info, &buf_size)) { 150 TestInterface(interface_info.device_name); 151 buf_size = sizeof(buf); 152 }; 153 154 AdbCloseHandle(enum_handle); 155 156 // Create interface by VID/PID/MI 157 ADBAPIHANDLE interface_handle = 158 AdbCreateInterface(kAdbInterfaceId, DEVICE_VENDOR_ID, 159 DEVICE_COMPOSITE_PRODUCT_ID, DEVICE_INTERFACE_ID); 160 if (NULL == interface_handle) { 161 printf("\nUnable to create interface by VID/PID: %u", GetLastError()); 162 return false; 163 } 164 165 // Test it 166 TestInterfaceHandle(interface_handle); 167 AdbCloseHandle(interface_handle); 168 return true; 169 } 170 171 bool TestInterface(const wchar_t* device_name) { 172 printf("\n*** Test interface( %ws )", device_name); 173 174 // Get ADB handle to the interface by its name 175 ADBAPIHANDLE interface_handle = AdbCreateInterfaceByName(device_name); 176 if (NULL == interface_handle) { 177 printf(" FAILED:\nUnable to create interface by name: %u", GetLastError()); 178 return false; 179 } 180 181 // Test it 182 TestInterfaceHandle(interface_handle); 183 AdbCloseHandle(interface_handle); 184 return true; 185 } 186 187 bool TestInterfaceHandle(ADBAPIHANDLE interface_handle) { 188 // Get interface name. 189 char intr_name[4096]; 190 unsigned long intr_name_size = sizeof(intr_name); 191 if (AdbGetInterfaceName(interface_handle, intr_name, &intr_name_size, true)) { 192 printf("\n+++ Interface name %s", intr_name); 193 } else { 194 printf("\n--- AdbGetInterfaceName failure %u", GetLastError()); 195 return false; 196 } 197 198 // Get device descriptor for the interface 199 USB_DEVICE_DESCRIPTOR dev_desc; 200 if (AdbGetUsbDeviceDescriptor(interface_handle, &dev_desc)) { 201 printf("\n+++ Device descriptor:"); 202 printf("\n bLength = %u", dev_desc.bLength); 203 printf("\n bDescriptorType = %u", dev_desc.bDescriptorType); 204 printf("\n bcdUSB = %u", dev_desc.bcdUSB); 205 printf("\n bDeviceClass = %u", dev_desc.bDeviceClass); 206 printf("\n bDeviceSubClass = %u", dev_desc.bDeviceSubClass); 207 printf("\n bDeviceProtocol = %u", dev_desc.bDeviceProtocol); 208 printf("\n bMaxPacketSize0 = %u", dev_desc.bMaxPacketSize0); 209 printf("\n idVendor = %X", dev_desc.idVendor); 210 printf("\n idProduct = %X", dev_desc.idProduct); 211 printf("\n bcdDevice = %u", dev_desc.bcdDevice); 212 printf("\n iManufacturer = %u", dev_desc.iManufacturer); 213 printf("\n iProduct = %u", dev_desc.iProduct); 214 printf("\n iSerialNumber = %u", dev_desc.iSerialNumber); 215 printf("\n bNumConfigurations = %u", dev_desc.bDescriptorType); 216 } else { 217 printf("\n--- AdbGetUsbDeviceDescriptor failure %u", GetLastError()); 218 return false; 219 } 220 221 // Get configuration descriptor for the interface 222 USB_CONFIGURATION_DESCRIPTOR config_desc; 223 if (AdbGetUsbConfigurationDescriptor(interface_handle, &config_desc)) { 224 printf("\n+++ Configuration descriptor:"); 225 printf("\n bLength = %u", config_desc.bLength); 226 printf("\n bDescriptorType = %u", config_desc.bDescriptorType); 227 printf("\n wTotalLength = %u", config_desc.wTotalLength); 228 printf("\n bNumInterfaces = %u", config_desc.bNumInterfaces); 229 printf("\n bConfigurationValue = %u", config_desc.bConfigurationValue); 230 printf("\n iConfiguration = %u", config_desc.iConfiguration); 231 printf("\n bmAttributes = %u", config_desc.bmAttributes); 232 printf("\n MaxPower = %u", config_desc.MaxPower); 233 } else { 234 printf("\n--- AdbGetUsbConfigurationDescriptor failure %u", GetLastError()); 235 return false; 236 } 237 238 // Get device serial number 239 char ser_num[1024]; 240 unsigned long ser_num_size = sizeof(ser_num); 241 if (AdbGetSerialNumber(interface_handle, ser_num, &ser_num_size, true)) { 242 printf("\n+++ Serial number: %s", ser_num); 243 } else { 244 printf("\n--- AdbGetSerialNumber failure %u", GetLastError()); 245 return false; 246 } 247 248 // Get interface descriptor 249 USB_INTERFACE_DESCRIPTOR intr_desc; 250 if (AdbGetUsbInterfaceDescriptor(interface_handle, &intr_desc)) { 251 printf("\n+++ Interface descriptor:"); 252 printf("\n bDescriptorType = %u", intr_desc.bDescriptorType); 253 printf("\n bInterfaceNumber = %u", intr_desc.bInterfaceNumber); 254 printf("\n bAlternateSetting = %u", intr_desc.bAlternateSetting); 255 printf("\n bNumEndpoints = %u", intr_desc.bNumEndpoints); 256 printf("\n bInterfaceClass = %u", intr_desc.bInterfaceClass); 257 printf("\n bInterfaceSubClass = %u", intr_desc.bInterfaceSubClass); 258 printf("\n bInterfaceProtocol = %u", intr_desc.bInterfaceProtocol); 259 printf("\n iInterface = %u", intr_desc.iInterface); 260 } else { 261 printf("\n--- AdbGetUsbInterfaceDescriptor failure %u", GetLastError()); 262 return false; 263 } 264 265 // Enumerate interface's endpoints 266 AdbEndpointInformation pipe_info; 267 for (UCHAR pipe = 0; pipe < intr_desc.bNumEndpoints; pipe++) { 268 if (AdbGetEndpointInformation(interface_handle, pipe, &pipe_info)) { 269 printf("\n PIPE %u info:", pipe); 270 printf("\n max_packet_size = %u", pipe_info.max_packet_size); 271 printf("\n max_transfer_size = %u", pipe_info.max_transfer_size); 272 printf("\n endpoint_type = %u", pipe_info.endpoint_type); 273 printf("\n endpoint_address = %02X", pipe_info.endpoint_address); 274 printf("\n polling_interval = %u", pipe_info.polling_interval); 275 printf("\n setting_index = %u", pipe_info.setting_index); 276 } else { 277 printf("\n--- AdbGetEndpointInformation(%u) failure %u", pipe, GetLastError()); 278 return false; 279 } 280 } 281 282 // Get default bulk read endpoint info 283 if (AdbGetDefaultBulkReadEndpointInformation(interface_handle, &pipe_info)) { 284 printf("\n Default Bulk Read Pipe info:"); 285 printf("\n max_packet_size = %u", pipe_info.max_packet_size); 286 printf("\n max_transfer_size = %u", pipe_info.max_transfer_size); 287 printf("\n endpoint_type = %u", pipe_info.endpoint_type); 288 printf("\n endpoint_address = %02X", pipe_info.endpoint_address); 289 printf("\n polling_interval = %u", pipe_info.polling_interval); 290 printf("\n setting_index = %u", pipe_info.setting_index); 291 } else { 292 printf("\n--- AdbGetDefaultBulkReadEndpointInformation failure %u", GetLastError()); 293 return false; 294 } 295 296 // Get default bulk write endpoint info 297 if (AdbGetDefaultBulkWriteEndpointInformation(interface_handle, &pipe_info)) { 298 printf("\n Default Bulk Write Pipe info:"); 299 printf("\n max_packet_size = %u", pipe_info.max_packet_size); 300 printf("\n max_transfer_size = %u", pipe_info.max_transfer_size); 301 printf("\n endpoint_type = %u", pipe_info.endpoint_type); 302 printf("\n endpoint_address = %02X", pipe_info.endpoint_address); 303 printf("\n polling_interval = %u", pipe_info.polling_interval); 304 printf("\n setting_index = %u", pipe_info.setting_index); 305 } else { 306 printf("\n--- AdbGetDefaultBulkWriteEndpointInformation failure %u", GetLastError()); 307 return false; 308 } 309 310 // Test a handshake on that interface 311 DeviceHandShake(interface_handle); 312 313 return true; 314 } 315 316 bool DeviceHandShake(ADBAPIHANDLE adb_interface) { 317 // Get interface name 318 char interf_name[512]; 319 unsigned long name_size = sizeof(interf_name); 320 if (!AdbGetInterfaceName(adb_interface, interf_name, &name_size, true)) { 321 printf("\nDeviceHandShake: AdbGetInterfaceName returned error %u", 322 GetLastError()); 323 return false; 324 } 325 326 printf("\n\nDeviceHandShake on %s", interf_name); 327 328 char* ser_num = NULL; 329 name_size = 0; 330 if (!AdbGetSerialNumber(adb_interface, ser_num, &name_size, true)) { 331 ser_num = reinterpret_cast<char*>(malloc(name_size)); 332 if (NULL != ser_num) { 333 if (!AdbGetSerialNumber(adb_interface, ser_num, &name_size, true)) { 334 printf("\n AdbGetSerialNumber returned error %u", GetLastError()); 335 AdbCloseHandle(adb_interface); 336 return false; 337 } 338 printf("\nInterface serial number is %s", ser_num); 339 free(ser_num); 340 } 341 } 342 343 // Get default read endpoint 344 ADBAPIHANDLE adb_read = AdbOpenDefaultBulkReadEndpoint(adb_interface, 345 AdbOpenAccessTypeReadWrite, 346 AdbOpenSharingModeReadWrite); 347 if (NULL == adb_read) { 348 printf("\n AdbOpenDefaultBulkReadEndpoint returned error %u", GetLastError()); 349 return false; 350 } 351 352 // Get default write endpoint 353 ADBAPIHANDLE adb_write = AdbOpenDefaultBulkWriteEndpoint(adb_interface, 354 AdbOpenAccessTypeReadWrite, 355 AdbOpenSharingModeReadWrite); 356 if (NULL == adb_write) { 357 printf("\n AdbOpenDefaultBulkWriteEndpoint returned error %u", GetLastError()); 358 AdbCloseHandle(adb_read); 359 return false; 360 } 361 362 // Send connect message 363 message msg_send; 364 msg_send.command = A_CNXN; 365 msg_send.arg0 = A_VERSION; 366 msg_send.arg1 = MAX_PAYLOAD; 367 msg_send.data_length = 0; 368 msg_send.data_crc32 = 0; 369 msg_send.magic = msg_send.command ^ 0xffffffff; 370 371 ULONG written_bytes = 0; 372 bool write_res = AdbWriteEndpointSync(adb_write, &msg_send, sizeof(msg_send), &written_bytes, 500); 373 if (!write_res) { 374 printf("\n AdbWriteEndpointSync returned error %u", GetLastError()); 375 AdbCloseHandle(adb_write); 376 AdbCloseHandle(adb_read); 377 return false; 378 } 379 380 // Receive handshake 381 message msg_rcv; 382 ULONG read_bytes = 0; 383 bool read_res = AdbReadEndpointSync(adb_read, &msg_rcv, sizeof(msg_rcv), &read_bytes, 512); 384 if (!read_res) { 385 printf("\n AdbReadEndpointSync returned error %u", GetLastError()); 386 AdbCloseHandle(adb_write); 387 AdbCloseHandle(adb_read); 388 return false; 389 } 390 391 printf("\n Read handshake: %u bytes received", read_bytes); 392 char* cmd_ansi = reinterpret_cast<char*>(&msg_rcv.command); 393 printf("\n command = %08X (%c%c%c%c)", msg_rcv.command, 394 cmd_ansi[0], cmd_ansi[1], cmd_ansi[2], cmd_ansi[3]); 395 printf("\n arg0 = %08X", msg_rcv.arg0); 396 printf("\n arg1 = %08X", msg_rcv.arg1); 397 printf("\n data_length = %u", msg_rcv.data_length); 398 printf("\n data_crc32 = %08X", msg_rcv.data_crc32); 399 printf("\n magic = %08X", msg_rcv.magic); 400 401 if (0 != msg_rcv.data_length) { 402 char* buf = reinterpret_cast<char*>(malloc(msg_rcv.data_length)); 403 read_res = AdbReadEndpointSync(adb_read, buf, msg_rcv.data_length, &read_bytes, 512); 404 if (!read_res) { 405 printf("\n AdbReadEndpointSync (data) returned error %u", GetLastError()); 406 free(buf); 407 AdbCloseHandle(adb_write); 408 AdbCloseHandle(adb_read); 409 return false; 410 } 411 412 for (ULONG n = 0; n < read_bytes; n++) { 413 if (0 == (n % 16)) 414 printf("\n "); 415 printf("%02X ", buf[n]); 416 } 417 418 printf("\n %s", buf); 419 420 delete buf; 421 } 422 423 AdbCloseHandle(adb_write); 424 AdbCloseHandle(adb_read); 425 426 return true; 427 } 428