1*90c8c64dSAndroid Build Coastguard Worker /*
2*90c8c64dSAndroid Build Coastguard Worker * Copyright (C) 2006 The Android Open Source Project
3*90c8c64dSAndroid Build Coastguard Worker *
4*90c8c64dSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*90c8c64dSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*90c8c64dSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*90c8c64dSAndroid Build Coastguard Worker *
8*90c8c64dSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*90c8c64dSAndroid Build Coastguard Worker *
10*90c8c64dSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*90c8c64dSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*90c8c64dSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*90c8c64dSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*90c8c64dSAndroid Build Coastguard Worker * limitations under the License.
15*90c8c64dSAndroid Build Coastguard Worker */
16*90c8c64dSAndroid Build Coastguard Worker
17*90c8c64dSAndroid Build Coastguard Worker /** \file
18*90c8c64dSAndroid Build Coastguard Worker This file consists of implementation of rotines that are exported
19*90c8c64dSAndroid Build Coastguard Worker from this DLL.
20*90c8c64dSAndroid Build Coastguard Worker */
21*90c8c64dSAndroid Build Coastguard Worker
22*90c8c64dSAndroid Build Coastguard Worker #include "stdafx.h"
23*90c8c64dSAndroid Build Coastguard Worker #include "adb_api.h"
24*90c8c64dSAndroid Build Coastguard Worker #include "adb_object_handle.h"
25*90c8c64dSAndroid Build Coastguard Worker #include "adb_interface_enum.h"
26*90c8c64dSAndroid Build Coastguard Worker #include "adb_interface.h"
27*90c8c64dSAndroid Build Coastguard Worker #include "adb_legacy_interface.h"
28*90c8c64dSAndroid Build Coastguard Worker #include "adb_endpoint_object.h"
29*90c8c64dSAndroid Build Coastguard Worker #include "adb_io_completion.h"
30*90c8c64dSAndroid Build Coastguard Worker #include "adb_helper_routines.h"
31*90c8c64dSAndroid Build Coastguard Worker #include "adb_winusb_api.h"
32*90c8c64dSAndroid Build Coastguard Worker
33*90c8c64dSAndroid Build Coastguard Worker /** \brief Points to InstantiateWinUsbInterface exported from AdbWinUsbApi.dll.
34*90c8c64dSAndroid Build Coastguard Worker
35*90c8c64dSAndroid Build Coastguard Worker This variable is initialized with the actual address in DllMain routine for
36*90c8c64dSAndroid Build Coastguard Worker this DLL on DLL_PROCESS_ATTACH event.
37*90c8c64dSAndroid Build Coastguard Worker @see PFN_INSTWINUSBINTERFACE for more information.
38*90c8c64dSAndroid Build Coastguard Worker */
39*90c8c64dSAndroid Build Coastguard Worker PFN_INSTWINUSBINTERFACE InstantiateWinUsbInterface = NULL;
40*90c8c64dSAndroid Build Coastguard Worker
AdbEnumInterfaces(GUID class_id,bool exclude_not_present,bool exclude_removed,bool active_only)41*90c8c64dSAndroid Build Coastguard Worker ADBAPIHANDLE __cdecl AdbEnumInterfaces(GUID class_id,
42*90c8c64dSAndroid Build Coastguard Worker bool exclude_not_present,
43*90c8c64dSAndroid Build Coastguard Worker bool exclude_removed,
44*90c8c64dSAndroid Build Coastguard Worker bool active_only) {
45*90c8c64dSAndroid Build Coastguard Worker AdbInterfaceEnumObject* enum_obj = NULL;
46*90c8c64dSAndroid Build Coastguard Worker ADBAPIHANDLE ret = NULL;
47*90c8c64dSAndroid Build Coastguard Worker
48*90c8c64dSAndroid Build Coastguard Worker try {
49*90c8c64dSAndroid Build Coastguard Worker // Instantiate and initialize enum object
50*90c8c64dSAndroid Build Coastguard Worker enum_obj = new AdbInterfaceEnumObject();
51*90c8c64dSAndroid Build Coastguard Worker
52*90c8c64dSAndroid Build Coastguard Worker if (enum_obj->InitializeEnum(class_id,
53*90c8c64dSAndroid Build Coastguard Worker exclude_not_present,
54*90c8c64dSAndroid Build Coastguard Worker exclude_removed,
55*90c8c64dSAndroid Build Coastguard Worker active_only)) {
56*90c8c64dSAndroid Build Coastguard Worker // After successful initialization we can create handle.
57*90c8c64dSAndroid Build Coastguard Worker ret = enum_obj->CreateHandle();
58*90c8c64dSAndroid Build Coastguard Worker }
59*90c8c64dSAndroid Build Coastguard Worker } catch (...) {
60*90c8c64dSAndroid Build Coastguard Worker SetLastError(ERROR_OUTOFMEMORY);
61*90c8c64dSAndroid Build Coastguard Worker }
62*90c8c64dSAndroid Build Coastguard Worker
63*90c8c64dSAndroid Build Coastguard Worker if (NULL != enum_obj)
64*90c8c64dSAndroid Build Coastguard Worker enum_obj->Release();
65*90c8c64dSAndroid Build Coastguard Worker
66*90c8c64dSAndroid Build Coastguard Worker return ret;
67*90c8c64dSAndroid Build Coastguard Worker }
68*90c8c64dSAndroid Build Coastguard Worker
AdbNextInterface(ADBAPIHANDLE adb_handle,AdbInterfaceInfo * info,unsigned long * size)69*90c8c64dSAndroid Build Coastguard Worker bool __cdecl AdbNextInterface(ADBAPIHANDLE adb_handle,
70*90c8c64dSAndroid Build Coastguard Worker AdbInterfaceInfo* info,
71*90c8c64dSAndroid Build Coastguard Worker unsigned long* size) {
72*90c8c64dSAndroid Build Coastguard Worker if (NULL == size) {
73*90c8c64dSAndroid Build Coastguard Worker SetLastError(ERROR_INVALID_PARAMETER);
74*90c8c64dSAndroid Build Coastguard Worker return false;
75*90c8c64dSAndroid Build Coastguard Worker }
76*90c8c64dSAndroid Build Coastguard Worker
77*90c8c64dSAndroid Build Coastguard Worker // Lookup AdbInterfaceEnumObject object for the handle
78*90c8c64dSAndroid Build Coastguard Worker AdbInterfaceEnumObject* adb_ienum_object =
79*90c8c64dSAndroid Build Coastguard Worker LookupObject<AdbInterfaceEnumObject>(adb_handle);
80*90c8c64dSAndroid Build Coastguard Worker if (NULL == adb_ienum_object)
81*90c8c64dSAndroid Build Coastguard Worker return false;
82*90c8c64dSAndroid Build Coastguard Worker
83*90c8c64dSAndroid Build Coastguard Worker // Everything is verified. Pass it down to the object
84*90c8c64dSAndroid Build Coastguard Worker bool ret = adb_ienum_object->Next(info, size);
85*90c8c64dSAndroid Build Coastguard Worker
86*90c8c64dSAndroid Build Coastguard Worker adb_ienum_object->Release();
87*90c8c64dSAndroid Build Coastguard Worker
88*90c8c64dSAndroid Build Coastguard Worker return ret;
89*90c8c64dSAndroid Build Coastguard Worker }
90*90c8c64dSAndroid Build Coastguard Worker
AdbResetInterfaceEnum(ADBAPIHANDLE adb_handle)91*90c8c64dSAndroid Build Coastguard Worker bool __cdecl AdbResetInterfaceEnum(ADBAPIHANDLE adb_handle) {
92*90c8c64dSAndroid Build Coastguard Worker // Lookup AdbInterfaceEnumObject object for the handle
93*90c8c64dSAndroid Build Coastguard Worker AdbInterfaceEnumObject* adb_ienum_object =
94*90c8c64dSAndroid Build Coastguard Worker LookupObject<AdbInterfaceEnumObject>(adb_handle);
95*90c8c64dSAndroid Build Coastguard Worker if (NULL == adb_ienum_object)
96*90c8c64dSAndroid Build Coastguard Worker return false;
97*90c8c64dSAndroid Build Coastguard Worker
98*90c8c64dSAndroid Build Coastguard Worker // Everything is verified. Pass it down to the object
99*90c8c64dSAndroid Build Coastguard Worker bool ret = adb_ienum_object->Reset();
100*90c8c64dSAndroid Build Coastguard Worker
101*90c8c64dSAndroid Build Coastguard Worker adb_ienum_object->Release();
102*90c8c64dSAndroid Build Coastguard Worker
103*90c8c64dSAndroid Build Coastguard Worker return ret;
104*90c8c64dSAndroid Build Coastguard Worker }
105*90c8c64dSAndroid Build Coastguard Worker
AdbCreateInterfaceByName(const wchar_t * interface_name)106*90c8c64dSAndroid Build Coastguard Worker ADBAPIHANDLE __cdecl AdbCreateInterfaceByName(
107*90c8c64dSAndroid Build Coastguard Worker const wchar_t* interface_name) {
108*90c8c64dSAndroid Build Coastguard Worker AdbInterfaceObject* obj = NULL;
109*90c8c64dSAndroid Build Coastguard Worker ADBAPIHANDLE ret = NULL;
110*90c8c64dSAndroid Build Coastguard Worker
111*90c8c64dSAndroid Build Coastguard Worker try {
112*90c8c64dSAndroid Build Coastguard Worker // Instantiate interface object, depending on the USB driver type.
113*90c8c64dSAndroid Build Coastguard Worker if (IsLegacyInterface(interface_name)) {
114*90c8c64dSAndroid Build Coastguard Worker // We have legacy USB driver underneath us.
115*90c8c64dSAndroid Build Coastguard Worker obj = new AdbLegacyInterfaceObject(interface_name);
116*90c8c64dSAndroid Build Coastguard Worker } else {
117*90c8c64dSAndroid Build Coastguard Worker // We have WinUsb driver underneath us. Make sure that AdbWinUsbApi.dll
118*90c8c64dSAndroid Build Coastguard Worker // is loaded and its InstantiateWinUsbInterface routine address has
119*90c8c64dSAndroid Build Coastguard Worker // been cached.
120*90c8c64dSAndroid Build Coastguard Worker if (NULL != InstantiateWinUsbInterface) {
121*90c8c64dSAndroid Build Coastguard Worker obj = InstantiateWinUsbInterface(interface_name);
122*90c8c64dSAndroid Build Coastguard Worker if (NULL == obj) {
123*90c8c64dSAndroid Build Coastguard Worker return NULL;
124*90c8c64dSAndroid Build Coastguard Worker }
125*90c8c64dSAndroid Build Coastguard Worker } else {
126*90c8c64dSAndroid Build Coastguard Worker return NULL;
127*90c8c64dSAndroid Build Coastguard Worker }
128*90c8c64dSAndroid Build Coastguard Worker }
129*90c8c64dSAndroid Build Coastguard Worker
130*90c8c64dSAndroid Build Coastguard Worker // Create handle for it
131*90c8c64dSAndroid Build Coastguard Worker ret = obj->CreateHandle();
132*90c8c64dSAndroid Build Coastguard Worker } catch (...) {
133*90c8c64dSAndroid Build Coastguard Worker SetLastError(ERROR_OUTOFMEMORY);
134*90c8c64dSAndroid Build Coastguard Worker }
135*90c8c64dSAndroid Build Coastguard Worker
136*90c8c64dSAndroid Build Coastguard Worker if (NULL != obj)
137*90c8c64dSAndroid Build Coastguard Worker obj->Release();
138*90c8c64dSAndroid Build Coastguard Worker
139*90c8c64dSAndroid Build Coastguard Worker return ret;
140*90c8c64dSAndroid Build Coastguard Worker }
141*90c8c64dSAndroid Build Coastguard Worker
AdbCreateInterface(GUID class_id,unsigned short vendor_id,unsigned short product_id,unsigned char interface_id)142*90c8c64dSAndroid Build Coastguard Worker ADBAPIHANDLE __cdecl AdbCreateInterface(GUID class_id,
143*90c8c64dSAndroid Build Coastguard Worker unsigned short vendor_id,
144*90c8c64dSAndroid Build Coastguard Worker unsigned short product_id,
145*90c8c64dSAndroid Build Coastguard Worker unsigned char interface_id) {
146*90c8c64dSAndroid Build Coastguard Worker // Enumerate all active interfaces for the given class
147*90c8c64dSAndroid Build Coastguard Worker AdbEnumInterfaceArray interfaces;
148*90c8c64dSAndroid Build Coastguard Worker
149*90c8c64dSAndroid Build Coastguard Worker if (!EnumerateDeviceInterfaces(class_id,
150*90c8c64dSAndroid Build Coastguard Worker DIGCF_DEVICEINTERFACE | DIGCF_PRESENT,
151*90c8c64dSAndroid Build Coastguard Worker true,
152*90c8c64dSAndroid Build Coastguard Worker true,
153*90c8c64dSAndroid Build Coastguard Worker &interfaces)) {
154*90c8c64dSAndroid Build Coastguard Worker return NULL;
155*90c8c64dSAndroid Build Coastguard Worker }
156*90c8c64dSAndroid Build Coastguard Worker
157*90c8c64dSAndroid Build Coastguard Worker if (interfaces.empty()) {
158*90c8c64dSAndroid Build Coastguard Worker SetLastError(ERROR_DEVICE_NOT_AVAILABLE);
159*90c8c64dSAndroid Build Coastguard Worker return NULL;
160*90c8c64dSAndroid Build Coastguard Worker }
161*90c8c64dSAndroid Build Coastguard Worker
162*90c8c64dSAndroid Build Coastguard Worker // Now iterate over active interfaces looking for the name match.
163*90c8c64dSAndroid Build Coastguard Worker // The name is formatted as such:
164*90c8c64dSAndroid Build Coastguard Worker // "\\\\?\\usb#vid_xxxx&pid_xxxx&mi_xx#123456789abcdef#{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"
165*90c8c64dSAndroid Build Coastguard Worker // where
166*90c8c64dSAndroid Build Coastguard Worker // vid_xxxx is for the vendor id (xxxx are hex for the given vendor id),
167*90c8c64dSAndroid Build Coastguard Worker // pid_xxxx is for the product id (xxxx are hex for the given product id)
168*90c8c64dSAndroid Build Coastguard Worker // mi_xx is for the interface id (xx are hex for the given interface id)
169*90c8c64dSAndroid Build Coastguard Worker // EnumerateDeviceInterfaces will guarantee that returned interface names
170*90c8c64dSAndroid Build Coastguard Worker // will have our class id at the end of the name (those last XXXes in the
171*90c8c64dSAndroid Build Coastguard Worker // format). So, we only need to match the beginning of the name
172*90c8c64dSAndroid Build Coastguard Worker wchar_t match_name[64];
173*90c8c64dSAndroid Build Coastguard Worker if (0xFF == interface_id) {
174*90c8c64dSAndroid Build Coastguard Worker // No interface id for the name.
175*90c8c64dSAndroid Build Coastguard Worker swprintf(match_name, L"\\\\?\\usb#vid_%04x&pid_%04x#",
176*90c8c64dSAndroid Build Coastguard Worker vendor_id, product_id);
177*90c8c64dSAndroid Build Coastguard Worker } else {
178*90c8c64dSAndroid Build Coastguard Worker // With interface id for the name.
179*90c8c64dSAndroid Build Coastguard Worker swprintf(match_name, L"\\\\?\\usb#vid_%04x&pid_%04x&mi_%02x#",
180*90c8c64dSAndroid Build Coastguard Worker vendor_id, product_id, interface_id);
181*90c8c64dSAndroid Build Coastguard Worker }
182*90c8c64dSAndroid Build Coastguard Worker size_t match_len = wcslen(match_name);
183*90c8c64dSAndroid Build Coastguard Worker
184*90c8c64dSAndroid Build Coastguard Worker for (AdbEnumInterfaceArray::iterator it = interfaces.begin();
185*90c8c64dSAndroid Build Coastguard Worker it != interfaces.end(); it++) {
186*90c8c64dSAndroid Build Coastguard Worker const AdbInstanceEnumEntry& next_interface = *it;
187*90c8c64dSAndroid Build Coastguard Worker if (0 == _wcsnicmp(match_name,
188*90c8c64dSAndroid Build Coastguard Worker next_interface.device_name().c_str(),
189*90c8c64dSAndroid Build Coastguard Worker match_len)) {
190*90c8c64dSAndroid Build Coastguard Worker // Found requested interface among active interfaces.
191*90c8c64dSAndroid Build Coastguard Worker return AdbCreateInterfaceByName(next_interface.device_name().c_str());
192*90c8c64dSAndroid Build Coastguard Worker }
193*90c8c64dSAndroid Build Coastguard Worker }
194*90c8c64dSAndroid Build Coastguard Worker
195*90c8c64dSAndroid Build Coastguard Worker SetLastError(ERROR_DEVICE_NOT_AVAILABLE);
196*90c8c64dSAndroid Build Coastguard Worker return NULL;
197*90c8c64dSAndroid Build Coastguard Worker }
198*90c8c64dSAndroid Build Coastguard Worker
AdbGetInterfaceName(ADBAPIHANDLE adb_interface,void * buffer,unsigned long * buffer_char_size,bool ansi)199*90c8c64dSAndroid Build Coastguard Worker bool __cdecl AdbGetInterfaceName(ADBAPIHANDLE adb_interface,
200*90c8c64dSAndroid Build Coastguard Worker void* buffer,
201*90c8c64dSAndroid Build Coastguard Worker unsigned long* buffer_char_size,
202*90c8c64dSAndroid Build Coastguard Worker bool ansi) {
203*90c8c64dSAndroid Build Coastguard Worker // Lookup interface object for the handle
204*90c8c64dSAndroid Build Coastguard Worker AdbInterfaceObject* adb_object =
205*90c8c64dSAndroid Build Coastguard Worker LookupObject<AdbInterfaceObject>(adb_interface);
206*90c8c64dSAndroid Build Coastguard Worker
207*90c8c64dSAndroid Build Coastguard Worker if (NULL != adb_object) {
208*90c8c64dSAndroid Build Coastguard Worker // Dispatch call to the found object
209*90c8c64dSAndroid Build Coastguard Worker bool ret = adb_object->GetInterfaceName(buffer, buffer_char_size, ansi);
210*90c8c64dSAndroid Build Coastguard Worker adb_object->Release();
211*90c8c64dSAndroid Build Coastguard Worker return ret;
212*90c8c64dSAndroid Build Coastguard Worker } else {
213*90c8c64dSAndroid Build Coastguard Worker SetLastError(ERROR_INVALID_HANDLE);
214*90c8c64dSAndroid Build Coastguard Worker return false;
215*90c8c64dSAndroid Build Coastguard Worker }
216*90c8c64dSAndroid Build Coastguard Worker }
217*90c8c64dSAndroid Build Coastguard Worker
AdbGetSerialNumber(ADBAPIHANDLE adb_interface,void * buffer,unsigned long * buffer_char_size,bool ansi)218*90c8c64dSAndroid Build Coastguard Worker bool __cdecl AdbGetSerialNumber(ADBAPIHANDLE adb_interface,
219*90c8c64dSAndroid Build Coastguard Worker void* buffer,
220*90c8c64dSAndroid Build Coastguard Worker unsigned long* buffer_char_size,
221*90c8c64dSAndroid Build Coastguard Worker bool ansi) {
222*90c8c64dSAndroid Build Coastguard Worker // Lookup interface object for the handle
223*90c8c64dSAndroid Build Coastguard Worker AdbInterfaceObject* adb_object =
224*90c8c64dSAndroid Build Coastguard Worker LookupObject<AdbInterfaceObject>(adb_interface);
225*90c8c64dSAndroid Build Coastguard Worker
226*90c8c64dSAndroid Build Coastguard Worker if (NULL != adb_object) {
227*90c8c64dSAndroid Build Coastguard Worker // Dispatch call to the found object
228*90c8c64dSAndroid Build Coastguard Worker bool ret = adb_object->GetSerialNumber(buffer, buffer_char_size, ansi);
229*90c8c64dSAndroid Build Coastguard Worker adb_object->Release();
230*90c8c64dSAndroid Build Coastguard Worker return ret;
231*90c8c64dSAndroid Build Coastguard Worker } else {
232*90c8c64dSAndroid Build Coastguard Worker SetLastError(ERROR_INVALID_HANDLE);
233*90c8c64dSAndroid Build Coastguard Worker return false;
234*90c8c64dSAndroid Build Coastguard Worker }
235*90c8c64dSAndroid Build Coastguard Worker }
236*90c8c64dSAndroid Build Coastguard Worker
AdbGetUsbDeviceDescriptor(ADBAPIHANDLE adb_interface,USB_DEVICE_DESCRIPTOR * desc)237*90c8c64dSAndroid Build Coastguard Worker bool __cdecl AdbGetUsbDeviceDescriptor(ADBAPIHANDLE adb_interface,
238*90c8c64dSAndroid Build Coastguard Worker USB_DEVICE_DESCRIPTOR* desc) {
239*90c8c64dSAndroid Build Coastguard Worker // Lookup interface object for the handle
240*90c8c64dSAndroid Build Coastguard Worker AdbInterfaceObject* adb_object =
241*90c8c64dSAndroid Build Coastguard Worker LookupObject<AdbInterfaceObject>(adb_interface);
242*90c8c64dSAndroid Build Coastguard Worker
243*90c8c64dSAndroid Build Coastguard Worker if (NULL != adb_object) {
244*90c8c64dSAndroid Build Coastguard Worker // Dispatch close to the found object
245*90c8c64dSAndroid Build Coastguard Worker bool ret = adb_object->GetUsbDeviceDescriptor(desc);
246*90c8c64dSAndroid Build Coastguard Worker adb_object->Release();
247*90c8c64dSAndroid Build Coastguard Worker return ret;
248*90c8c64dSAndroid Build Coastguard Worker } else {
249*90c8c64dSAndroid Build Coastguard Worker SetLastError(ERROR_INVALID_HANDLE);
250*90c8c64dSAndroid Build Coastguard Worker return false;
251*90c8c64dSAndroid Build Coastguard Worker }
252*90c8c64dSAndroid Build Coastguard Worker }
253*90c8c64dSAndroid Build Coastguard Worker
AdbGetUsbConfigurationDescriptor(ADBAPIHANDLE adb_interface,USB_CONFIGURATION_DESCRIPTOR * desc)254*90c8c64dSAndroid Build Coastguard Worker bool __cdecl AdbGetUsbConfigurationDescriptor(ADBAPIHANDLE adb_interface,
255*90c8c64dSAndroid Build Coastguard Worker USB_CONFIGURATION_DESCRIPTOR* desc) {
256*90c8c64dSAndroid Build Coastguard Worker // Lookup interface object for the handle
257*90c8c64dSAndroid Build Coastguard Worker AdbInterfaceObject* adb_object =
258*90c8c64dSAndroid Build Coastguard Worker LookupObject<AdbInterfaceObject>(adb_interface);
259*90c8c64dSAndroid Build Coastguard Worker
260*90c8c64dSAndroid Build Coastguard Worker if (NULL != adb_object) {
261*90c8c64dSAndroid Build Coastguard Worker // Dispatch close to the found object
262*90c8c64dSAndroid Build Coastguard Worker bool ret = adb_object->GetUsbConfigurationDescriptor(desc);
263*90c8c64dSAndroid Build Coastguard Worker adb_object->Release();
264*90c8c64dSAndroid Build Coastguard Worker return ret;
265*90c8c64dSAndroid Build Coastguard Worker } else {
266*90c8c64dSAndroid Build Coastguard Worker SetLastError(ERROR_INVALID_HANDLE);
267*90c8c64dSAndroid Build Coastguard Worker return false;
268*90c8c64dSAndroid Build Coastguard Worker }
269*90c8c64dSAndroid Build Coastguard Worker }
270*90c8c64dSAndroid Build Coastguard Worker
AdbGetUsbInterfaceDescriptor(ADBAPIHANDLE adb_interface,USB_INTERFACE_DESCRIPTOR * desc)271*90c8c64dSAndroid Build Coastguard Worker bool __cdecl AdbGetUsbInterfaceDescriptor(ADBAPIHANDLE adb_interface,
272*90c8c64dSAndroid Build Coastguard Worker USB_INTERFACE_DESCRIPTOR* desc) {
273*90c8c64dSAndroid Build Coastguard Worker // Lookup interface object for the handle
274*90c8c64dSAndroid Build Coastguard Worker AdbInterfaceObject* adb_object =
275*90c8c64dSAndroid Build Coastguard Worker LookupObject<AdbInterfaceObject>(adb_interface);
276*90c8c64dSAndroid Build Coastguard Worker
277*90c8c64dSAndroid Build Coastguard Worker if (NULL != adb_object) {
278*90c8c64dSAndroid Build Coastguard Worker // Dispatch close to the found object
279*90c8c64dSAndroid Build Coastguard Worker bool ret = adb_object->GetUsbInterfaceDescriptor(desc);
280*90c8c64dSAndroid Build Coastguard Worker adb_object->Release();
281*90c8c64dSAndroid Build Coastguard Worker return ret;
282*90c8c64dSAndroid Build Coastguard Worker } else {
283*90c8c64dSAndroid Build Coastguard Worker SetLastError(ERROR_INVALID_HANDLE);
284*90c8c64dSAndroid Build Coastguard Worker return false;
285*90c8c64dSAndroid Build Coastguard Worker }
286*90c8c64dSAndroid Build Coastguard Worker }
287*90c8c64dSAndroid Build Coastguard Worker
AdbGetEndpointInformation(ADBAPIHANDLE adb_interface,UCHAR endpoint_index,AdbEndpointInformation * info)288*90c8c64dSAndroid Build Coastguard Worker bool __cdecl AdbGetEndpointInformation(ADBAPIHANDLE adb_interface,
289*90c8c64dSAndroid Build Coastguard Worker UCHAR endpoint_index,
290*90c8c64dSAndroid Build Coastguard Worker AdbEndpointInformation* info) {
291*90c8c64dSAndroid Build Coastguard Worker // Lookup interface object for the handle
292*90c8c64dSAndroid Build Coastguard Worker AdbInterfaceObject* adb_object =
293*90c8c64dSAndroid Build Coastguard Worker LookupObject<AdbInterfaceObject>(adb_interface);
294*90c8c64dSAndroid Build Coastguard Worker
295*90c8c64dSAndroid Build Coastguard Worker if (NULL != adb_object) {
296*90c8c64dSAndroid Build Coastguard Worker // Dispatch close to the found object
297*90c8c64dSAndroid Build Coastguard Worker bool ret = adb_object->GetEndpointInformation(endpoint_index, info);
298*90c8c64dSAndroid Build Coastguard Worker adb_object->Release();
299*90c8c64dSAndroid Build Coastguard Worker return ret;
300*90c8c64dSAndroid Build Coastguard Worker } else {
301*90c8c64dSAndroid Build Coastguard Worker SetLastError(ERROR_INVALID_HANDLE);
302*90c8c64dSAndroid Build Coastguard Worker return false;
303*90c8c64dSAndroid Build Coastguard Worker }
304*90c8c64dSAndroid Build Coastguard Worker }
305*90c8c64dSAndroid Build Coastguard Worker
AdbGetDefaultBulkReadEndpointInformation(ADBAPIHANDLE adb_interface,AdbEndpointInformation * info)306*90c8c64dSAndroid Build Coastguard Worker bool __cdecl AdbGetDefaultBulkReadEndpointInformation(ADBAPIHANDLE adb_interface,
307*90c8c64dSAndroid Build Coastguard Worker AdbEndpointInformation* info) {
308*90c8c64dSAndroid Build Coastguard Worker return AdbGetEndpointInformation(adb_interface,
309*90c8c64dSAndroid Build Coastguard Worker ADB_QUERY_BULK_READ_ENDPOINT_INDEX,
310*90c8c64dSAndroid Build Coastguard Worker info);
311*90c8c64dSAndroid Build Coastguard Worker }
312*90c8c64dSAndroid Build Coastguard Worker
AdbGetDefaultBulkWriteEndpointInformation(ADBAPIHANDLE adb_interface,AdbEndpointInformation * info)313*90c8c64dSAndroid Build Coastguard Worker bool __cdecl AdbGetDefaultBulkWriteEndpointInformation(ADBAPIHANDLE adb_interface,
314*90c8c64dSAndroid Build Coastguard Worker AdbEndpointInformation* info) {
315*90c8c64dSAndroid Build Coastguard Worker return AdbGetEndpointInformation(adb_interface,
316*90c8c64dSAndroid Build Coastguard Worker ADB_QUERY_BULK_WRITE_ENDPOINT_INDEX,
317*90c8c64dSAndroid Build Coastguard Worker info);
318*90c8c64dSAndroid Build Coastguard Worker }
319*90c8c64dSAndroid Build Coastguard Worker
AdbOpenEndpoint(ADBAPIHANDLE adb_interface,unsigned char endpoint_index,AdbOpenAccessType access_type,AdbOpenSharingMode sharing_mode)320*90c8c64dSAndroid Build Coastguard Worker ADBAPIHANDLE __cdecl AdbOpenEndpoint(ADBAPIHANDLE adb_interface,
321*90c8c64dSAndroid Build Coastguard Worker unsigned char endpoint_index,
322*90c8c64dSAndroid Build Coastguard Worker AdbOpenAccessType access_type,
323*90c8c64dSAndroid Build Coastguard Worker AdbOpenSharingMode sharing_mode) {
324*90c8c64dSAndroid Build Coastguard Worker // Lookup interface object for the handle
325*90c8c64dSAndroid Build Coastguard Worker AdbInterfaceObject* adb_object =
326*90c8c64dSAndroid Build Coastguard Worker LookupObject<AdbInterfaceObject>(adb_interface);
327*90c8c64dSAndroid Build Coastguard Worker
328*90c8c64dSAndroid Build Coastguard Worker if (NULL != adb_object) {
329*90c8c64dSAndroid Build Coastguard Worker // Dispatch close to the found object
330*90c8c64dSAndroid Build Coastguard Worker ADBAPIHANDLE ret =
331*90c8c64dSAndroid Build Coastguard Worker adb_object->OpenEndpoint(endpoint_index, access_type, sharing_mode);
332*90c8c64dSAndroid Build Coastguard Worker adb_object->Release();
333*90c8c64dSAndroid Build Coastguard Worker return ret;
334*90c8c64dSAndroid Build Coastguard Worker } else {
335*90c8c64dSAndroid Build Coastguard Worker SetLastError(ERROR_INVALID_HANDLE);
336*90c8c64dSAndroid Build Coastguard Worker return NULL;
337*90c8c64dSAndroid Build Coastguard Worker }
338*90c8c64dSAndroid Build Coastguard Worker }
339*90c8c64dSAndroid Build Coastguard Worker
AdbOpenDefaultBulkReadEndpoint(ADBAPIHANDLE adb_interface,AdbOpenAccessType access_type,AdbOpenSharingMode sharing_mode)340*90c8c64dSAndroid Build Coastguard Worker ADBAPIHANDLE __cdecl AdbOpenDefaultBulkReadEndpoint(ADBAPIHANDLE adb_interface,
341*90c8c64dSAndroid Build Coastguard Worker AdbOpenAccessType access_type,
342*90c8c64dSAndroid Build Coastguard Worker AdbOpenSharingMode sharing_mode) {
343*90c8c64dSAndroid Build Coastguard Worker return AdbOpenEndpoint(adb_interface,
344*90c8c64dSAndroid Build Coastguard Worker ADB_QUERY_BULK_READ_ENDPOINT_INDEX,
345*90c8c64dSAndroid Build Coastguard Worker access_type,
346*90c8c64dSAndroid Build Coastguard Worker sharing_mode);
347*90c8c64dSAndroid Build Coastguard Worker }
348*90c8c64dSAndroid Build Coastguard Worker
AdbOpenDefaultBulkWriteEndpoint(ADBAPIHANDLE adb_interface,AdbOpenAccessType access_type,AdbOpenSharingMode sharing_mode)349*90c8c64dSAndroid Build Coastguard Worker ADBAPIHANDLE __cdecl AdbOpenDefaultBulkWriteEndpoint(ADBAPIHANDLE adb_interface,
350*90c8c64dSAndroid Build Coastguard Worker AdbOpenAccessType access_type,
351*90c8c64dSAndroid Build Coastguard Worker AdbOpenSharingMode sharing_mode) {
352*90c8c64dSAndroid Build Coastguard Worker return AdbOpenEndpoint(adb_interface,
353*90c8c64dSAndroid Build Coastguard Worker ADB_QUERY_BULK_WRITE_ENDPOINT_INDEX,
354*90c8c64dSAndroid Build Coastguard Worker access_type,
355*90c8c64dSAndroid Build Coastguard Worker sharing_mode);
356*90c8c64dSAndroid Build Coastguard Worker }
357*90c8c64dSAndroid Build Coastguard Worker
AdbGetEndpointInterface(ADBAPIHANDLE adb_endpoint)358*90c8c64dSAndroid Build Coastguard Worker ADBAPIHANDLE __cdecl AdbGetEndpointInterface(ADBAPIHANDLE adb_endpoint) {
359*90c8c64dSAndroid Build Coastguard Worker // Lookup endpoint object for the handle
360*90c8c64dSAndroid Build Coastguard Worker AdbEndpointObject* adb_object =
361*90c8c64dSAndroid Build Coastguard Worker LookupObject<AdbEndpointObject>(adb_endpoint);
362*90c8c64dSAndroid Build Coastguard Worker
363*90c8c64dSAndroid Build Coastguard Worker if (NULL != adb_object) {
364*90c8c64dSAndroid Build Coastguard Worker // Dispatch the call to the found object
365*90c8c64dSAndroid Build Coastguard Worker ADBAPIHANDLE ret = adb_object->GetParentInterfaceHandle();
366*90c8c64dSAndroid Build Coastguard Worker adb_object->Release();
367*90c8c64dSAndroid Build Coastguard Worker return ret;
368*90c8c64dSAndroid Build Coastguard Worker } else {
369*90c8c64dSAndroid Build Coastguard Worker SetLastError(ERROR_INVALID_HANDLE);
370*90c8c64dSAndroid Build Coastguard Worker return NULL;
371*90c8c64dSAndroid Build Coastguard Worker }
372*90c8c64dSAndroid Build Coastguard Worker }
373*90c8c64dSAndroid Build Coastguard Worker
AdbQueryInformationEndpoint(ADBAPIHANDLE adb_endpoint,AdbEndpointInformation * info)374*90c8c64dSAndroid Build Coastguard Worker bool __cdecl AdbQueryInformationEndpoint(ADBAPIHANDLE adb_endpoint,
375*90c8c64dSAndroid Build Coastguard Worker AdbEndpointInformation* info) {
376*90c8c64dSAndroid Build Coastguard Worker // Lookup endpoint object for the handle
377*90c8c64dSAndroid Build Coastguard Worker AdbEndpointObject* adb_object =
378*90c8c64dSAndroid Build Coastguard Worker LookupObject<AdbEndpointObject>(adb_endpoint);
379*90c8c64dSAndroid Build Coastguard Worker
380*90c8c64dSAndroid Build Coastguard Worker if (NULL != adb_object) {
381*90c8c64dSAndroid Build Coastguard Worker // Dispatch the call to the found object
382*90c8c64dSAndroid Build Coastguard Worker bool ret = adb_object->GetEndpointInformation(info);
383*90c8c64dSAndroid Build Coastguard Worker adb_object->Release();
384*90c8c64dSAndroid Build Coastguard Worker return ret;
385*90c8c64dSAndroid Build Coastguard Worker } else {
386*90c8c64dSAndroid Build Coastguard Worker SetLastError(ERROR_INVALID_HANDLE);
387*90c8c64dSAndroid Build Coastguard Worker return false;
388*90c8c64dSAndroid Build Coastguard Worker }
389*90c8c64dSAndroid Build Coastguard Worker }
390*90c8c64dSAndroid Build Coastguard Worker
AdbReadEndpointAsync(ADBAPIHANDLE adb_endpoint,void * buffer,unsigned long bytes_to_read,unsigned long * bytes_read,unsigned long time_out,HANDLE event_handle)391*90c8c64dSAndroid Build Coastguard Worker ADBAPIHANDLE __cdecl AdbReadEndpointAsync(ADBAPIHANDLE adb_endpoint,
392*90c8c64dSAndroid Build Coastguard Worker void* buffer,
393*90c8c64dSAndroid Build Coastguard Worker unsigned long bytes_to_read,
394*90c8c64dSAndroid Build Coastguard Worker unsigned long* bytes_read,
395*90c8c64dSAndroid Build Coastguard Worker unsigned long time_out,
396*90c8c64dSAndroid Build Coastguard Worker HANDLE event_handle) {
397*90c8c64dSAndroid Build Coastguard Worker // Lookup endpoint object for the handle
398*90c8c64dSAndroid Build Coastguard Worker AdbEndpointObject* adb_object =
399*90c8c64dSAndroid Build Coastguard Worker LookupObject<AdbEndpointObject>(adb_endpoint);
400*90c8c64dSAndroid Build Coastguard Worker
401*90c8c64dSAndroid Build Coastguard Worker if (NULL != adb_object) {
402*90c8c64dSAndroid Build Coastguard Worker // Dispatch the call to the found object
403*90c8c64dSAndroid Build Coastguard Worker ADBAPIHANDLE ret = adb_object->AsyncRead(buffer,
404*90c8c64dSAndroid Build Coastguard Worker bytes_to_read,
405*90c8c64dSAndroid Build Coastguard Worker bytes_read,
406*90c8c64dSAndroid Build Coastguard Worker event_handle,
407*90c8c64dSAndroid Build Coastguard Worker time_out);
408*90c8c64dSAndroid Build Coastguard Worker adb_object->Release();
409*90c8c64dSAndroid Build Coastguard Worker return ret;
410*90c8c64dSAndroid Build Coastguard Worker } else {
411*90c8c64dSAndroid Build Coastguard Worker SetLastError(ERROR_INVALID_HANDLE);
412*90c8c64dSAndroid Build Coastguard Worker return NULL;
413*90c8c64dSAndroid Build Coastguard Worker }
414*90c8c64dSAndroid Build Coastguard Worker }
415*90c8c64dSAndroid Build Coastguard Worker
AdbWriteEndpointAsync(ADBAPIHANDLE adb_endpoint,void * buffer,unsigned long bytes_to_write,unsigned long * bytes_written,unsigned long time_out,HANDLE event_handle)416*90c8c64dSAndroid Build Coastguard Worker ADBAPIHANDLE __cdecl AdbWriteEndpointAsync(ADBAPIHANDLE adb_endpoint,
417*90c8c64dSAndroid Build Coastguard Worker void* buffer,
418*90c8c64dSAndroid Build Coastguard Worker unsigned long bytes_to_write,
419*90c8c64dSAndroid Build Coastguard Worker unsigned long* bytes_written,
420*90c8c64dSAndroid Build Coastguard Worker unsigned long time_out,
421*90c8c64dSAndroid Build Coastguard Worker HANDLE event_handle) {
422*90c8c64dSAndroid Build Coastguard Worker // Lookup endpoint object for the handle
423*90c8c64dSAndroid Build Coastguard Worker AdbEndpointObject* adb_object =
424*90c8c64dSAndroid Build Coastguard Worker LookupObject<AdbEndpointObject>(adb_endpoint);
425*90c8c64dSAndroid Build Coastguard Worker
426*90c8c64dSAndroid Build Coastguard Worker if (NULL != adb_object) {
427*90c8c64dSAndroid Build Coastguard Worker // Dispatch the call to the found object
428*90c8c64dSAndroid Build Coastguard Worker ADBAPIHANDLE ret = adb_object->AsyncWrite(buffer,
429*90c8c64dSAndroid Build Coastguard Worker bytes_to_write,
430*90c8c64dSAndroid Build Coastguard Worker bytes_written,
431*90c8c64dSAndroid Build Coastguard Worker event_handle,
432*90c8c64dSAndroid Build Coastguard Worker time_out);
433*90c8c64dSAndroid Build Coastguard Worker adb_object->Release();
434*90c8c64dSAndroid Build Coastguard Worker return ret;
435*90c8c64dSAndroid Build Coastguard Worker } else {
436*90c8c64dSAndroid Build Coastguard Worker SetLastError(ERROR_INVALID_HANDLE);
437*90c8c64dSAndroid Build Coastguard Worker return false;
438*90c8c64dSAndroid Build Coastguard Worker }
439*90c8c64dSAndroid Build Coastguard Worker }
440*90c8c64dSAndroid Build Coastguard Worker
AdbReadEndpointSync(ADBAPIHANDLE adb_endpoint,void * buffer,unsigned long bytes_to_read,unsigned long * bytes_read,unsigned long time_out)441*90c8c64dSAndroid Build Coastguard Worker bool __cdecl AdbReadEndpointSync(ADBAPIHANDLE adb_endpoint,
442*90c8c64dSAndroid Build Coastguard Worker void* buffer,
443*90c8c64dSAndroid Build Coastguard Worker unsigned long bytes_to_read,
444*90c8c64dSAndroid Build Coastguard Worker unsigned long* bytes_read,
445*90c8c64dSAndroid Build Coastguard Worker unsigned long time_out) {
446*90c8c64dSAndroid Build Coastguard Worker // Lookup endpoint object for the handle
447*90c8c64dSAndroid Build Coastguard Worker AdbEndpointObject* adb_object =
448*90c8c64dSAndroid Build Coastguard Worker LookupObject<AdbEndpointObject>(adb_endpoint);
449*90c8c64dSAndroid Build Coastguard Worker
450*90c8c64dSAndroid Build Coastguard Worker if (NULL != adb_object) {
451*90c8c64dSAndroid Build Coastguard Worker // Dispatch the call to the found object
452*90c8c64dSAndroid Build Coastguard Worker bool ret =
453*90c8c64dSAndroid Build Coastguard Worker adb_object->SyncRead(buffer, bytes_to_read, bytes_read, time_out);
454*90c8c64dSAndroid Build Coastguard Worker adb_object->Release();
455*90c8c64dSAndroid Build Coastguard Worker return ret;
456*90c8c64dSAndroid Build Coastguard Worker } else {
457*90c8c64dSAndroid Build Coastguard Worker SetLastError(ERROR_INVALID_HANDLE);
458*90c8c64dSAndroid Build Coastguard Worker return NULL;
459*90c8c64dSAndroid Build Coastguard Worker }
460*90c8c64dSAndroid Build Coastguard Worker }
461*90c8c64dSAndroid Build Coastguard Worker
AdbWriteEndpointSync(ADBAPIHANDLE adb_endpoint,void * buffer,unsigned long bytes_to_write,unsigned long * bytes_written,unsigned long time_out)462*90c8c64dSAndroid Build Coastguard Worker bool __cdecl AdbWriteEndpointSync(ADBAPIHANDLE adb_endpoint,
463*90c8c64dSAndroid Build Coastguard Worker void* buffer,
464*90c8c64dSAndroid Build Coastguard Worker unsigned long bytes_to_write,
465*90c8c64dSAndroid Build Coastguard Worker unsigned long* bytes_written,
466*90c8c64dSAndroid Build Coastguard Worker unsigned long time_out) {
467*90c8c64dSAndroid Build Coastguard Worker // Lookup endpoint object for the handle
468*90c8c64dSAndroid Build Coastguard Worker AdbEndpointObject* adb_object =
469*90c8c64dSAndroid Build Coastguard Worker LookupObject<AdbEndpointObject>(adb_endpoint);
470*90c8c64dSAndroid Build Coastguard Worker
471*90c8c64dSAndroid Build Coastguard Worker if (NULL != adb_object) {
472*90c8c64dSAndroid Build Coastguard Worker // Dispatch the call to the found object
473*90c8c64dSAndroid Build Coastguard Worker bool ret =
474*90c8c64dSAndroid Build Coastguard Worker adb_object->SyncWrite(buffer, bytes_to_write, bytes_written, time_out);
475*90c8c64dSAndroid Build Coastguard Worker adb_object->Release();
476*90c8c64dSAndroid Build Coastguard Worker return ret;
477*90c8c64dSAndroid Build Coastguard Worker } else {
478*90c8c64dSAndroid Build Coastguard Worker SetLastError(ERROR_INVALID_HANDLE);
479*90c8c64dSAndroid Build Coastguard Worker return false;
480*90c8c64dSAndroid Build Coastguard Worker }
481*90c8c64dSAndroid Build Coastguard Worker }
482*90c8c64dSAndroid Build Coastguard Worker
AdbGetOvelappedIoResult(ADBAPIHANDLE adb_io_completion,LPOVERLAPPED overlapped,unsigned long * bytes_transferred,bool wait)483*90c8c64dSAndroid Build Coastguard Worker bool __cdecl AdbGetOvelappedIoResult(ADBAPIHANDLE adb_io_completion,
484*90c8c64dSAndroid Build Coastguard Worker LPOVERLAPPED overlapped,
485*90c8c64dSAndroid Build Coastguard Worker unsigned long* bytes_transferred,
486*90c8c64dSAndroid Build Coastguard Worker bool wait) {
487*90c8c64dSAndroid Build Coastguard Worker // Lookup endpoint object for the handle
488*90c8c64dSAndroid Build Coastguard Worker AdbIOCompletion* adb_object =
489*90c8c64dSAndroid Build Coastguard Worker LookupObject<AdbIOCompletion>(adb_io_completion);
490*90c8c64dSAndroid Build Coastguard Worker
491*90c8c64dSAndroid Build Coastguard Worker if (NULL != adb_object) {
492*90c8c64dSAndroid Build Coastguard Worker // Dispatch the call to the found object
493*90c8c64dSAndroid Build Coastguard Worker bool ret =
494*90c8c64dSAndroid Build Coastguard Worker adb_object->GetOvelappedIoResult(overlapped, bytes_transferred, wait);
495*90c8c64dSAndroid Build Coastguard Worker adb_object->Release();
496*90c8c64dSAndroid Build Coastguard Worker return ret;
497*90c8c64dSAndroid Build Coastguard Worker } else {
498*90c8c64dSAndroid Build Coastguard Worker SetLastError(ERROR_INVALID_HANDLE);
499*90c8c64dSAndroid Build Coastguard Worker return false;
500*90c8c64dSAndroid Build Coastguard Worker }
501*90c8c64dSAndroid Build Coastguard Worker }
502*90c8c64dSAndroid Build Coastguard Worker
AdbHasOvelappedIoComplated(ADBAPIHANDLE adb_io_completion)503*90c8c64dSAndroid Build Coastguard Worker bool __cdecl AdbHasOvelappedIoComplated(ADBAPIHANDLE adb_io_completion) {
504*90c8c64dSAndroid Build Coastguard Worker // Lookup endpoint object for the handle
505*90c8c64dSAndroid Build Coastguard Worker AdbIOCompletion* adb_object =
506*90c8c64dSAndroid Build Coastguard Worker LookupObject<AdbIOCompletion>(adb_io_completion);
507*90c8c64dSAndroid Build Coastguard Worker
508*90c8c64dSAndroid Build Coastguard Worker if (NULL != adb_object) {
509*90c8c64dSAndroid Build Coastguard Worker // Dispatch the call to the found object
510*90c8c64dSAndroid Build Coastguard Worker bool ret =
511*90c8c64dSAndroid Build Coastguard Worker adb_object->IsCompleted();
512*90c8c64dSAndroid Build Coastguard Worker adb_object->Release();
513*90c8c64dSAndroid Build Coastguard Worker return ret;
514*90c8c64dSAndroid Build Coastguard Worker } else {
515*90c8c64dSAndroid Build Coastguard Worker SetLastError(ERROR_INVALID_HANDLE);
516*90c8c64dSAndroid Build Coastguard Worker return true;
517*90c8c64dSAndroid Build Coastguard Worker }
518*90c8c64dSAndroid Build Coastguard Worker }
519*90c8c64dSAndroid Build Coastguard Worker
AdbCloseHandle(ADBAPIHANDLE adb_handle)520*90c8c64dSAndroid Build Coastguard Worker bool __cdecl AdbCloseHandle(ADBAPIHANDLE adb_handle) {
521*90c8c64dSAndroid Build Coastguard Worker // Lookup object for the handle
522*90c8c64dSAndroid Build Coastguard Worker AdbObjectHandle* adb_object = AdbObjectHandle::Lookup(adb_handle);
523*90c8c64dSAndroid Build Coastguard Worker
524*90c8c64dSAndroid Build Coastguard Worker if (NULL != adb_object) {
525*90c8c64dSAndroid Build Coastguard Worker // Dispatch close to the found object
526*90c8c64dSAndroid Build Coastguard Worker bool ret = adb_object->CloseHandle();
527*90c8c64dSAndroid Build Coastguard Worker adb_object->Release();
528*90c8c64dSAndroid Build Coastguard Worker return ret;
529*90c8c64dSAndroid Build Coastguard Worker } else {
530*90c8c64dSAndroid Build Coastguard Worker SetLastError(ERROR_INVALID_HANDLE);
531*90c8c64dSAndroid Build Coastguard Worker return false;
532*90c8c64dSAndroid Build Coastguard Worker }
533*90c8c64dSAndroid Build Coastguard Worker }
534