diff --git a/host/windows/usb/common/android_usb_common_defines.h b/host/windows/usb/common/android_usb_common_defines.h deleted file mode 100644 index 723f4a356..000000000 --- a/host/windows/usb/common/android_usb_common_defines.h +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_USB_COMMON_DEFINES_H__ -#define ANDROID_USB_COMMON_DEFINES_H__ -/** \file - This file consists of declarations common for both, User and Kernel mode - parts of the system. -*/ - -/// Name for the default bulk read pipe -#define DEVICE_BULK_READ_PIPE_NAME L"BulkRead" - -/// Name for the default bulk write pipe -#define DEVICE_BULK_WRITE_PIPE_NAME L"BulkWrite" - -/// Prefix for an index-based pipe name -#define DEVICE_PIPE_NAME_PREFIX L"PIPE_" - -/** \name IOCTL codes for the driver -*/ -///@{ - -/// Control code for IOCTL that gets USB_DEVICE_DESCRIPTOR -#define ADB_CTL_GET_USB_DEVICE_DESCRIPTOR 10 - -/// Control code for IOCTL that gets USB_CONFIGURATION_DESCRIPTOR -#define ADB_CTL_GET_USB_CONFIGURATION_DESCRIPTOR 11 - -/// Control code for IOCTL that gets USB_INTERFACE_DESCRIPTOR -#define ADB_CTL_GET_USB_INTERFACE_DESCRIPTOR 12 - -/// Control code for IOCTL that gets endpoint information -#define ADB_CTL_GET_ENDPOINT_INFORMATION 13 - -/// Control code for bulk read IOCTL -#define ADB_CTL_BULK_READ 14 - -/// Control code for bulk write IOCTL -#define ADB_CTL_BULK_WRITE 15 - -/// Control code for IOCTL that gets device serial number -#define ADB_CTL_GET_SERIAL_NUMBER 16 - -/// IOCTL that gets USB_DEVICE_DESCRIPTOR -#define ADB_IOCTL_GET_USB_DEVICE_DESCRIPTOR \ - CTL_CODE(FILE_DEVICE_UNKNOWN, \ - ADB_CTL_GET_USB_DEVICE_DESCRIPTOR, \ - METHOD_BUFFERED, \ - FILE_READ_ACCESS) - -/// IOCTL that gets USB_CONFIGURATION_DESCRIPTOR -#define ADB_IOCTL_GET_USB_CONFIGURATION_DESCRIPTOR \ - CTL_CODE(FILE_DEVICE_UNKNOWN, \ - ADB_CTL_GET_USB_CONFIGURATION_DESCRIPTOR, \ - METHOD_BUFFERED, \ - FILE_READ_ACCESS) - -/// IOCTL that gets USB_INTERFACE_DESCRIPTOR -#define ADB_IOCTL_GET_USB_INTERFACE_DESCRIPTOR \ - CTL_CODE(FILE_DEVICE_UNKNOWN, \ - ADB_CTL_GET_USB_INTERFACE_DESCRIPTOR, \ - METHOD_BUFFERED, \ - FILE_READ_ACCESS) - -/// IOCTL that gets endpoint information -#define ADB_IOCTL_GET_ENDPOINT_INFORMATION \ - CTL_CODE(FILE_DEVICE_UNKNOWN, \ - ADB_CTL_GET_ENDPOINT_INFORMATION, \ - METHOD_BUFFERED, \ - FILE_READ_ACCESS) - -/// Bulk read IOCTL -#define ADB_IOCTL_BULK_READ \ - CTL_CODE(FILE_DEVICE_UNKNOWN, \ - ADB_CTL_BULK_READ, \ - METHOD_OUT_DIRECT, \ - FILE_READ_ACCESS) - -// For bulk write IOCTL we send request data in the form of AdbBulkTransfer -// structure and output buffer is just ULONG that receives number of bytes -// actually written. Since both of these are tiny we can use buffered I/O -// for this IOCTL. -/// Bulk write IOCTL -#define ADB_IOCTL_BULK_WRITE \ - CTL_CODE(FILE_DEVICE_UNKNOWN, \ - ADB_CTL_BULK_WRITE, \ - METHOD_BUFFERED, \ - FILE_WRITE_ACCESS) - -/// IOCTL that gets device serial number -#define ADB_IOCTL_GET_SERIAL_NUMBER \ - CTL_CODE(FILE_DEVICE_UNKNOWN, \ - ADB_CTL_GET_SERIAL_NUMBER, \ - METHOD_BUFFERED, \ - FILE_READ_ACCESS) - -///@} - -/** Structure AdbQueryEndpointInformation formats input for - ADB_IOCTL_GET_ENDPOINT_INFORMATION IOCTL request -*/ -struct AdbQueryEndpointInformation { - /// Zero-based endpoint index for which information is queried. - /// See ADB_QUERY_BULK_xxx_ENDPOINT_INDEX for shortcuts. - UCHAR endpoint_index; -}; - -/** Structure AdbBulkTransfer formats parameters for ADB_CTL_BULK_READ and - ADB_CTL_BULK_WRITE IOCTL requests. -*/ -struct AdbBulkTransfer { - /// Time in milliseconds to complete this request - ULONG time_out; - - /// Size of the data to transfer. This parameter is used only for - /// ADB_CTL_BULK_WRITE request. For ADB_CTL_BULK_READ requests transfer - /// size is defined by the output buffer size. - ULONG transfer_size; - - /// Initializes statically allocated structure - __forceinline AdbBulkTransfer() { - time_out = 0; - transfer_size = 0; - for_x64 = 0; - } - - /// Provides access to protected write_buffer field - void* GetWriteBuffer() { - return write_buffer; - } - - /// Provides access to protected write_buffer field - const void* GetWriteBuffer() const { - return write_buffer; - } - - /// Sets write_buffer field. - void SetWriteBuffer(void* buffer) { - // For 32-bit we must zero out high 32 bit of the address, so 64-bit - // driver will see valid address when accessing 64-bit write_buffer. - for_x64 = 0; - write_buffer = buffer; - } - -protected: - /// Pointer to the actual buffer for ADB_CTL_BULK_WRITE request. This field - /// is not used in ADB_CTL_BULK_READ request. Note that in order to support - /// compatibility between 32-bit and 64-bit versions of both, driver and - /// application we must sizeof this field to the max pointer sizeof (which - /// is 64 bit in our case). The idea is that if IOCTL was issued by a 64-bit - /// process to a 64-bit driver, write_buffer will be valid 64-bit pointer to - /// the write buffer. Same is true for 32-bit app talking to 32-bit driver. - /// If, however, a 32-bit app is talking to 64-bit driver, then write_buffer - /// initialized by 32-bit app will contain 32-bit address, which will be - /// correctly picked up ("extended") by 64-bit driver. Since when setting - /// this field by a 32-bit app requires some extra work (see SetWriteBuffer) - /// we hide this field, making it accessible only throug the accessor - /// methods (Get/SetWriteBuffer). - union { - void* write_buffer; - __int64 for_x64; - }; -}; - -#endif // ANDROID_USB_COMMON_DEFINES_H__ diff --git a/host/windows/usb/driver/android_usb.inf b/host/windows/usb/driver/android_usb.inf deleted file mode 100644 index fff04400d..000000000 --- a/host/windows/usb/driver/android_usb.inf +++ /dev/null @@ -1,126 +0,0 @@ -;/*++ -; -;Abstract: -; Installation inf for the Android USB Bulk device -; -;--*/ - -[Version] -Signature="$WINDOWS NT$" -Class=USB -ClassGuid={F72FE0D4-CBCB-407d-8814-9ED673D0DD6B} -Provider=%GOOG% -DriverVer=1/29/2009,1.0.0010.00000 -CatalogFile.NTx86=androidusb86.cat -CatalogFile.NTamd64=androidusba64.cat - -; ================= Class section ===================== - -[ClassInstall32] -Addreg=AndroidUsbClassReg - -[AndroidUsbClassReg] -HKR,,,0,%ClassName% -HKR,,Icon,,-5 - -[DestinationDirs] -DefaultDestDir = 12 - -; ================= Device section ===================== - -[Manufacturer] -%MfgName%=Google,NTx86,NTamd64 - -; For Win2K -[Google] -; For loopback testing -%USB\VID_18D1&PID_DDDD.DeviceDescTest%=androidusb.Dev, USB\VID_18D1&PID_DDDD -; HTC Dream -%USB\VID_0BB4&PID_0C01.DeviceDescRelease%=androidusb.Dev, USB\VID_0BB4&PID_0C01 -%USB\VID_0BB4&PID_0C02&MI_01.DeviceDescRelease%=androidusb.Dev, USB\VID_0BB4&PID_0C02&MI_01 -%USB\VID_0BB4&PID_0FFF.DeviceDescRelease%=androidusb.Dev, USB\VID_0BB4&PID_0FFF - -; For XP and later -[Google.NTx86] -; For loopback testing -%USB\VID_18D1&PID_DDDD.DeviceDescTest%=androidusb.Dev, USB\VID_18D1&PID_DDDD -; HTC Dream -%USB\VID_0BB4&PID_0C01.DeviceDescRelease%=androidusb.Dev, USB\VID_0BB4&PID_0C01 -%USB\VID_0BB4&PID_0C02&MI_01.DeviceDescRelease%=androidusb.Dev, USB\VID_0BB4&PID_0C02&MI_01 -%USB\VID_0BB4&PID_0FFF.DeviceDescRelease%=androidusb.Dev, USB\VID_0BB4&PID_0FFF - -; For AMD64 and later -[Google.NTamd64] -; For loopback testing -%USB\VID_18D1&PID_DDDD.DeviceDescTest%=androidusb.Dev, USB\VID_18D1&PID_DDDD -; HTC Dream -%USB\VID_0BB4&PID_0C01.DeviceDescRelease%=androidusb.Dev, USB\VID_0BB4&PID_0C01 -%USB\VID_0BB4&PID_0C02&MI_01.DeviceDescRelease%=androidusb.Dev, USB\VID_0BB4&PID_0C02&MI_01 -%USB\VID_0BB4&PID_0FFF.DeviceDescRelease%=androidusb.Dev, USB\VID_0BB4&PID_0FFF - -[androidusb.Dev.NT] -CopyFiles=androidusb.Files.Ext - -[androidusb.Dev.NT.Services] -Addservice = androidusb, 0x00000002, androidusb.AddService - -[androidusb.AddService] -DisplayName = %androidusb.SvcDesc% -ServiceType = 1 ; SERVICE_KERNEL_DRIVER -StartType = 3 ; SERVICE_DEMAND_START -ErrorControl = 1 ; SERVICE_ERROR_NORMAL -ServiceBinary = %10%\System32\Drivers\androidusb.sys -AddReg = androidusb.AddReg -LoadOrderGroup = Base - -[androidusb.AddReg] -HKR,"Parameters","MaximumTransferSize",0x10001,4096 -HKR,"Parameters","DebugLevel",0x10001,2 -HKR, Parameters\Wdf, VerboseOn, 0x00010001, 1 -HKR, Parameters\Wdf, VerifierOn, 0x00010001, 1 -HKR, Parameters\Wdf, DbgBreakOnError, 0x00010001, 1 - -[androidusb.Files.Ext] -androidusb.sys - -[SourceDisksNames] -1=%Disk_Description%,,, - -[SourceDisksFiles] -androidusb.sys = 1 - -;-------------- WDF Coinstaller installation -[DestinationDirs] -CoInstaller_CopyFiles = 11 - -[androidusb.Dev.NT.CoInstallers] -AddReg=CoInstaller_AddReg -CopyFiles=CoInstaller_CopyFiles - -[CoInstaller_CopyFiles] -wdfcoinstaller01005.dll - -[SourceDisksFiles] -wdfcoinstaller01005.dll=1 ; make sure the number matches with SourceDisksNames - -[CoInstaller_AddReg] -HKR,,CoInstallers32,0x00010000, "wdfcoinstaller01005.dll,WdfCoInstaller" - -[androidusb.Dev.NT.Wdf] -KmdfService = androidusb, androidusb_wdfsect - -[androidusb_wdfsect] -KmdfLibraryVersion = 1.5 - -;---------------------------------------------------------------; - -[Strings] -GOOG = "Google, Inc" -MfgName = "Google, Inc" -Disk_Description= "ADB Interface Installation Disk" -androidusb.SvcDesc = "ADB Interface Driver" -ClassName = "ADB Interface" -USB\VID_18D1&PID_DDDD.DeviceDescTest="ADB Testing Interface" -USB\VID_0BB4&PID_0C01.DeviceDescRelease="HTC Dream" -USB\VID_0BB4&PID_0C02&MI_01.DeviceDescRelease="HTC Dream Composite ADB Interface" -USB\VID_0BB4&PID_0FFF.DeviceDescRelease="HTC Bootloader" diff --git a/host/windows/usb/driver/android_usb.rc b/host/windows/usb/driver/android_usb.rc deleted file mode 100644 index 3b1941617..000000000 --- a/host/windows/usb/driver/android_usb.rc +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -// Don't let the resource editor in here -#ifdef APSTUDIO_INVOKED - #error this file is not editable by Visual C++ -#endif //APSTUDIO_INVOKED - - -#define VER_FILETYPE VFT_DRV -#define VER_FILESUBTYPE VFT2_DRV_SYSTEM -#define VER_FILEDESCRIPTION_STR "ADB Interface" -#define VER_INTERNALNAME_STR "androidusb.sys" -#define VER_ORIGINALFILENAME_STR "androidusb.sys" -#define VER_FILEOS VOS_NT -#define VER_FILEFLAGSMASK (VS_FF_DEBUG | VS_FF_PRERELEASE) - -#if DBG - #define VER_FILEFLAGS VS_FF_DEBUG | VS_FF_PRERELEASE -#else // DBG - #define VER_FILEFLAGS VS_FF_PRERELEASE -#endif // DBG - -#include "common.ver" diff --git a/host/windows/usb/driver/android_usb.sln b/host/windows/usb/driver/android_usb.sln deleted file mode 100644 index ac4cbe901..000000000 --- a/host/windows/usb/driver/android_usb.sln +++ /dev/null @@ -1,27 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "android_usb", "android_usb.vcproj", "{D980BE56-A7AB-4E05-919B-677FB7716307}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Debug-64 = Debug-64 - Release = Release - Release-64 = Release-64 - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {D980BE56-A7AB-4E05-919B-677FB7716307}.Debug.ActiveCfg = Debug|Win32 - {D980BE56-A7AB-4E05-919B-677FB7716307}.Debug.Build.0 = Debug|Win32 - {D980BE56-A7AB-4E05-919B-677FB7716307}.Debug-64.ActiveCfg = Debug-64|Win32 - {D980BE56-A7AB-4E05-919B-677FB7716307}.Debug-64.Build.0 = Debug-64|Win32 - {D980BE56-A7AB-4E05-919B-677FB7716307}.Release.ActiveCfg = Release|Win32 - {D980BE56-A7AB-4E05-919B-677FB7716307}.Release.Build.0 = Release|Win32 - {D980BE56-A7AB-4E05-919B-677FB7716307}.Release-64.ActiveCfg = Release-64|Win32 - {D980BE56-A7AB-4E05-919B-677FB7716307}.Release-64.Build.0 = Release-64|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/host/windows/usb/driver/android_usb.vcproj b/host/windows/usb/driver/android_usb.vcproj deleted file mode 100644 index 5402b0c2b..000000000 --- a/host/windows/usb/driver/android_usb.vcproj +++ /dev/null @@ -1,1273 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/host/windows/usb/driver/android_usb_bulk_file_object.cpp b/host/windows/usb/driver/android_usb_bulk_file_object.cpp deleted file mode 100644 index 9b3a59c08..000000000 --- a/host/windows/usb/driver/android_usb_bulk_file_object.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** \file - This file consists of implementation of class AndroidUsbBulkPipeFileObject - that encapsulates extension to a bulk pipe file objects. -*/ -#pragma data_seg() -#pragma code_seg() - -#include "precomp.h" -#include "android_usb_bulk_file_object.h" - -#pragma data_seg() -#pragma code_seg("PAGE") - -AndroidUsbBulkPipeFileObject::AndroidUsbBulkPipeFileObject( - AndroidUsbDeviceObject* dev_obj, - WDFFILEOBJECT wdf_fo, - WDFUSBPIPE wdf_pipe_obj) - : AndroidUsbPipeFileObject(dev_obj, wdf_fo, wdf_pipe_obj) { - ASSERT_IRQL_PASSIVE(); - -#if DBG - WDF_USB_PIPE_INFORMATION pipe_info; - WDF_USB_PIPE_INFORMATION_INIT(&pipe_info); - WdfUsbTargetPipeGetInformation(wdf_pipe_obj, &pipe_info); - ASSERT(WdfUsbPipeTypeBulk == pipe_info.PipeType); -#endif // DBG -} - -#pragma code_seg() - -AndroidUsbBulkPipeFileObject::~AndroidUsbBulkPipeFileObject() { - ASSERT_IRQL_LOW_OR_DISPATCH(); -} - -#pragma data_seg() -#pragma code_seg() diff --git a/host/windows/usb/driver/android_usb_bulk_file_object.h b/host/windows/usb/driver/android_usb_bulk_file_object.h deleted file mode 100644 index 8b75eeeeb..000000000 --- a/host/windows/usb/driver/android_usb_bulk_file_object.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_USB_BULK_PIPE_FILE_OBJECT_H__ -#define ANDROID_USB_BULK_PIPE_FILE_OBJECT_H__ -/** \file - This file consists of declaration of class AndroidUsbBulkPipeFileObject - that encapsulates extension to a bulk pipe file objects. -*/ - -#include "android_usb_pipe_file_object.h" - -/** AndroidUsbBulkPipeFileObject class encapsulates extension to a KMDF file - object that represent opened bulk pipe. Instances of this class must be - allocated from NonPagedPool. -*/ -class AndroidUsbBulkPipeFileObject : public AndroidUsbPipeFileObject { - public: - /** \brief Constructs the object. - - This method must be called at low IRQL. - @param dev_obj[in] Our device object for which this file has been created - @param wdf_fo[in] KMDF file object this extension wraps - @param wdf_pipe_obj[in] KMDF pipe for this file - */ - AndroidUsbBulkPipeFileObject(AndroidUsbDeviceObject* dev_obj, - WDFFILEOBJECT wdf_fo, - WDFUSBPIPE wdf_pipe_obj); - - /** \brief Destructs the object. - - This method can be called at any IRQL. - */ - virtual ~AndroidUsbBulkPipeFileObject(); -}; - -#endif // ANDROID_USB_BULK_PIPE_FILE_OBJECT_H__ diff --git a/host/windows/usb/driver/android_usb_device_file_object.cpp b/host/windows/usb/driver/android_usb_device_file_object.cpp deleted file mode 100644 index e134ebb4c..000000000 --- a/host/windows/usb/driver/android_usb_device_file_object.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** \file - This file consists of implementation of class AndroidUsbDeviceFileObject - that encapsulates an extension for a KMDF file object that represent - opened device. -*/ -#pragma data_seg() -#pragma code_seg() - -#include "precomp.h" -#include "android_usb_device_file_object.h" - -#pragma data_seg() -#pragma code_seg("PAGE") - -AndroidUsbDeviceFileObject::AndroidUsbDeviceFileObject( - AndroidUsbDeviceObject* dev_obj, - WDFFILEOBJECT wdf_fo) - : AndroidUsbFileObject(AndroidUsbFileObjectTypeDevice, dev_obj, wdf_fo) { - ASSERT_IRQL_PASSIVE(); -} - -#pragma code_seg() - -AndroidUsbDeviceFileObject::~AndroidUsbDeviceFileObject() { - ASSERT_IRQL_LOW_OR_DISPATCH(); -} - -void AndroidUsbDeviceFileObject::OnEvtIoDeviceControl(WDFREQUEST request, - size_t output_buf_len, - size_t input_buf_len, - ULONG ioctl_code) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - - switch (ioctl_code) { - case ADB_IOCTL_GET_USB_DEVICE_DESCRIPTOR: - device_object()->OnGetUsbDeviceDescriptorCtl(request, output_buf_len); - break; - - case ADB_IOCTL_GET_USB_CONFIGURATION_DESCRIPTOR: - device_object()->OnGetUsbConfigDescriptorCtl(request, output_buf_len); - break; - - case ADB_IOCTL_GET_USB_INTERFACE_DESCRIPTOR: - device_object()->OnGetUsbInterfaceDescriptorCtl(request, output_buf_len); - break; - - case ADB_IOCTL_GET_ENDPOINT_INFORMATION: - device_object()->OnGetEndpointInformationCtl(request, - input_buf_len, - output_buf_len); - break; - - case ADB_IOCTL_GET_SERIAL_NUMBER: - device_object()->OnGetSerialNumberCtl(request, output_buf_len); - break; - - default: - AndroidUsbFileObject::OnEvtIoDeviceControl(request, - output_buf_len, - input_buf_len, - ioctl_code); - break; - } -} - -#pragma data_seg() -#pragma code_seg() diff --git a/host/windows/usb/driver/android_usb_device_file_object.h b/host/windows/usb/driver/android_usb_device_file_object.h deleted file mode 100644 index c40bb5074..000000000 --- a/host/windows/usb/driver/android_usb_device_file_object.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_USB_DEVICE_FILE_OBJECT_H__ -#define ANDROID_USB_DEVICE_FILE_OBJECT_H__ -/** \file - This file consists of declaration of class AndroidUsbDeviceFileObject that - encapsulates an extension for a KMDF file object that represent opened - device. -*/ - -#include "android_usb_file_object.h" - -/** AndroidUsbDeviceFileObject class encapsulates an extension for a KMDF - file object that represent opened device. Instances of this class must be - allocated from NonPagedPool. -*/ -class AndroidUsbDeviceFileObject : public AndroidUsbFileObject { - public: - /** \brief Constructs the object. - - This method must be called at low IRQL. - @param dev_obj[in] Our device object for which this file has been created - @param wdf_fo[in] KMDF file object this extension wraps - */ - AndroidUsbDeviceFileObject(AndroidUsbDeviceObject* dev_obj, - WDFFILEOBJECT wdf_fo); - - /** \brief Destructs the object. - - This method can be called at any IRQL. - */ - virtual ~AndroidUsbDeviceFileObject(); - - /** \brief IOCTL event handler - - This method is called when a device control request comes to the file - object this extension wraps. We override this method to handle the - following IOCTL requests: - 1. ADB_CTL_GET_USB_DEVICE_DESCRIPTOR - 2. ADB_CTL_GET_USB_CONFIGURATION_DESCRIPTOR - 3. ADB_CTL_GET_USB_INTERFACE_DESCRIPTOR - 4. ADB_CTL_GET_ENDPOINT_INFORMATION - This callback can be called IRQL <= DISPATCH_LEVEL. - @param request[in] A handle to a framework request object. - @param output_buf_len[in] The length, in bytes, of the request's output - buffer, if an output buffer is available. - @param input_buf_len[in] The length, in bytes, of the request's input - buffer, if an input buffer is available. - @param ioctl_code[in] The driver-defined or system-defined I/O control code - that is associated with the request. - @return Successful status or an appropriate error code - */ - virtual void OnEvtIoDeviceControl(WDFREQUEST request, - size_t output_buf_len, - size_t input_buf_len, - ULONG ioctl_code); -}; - -#endif // ANDROID_USB_DEVICE_FILE_OBJECT_H__ diff --git a/host/windows/usb/driver/android_usb_device_object.cpp b/host/windows/usb/driver/android_usb_device_object.cpp deleted file mode 100644 index b20c1b7b3..000000000 --- a/host/windows/usb/driver/android_usb_device_object.cpp +++ /dev/null @@ -1,1216 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** \file - This file consists of implementation of class AndroidUsbDeviceObject that - encapsulates an extension for KMDF device (FDO) object. -*/ -#pragma data_seg() -#pragma code_seg() - -#include "precomp.h" -#include "android_usb_device_object.h" -#include "android_usb_file_object.h" -#include "android_usb_device_file_object.h" -#include "android_usb_pipe_file_object.h" -#include "android_usb_bulk_file_object.h" -#include "android_usb_interrupt_file_object.h" - -#pragma data_seg() - -/// Buffer for bulk read pipe name -const WCHAR bulk_read_pipe_str[] = L"\\" DEVICE_BULK_READ_PIPE_NAME; - -/// Unicode string for bulk read pipe name -UNICODE_STRING bulk_read_pipe_name = { - sizeof(bulk_read_pipe_str) - sizeof(WCHAR), - sizeof(bulk_read_pipe_str) - sizeof(WCHAR), - const_cast(bulk_read_pipe_str) -}; - -/// Buffer for bulk write pipe name -const WCHAR bulk_write_pipe_str[] = L"\\" DEVICE_BULK_WRITE_PIPE_NAME; - -/// Unicode string for bulk write pipe name -UNICODE_STRING bulk_write_pipe_name = { - sizeof(bulk_write_pipe_str) - sizeof(WCHAR), - sizeof(bulk_write_pipe_str) - sizeof(WCHAR), - const_cast(bulk_write_pipe_str) -}; - -/// Buffer for an index-based pipe name prefix -const WCHAR index_pipe_prefix_str[] = L"\\" DEVICE_PIPE_NAME_PREFIX; - -/// Unicode string for index-based pipe name prefix -UNICODE_STRING index_pipe_prefix = { - sizeof(index_pipe_prefix_str) - sizeof(WCHAR), - sizeof(index_pipe_prefix_str) - sizeof(WCHAR), - const_cast(index_pipe_prefix_str) -}; - -/// GUID that sets class ID for our device -const GUID android_guid = ANDROID_USB_CLASS_ID; - -#pragma code_seg("PAGE") - -AndroidUsbDeviceObject::AndroidUsbDeviceObject() - : AndroidUsbWdfObject(AndroidUsbWdfObjectTypeDevice), - wdf_target_device_(NULL), - wdf_usb_interface_(NULL), - serial_number_handle_(NULL), - serial_number_char_len_(0), - configured_pipes_num_(0), - bulk_read_pipe_index_(INVALID_UCHAR), - bulk_write_pipe_index_(INVALID_UCHAR), - configuration_descriptor_(NULL) { - ASSERT_IRQL_PASSIVE(); -} - -#pragma code_seg() - -AndroidUsbDeviceObject::~AndroidUsbDeviceObject() { - ASSERT_IRQL_LOW_OR_DISPATCH(); - if (NULL != serial_number_handle_) - WdfObjectDelete(serial_number_handle_); -} - -#pragma code_seg("PAGE") - -NTSTATUS AndroidUsbDeviceObject::CreateFDODevice(PWDFDEVICE_INIT device_init) { - ASSERT_IRQL_PASSIVE(); - - ASSERT(!IsTaretDeviceCreated()); - if (IsTaretDeviceCreated()) - return STATUS_INTERNAL_ERROR; - - // Initialize our object attributes first - WDF_OBJECT_ATTRIBUTES device_attr; - NTSTATUS status = InitObjectAttributes(&device_attr, NULL); - ASSERT(NT_SUCCESS(status)); - if (!NT_SUCCESS(status)) - return status; - - // Initialize the pnp_power_callbacks structure. Callback events for PnP - // and Power are specified here. If we don't supply any callbacks, the - // KMDF will take appropriate default actions for an FDO device object. - // EvtDevicePrepareHardware and EvtDeviceReleaseHardware are major entry - // points for initializing / cleaning up our device. Probably, we can leave - // the rest to the framework. - WDF_PNPPOWER_EVENT_CALLBACKS pnp_power_callbacks; - WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnp_power_callbacks); - pnp_power_callbacks.EvtDevicePrepareHardware = - EvtDevicePrepareHardwareEntry; - pnp_power_callbacks.EvtDeviceReleaseHardware = - EvtDeviceReleaseHardwareEntry; - WdfDeviceInitSetPnpPowerEventCallbacks(device_init, &pnp_power_callbacks); - - // Initialize the request attributes to specify the context size and type - // for every request created by framework for this device. - WDF_OBJECT_ATTRIBUTES request_attr; - WDF_OBJECT_ATTRIBUTES_INIT(&request_attr); - WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(&request_attr, AndroidUsbWdfRequestContext); - WdfDeviceInitSetRequestAttributes(device_init, &request_attr); - - // Initialize WDF_FILEOBJECT_CONFIG_INIT struct to tell the KMDF that we are - // interested in handling Create requests that get genereated when an - // application or another kernel component opens a handle through the device. - // We are not interested in receiving cleanup / close IRPs at this point. - WDF_FILEOBJECT_CONFIG file_config; - WDF_OBJECT_ATTRIBUTES file_attr; - WDF_FILEOBJECT_CONFIG_INIT(&file_config, - EvtDeviceFileCreateEntry, - WDF_NO_EVENT_CALLBACK, - WDF_NO_EVENT_CALLBACK); - WDF_OBJECT_ATTRIBUTES_INIT(&file_attr); - WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(&file_attr, - AndroidUsbWdfObjectContext); - file_attr.EvtCleanupCallback = AndroidUsbWdfObject::EvtCleanupCallbackEntry; - file_attr.EvtDestroyCallback = AndroidUsbWdfObject::EvtDestroyCallbackEntry; - // We will provide our own synchronization for file access - file_attr.SynchronizationScope = WdfSynchronizationScopeNone; - WdfDeviceInitSetFileObjectConfig(device_init, &file_config, &file_attr); - - // I/O type is buffered by default. It could be very inefficient if we have - // large reads / writes through our device. - WdfDeviceInitSetIoType(device_init, WdfDeviceIoDirect); - - // DeviceInit is completely initialized. So call the framework - // to create the device and attach it to the lower stack. - WDFDEVICE wdf_dev = NULL; - status = WdfDeviceCreate(&device_init, &device_attr, &wdf_dev); - ASSERT(NT_SUCCESS(status) && (NULL != wdf_dev)); - if (!NT_SUCCESS(status)) - return status; - - // Save handle to the created device - set_wdf_object(wdf_dev); - - // Tell the framework to set the SurpriseRemovalOK in the DeviceCaps so - // that we don't get the popup in usermode (on Win2K) when we surprise - // remove the device. - WDF_DEVICE_PNP_CAPABILITIES pnp_caps; - WDF_DEVICE_PNP_CAPABILITIES_INIT(&pnp_caps); - pnp_caps.SurpriseRemovalOK = WdfTrue; - WdfDeviceSetPnpCapabilities(wdf_device(), &pnp_caps); - - // Create our default queue object for this device to start receiving I/O - status = CreateDefaultQueue(); - ASSERT(NT_SUCCESS(status)); - if (!NT_SUCCESS(status)) - return status; - - // Register a device interface so that app can find our device and talk to it. - status = WdfDeviceCreateDeviceInterface(wdf_device(), &android_guid, NULL); - ASSERT(NT_SUCCESS(status)); - if (!NT_SUCCESS(status)) - return status; - - // Initialize our extension to that device. We will do this at the very end - // so we know that we successfully passed entire device create chain when - // we are called with other callbacks to that device. - status = InitializeContext(); - ASSERT(NT_SUCCESS(status)); - if (!NT_SUCCESS(status)) - return status; - - return STATUS_SUCCESS; -} - -NTSTATUS AndroidUsbDeviceObject::ResetDevice() { - ASSERT_IRQL_PASSIVE(); - - if (!IsTaretDeviceCreated()) - return STATUS_SUCCESS; - - // Reset the device - NTSTATUS status = - status = WdfUsbTargetDeviceResetPortSynchronously(wdf_target_device()); - - // !!!!! Note that after the call to WdfUsbTargetDeviceResetPortSynchronously - // this object may be no longer valid !!!!! - - if (!NT_SUCCESS(status)) - GoogleDbgPrint("\n!!!!! AndroidUsbDeviceObject::ResetDevice failed %X", status); - - return status; -} - -NTSTATUS AndroidUsbDeviceObject::OnEvtDevicePrepareHardware( - WDFCMRESLIST resources_raw, - WDFCMRESLIST resources_translated) { - ASSERT_IRQL_PASSIVE(); - - // Create a USB device handle so that we can communicate with the underlying - // USB stack. The wdf_target_device_ handle is used to query, configure, and - // manage all aspects of the USB device. These aspects include device - // properties, bus properties, and I/O creation and synchronization. This - // call gets the device and configuration descriptors and stores them in - // wdf_target_device_ object. - NTSTATUS status = WdfUsbTargetDeviceCreate(wdf_device(), - WDF_NO_OBJECT_ATTRIBUTES, - &wdf_target_device_); - ASSERT(NT_SUCCESS(status) && (NULL != wdf_target_device_)); - if (!NT_SUCCESS(status)) - return status; - - // Retrieve USBD version information, port driver capabilites and device - // capabilites such as speed, power, etc. - WDF_USB_DEVICE_INFORMATION_INIT(&usb_device_info_); - status = WdfUsbTargetDeviceRetrieveInformation(wdf_target_device(), - &usb_device_info_); - ASSERT(NT_SUCCESS(status)); - if (!NT_SUCCESS(status)) - return status; - - WdfUsbTargetDeviceGetDeviceDescriptor(wdf_target_device(), - &usb_device_descriptor_); -#if DBG - PrintUsbTargedDeviceInformation(usb_device_info()); - PrintUsbDeviceDescriptor(&usb_device_descriptor_); -#endif // DBG - - // Save device serial number - status = - WdfUsbTargetDeviceAllocAndQueryString(wdf_target_device(), - WDF_NO_OBJECT_ATTRIBUTES, - &serial_number_handle_, - &serial_number_char_len_, - usb_device_descriptor_.iSerialNumber, - 0x0409); // English (US) - if (!NT_SUCCESS(status)) - return status; - -#if DBG - UNICODE_STRING ser_num; - ser_num.Length = serial_number_byte_len(); - ser_num.MaximumLength = ser_num.Length; - ser_num.Buffer = const_cast - (serial_number()); - GoogleDbgPrint("\n*** Device serial number %wZ", &ser_num); -#endif // DBG - - // Configure our device now - status = ConfigureDevice(); - ASSERT(NT_SUCCESS(status)); - if (!NT_SUCCESS(status)) - return status; - - // Select device interfaces - status = SelectInterfaces(); - if (!NT_SUCCESS(status)) - return status; - - return status; -} - -NTSTATUS AndroidUsbDeviceObject::OnEvtDeviceReleaseHardware( - WDFCMRESLIST resources_translated) { - ASSERT_IRQL_PASSIVE(); - - // It's possible that Preparehardware failed half way thru. So make - // sure the target device exists. - if (!IsTaretDeviceCreated()) - return STATUS_SUCCESS; - - // Cancel all the currently queued I/O. This is better than sending an - // explicit USB abort request down because release hardware gets - // called even when the device surprise-removed. - WdfIoTargetStop(WdfUsbTargetDeviceGetIoTarget(wdf_target_device()), - WdfIoTargetCancelSentIo); - - // Unselect all selected configurations - WDF_USB_DEVICE_SELECT_CONFIG_PARAMS config_params; - WDF_USB_DEVICE_SELECT_CONFIG_PARAMS_INIT_DECONFIG(&config_params); - - NTSTATUS status = WdfUsbTargetDeviceSelectConfig(wdf_target_device(), - WDF_NO_OBJECT_ATTRIBUTES, - &config_params); - ASSERT(NT_SUCCESS(status) || (STATUS_DEVICE_NOT_CONNECTED == status)); - return status; -} - -void AndroidUsbDeviceObject::OnEvtDeviceFileCreate(WDFREQUEST request, - WDFFILEOBJECT wdf_fo) { - ASSERT_IRQL_PASSIVE(); - ASSERT(IsInterfaceSelected()); - if (!IsInterfaceSelected()) { - WdfRequestComplete(request, STATUS_INVALID_DEVICE_STATE); - return; - } - - PUNICODE_STRING file_name = WdfFileObjectGetFileName(wdf_fo); - ASSERT(NULL != file_name); - if (NULL == file_name) { - WdfRequestComplete(request, STATUS_OBJECT_NAME_INVALID); - return; - } - - WDFUSBPIPE wdf_pipe_obj = NULL; - WDF_USB_PIPE_INFORMATION pipe_info; - - // TODO: Share / access check here? - - // Lets see if this is a device open - if (0 != file_name->Length) { - // This is a pipe open. Lets retrieve pipe index from the name - UCHAR pipe_index = GetPipeIndexFromFileName(file_name); - if (INVALID_UCHAR == pipe_index) { - GoogleDbgPrint("\n!!!!! There is no pipe index for file %wZ", file_name); - WdfRequestComplete(request, STATUS_OBJECT_NAME_INVALID); - return; - } - - // Make sure that pipe index doesn't exceed number of pipes - if (pipe_index >= configured_pipes_num()) { - WdfRequestComplete(request, STATUS_OBJECT_NAME_NOT_FOUND); - return; - } - - // Retrieve the pipe along with the pipe info - WDF_USB_PIPE_INFORMATION_INIT(&pipe_info); - wdf_pipe_obj = WdfUsbInterfaceGetConfiguredPipe(wdf_usb_interface(), - pipe_index, - &pipe_info); - if (NULL == wdf_pipe_obj) { - GoogleDbgPrint("\n!!!!! There is no pipe for index %u for file %wZ", - pipe_index, file_name); - WdfRequestComplete(request, STATUS_OBJECT_NAME_NOT_FOUND); - return; - } - } - - // If we're here this must be either device open or pipe open - ASSERT((NULL != wdf_pipe_obj) || (0 == file_name->Length)); - - // Create our file object extension for this file - AndroidUsbFileObject* wdf_file_ext = NULL; - NTSTATUS status; - - if (0 == file_name->Length) { - // This is a device FO. Create wrapper for device FO - ASSERT(NULL == wdf_pipe_obj); - wdf_file_ext = new(NonPagedPool, GANDR_POOL_TAG_DEVICE_FO) - AndroidUsbDeviceFileObject(this, wdf_fo); - ASSERT(NULL != wdf_file_ext); - if (NULL == wdf_file_ext) { - WdfRequestComplete(request, STATUS_INSUFFICIENT_RESOURCES); - return; - } - - // Initialize extension - status = wdf_file_ext->Initialize(); - if (!NT_SUCCESS(status)) { - delete wdf_file_ext; - WdfRequestComplete(request, status); - return; - } - } else { - // This is a pipe file. Create and initialize appropriate extension for it. - status = - CreatePipeFileObjectExt(wdf_fo, wdf_pipe_obj, &pipe_info, &wdf_file_ext); - ASSERT((NULL != wdf_file_ext) || !NT_SUCCESS(status)); - if (!NT_SUCCESS(status)) { - WdfRequestComplete(request, status); - return; - } - } - ASSERT(GetAndroidUsbFileObjectFromHandle(wdf_fo) == wdf_file_ext); - WdfRequestComplete(request, STATUS_SUCCESS); -} - -NTSTATUS AndroidUsbDeviceObject::EvtDevicePrepareHardwareEntry( - WDFDEVICE wdf_dev, - WDFCMRESLIST resources_raw, - WDFCMRESLIST resources_translated) { - ASSERT_IRQL_PASSIVE(); - - // Get our wrapper for the device and redirect event to its handler - AndroidUsbDeviceObject* wdf_device_ext = - GetAndroidUsbDeviceObjectFromHandle(wdf_dev); - ASSERT(NULL != wdf_device_ext); - return (NULL != wdf_device_ext) ? - wdf_device_ext->OnEvtDevicePrepareHardware(resources_raw, - resources_translated) : - STATUS_INVALID_DEVICE_REQUEST; -} - -NTSTATUS AndroidUsbDeviceObject::EvtDeviceReleaseHardwareEntry( - WDFDEVICE wdf_dev, - WDFCMRESLIST resources_translated) { - ASSERT_IRQL_PASSIVE(); - - // Get our wrapper for the device and redirect event to its handler - AndroidUsbDeviceObject* wdf_device_ext = - GetAndroidUsbDeviceObjectFromHandle(wdf_dev); - ASSERT(NULL != wdf_device_ext); - return (NULL != wdf_device_ext) ? - wdf_device_ext->OnEvtDeviceReleaseHardware(resources_translated) : - STATUS_INVALID_DEVICE_REQUEST; -} - -void AndroidUsbDeviceObject::EvtDeviceFileCreateEntry( - WDFDEVICE wdf_dev, - WDFREQUEST request, - WDFFILEOBJECT wdf_fo) { - ASSERT_IRQL_PASSIVE(); - - ASSERT(NULL != wdf_fo); - if (NULL == wdf_fo) { - WdfRequestComplete(request, STATUS_INVALID_PARAMETER); - return; - } - - // Get our wrapper for the device and redirect event to its handler - AndroidUsbDeviceObject* wdf_device_ext = - GetAndroidUsbDeviceObjectFromHandle(wdf_dev); - ASSERT(NULL != wdf_device_ext); - if (NULL != wdf_device_ext) { - wdf_device_ext->OnEvtDeviceFileCreate(request, wdf_fo); - } else { - WdfRequestComplete(request, STATUS_INVALID_DEVICE_REQUEST); - } -} - -#pragma code_seg() - -void AndroidUsbDeviceObject::OnEvtIoRead(WDFREQUEST request, - size_t length) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - ASSERT(IsInterfaceSelected()); - if (!IsInterfaceSelected()) { - WdfRequestComplete(request, STATUS_INVALID_DEVICE_STATE); - return; - } - - // Get our file extension and dispatch this event to its handler - AndroidUsbFileObject* wdf_file_ext = - GetAndroidUsbFileObjectForRequest(request); - ASSERT(NULL != wdf_file_ext); - if (NULL != wdf_file_ext) { - wdf_file_ext->OnEvtIoRead(request, length); - } else { - WdfRequestComplete(request, STATUS_INVALID_DEVICE_REQUEST); - } -} - -void AndroidUsbDeviceObject::OnEvtIoWrite(WDFREQUEST request, - size_t length) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - ASSERT(IsInterfaceSelected()); - if (!IsInterfaceSelected()) { - WdfRequestComplete(request, STATUS_INVALID_DEVICE_STATE); - return; - } - - // Get our file extension and dispatch this event to its handler - AndroidUsbFileObject* wdf_file_ext = - GetAndroidUsbFileObjectForRequest(request); - ASSERT(NULL != wdf_file_ext); - if (NULL != wdf_file_ext) { - wdf_file_ext->OnEvtIoWrite(request, length); - } else { - WdfRequestComplete(request, STATUS_INVALID_DEVICE_REQUEST); - } -} - -void AndroidUsbDeviceObject::OnEvtIoDeviceControl(WDFREQUEST request, - size_t output_buf_len, - size_t input_buf_len, - ULONG ioctl_code) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - ASSERT(IsInterfaceSelected()); - if (!IsInterfaceSelected()) { - WdfRequestComplete(request, STATUS_INVALID_DEVICE_STATE); - return; - } - - // Get our file extension and dispatch this event to its handler - AndroidUsbFileObject* wdf_file_ext = - GetAndroidUsbFileObjectForRequest(request); - ASSERT(NULL != wdf_file_ext); - if (NULL != wdf_file_ext) { - wdf_file_ext->OnEvtIoDeviceControl(request, - output_buf_len, - input_buf_len, - ioctl_code); - } else { - WdfRequestComplete(request, STATUS_INVALID_DEVICE_REQUEST); - } -} - -void AndroidUsbDeviceObject::EvtIoReadEntry(WDFQUEUE queue, - WDFREQUEST request, - size_t length) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - - // Get our file extension and dispatch this event to the appropriate handler - // inside our device extension. - AndroidUsbFileObject* wdf_file_ext = - GetAndroidUsbFileObjectForRequest(request); - ASSERT(NULL != wdf_file_ext); - if (NULL != wdf_file_ext) { - wdf_file_ext->device_object()->OnEvtIoRead(request, length); - } else { - WdfRequestComplete(request, STATUS_INVALID_DEVICE_REQUEST); - } -} - -void AndroidUsbDeviceObject::EvtIoWriteEntry(WDFQUEUE queue, - WDFREQUEST request, - size_t length) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - - // Get our file extension and dispatch this event to the appropriate handler - // inside our device extension. - AndroidUsbFileObject* wdf_file_ext = - GetAndroidUsbFileObjectForRequest(request); - ASSERT(NULL != wdf_file_ext); - if (NULL != wdf_file_ext) { - wdf_file_ext->device_object()->OnEvtIoWrite(request, length); - } else { - WdfRequestComplete(request, STATUS_INVALID_DEVICE_REQUEST); - } -} - -void AndroidUsbDeviceObject::EvtIoDeviceControlEntry(WDFQUEUE queue, - WDFREQUEST request, - size_t output_buf_len, - size_t input_buf_len, - ULONG ioctl_code) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - - // Get our file extension and dispatch this event to the appropriate handler - // inside our device extension. - AndroidUsbFileObject* wdf_file_ext = - GetAndroidUsbFileObjectForRequest(request); - ASSERT(NULL != wdf_file_ext); - if (NULL != wdf_file_ext) { - wdf_file_ext->device_object()->OnEvtIoDeviceControl(request, - output_buf_len, - input_buf_len, - ioctl_code); - } else { - WdfRequestComplete(request, STATUS_INVALID_DEVICE_REQUEST); - } -} - -void AndroidUsbDeviceObject::OnGetUsbDeviceDescriptorCtl(WDFREQUEST request, - size_t output_buf_len) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - - // Check the buffer first - if (output_buf_len >= sizeof(USB_DEVICE_DESCRIPTOR)) { - // Get the output buffer - NTSTATUS status; - void* ret_info = OutAddress(request, &status); - ASSERT(NT_SUCCESS(status) && (NULL != ret_info)); - if (NT_SUCCESS(status)) { - // Copy requested info into output buffer and complete request - RtlCopyMemory(ret_info, - usb_device_descriptor(), - sizeof(USB_DEVICE_DESCRIPTOR)); - - WdfRequestCompleteWithInformation(request, - STATUS_SUCCESS, - sizeof(USB_DEVICE_DESCRIPTOR)); - } else { - WdfRequestComplete(request, status); - } - } else { - WdfRequestCompleteWithInformation(request, - STATUS_BUFFER_TOO_SMALL, - sizeof(USB_DEVICE_DESCRIPTOR)); - } -} - -void AndroidUsbDeviceObject::OnGetUsbConfigDescriptorCtl(WDFREQUEST request, - size_t output_buf_len) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - - if (NULL != configuration_descriptor()) { - // Check the buffer first - if (output_buf_len >= sizeof(USB_CONFIGURATION_DESCRIPTOR)) { - // Get the output buffer - NTSTATUS status; - void* ret_info = OutAddress(request, &status); - ASSERT(NT_SUCCESS(status) && (NULL != ret_info)); - if (NT_SUCCESS(status)) { - // Copy requested info into output buffer and complete request - RtlCopyMemory(ret_info, - configuration_descriptor(), - sizeof(USB_CONFIGURATION_DESCRIPTOR)); - - WdfRequestCompleteWithInformation(request, - STATUS_SUCCESS, - sizeof(USB_CONFIGURATION_DESCRIPTOR)); - } else { - WdfRequestComplete(request, status); - } - } else { - WdfRequestCompleteWithInformation(request, - STATUS_BUFFER_TOO_SMALL, - sizeof(USB_CONFIGURATION_DESCRIPTOR)); - } - } else { - WdfRequestComplete(request, STATUS_INVALID_DEVICE_REQUEST); - } -} - -void AndroidUsbDeviceObject::OnGetUsbInterfaceDescriptorCtl(WDFREQUEST request, - size_t output_buf_len) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - - // Check the buffer first - if (output_buf_len >= sizeof(USB_INTERFACE_DESCRIPTOR)) { - // Get the output buffer - NTSTATUS status; - void* ret_info = OutAddress(request, &status); - ASSERT(NT_SUCCESS(status) && (NULL != ret_info)); - if (NT_SUCCESS(status)) { - // Copy requested info into output buffer and complete request - RtlCopyMemory(ret_info, - interface_descriptor(), - sizeof(USB_INTERFACE_DESCRIPTOR)); - - WdfRequestCompleteWithInformation(request, - STATUS_SUCCESS, - sizeof(USB_INTERFACE_DESCRIPTOR)); - } else { - WdfRequestComplete(request, status); - } - } else { - WdfRequestCompleteWithInformation(request, - STATUS_BUFFER_TOO_SMALL, - sizeof(USB_INTERFACE_DESCRIPTOR)); - } -} - -void AndroidUsbDeviceObject::OnGetEndpointInformationCtl( - WDFREQUEST request, - size_t input_buf_len, - size_t output_buf_len) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - - // Check the buffers first - if (input_buf_len < sizeof(AdbQueryEndpointInformation)) { - WdfRequestComplete(request, STATUS_INVALID_BUFFER_SIZE); - return; - } - - if (output_buf_len < sizeof(AdbEndpointInformation)) { - WdfRequestCompleteWithInformation(request, - STATUS_BUFFER_TOO_SMALL, - sizeof(AdbEndpointInformation)); - return; - } - - // Get the output buffer - NTSTATUS status; - AdbEndpointInformation* ret_info = reinterpret_cast - (OutAddress(request, &status)); - ASSERT(NT_SUCCESS(status) && (NULL != ret_info)); - if (!NT_SUCCESS(status)) { - WdfRequestComplete(request, status); - return; - } - - // Get the input buffer - AdbQueryEndpointInformation* in = reinterpret_cast - (InAddress(request, &status)); - ASSERT(NT_SUCCESS(status) && (NULL != in)); - if (!NT_SUCCESS(status)) { - WdfRequestComplete(request, status); - return; - } - - // Lets see what exactly is queried - UCHAR endpoint_index = in->endpoint_index; - if (ADB_QUERY_BULK_WRITE_ENDPOINT_INDEX == endpoint_index) - endpoint_index = bulk_write_pipe_index(); - else if (ADB_QUERY_BULK_READ_ENDPOINT_INDEX == endpoint_index) - endpoint_index = bulk_read_pipe_index(); - - // Make sure index is valid and within interface range - if ((INVALID_UCHAR == endpoint_index) || - (endpoint_index >= configured_pipes_num())) { - WdfRequestComplete(request, STATUS_NOT_FOUND); - return; - } - - // Get endpoint information - WDF_USB_PIPE_INFORMATION pipe_info; - WDF_USB_PIPE_INFORMATION_INIT(&pipe_info); - WDFUSBPIPE wdf_pipe_obj = - WdfUsbInterfaceGetConfiguredPipe(wdf_usb_interface(), endpoint_index, &pipe_info); - if (NULL == wdf_pipe_obj) { - WdfRequestComplete(request, STATUS_NOT_FOUND); - return; - } - - // Copy endpoint info to the output - ret_info->max_packet_size = pipe_info.MaximumPacketSize; - ret_info->endpoint_address = pipe_info.EndpointAddress; - ret_info->polling_interval = pipe_info.Interval; - ret_info->setting_index = pipe_info.SettingIndex; - ret_info->endpoint_type = static_cast(pipe_info.PipeType); - ret_info->max_transfer_size = pipe_info.MaximumTransferSize; - - WdfRequestCompleteWithInformation(request, - STATUS_SUCCESS, - sizeof(AdbEndpointInformation)); -} - -void AndroidUsbDeviceObject::OnGetSerialNumberCtl(WDFREQUEST request, - size_t output_buf_len) { - ASSERT_IRQL_LOW(); - - if (NULL == serial_number()) { - // There is no serial number saved for this device! - WdfRequestComplete(request, STATUS_INTERNAL_ERROR); - return; - } - - size_t expected_len = serial_number_byte_len() + sizeof(WCHAR); - - // Check the buffer first - if (output_buf_len >= expected_len) { - // Get the output buffer - NTSTATUS status; - WCHAR* ret_info = reinterpret_cast(OutAddress(request, &status)); - ASSERT(NT_SUCCESS(status) && (NULL != ret_info)); - if (NT_SUCCESS(status)) { - // Copy serial number - RtlCopyMemory(ret_info, serial_number(), serial_number_byte_len()); - ret_info[serial_number_char_len()] = L'\0'; - WdfRequestCompleteWithInformation(request, STATUS_SUCCESS, expected_len); - } else { - WdfRequestComplete(request, status); - } - } else { - WdfRequestCompleteWithInformation(request, - STATUS_BUFFER_TOO_SMALL, - sizeof(expected_len)); - } -} - -#pragma code_seg("PAGE") - -NTSTATUS AndroidUsbDeviceObject::CreateDefaultQueue() { - ASSERT_IRQL_PASSIVE(); - - // Register I/O callbacks to tell the framework that we are interested - // in handling WdfRequestTypeRead, WdfRequestTypeWrite, and - // WdfRequestTypeDeviceControl requests. WdfIoQueueDispatchParallel means - // that we are capable of handling all the I/O request simultaneously and we - // are responsible for protecting data that could be accessed by these - // callbacks simultaneously. This queue will be, by default, automanaged by - // the framework with respect to PnP and Power events. That is, framework - // will take care of queuing, failing, dispatching incoming requests based - // on the current PnP / Power state of the device. We also need to register - // a EvtIoStop handler so that we can acknowledge requests that are pending - // at the target driver. - WDF_IO_QUEUE_CONFIG io_queue_config; - WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&io_queue_config, - WdfIoQueueDispatchParallel); - - io_queue_config.EvtIoDeviceControl = EvtIoDeviceControlEntry; - io_queue_config.EvtIoRead = EvtIoReadEntry; - io_queue_config.EvtIoWrite = EvtIoWriteEntry; - io_queue_config.AllowZeroLengthRequests = TRUE; - // By default KMDF will take care of the power management of this queue - io_queue_config.PowerManaged = WdfUseDefault; - - // Create queue object - WDFQUEUE wdf_queue_obj = NULL; - NTSTATUS status = WdfIoQueueCreate(wdf_device(), - &io_queue_config, - WDF_NO_OBJECT_ATTRIBUTES, - &wdf_queue_obj); - ASSERT(NT_SUCCESS(status) && (NULL != wdf_queue_obj)); - if (!NT_SUCCESS(status)) - return status; - return STATUS_SUCCESS; -} - -NTSTATUS AndroidUsbDeviceObject::ConfigureDevice() { - ASSERT_IRQL_PASSIVE(); - - ASSERT(IsTaretDeviceCreated()); - if (!IsTaretDeviceCreated()) - return STATUS_INTERNAL_ERROR; - - // In order to get the configuration descriptor we must first query for its - // size (by supplying NULL for the descriptor's address), allocate enough - // memory and then retrieve the descriptor. - USHORT size = 0; - - // Query descriptor size first - NTSTATUS status = - WdfUsbTargetDeviceRetrieveConfigDescriptor(wdf_target_device(), - WDF_NO_HANDLE, - &size); - ASSERT((status == STATUS_BUFFER_TOO_SMALL) || !NT_SUCCESS(status)); - if (status != STATUS_BUFFER_TOO_SMALL) - return status; - - // Create a memory object and specify our device as the parent so that - // it will be freed automatically along with our device. - WDFMEMORY memory = NULL; - WDF_OBJECT_ATTRIBUTES attributes; - WDF_OBJECT_ATTRIBUTES_INIT(&attributes); - attributes.ParentObject = wdf_device(); - status = WdfMemoryCreate(&attributes, - NonPagedPool, - GANDR_POOL_TAG_DEV_CFG_DESC, - size, - &memory, - reinterpret_cast(&configuration_descriptor_)); - ASSERT(NT_SUCCESS(status)); - if (!NT_SUCCESS(status)) - return status; - - // Now retrieve configuration descriptor - status = - WdfUsbTargetDeviceRetrieveConfigDescriptor(wdf_target_device(), - configuration_descriptor_, - &size); - ASSERT(NT_SUCCESS(status) && (NULL != configuration_descriptor_)); - if (!NT_SUCCESS(status)) - return status; - -#if DBG - PrintConfigDescriptor(configuration_descriptor(), size); -#endif // DBG - - return status; -} - -NTSTATUS AndroidUsbDeviceObject::SelectInterfaces() { - ASSERT_IRQL_PASSIVE(); - - ASSERT(IsDeviceConfigured()); - if (!IsDeviceConfigured()) - return STATUS_INTERNAL_ERROR; - - WDF_USB_DEVICE_SELECT_CONFIG_PARAMS config_params; - PWDF_USB_INTERFACE_SETTING_PAIR pairs = NULL; - // TODO: We need to find a way (possibly by looking at each - // interface descriptor) to get index of the ADB interface in multiinterface - // configuration. - UCHAR adb_interface_index = 0; - - if (IsSingleInterfaceDevice()) { - // Our device has only one interface, so we don't have to bother with - // multiple interfaces at all. - GoogleDbgPrint("\n********** Device reports single interface"); - // Select single interface configuration - WDF_USB_DEVICE_SELECT_CONFIG_PARAMS_INIT_SINGLE_INTERFACE(&config_params); - } else { - // Configure multiple interfaces - ULONG num_interf = GetInterfaceCount(); - GoogleDbgPrint("\n********** Device reports %u interfaces", - num_interf); - - // Allocate pairs for each interface - pairs = new(PagedPool, GANDR_POOL_TAG_INTERF_PAIRS) - WDF_USB_INTERFACE_SETTING_PAIR[num_interf]; - ASSERT(NULL != pairs); - if (NULL == pairs) - return STATUS_INSUFFICIENT_RESOURCES; - - adb_interface_index = 1; - // Initialize each interface pair - for (UCHAR pair = 0; pair < num_interf; pair++) { - pairs[pair].SettingIndex = 0; - pairs[pair].UsbInterface = - WdfUsbTargetDeviceGetInterface(wdf_target_device(), pair); - ASSERT(NULL != pairs[pair].UsbInterface); - if (NULL == pairs[pair].UsbInterface) { - delete[] pairs; - return STATUS_INTERNAL_ERROR; - } - } - - // Select multiinterface configuration - WDF_USB_DEVICE_SELECT_CONFIG_PARAMS_INIT_MULTIPLE_INTERFACES(&config_params, - (UCHAR)num_interf, - pairs); - } - - NTSTATUS status = - WdfUsbTargetDeviceSelectConfig(wdf_target_device(), - WDF_NO_OBJECT_ATTRIBUTES, - &config_params); - if (NULL != pairs) - delete[] pairs; - - // ASSERT(NT_SUCCESS(status)); - if (!NT_SUCCESS(status)) - return status; - -#if DBG - PrintSelectedConfig(&config_params); -#endif // DBG - - wdf_usb_interface_ = - WdfUsbTargetDeviceGetInterface(wdf_target_device(), adb_interface_index); - ASSERT(NULL != wdf_usb_interface_); - if (NULL == wdf_usb_interface_) - return STATUS_INTERNAL_ERROR; - - configured_pipes_num_ = WdfUsbInterfaceGetNumEndpoints(wdf_usb_interface(), 0); - ASSERT(0 != configured_pipes_num_); - - // Cache selected interface descriptor - BYTE setting_index = - WdfUsbInterfaceGetConfiguredSettingIndex(wdf_usb_interface()); - - WdfUsbInterfaceGetDescriptor(wdf_usb_interface(), - setting_index, - &interface_descriptor_); - -#if DBG - PrintInterfaceDescriptor(interface_descriptor()); -#endif // DBG - - // Iterate over pipes, decoding and saving info about bulk r/w pipes for - // easier and faster addressing later on when they get opened - for (UCHAR pipe = 0; pipe < configured_pipes_num(); pipe++) { - WDF_USB_PIPE_INFORMATION pipe_info; - WDF_USB_PIPE_INFORMATION_INIT(&pipe_info); - WDFUSBPIPE wdf_pipe_obj = - WdfUsbInterfaceGetConfiguredPipe(wdf_usb_interface(), pipe, &pipe_info); - ASSERT(NULL != wdf_pipe_obj); - if (NULL != wdf_pipe_obj) { - if ((WdfUsbPipeTypeBulk == pipe_info.PipeType) && - WDF_USB_PIPE_DIRECTION_IN(pipe_info.EndpointAddress)) { - // This is a bulk read pipe - ASSERT(!IsBulkReadPipeKnown()); - bulk_read_pipe_index_ = pipe; - } else { - ASSERT(!IsBulkWritePipeKnown()); - bulk_write_pipe_index_ = pipe; - } - } -#if DBG - PrintPipeInformation(&pipe_info, pipe); -#endif // DBG - } - - // At the end we must have calculated indexes for both, - // bulk read and write pipes - ASSERT(!NT_SUCCESS(status) || (IsBulkReadPipeKnown() && - IsBulkWritePipeKnown())); - - return status; -} - -UCHAR AndroidUsbDeviceObject::GetPipeIndexFromFileName( - PUNICODE_STRING file_path) { - ASSERT_IRQL_PASSIVE(); - ASSERT((NULL != file_path) && (0 != file_path->Length) && (NULL != file_path->Buffer)); - if ((NULL == file_path) || - (0 == file_path->Length) || - (NULL == file_path->Buffer)) { - return INVALID_UCHAR; - } - - // Lets check for explicit r/w pipe names - if (0 == RtlCompareUnicodeString(file_path, &bulk_read_pipe_name, TRUE)) - return bulk_read_pipe_index(); - if (0 == RtlCompareUnicodeString(file_path, &bulk_write_pipe_name, TRUE)) - return bulk_write_pipe_index(); - - // Lets check path format - if (file_path->Length <= index_pipe_prefix.Length) { - GoogleDbgPrint("\n!!!!! Bad format for pipe name: %wZ", file_path); - return INVALID_UCHAR; - } - - // Now when whe know that file_path->Length is sufficient lets match this - // path with the prefix - UNICODE_STRING prefix_match = *file_path; - prefix_match.Length = index_pipe_prefix.Length; - prefix_match.MaximumLength = prefix_match.Length; - - if (0 != RtlCompareUnicodeString(&prefix_match, &index_pipe_prefix, TRUE)) { - GoogleDbgPrint("\n!!!!! Bad format for pipe name: %wZ", file_path); - return INVALID_UCHAR; - } - - // Prefix matches. Make sure that remaining chars are all decimal digits. - // Pipe index begins right after the prefix ends. - const ULONG index_begins_at = WcharLen(index_pipe_prefix.Length); - const ULONG name_len = WcharLen(file_path->Length); - for (ULONG index = index_begins_at; index < name_len; index++) { - if ((file_path->Buffer[index] > L'9') || - (file_path->Buffer[index] < L'0')) { - GoogleDbgPrint("\n!!!!! Bad format for pipe name: %wZ", file_path); - return INVALID_UCHAR; - } - } - - // Parse the pipe# - ULONG uval = 0; - ULONG umultiplier = 1; - - // traversing least to most significant digits. - for (ULONG index = name_len - 1; index >= index_begins_at; index--) { - uval += (umultiplier * static_cast(file_path->Buffer[index] - L'0')); - umultiplier *= 10; - } - - return static_cast(uval); -} - -NTSTATUS AndroidUsbDeviceObject::CreatePipeFileObjectExt( - WDFFILEOBJECT wdf_fo, - WDFUSBPIPE wdf_pipe_obj, - const WDF_USB_PIPE_INFORMATION* pipe_info, - AndroidUsbFileObject** wdf_file_ext) { - ASSERT_IRQL_PASSIVE(); - ASSERT((NULL != wdf_fo) && (NULL != wdf_pipe_obj) && (NULL != pipe_info) && (NULL != wdf_file_ext)); - if ((NULL == wdf_fo) || (NULL == wdf_pipe_obj) || (NULL == pipe_info) || (NULL == wdf_file_ext)) { - return STATUS_INTERNAL_ERROR; - } - *wdf_file_ext = NULL; - - AndroidUsbPipeFileObject* wdf_pipe_file_ext = NULL; - - // We support only WdfUsbPipeTypeBulk and WdfUsbPipeTypeInterrupt files - // at this point. - switch (pipe_info->PipeType) { - case WdfUsbPipeTypeBulk: - wdf_pipe_file_ext = new(NonPagedPool, GANDR_POOL_TAG_BULK_FILE) - AndroidUsbBulkPipeFileObject(this, wdf_fo, wdf_pipe_obj); - break; - - case WdfUsbPipeTypeInterrupt: - wdf_pipe_file_ext = new(NonPagedPool, GANDR_POOL_TAG_INTERRUPT_FILE) - AndroidUsbInterruptPipeFileObject(this, wdf_fo, wdf_pipe_obj); - break;; - - case WdfUsbPipeTypeIsochronous: - case WdfUsbPipeTypeControl: - case WdfUsbPipeTypeInvalid: - default: - return STATUS_OBJECT_TYPE_MISMATCH; - } - - // If we reached here instance of a file wrapper must be created. - ASSERT(NULL != wdf_pipe_file_ext); - if (NULL == wdf_pipe_file_ext) - return STATUS_INSUFFICIENT_RESOURCES; - - // Initialize the wrapper. - NTSTATUS status = wdf_pipe_file_ext->InitializePipe(pipe_info); - ASSERT(NT_SUCCESS(status)); - if (NT_SUCCESS(status)) { - *wdf_file_ext = wdf_pipe_file_ext; - } else { - delete wdf_pipe_file_ext; - } - - return STATUS_SUCCESS; -} - -#if DBG -#pragma code_seg() - -void AndroidUsbDeviceObject::PrintUsbDeviceDescriptor( - const USB_DEVICE_DESCRIPTOR* desc) { - GoogleDbgPrint("\n***** USB_DEVICE_DESCRIPTOR %p for device %p", desc, this); - GoogleDbgPrint("\n bDescriptorType = %u", desc->bDescriptorType); - GoogleDbgPrint("\n bcdUSB = x%02X", desc->bcdUSB); - GoogleDbgPrint("\n bDeviceClass = x%02X", desc->bDeviceClass); - GoogleDbgPrint("\n bDeviceSubClass = x%02X", desc->bDeviceSubClass); - GoogleDbgPrint("\n bDeviceProtocol = x%02X", desc->bDeviceProtocol); - GoogleDbgPrint("\n bMaxPacketSize = %u", desc->bMaxPacketSize0); - GoogleDbgPrint("\n idVendor = x%04X", desc->idVendor); - GoogleDbgPrint("\n idProduct = x%04X", desc->idProduct); - GoogleDbgPrint("\n bcdDevice = x%02X", desc->bcdDevice); - GoogleDbgPrint("\n iManufacturer = %u", desc->iManufacturer); - GoogleDbgPrint("\n iProduct = %u", desc->iProduct); - GoogleDbgPrint("\n iSerialNumber = %u", desc->iSerialNumber); - GoogleDbgPrint("\n bNumConfigurations = %u", desc->bNumConfigurations); -} - -void AndroidUsbDeviceObject::PrintUsbTargedDeviceInformation( - const WDF_USB_DEVICE_INFORMATION* info) { - GoogleDbgPrint("\n***** WDF_USB_DEVICE_INFORMATION %p for device %p", info, this); - GoogleDbgPrint("\n HcdPortCapabilities = x%08X", info->HcdPortCapabilities); - GoogleDbgPrint("\n Traits = x%08X", info->Traits); - GoogleDbgPrint("\n VersionInfo.USBDI_Version = x%08X", - info->UsbdVersionInformation.USBDI_Version); - GoogleDbgPrint("\n VersionInfo.Supported_USB_Version = x%08X", - info->UsbdVersionInformation.Supported_USB_Version); -} - -void AndroidUsbDeviceObject::PrintConfigDescriptor( - const USB_CONFIGURATION_DESCRIPTOR* desc, - ULONG size) { - GoogleDbgPrint("\n***** USB_CONFIGURATION_DESCRIPTOR %p for device %p size %u", - desc, this, size); - GoogleDbgPrint("\n bDescriptorType = %u", desc->bDescriptorType); - GoogleDbgPrint("\n wTotalLength = %u", desc->wTotalLength); - GoogleDbgPrint("\n bNumInterfaces = %u", desc->bNumInterfaces); - GoogleDbgPrint("\n bConfigurationValue = %u", desc->bConfigurationValue); - GoogleDbgPrint("\n iConfiguration = %u", desc->iConfiguration); - GoogleDbgPrint("\n bmAttributes = %u", desc->bmAttributes); - GoogleDbgPrint("\n MaxPower = %u", desc->MaxPower); -} - -void AndroidUsbDeviceObject::PrintSelectedConfig( - const WDF_USB_DEVICE_SELECT_CONFIG_PARAMS* config) { - GoogleDbgPrint("\n***** WDF_USB_DEVICE_SELECT_CONFIG_PARAMS %p for device %p", config, this); - GoogleDbgPrint("\n Type = %u", config->Type); - switch (config->Type) { - case WdfUsbTargetDeviceSelectConfigTypeSingleInterface: - GoogleDbgPrint("\n SingleInterface:"); - GoogleDbgPrint("\n NumberConfiguredPipes = %u", - config->Types.SingleInterface.NumberConfiguredPipes); - GoogleDbgPrint("\n ConfiguredUsbInterface = %p", - config->Types.SingleInterface.ConfiguredUsbInterface); - break; - - case WdfUsbTargetDeviceSelectConfigTypeMultiInterface: - GoogleDbgPrint("\n MultiInterface:"); - GoogleDbgPrint("\n NumberInterfaces = %u", - config->Types.MultiInterface.NumberInterfaces); - GoogleDbgPrint("\n NumberOfConfiguredInterfaces = %u", - config->Types.MultiInterface.NumberOfConfiguredInterfaces); - GoogleDbgPrint("\n Pairs = %p", - config->Types.MultiInterface.Pairs); - break; - - case WdfUsbTargetDeviceSelectConfigTypeInterfacesDescriptor: - GoogleDbgPrint("\n Descriptor:"); - GoogleDbgPrint("\n NumInterfaceDescriptors = %u", - config->Types.Descriptor.NumInterfaceDescriptors); - GoogleDbgPrint("\n ConfigurationDescriptor = %p", - config->Types.Descriptor.ConfigurationDescriptor); - GoogleDbgPrint("\n InterfaceDescriptors = %p", - config->Types.Descriptor.InterfaceDescriptors); - break; - - case WdfUsbTargetDeviceSelectConfigTypeUrb: - GoogleDbgPrint("\n Urb:"); - GoogleDbgPrint("\n Urb = %p", - config->Types.Urb.Urb); - break; - - case WdfUsbTargetDeviceSelectConfigTypeInterfacesPairs: - case WdfUsbTargetDeviceSelectConfigTypeInvalid: - case WdfUsbTargetDeviceSelectConfigTypeDeconfig: - default: - GoogleDbgPrint("\n Config type is unknown or invalid or not printable."); - break; - } -} - -void AndroidUsbDeviceObject::PrintInterfaceDescriptor( - const USB_INTERFACE_DESCRIPTOR* desc) { - GoogleDbgPrint("\n***** USB_INTERFACE_DESCRIPTOR %p for device %p", - desc, this); - GoogleDbgPrint("\n bLength = %u", desc->bLength); - GoogleDbgPrint("\n bDescriptorType = %u", desc->bDescriptorType); - GoogleDbgPrint("\n bInterfaceNumber = %u", desc->bInterfaceNumber); - GoogleDbgPrint("\n bAlternateSetting = %u", desc->bAlternateSetting); - GoogleDbgPrint("\n bNumEndpoints = %u", desc->bNumEndpoints); - GoogleDbgPrint("\n bInterfaceClass = x%02X", desc->bInterfaceClass); - GoogleDbgPrint("\n bInterfaceSubClass = x%02X", desc->bInterfaceSubClass); - GoogleDbgPrint("\n bInterfaceProtocol = x%02X", desc->bInterfaceProtocol); - GoogleDbgPrint("\n iInterface = %u", desc->iInterface); -} - -void AndroidUsbDeviceObject::PrintPipeInformation( - const WDF_USB_PIPE_INFORMATION* info, - UCHAR pipe_index) { - GoogleDbgPrint("\n***** WDF_USB_PIPE_INFORMATION[%u] %p for device %p", - pipe_index, info, this); - GoogleDbgPrint("\n Size = %u", info->Size); - GoogleDbgPrint("\n MaximumPacketSize = %u", info->MaximumPacketSize); - GoogleDbgPrint("\n EndpointAddress = x%02X", info->EndpointAddress); - GoogleDbgPrint("\n Interval = %u", info->Interval); - GoogleDbgPrint("\n SettingIndex = %u", info->SettingIndex); - GoogleDbgPrint("\n PipeType = %u", info->PipeType); - GoogleDbgPrint("\n MaximumTransferSize = %u", info->MaximumTransferSize); -} - -#endif // DBG - -#pragma data_seg() -#pragma code_seg() diff --git a/host/windows/usb/driver/android_usb_device_object.h b/host/windows/usb/driver/android_usb_device_object.h deleted file mode 100644 index 5c97e9c7f..000000000 --- a/host/windows/usb/driver/android_usb_device_object.h +++ /dev/null @@ -1,603 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_USB_DEVICE_OBJECT_H__ -#define ANDROID_USB_DEVICE_OBJECT_H__ -/** \file - This file consists of declaration of class AndroidUsbDeviceObject that - encapsulates an extension for KMDF device (FDO) object. -*/ - -#include "android_usb_wdf_object.h" - -// Forward declaration for file object extension -class AndroidUsbFileObject; - -/** AndroidUsbDeviceObject class encapsulates an extension for KMDF FDO device - object. Instances of this class must be allocated from NonPagedPool. -*/ -class AndroidUsbDeviceObject : public AndroidUsbWdfObject { - public: - /** \brief Constructs the object. - - This method must be called at low IRQL. - */ - AndroidUsbDeviceObject(); - - /** \brief Destructs the object. - - This method can be called at any IRQL. - */ - ~AndroidUsbDeviceObject(); - - public: - /** \brief Creates and initializes FDO device object extension - - This method is called from driver's OnAddDevice method in response to - AddDevice call from the PnP manager - @param device_init[in] A pointer to a framework-allocated WDFDEVICE_INIT - structure. - @return If the routine succeeds, it returns STATUS_SUCCESS. Otherwise, - it returns one of the error status values defined in ntstatus.h. - */ - NTSTATUS CreateFDODevice(PWDFDEVICE_INIT device_init); - - /** \brief Resets target device - - When executing this method instance of this class may be deleted! - This method must be called at PASSIVE IRQL. - @return STATUS_SUCCESS or an appropriate error code - */ - NTSTATUS ResetDevice(); - - private: - /** \name Device event handlers and callbacks - */ - ///@{ - - /** \brief Handler for PnP prepare hardware event - - This method performs any operations that are needed to make a device - accessible to the driver. The framework calls this callback after the PnP - manager has assigned hardware resources to the device and after the device - has entered its uninitialized D0 state. This callback is called before - calling the driver's EvtDeviceD0Entry callback function. - This method is called at PASSIVE IRQL. - @param resources_raw[in] A handle to a framework resource-list object that - identifies the raw hardware resources that the PnP manager has - assigned to the device. - @param resources_translated[in] A handle to a framework resource-list - object that identifies the translated hardware resources that the - PnP manager has assigned to the device. - @return Successful status or an appropriate error code - */ - NTSTATUS OnEvtDevicePrepareHardware(WDFCMRESLIST resources_raw, - WDFCMRESLIST resources_translated); - - /** \brief Handler for PnP release hardware event - - This method performs operations that that are needed when a device is no - longer accessible. Framework calls the callback function if the device is - being removed, or if the PnP manager is attempting to redistribute hardware - resources. The framework calls the EvtDeviceReleaseHardware callback - function after the driver's device has been shut off, the PnP manager has - reclaimed the hardware resources that it assigned to the device, and the - device is no longer accessible. (The PCI configuration state is still - accessible.) Typically, a EvtDeviceReleaseHardware callback function unmaps - memory that the driver's EvtDevicePrepareHardware callback function mapped. - Usually, all other hardware shutdown operations should take place in the - driver's EvtDeviceD0Exit callback function. - This method is called at PASSIVE IRQL. - @param wdf_device[in] A handle to a framework device object. - @param resources_translated[in] A handle to a framework resource-list - object that identifies the translated hardware resources that the - PnP manager has assigned to the device. - @return Successful status or an appropriate error code - */ - NTSTATUS OnEvtDeviceReleaseHardware(WDFCMRESLIST resources_translated); - - /** \brief Handler for create file event (request) - - This method performs operations that are needed when an application - requests access to an item within this device path (including device - itself). This method is called synchronously, in the context of the - user thread that opens the item. - This method is called at PASSIVE IRQL. - @param request[in] A handle to a framework request object that represents - a file creation request. - @param wdf_fo[in] A handle to a framework file object that describes a - file that is being created with this request. - @return Successful status or an appropriate error code - */ - void OnEvtDeviceFileCreate(WDFREQUEST request, WDFFILEOBJECT wdf_fo); - - /** \brief Entry point for PnP prepare hardware event - - This callback performs any operations that are needed to make a device - accessible to the driver. The framework calls this callback after the PnP - manager has assigned hardware resources to the device and after the device - has entered its uninitialized D0 state. This callback is called before - calling the driver's EvtDeviceD0Entry callback function. - This callback is called at PASSIVE IRQL. - @param wdf_dev[in] A handle to a framework device object. - @param resources_raw[in] A handle to a framework resource-list object that - identifies the raw hardware resources that the PnP manager has - assigned to the device. - @param resources_translated[in] A handle to a framework resource-list - object that identifies the translated hardware resources that the - PnP manager has assigned to the device. - @return Successful status or an appropriate error code - */ - static NTSTATUS EvtDevicePrepareHardwareEntry(WDFDEVICE wdf_dev, - WDFCMRESLIST resources_raw, - WDFCMRESLIST resources_translated); - - /** \brief Entry point for PnP release hardware event - - This callback performs operations that that are needed when a device is no - longer accessible. Framework calls the callback function if the device is - being removed, or if the PnP manager is attempting to redistribute hardware - resources. The framework calls the EvtDeviceReleaseHardware callback - function after the driver's device has been shut off, the PnP manager has - reclaimed the hardware resources that it assigned to the device, and the - device is no longer accessible. (The PCI configuration state is still - accessible.) Typically, a EvtDeviceReleaseHardware callback function unmaps - memory that the driver's EvtDevicePrepareHardware callback function mapped. - Usually, all other hardware shutdown operations should take place in the - driver's EvtDeviceD0Exit callback function. - This callback is called at PASSIVE IRQL. - @param wdf_dev[in] A handle to a framework device object. - @param resources_translated[in] A handle to a framework resource-list - object that identifies the translated hardware resources that the - PnP manager has assigned to the device. - @return Successful status or an appropriate error code - */ - static NTSTATUS EvtDeviceReleaseHardwareEntry(WDFDEVICE wdf_dev, - WDFCMRESLIST resources_translated); - - /** \brief Entry point for create file event (request) - - This callback performs operations that that are needed when an application - requests access to a device. The framework calls a driver's - EvtDeviceFileCreate callback function when a user application or another - driver opens the device (or file on this device) to perform an I/O - operation, such as reading or writing a file. This callback function is - called synchronously, in the context of the user thread that opens the - device. - This callback is called at PASSIVE IRQL. - @param wdf_dev[in] A handle to a framework device object. - @param request[in] A handle to a framework request object that represents - a file creation request. - @param wdf_fo[in] A handle to a framework file object that describes a - file that is being created with this request. - @return Successful status or an appropriate error code - */ - static void EvtDeviceFileCreateEntry(WDFDEVICE wdf_dev, - WDFREQUEST request, - WDFFILEOBJECT wdf_fo); - - ///@} - - private: - /** \name I/O request event handlers and callbacks - */ - ///@{ - - /** \brief Read event handler - - This method is called when a read request comes to a file object opened - on this device. - This method can be called IRQL <= DISPATCH_LEVEL. - @param request[in] A handle to a framework request object. - @param length[in] The number of bytes to be read. - */ - void OnEvtIoRead(WDFREQUEST request, size_t length); - - /** \brief Write event handler - - This method is called when a write request comes to a file object opened - on this device. - This method can be called IRQL <= DISPATCH_LEVEL. - @param request[in] A handle to a framework request object. - @param length[in] The number of bytes to be written. - */ - void OnEvtIoWrite(WDFREQUEST request, size_t length); - - /** \brief IOCTL event handler - - This method is called when a device control request comes to a file object - opened on this device. - This method can be called IRQL <= DISPATCH_LEVEL. - @param request[in] A handle to a framework request object. - @param output_buf_len[in] The length, in bytes, of the request's output - buffer, if an output buffer is available. - @param input_buf_len[in] The length, in bytes, of the request's input - buffer, if an input buffer is available. - @param ioctl_code[in] The driver-defined or system-defined I/O control code - that is associated with the request. - */ - void OnEvtIoDeviceControl(WDFREQUEST request, - size_t output_buf_len, - size_t input_buf_len, - ULONG ioctl_code); - - /** \brief Entry point for read event - - This callback is called when a read request comes to a file object opened - on this device. - This callback can be called IRQL <= DISPATCH_LEVEL. - @param queue[in] A handle to the framework queue object that is associated - with the I/O request. - @param request[in] A handle to a framework request object. - @param length[in] The number of bytes to be read. - */ - static void EvtIoReadEntry(WDFQUEUE queue, - WDFREQUEST request, - size_t length); - - /** \brief Entry point for write event - - This callback is called when a write request comes to a file object opened - on this device. - This callback can be called IRQL <= DISPATCH_LEVEL. - @param queue[in] A handle to the framework queue object that is associated - with the I/O request. - @param request[in] A handle to a framework request object. - @param length[in] The number of bytes to be written. - */ - static void EvtIoWriteEntry(WDFQUEUE queue, - WDFREQUEST request, - size_t length); - - /** \brief Entry point for device IOCTL event - - This callback is called when a device control request comes to a file - object opened on this device. - This callback can be called IRQL <= DISPATCH_LEVEL. - @param queue[in] A handle to the framework queue object that is associated - with the I/O request. - @param request[in] A handle to a framework request object. - @param output_buf_len[in] The length, in bytes, of the request's output - buffer, if an output buffer is available. - @param input_buf_len[in] The length, in bytes, of the request's input - buffer, if an input buffer is available. - @param ioctl_code[in] The driver-defined or system-defined I/O control code - that is associated with the request. - */ - static void EvtIoDeviceControlEntry(WDFQUEUE queue, - WDFREQUEST request, - size_t output_buf_len, - size_t input_buf_len, - ULONG ioctl_code); - - ///@} - - public: - /** \name Device level I/O request handlers - */ - ///@{ - - /** \brief Gets USB device descriptor - - This method can be called at IRQL <= DISPATCH_LEVEL - @param request[in] A handle to a framework request object for this IOCTL. - @param output_buf_len[in] The length, in bytes, of the request's output - buffer, if an output buffer is available. - */ - void OnGetUsbDeviceDescriptorCtl(WDFREQUEST request, size_t output_buf_len); - - /** \brief Gets USB configuration descriptor for the selected configuration. - - This method can be called at IRQL <= DISPATCH_LEVEL - @param request[in] A handle to a framework request object for this IOCTL. - @param output_buf_len[in] The length, in bytes, of the request's output - buffer, if an output buffer is available. - */ - void OnGetUsbConfigDescriptorCtl(WDFREQUEST request, size_t output_buf_len); - - /** \brief Gets USB configuration descriptor for the selected interface. - - This method can be called at IRQL <= DISPATCH_LEVEL - @param request[in] A handle to a framework request object for this IOCTL. - @param output_buf_len[in] The length, in bytes, of the request's output - buffer, if an output buffer is available. - */ - void OnGetUsbInterfaceDescriptorCtl(WDFREQUEST request, size_t output_buf_len); - - /** \brief Gets information about an endpoint. - - This method can be called at IRQL <= DISPATCH_LEVEL - @param request[in] A handle to a framework request object for this IOCTL. - @param input_buf_len[in] The length, in bytes, of the request's input - buffer, if an input buffer is available. - @param output_buf_len[in] The length, in bytes, of the request's output - buffer, if an output buffer is available. - */ - void OnGetEndpointInformationCtl(WDFREQUEST request, - size_t input_buf_len, - size_t output_buf_len); - - /** \brief Gets device serial number. - - Serial number is returned in form of zero-terminated string that in the - output buffer. This method must be called at low IRQL. - @param request[in] A handle to a framework request object for this IOCTL. - @param output_buf_len[in] The length, in bytes, of the request's output - buffer, if an output buffer is available. - */ - void OnGetSerialNumberCtl(WDFREQUEST request, size_t output_buf_len); - - ///@} - - private: - /** \name Internal methods - */ - ///@{ - - /** \brief Creates default request queue for this device. - - In KMDF all I/O requests are coming through the queue object. So, in order - to enable our device to receive I/O requests we must create a queue for it. - This method is called at PASSIVE IRQL. - @return STATUS_SUCCESS or an appropriate error code. - */ - NTSTATUS CreateDefaultQueue(); - - /** \brief Configures our device. - - This method is called from the prepare hardware handler after underlying - FDO device has been created. - This method is called at PASSSIVE IRQL. - @return STATUS_SUCCESS or an appropriate error code. - */ - NTSTATUS ConfigureDevice(); - - /** \brief Selects interfaces on our device. - - This method is called from the prepare hardware handler after underlying - FDO device has been created and configured. - This method is called at PASSSIVE IRQL. - @return STATUS_SUCCESS or an appropriate error code. - */ - NTSTATUS SelectInterfaces(); - - /** \brief Gets pipe index from a file name - - This method is called from OnEvtDeviceFileCreate to determine index of - the pipe this file is addressing. - This method is called at PASSIVE IRQL. - @param file_path[in] Path to the file that being opened. - @return Pipe index or INVALID_UCHAR if index cannot be calculated. - */ - UCHAR GetPipeIndexFromFileName(PUNICODE_STRING file_path); - - /** \brief Creates file object extension for a pipe - - This method is called from OnEvtDeviceFileCreate to create an appropriate - file object extension for a particular pipe type. - This method is called at PASSIVE IRQL. - @param wdf_fo[in] KMDF file to extend. - @param wdf_pipe_obj[in] KMDF pipe for this extension - @param pipe_info[in] Pipe information - @param wdf_file_ext[out] Upon successfull completion will receive instance - of the extension. - @return STATUS_SUCCESS or an appropriate error code - */ - NTSTATUS CreatePipeFileObjectExt(WDFFILEOBJECT wdf_fo, - WDFUSBPIPE wdf_pipe_obj, - const WDF_USB_PIPE_INFORMATION* pipe_info, - AndroidUsbFileObject** wdf_file_ext); - - ///@} - - private: - /** \name Debugging support - */ - ///@{ - -#if DBG - /// Prints USB_DEVICE_DESCRIPTOR to debug output - void PrintUsbDeviceDescriptor(const USB_DEVICE_DESCRIPTOR* desc); - - /// Prints WDF_USB_DEVICE_INFORMATION to debug output - void PrintUsbTargedDeviceInformation(const WDF_USB_DEVICE_INFORMATION* info); - - /// Prints USB_CONFIGURATION_DESCRIPTOR to debug output - void PrintConfigDescriptor(const USB_CONFIGURATION_DESCRIPTOR* desc, - ULONG size); - - /// Prints WDF_USB_DEVICE_SELECT_CONFIG_PARAMS to debug output - void PrintSelectedConfig(const WDF_USB_DEVICE_SELECT_CONFIG_PARAMS* config); - - /// Prints USB_INTERFACE_DESCRIPTOR to debug output - void PrintInterfaceDescriptor(const USB_INTERFACE_DESCRIPTOR* desc); - - /// Prints WDF_USB_PIPE_INFORMATION to debug output - void PrintPipeInformation(const WDF_USB_PIPE_INFORMATION* info, - UCHAR pipe_index); - -#endif // DBG - - ///@} - - public: - /// Gets WDF device handle for this device - __forceinline WDFDEVICE wdf_device() const { - return reinterpret_cast(wdf_object()); - } - - /// Gets target USB device descriptor - __forceinline const USB_DEVICE_DESCRIPTOR* usb_device_descriptor() const { - return &usb_device_descriptor_; - } - - /// Gets target USB device information - __forceinline const WDF_USB_DEVICE_INFORMATION* usb_device_info() const { - return &usb_device_info_; - } - - /// Gets selected interface descriptor - __forceinline const USB_INTERFACE_DESCRIPTOR* interface_descriptor() const { - return &interface_descriptor_; - } - - /// Gets target (PDO) device handle - __forceinline WDFUSBDEVICE wdf_target_device() const { - return wdf_target_device_; - } - - /// Checks if target device has been created - __forceinline bool IsTaretDeviceCreated() const { - return (NULL != wdf_target_device()); - } - - /// Gets USB configuration descriptor - __forceinline const USB_CONFIGURATION_DESCRIPTOR* configuration_descriptor() const { - return configuration_descriptor_; - } - - /// Checks if device has been configured - __forceinline bool IsDeviceConfigured() const { - return (NULL != configuration_descriptor()); - } - - /// Gets number of interfaces for this device - __forceinline UCHAR GetInterfaceCount() const { - ASSERT(IsDeviceConfigured()); - return IsDeviceConfigured() ? configuration_descriptor()->bNumInterfaces : 0; - } - - /// Checks if this is "single interface" device - __forceinline bool IsSingleInterfaceDevice() const { - return (1 == GetInterfaceCount()); - } - - /// Gets USB interface selected on this device - __forceinline WDFUSBINTERFACE wdf_usb_interface() const { - return wdf_usb_interface_; - } - - /// Checks if an interface has been selected on this device - __forceinline bool IsInterfaceSelected() const { - return (NULL != wdf_usb_interface()); - } - - /// Gets number of pipes configured on this device - __forceinline UCHAR configured_pipes_num() const { - return configured_pipes_num_; - } - - /// Gets index of the bulk read pipe - __forceinline UCHAR bulk_read_pipe_index() const { - return bulk_read_pipe_index_; - } - - /// Gets index of the bulk write pipe - __forceinline UCHAR bulk_write_pipe_index() const { - return bulk_write_pipe_index_; - } - - /// Checks if this is a high speed device - __forceinline bool IsHighSpeed() const { - return (0 != (usb_device_info()->Traits & WDF_USB_DEVICE_TRAIT_AT_HIGH_SPEED)); - } - - /// Checks if bulk read pipe index is known - __forceinline bool IsBulkReadPipeKnown() const { - return (INVALID_UCHAR != bulk_read_pipe_index()); - } - - /// Checks if bulk write pipe index is known - __forceinline bool IsBulkWritePipeKnown() const { - return (INVALID_UCHAR != bulk_write_pipe_index()); - } - - /// Gets device serial number string. Note that string may be - /// not zero-terminated. Use serial_number_len() to get actual - /// length of this string. - __forceinline const WCHAR* serial_number() const { - ASSERT(NULL != serial_number_handle_); - return (NULL != serial_number_handle_) ? - reinterpret_cast - (WdfMemoryGetBuffer(serial_number_handle_, NULL)) : - NULL; - } - - /// Gets length (in bytes) of device serial number string - __forceinline USHORT serial_number_char_len() const { - return serial_number_char_len_; - } - - /// Gets length (in bytes) of device serial number string - __forceinline USHORT serial_number_byte_len() const { - return serial_number_char_len() * sizeof(WCHAR); - } - - protected: - /// Target USB device descriptor - USB_DEVICE_DESCRIPTOR usb_device_descriptor_; - - /// Target USB device information - WDF_USB_DEVICE_INFORMATION usb_device_info_; - - /// Selected interface descriptor - USB_INTERFACE_DESCRIPTOR interface_descriptor_; - - /// USB configuration descriptor - PUSB_CONFIGURATION_DESCRIPTOR configuration_descriptor_; - - /// Target (PDO?) device handle - WDFUSBDEVICE wdf_target_device_; - - /// USB interface selected on this device - WDFUSBINTERFACE wdf_usb_interface_; - - /// Device serial number - WDFMEMORY serial_number_handle_; - - /// Device serial number string length - USHORT serial_number_char_len_; - - /// Number of pipes configured on this device - UCHAR configured_pipes_num_; - - /// Index of the bulk read pipe - UCHAR bulk_read_pipe_index_; - - /// Index of the bulk write pipe - UCHAR bulk_write_pipe_index_; -}; - -/** \brief Gets device KMDF object extension for the given KMDF object - - @param wdf_dev[in] KMDF handle describing device object - @return Instance of AndroidUsbDeviceObject associated with KMDF object or - NULL if association is not found. -*/ -__forceinline AndroidUsbDeviceObject* GetAndroidUsbDeviceObjectFromHandle( - WDFDEVICE wdf_dev) { - AndroidUsbWdfObject* wdf_object_ext = - GetAndroidUsbWdfObjectFromHandle(wdf_dev); - ASSERT((NULL != wdf_object_ext) && - wdf_object_ext->Is(AndroidUsbWdfObjectTypeDevice)); - if ((NULL != wdf_object_ext) && - wdf_object_ext->Is(AndroidUsbWdfObjectTypeDevice)) { - return reinterpret_cast(wdf_object_ext); - } - return NULL; -} - -#endif // ANDROID_USB_DEVICE_OBJECT_H__ diff --git a/host/windows/usb/driver/android_usb_driver_defines.h b/host/windows/usb/driver/android_usb_driver_defines.h deleted file mode 100644 index 4fe25d760..000000000 --- a/host/windows/usb/driver/android_usb_driver_defines.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_USB_DRIVER_DEFINES_H__ -#define ANDROID_USB_DRIVER_DEFINES_H__ -/** \file - This file consists of constants, types and macros used (and useful) in driver - development. -*/ - -/** \name IRQL assertions - These assertions help to verify that code is running at expected IRQL -*/ -///@{ - -/// Asserts that current IRQL is less than provided level -#define ASSERT_IRQL_LESS(irql_level) ASSERT(KeGetCurrentIrql() < irql_level) -/// Asserts that current IRQL is less or equal than provided level -#define ASSERT_IRQL_LESS_OR_EQUAL(irql_level) ASSERT(KeGetCurrentIrql() <= irql_level) -/// Asserts that current IRQL is the same as provided level -#define ASSERT_IRQL_IS(irql_level) ASSERT(irql_level == KeGetCurrentIrql()) -/// Asserts that current IRQL is less than DISPATCH_LEVEL -#define ASSERT_IRQL_LOW() ASSERT_IRQL_LESS(DISPATCH_LEVEL) -/// Asserts that current IRQL is above APC_LEVEL -#define ASSERT_IRQL_HIGH() ASSERT(KeGetCurrentIrql() >= DISPATCH_LEVEL) -/// Asserts that current IRQL is at PASSIVE_LEVEL -#define ASSERT_IRQL_PASSIVE() ASSERT_IRQL_IS(PASSIVE_LEVEL) -/// Asserts that current IRQL is at APC_LEVEL -#define ASSERT_IRQL_APC() ASSERT_IRQL_IS(APC_LEVEL) -/// Asserts that current IRQL is at DISPATCH_LEVEL -#define ASSERT_IRQL_DISPATCH() ASSERT_IRQL_IS(DISPATCH_LEVEL) -/// Asserts that current IRQL is at APC or DISPATCH_LEVEL -#define ASSERT_IRQL_APC_OR_DISPATCH() \ - ASSERT((KeGetCurrentIrql() == APC_LEVEL) || (KeGetCurrentIrql() == DISPATCH_LEVEL)) -/// Asserts that current IRQL is less or equal DISPATCH_LEVEL -#define ASSERT_IRQL_LOW_OR_DISPATCH() \ - ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL) - -///@} - -#if DBG -/** \brief Overrides DbgPrint to make sure that nothing gets printed - to debug output in release build. -*/ -ULONG __cdecl GoogleDbgPrint(char* format, ...); -#else -#define GoogleDbgPrint(Arg) NOTHING -#endif - -/// Invalid UCHAR value -#define INVALID_UCHAR (static_cast(0xFF)) - -/// Invalid ULONG value -#define INVALID_ULONG (static_cast(-1)) - -/** Enum AndroidUsbWdfObjectType enumerates types of KMDF objects that - we extend in our driver. -*/ -enum AndroidUsbWdfObjectType { - // We start enum with 1 insetead of 0 to protect orselves from a dangling - // or uninitialized context structures because KMDF will zero our extension - // when it gets created. - - /// Device object context - AndroidUsbWdfObjectTypeDevice = 1, - - /// File object context - AndroidUsbWdfObjectTypeFile, - - /// Request object context - AndroidUsbWdfObjectTypeRequest, - - /// Workitem object context - AndroidUsbWdfObjectTypeWorkitem, - - /// Illegal (maximum) context id - AndroidUsbWdfObjectTypeMax -}; - -/** Structure AndroidUsbWdfObjectContext represents our context that extends - every KMDF object (device, file, pipe, etc). -*/ -typedef struct TagAndroidUsbWdfObjectContext { - /// KMDF object type that is extended with this context - AndroidUsbWdfObjectType object_type; - - /// Instance of the class that extends KMDF object with this context - class AndroidUsbWdfObject* wdf_object_ext; -} AndroidUsbWdfObjectContext; - -// KMDF woodoo to register our extension and implement accessor method -WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(AndroidUsbWdfObjectContext, - GetAndroidUsbWdfObjectContext) - -/** Structure AndroidUsbWdfRequestContext represents our context that is - associated with every request recevied by the driver. -*/ -typedef struct TagAndroidUsbWdfRequestContext { - /// KMDF object type that is extended with this context - /// (must be AndroidUsbWdfObjectTypeRequest) - AndroidUsbWdfObjectType object_type; - - /// System time request has been first scheduled - // (time of the first WdfRequestSend is called for it) - LARGE_INTEGER sent_at; - - /// KMDF descriptor for the memory allocated for URB - WDFMEMORY urb_mem; - - /// MDL describing the transfer buffer - PMDL transfer_mdl; - - /// Private MDL that we build in order to perform the transfer - PMDL mdl; - - // Virtual address for the current segment of transfer. - void* virtual_address; - - /// Number of bytes remaining to transfer - ULONG length; - - /// Number of bytes requested to transfer - ULONG transfer_size; - - /// Accummulated number of bytes transferred - ULONG num_xfer; - - /// Initial timeout (in millisec) set for this request - ULONG initial_time_out; - - // Read / Write selector - bool is_read; - - // IOCTL selector - bool is_ioctl; -} AndroidUsbWdfRequestContext; - -// KMDF woodoo to register our extension and implement accessor method -WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(AndroidUsbWdfRequestContext, - GetAndroidUsbWdfRequestContext) - -/** Structure AndroidUsbWorkitemContext represents our context that is - associated with workitems created by our driver. -*/ -typedef struct TagAndroidUsbWorkitemContext { - /// KMDF object type that is extended with this context - /// (must be AndroidUsbWdfObjectTypeWorkitem) - AndroidUsbWdfObjectType object_type; - - /// Pipe file object extension that enqueued this work item - class AndroidUsbPipeFileObject* pipe_file_ext; -} AndroidUsbWorkitemContext; - -// KMDF woodoo to register our extension and implement accessor method -WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(AndroidUsbWorkitemContext, - GetAndroidUsbWorkitemContext) - -#endif // ANDROID_USB_DRIVER_DEFINES_H__ diff --git a/host/windows/usb/driver/android_usb_driver_object.cpp b/host/windows/usb/driver/android_usb_driver_object.cpp deleted file mode 100644 index d8be50f69..000000000 --- a/host/windows/usb/driver/android_usb_driver_object.cpp +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** \file - This file consists of implementation of class AndroidUsbDriverObject that - encapsulates our driver object -*/ -#pragma data_seg() -#pragma code_seg() - -#include "precomp.h" -#include "android_usb_device_object.h" -#include "android_usb_driver_object.h" - -#pragma data_seg() - -/** Globally accessible instance of the AndroidUsbDriverObject. - NT OS design allows us using of a global pointer to our driver object - instance since it can't be created or destroyed concurently and its value - is not going to change between creation and destruction. -*/ -AndroidUsbDriverObject* global_driver_object = NULL; - -#pragma code_seg("INIT") - -extern "C" { - -/// Main entry point to the driver -NTSTATUS DriverEntry(PDRIVER_OBJECT drv_object, PUNICODE_STRING reg_path) { - // Just pass it down inside the class - return AndroidUsbDriverObject::DriverEntry(drv_object, reg_path); -} - -} // extern "C" - -NTSTATUS AndroidUsbDriverObject::DriverEntry(PDRIVER_OBJECT drv_object, - PUNICODE_STRING reg_path) { - ASSERT_IRQL_PASSIVE(); - ASSERT(NULL != drv_object); - ASSERT((NULL != reg_path) && - (NULL != reg_path->Buffer) && - (0 != reg_path->Length)); - - // Instantiate driver object - global_driver_object = new(NonPagedPool, GANDR_POOL_TAG_DRIVER_OBJECT) - AndroidUsbDriverObject(drv_object, reg_path); - ASSERT(NULL != global_driver_object); - if (NULL == global_driver_object) - return STATUS_INSUFFICIENT_RESOURCES; - - // Initialize driver object - NTSTATUS status = global_driver_object->OnDriverEntry(drv_object, reg_path); - - if (!NT_SUCCESS(status)) { - // Something went wrong. Delete our driver object and get out of here. - delete global_driver_object; - } - - return status; -} - -AndroidUsbDriverObject::AndroidUsbDriverObject(PDRIVER_OBJECT drv_object, - PUNICODE_STRING reg_path) - : driver_object_(drv_object), - wdf_driver_(NULL) { - ASSERT_IRQL_PASSIVE(); - ASSERT(NULL != driver_object()); -} - -NTSTATUS AndroidUsbDriverObject::OnDriverEntry(PDRIVER_OBJECT drv_object, - PUNICODE_STRING reg_path) { - ASSERT_IRQL_PASSIVE(); - ASSERT(driver_object() == drv_object); - - // Initiialize driver config, specifying our unload callback and default - // pool tag for memory allocations that KMDF does on our behalf. - WDF_DRIVER_CONFIG config; - WDF_DRIVER_CONFIG_INIT(&config, EvtDeviceAddEntry); - config.EvtDriverUnload = EvtDriverUnloadEntry; - config.DriverPoolTag = GANDR_POOL_TAG_DEFAULT; - - // Create a framework driver object to represent our driver. - NTSTATUS status = WdfDriverCreate(drv_object, - reg_path, - WDF_NO_OBJECT_ATTRIBUTES, - &config, - &wdf_driver_); - ASSERT(NT_SUCCESS(status)); - if (!NT_SUCCESS(status)) - return status; - - GoogleDbgPrint("\n>>>>>>>>>> Android USB driver has started >>>>>>>>>>"); - - return STATUS_SUCCESS; -} - -#pragma code_seg("PAGE") - -AndroidUsbDriverObject::~AndroidUsbDriverObject() { - ASSERT_IRQL_PASSIVE(); -} - -NTSTATUS AndroidUsbDriverObject::OnAddDevice(PWDFDEVICE_INIT device_init) { - ASSERT_IRQL_PASSIVE(); - GoogleDbgPrint("\n++++++++++ AndroidUsbDriverObject::OnAddDevice ++++++++++"); - // Instantiate our device object extension for this device - AndroidUsbDeviceObject* wdf_device_ext = - new(NonPagedPool, GANDR_POOL_TAG_KMDF_DEVICE) AndroidUsbDeviceObject(); - ASSERT(NULL != wdf_device_ext); - if (NULL == wdf_device_ext) - return STATUS_INSUFFICIENT_RESOURCES; - - // Create and initialize FDO device - NTSTATUS status = wdf_device_ext->CreateFDODevice(device_init); - ASSERT(NT_SUCCESS(status)); - if (!NT_SUCCESS(status)) - delete wdf_device_ext; - - return status; -} - -void AndroidUsbDriverObject::OnDriverUnload() { - ASSERT_IRQL_PASSIVE(); - GoogleDbgPrint("\n<<<<<<<<<< Android USB driver is unloaded <<<<<<<<<<"); -} - -NTSTATUS AndroidUsbDriverObject::EvtDeviceAddEntry( - WDFDRIVER wdf_drv, - PWDFDEVICE_INIT device_init) { - ASSERT_IRQL_PASSIVE(); - ASSERT((NULL != global_driver_object) && (global_driver_object->wdf_driver() == wdf_drv)); - - // Pass it down to our driver object - if ((NULL == global_driver_object) || - (global_driver_object->wdf_driver() != wdf_drv)) { - return STATUS_INTERNAL_ERROR; - } - - return global_driver_object->OnAddDevice(device_init); -} - -VOID AndroidUsbDriverObject::EvtDriverUnloadEntry(WDFDRIVER wdf_drv) { - ASSERT_IRQL_PASSIVE(); - ASSERT((NULL != global_driver_object) && - (global_driver_object->wdf_driver() == wdf_drv)); - - // Pass it down to our driver object - if ((NULL != global_driver_object) && - (global_driver_object->wdf_driver() == wdf_drv)) { - global_driver_object->OnDriverUnload(); - // Now we can (and have to) delete our driver object - delete global_driver_object; - } -} - -#if DBG - -#pragma code_seg() - -ULONG __cdecl GoogleDbgPrint(char* format, ...) { - va_list arg_list; - va_start(arg_list, format); - ULONG ret = - vDbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, format, arg_list); - va_end(arg_list); - - return ret; -} - -#endif // DBG - -#pragma data_seg() -#pragma code_seg() diff --git a/host/windows/usb/driver/android_usb_driver_object.h b/host/windows/usb/driver/android_usb_driver_object.h deleted file mode 100644 index 8f68a80d0..000000000 --- a/host/windows/usb/driver/android_usb_driver_object.h +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_USB_DRIVER_OBJECT_H__ -#define ANDROID_USB_DRIVER_OBJECT_H__ -/** \file - This file consists of declaration of class AndroidUsbDriverObject that - encapsulates our driver object. -*/ - -/// Globally accessible pointer to the driver object -extern class AndroidUsbDriverObject* global_driver_object; - -/** AndroidUsbDriverObject class encapsulates driver object and provides - overall initialization / cleanup as well as management of globally used - resources. We use KMDF framework for this driver because it takes care of - most of the USB related "things" (like PnP, power management and other - stuff) so we can concentrate more on real functionality. This driver is - based on KMDF's usbsamp driver sample available at DDK's src\kmdf\usbsamp - directory. Instance of this class (always one) must be allocated from - NonPagedPool. -*/ -class AndroidUsbDriverObject { - - public: - /** \brief Driver initialization entry point. - - This method is a "gate" to our driver class from main DriverEntry routine. - Since this method is called from within DriverEntry only it is placed in - "INIT" code segment. - This method is called at IRQL PASSIVE_LEVEL. - @param drv_object[in] Driver object passed to DriverEntry routine - @param reg_path[in] Path to the driver's Registry passed to DriverEntry - routine - @returns STATUS_SUCCESS on success or an appropriate error code. - */ - static NTSTATUS DriverEntry(PDRIVER_OBJECT drv_object, - PUNICODE_STRING reg_path); - - private: - /** \brief Constructs driver object. - - Constructor for driver class must be as light as possible. All - initialization that may fail must be deferred to OnDriverEntry method. - Since this method is called from within DriverEntry only it is placed in - "INIT" code segment. - This method is called at IRQL PASSIVE_LEVEL. - @param drv_object[in] Driver object passed to DriverEntry routine - @param reg_path[in] Path to the driver's Registry passed to DriverEntry - routine - */ - AndroidUsbDriverObject(PDRIVER_OBJECT drv_object, PUNICODE_STRING reg_path); - - /** \brief Destructs driver object. - - Destructor for driver class must be as light as possible. All - uninitialization must be done in OnDriverUnload method. - This method must be called at PASSIVE IRQL. - */ - ~AndroidUsbDriverObject(); - - /** \brief Initializes instance of the driver object. - - This method is called immediatelly after driver object has been - instantiated to perform actual initialization of the driver. Since this - method is called from within DriverEntry only it is placed in - "INIT" code segment. - This method is called at IRQL PASSIVE_LEVEL. - @param drv_object[in] Driver object passed to DriverEntry routine - @param reg_path[in] Path to the driver's Registry passed to DriverEntry - routine - @returns STATUS_SUCCESS on success or an appropriate error code. - */ - NTSTATUS OnDriverEntry(PDRIVER_OBJECT drv_object, PUNICODE_STRING reg_path); - - /** \brief Actual handler for KMDF's AddDevice event - - This method is called by the framework in response to AddDevice call from - the PnP manager. We create and initialize a device object to represent a - new instance of the device. - This method is called at IRQL PASSIVE_LEVEL. - @param device_init[in] A pointer to a framework-allocated WDFDEVICE_INIT - structure. - @return If the routine succeeds, it returns STATUS_SUCCESS. Otherwise, - it returns one of the error status values defined in ntstatus.h. - */ - NTSTATUS OnAddDevice(PWDFDEVICE_INIT device_init); - - /** \brief Actual driver unload event handler. - - This method is called when driver is being unloaded. - This method is called at IRQL PASSIVE_LEVEL. - */ - void OnDriverUnload(); - - /** \brief KMDF's DeviceAdd event entry point - - This callback is called by the framework in response to AddDevice call from - the PnP manager. We create and initialize a device object to represent a - new instance of the device. All the software resources should be allocated - in this callback. - This method is called at IRQL PASSIVE_LEVEL. - @param wdf_drv[in] WDF driver handle. - @param device_init[in] A pointer to a framework-allocated WDFDEVICE_INIT - structure. - @return If the routine succeeds, it returns STATUS_SUCCESS. Otherwise, - it returns one of the error status values defined in ntstatus.h. - */ - static NTSTATUS EvtDeviceAddEntry(WDFDRIVER wdf_drv, - PWDFDEVICE_INIT device_init); - - /** \brief Driver unload event entry point. - - Framework calls this callback when driver is being unloaded. - This method is called at IRQL PASSIVE_LEVEL. - */ - static VOID EvtDriverUnloadEntry(WDFDRIVER wdf_drv); - - public: - - /// Gets this driver's DRIVER_OBJECT - __forceinline PDRIVER_OBJECT driver_object() const { - return driver_object_; - } - - /// Gets KMDF driver handle - __forceinline WDFDRIVER wdf_driver() const { - return wdf_driver_; - } - - private: - /// This driver's driver object - PDRIVER_OBJECT driver_object_; - - /// KMDF driver handle - WDFDRIVER wdf_driver_; -}; - -#endif // ANDROID_USB_DRIVER_OBJECT_H__ diff --git a/host/windows/usb/driver/android_usb_file_object.cpp b/host/windows/usb/driver/android_usb_file_object.cpp deleted file mode 100644 index e5ce0a26b..000000000 --- a/host/windows/usb/driver/android_usb_file_object.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** \file - This file consists of implementation of class AndroidUsbFileObject that - encapsulates a common extension for all KMDF file object types. -*/ -#pragma data_seg() -#pragma code_seg() - -#include "precomp.h" -#include "android_usb_file_object.h" - -#pragma data_seg() -#pragma code_seg("PAGE") - -AndroidUsbFileObject::AndroidUsbFileObject(AndroidUsbFileObjectType fo_type, - AndroidUsbDeviceObject* dev_obj, - WDFFILEOBJECT wdf_fo) - : AndroidUsbWdfObject(AndroidUsbWdfObjectTypeFile), - file_type_(fo_type), - device_object_(dev_obj) { - ASSERT_IRQL_PASSIVE(); - ASSERT(NULL != dev_obj); - ASSERT(fo_type < AndroidUsbFileObjectTypeMax); - ASSERT(NULL != wdf_fo); - set_wdf_object(wdf_fo); -} - -#pragma code_seg() - -AndroidUsbFileObject::~AndroidUsbFileObject() { - ASSERT_IRQL_LOW_OR_DISPATCH(); -} - -#pragma code_seg("PAGE") - -NTSTATUS AndroidUsbFileObject::Initialize() { - ASSERT_IRQL_LOW(); - ASSERT(NULL != wdf_file()); - if (NULL == wdf_file()) - return STATUS_INTERNAL_ERROR; - - // Register context for this file object - return InitializeContext(); -} - -#pragma code_seg() - -void AndroidUsbFileObject::OnEvtIoRead(WDFREQUEST request, - size_t length) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - ASSERT(WdfRequestGetFileObject(request) == wdf_file()); - // Complete zero reads with success - if (0 == length) { - WdfRequestCompleteWithInformation(request, STATUS_SUCCESS, 0); - return; - } - - WdfRequestComplete(request, STATUS_INVALID_DEVICE_REQUEST); -} - -void AndroidUsbFileObject::OnEvtIoWrite(WDFREQUEST request, - size_t length) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - ASSERT(WdfRequestGetFileObject(request) == wdf_file()); - // Complete zero writes with success - if (0 == length) { - WdfRequestCompleteWithInformation(request, STATUS_SUCCESS, 0); - return; - } - - WdfRequestComplete(request, STATUS_INVALID_DEVICE_REQUEST); -} - -void AndroidUsbFileObject::OnEvtIoDeviceControl(WDFREQUEST request, - size_t output_buf_len, - size_t input_buf_len, - ULONG ioctl_code) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - ASSERT(WdfRequestGetFileObject(request) == wdf_file()); - - WdfRequestComplete(request, STATUS_INVALID_DEVICE_REQUEST); -} - -#pragma data_seg() -#pragma code_seg() diff --git a/host/windows/usb/driver/android_usb_file_object.h b/host/windows/usb/driver/android_usb_file_object.h deleted file mode 100644 index 1dbb92b7b..000000000 --- a/host/windows/usb/driver/android_usb_file_object.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_USB_FILE_OBJECT_H__ -#define ANDROID_USB_FILE_OBJECT_H__ -/** \file - This file consists of declaration of class AndroidUsbFileObject that - encapsulates a common extension for all KMDF file object types. -*/ - -#include "android_usb_wdf_object.h" -#include "android_usb_device_object.h" - -/** Enumerator AndroidUsbFileObjectType defines possible types for our file - object extension. -*/ -enum AndroidUsbFileObjectType { - /// File extends device FO - AndroidUsbFileObjectTypeDevice, - - // File extends a pipe FO - AndroidUsbFileObjectTypePipe, - - AndroidUsbFileObjectTypeMax, -}; - -/** AndroidUsbFileObject class encapsulates a common extension for all KMDF - file object types. Instances of this class must be allocated from - NonPagedPool. -*/ -class AndroidUsbFileObject : public AndroidUsbWdfObject { - public: - /** \brief Constructs the object. - - This method must be called at low IRQL. - @param fo_type[in] Type of the file object that this object extends - @param dev_obj[in] Our device object for which this file has been created - @param wdf_fo[in] KMDF file object for this extension - */ - AndroidUsbFileObject(AndroidUsbFileObjectType fo_type, - AndroidUsbDeviceObject* dev_obj, - WDFFILEOBJECT wdf_fo); - - /** \brief Destructs the object. - - This method can be called at any IRQL. - */ - virtual ~AndroidUsbFileObject(); - - /** \brief Initializes the object - - This method verifies that instance has been created and calls base class's - InitializeContext method to register itself with the wrapped FO. All - derived classes must call this method when initializing. - This method must be called at low IRQL. - @return STATUS_SUCCESS on success or an appropriate error code - */ - virtual NTSTATUS Initialize(); - - /** \brief Read event handler - - This method is called when a read request comes to the file object this - class extends. - This method can be called IRQL <= DISPATCH_LEVEL. - @param request[in] A handle to a framework request object. - @param length[in] The number of bytes to be read. - @return Successful status or an appropriate error code - */ - virtual void OnEvtIoRead(WDFREQUEST request, size_t length); - - /** \brief Write event handler - - This method is called when a write request comes to the file object this - class extends. - This callback can be called IRQL <= DISPATCH_LEVEL. - @param request[in] A handle to a framework request object. - @param length[in] The number of bytes to be written. - @return Successful status or an appropriate error code - */ - virtual void OnEvtIoWrite(WDFREQUEST request, size_t length); - - /** \brief IOCTL event handler - - This method is called when a device control request comes to the file - object this class extends. - This callback can be called IRQL <= DISPATCH_LEVEL. - @param request[in] A handle to a framework request object. - @param output_buf_len[in] The length, in bytes, of the request's output - buffer, if an output buffer is available. - @param input_buf_len[in] The length, in bytes, of the request's input - buffer, if an input buffer is available. - @param ioctl_code[in] The driver-defined or system-defined I/O control code - that is associated with the request. - @return Successful status or an appropriate error code - */ - virtual void OnEvtIoDeviceControl(WDFREQUEST request, - size_t output_buf_len, - size_t input_buf_len, - ULONG ioctl_code); - - public: - /// Gets KMDF file handle for this extension - __forceinline WDFFILEOBJECT wdf_file() const { - return reinterpret_cast(wdf_object()); - } - - /// Gets device object that owns this file - __forceinline AndroidUsbDeviceObject* device_object() const { - return device_object_; - } - - /// Gets type of the file object that this extension wraps - __forceinline AndroidUsbFileObjectType file_type() const { - return file_type_; - } - - /// Gets WDF device handle for device that owns this file - __forceinline WDFDEVICE wdf_device() const { - ASSERT(NULL != device_object()); - return (NULL != device_object()) ? device_object()->wdf_device() : - NULL; - } - - /// Gets target (PDO) device handle for the device that owns this file - __forceinline WDFUSBDEVICE wdf_target_device() const { - ASSERT(NULL != device_object()); - return (NULL != device_object()) ? device_object()->wdf_target_device() : - NULL; - } - - protected: - /// Device object that owns this file - AndroidUsbDeviceObject* device_object_; - - /// Type of the file object that this extension wraps - AndroidUsbFileObjectType file_type_; -}; - -/** \brief Gets file KMDF object extension for the given KMDF file object - - This method can be called at any IRQL - @param wdf_fo[in] KMDF file handle describing file object - @return Instance of AndroidUsbFileObject associated with this object or NULL - if association is not found. -*/ -__forceinline AndroidUsbFileObject* GetAndroidUsbFileObjectFromHandle( - WDFFILEOBJECT wdf_fo) { - AndroidUsbWdfObject* wdf_object_ext = - GetAndroidUsbWdfObjectFromHandle(wdf_fo); - ASSERT(NULL != wdf_object_ext); - if (NULL != wdf_object_ext) { - ASSERT(wdf_object_ext->Is(AndroidUsbWdfObjectTypeFile)); - if (wdf_object_ext->Is(AndroidUsbWdfObjectTypeFile)) - return reinterpret_cast(wdf_object_ext); - } - return NULL; -} - -/** \brief Gets file KMDF file object extension for the given request - - This method can be called at any IRQL - @param request[in] KMDF request object - @return Instance of AndroidUsbFileObject associated with this request or NULL - if association is not found. -*/ -__forceinline AndroidUsbFileObject* GetAndroidUsbFileObjectForRequest( - WDFREQUEST request) { - return GetAndroidUsbFileObjectFromHandle(WdfRequestGetFileObject(request)); -} - -#endif // ANDROID_USB_FILE_OBJECT_H__ diff --git a/host/windows/usb/driver/android_usb_inl.h b/host/windows/usb/driver/android_usb_inl.h deleted file mode 100644 index 8d697cf1f..000000000 --- a/host/windows/usb/driver/android_usb_inl.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_USB_INL_H__ -#define ANDROID_USB_INL_H__ -/** \file - This file consists of inline routines for the driver. -*/ - -/// Gets control code out of the entire IOCTL code packet -__forceinline ULONG GetCtlCode(ULONG ioctl_code) { - return (ioctl_code >> 2) & 0x0FFF; -} - -/** \brief - Converts string length from number of wide characters into number of bytes. -*/ -__forceinline USHORT ByteLen(USHORT wchar_len) { - return static_cast(wchar_len * sizeof(WCHAR)); -} - -/** \brief Gets byte length of a zero-terminated string not including - zero terminator. Must be called at low IRQL. -*/ -__forceinline USHORT ByteLen(const WCHAR* str) { - ASSERT_IRQL_LOW(); - return (NULL != str) ? ByteLen(static_cast(wcslen(str))) : 0; -} - -/** \brief - Converts string length from number of bytes into number of wide characters. - Can be called at any IRQL. -*/ -__forceinline USHORT WcharLen(USHORT byte_len) { - return byte_len / sizeof(WCHAR); -} - -/** \brief Retrieves pointer out of the WDFMEMORY handle -*/ -__forceinline void* GetAddress(WDFMEMORY wdf_mem) { - ASSERT(NULL != wdf_mem); - return (NULL != wdf_mem) ? WdfMemoryGetBuffer(wdf_mem, NULL) : NULL; -} - -/** \brief Retrieves output memory address for WDFREQUEST - - @param request[in] A handle to KMDF request object - @param status[out] Receives status of the call. Can be NULL. -*/ -__forceinline void* OutAddress(WDFREQUEST request, NTSTATUS* status) { - ASSERT(NULL != request); - WDFMEMORY wdf_mem = NULL; - NTSTATUS stat = WdfRequestRetrieveOutputMemory(request, &wdf_mem); - ASSERT((NULL != wdf_mem) || (!NT_SUCCESS(stat))); - if (NULL != status) - *status = stat; - return NT_SUCCESS(stat) ? GetAddress(wdf_mem) : NULL; -} - -/** \brief Retrieves input memory address for WDFREQUEST - - @param request[in] A handle to KMDF request object - @param status[out] Receives status of the call. Can be NULL. -*/ -__forceinline void* InAddress(WDFREQUEST request, NTSTATUS* status) { - ASSERT(NULL != request); - WDFMEMORY wdf_mem = NULL; - NTSTATUS stat = WdfRequestRetrieveInputMemory(request, &wdf_mem); - ASSERT((NULL != wdf_mem) || (!NT_SUCCESS(stat))); - if (NULL != status) - *status = stat; - return NT_SUCCESS(stat) ? GetAddress(wdf_mem) : NULL; -} - -#endif // ANDROID_USB_INL_H__ diff --git a/host/windows/usb/driver/android_usb_interrupt_file_object.cpp b/host/windows/usb/driver/android_usb_interrupt_file_object.cpp deleted file mode 100644 index d6303bbee..000000000 --- a/host/windows/usb/driver/android_usb_interrupt_file_object.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** \file - This file consists of implementation of class AndroidUsbInterruptPipeFileObject - that encapsulates extension to an interrupt pipe file objects. -*/ -#pragma data_seg() -#pragma code_seg() - -#include "precomp.h" -#include "android_usb_interrupt_file_object.h" - -#pragma data_seg() -#pragma code_seg("PAGE") - -AndroidUsbInterruptPipeFileObject::AndroidUsbInterruptPipeFileObject( - AndroidUsbDeviceObject* dev_obj, - WDFFILEOBJECT wdf_fo, - WDFUSBPIPE wdf_pipe_obj) - : AndroidUsbPipeFileObject(dev_obj, wdf_fo, wdf_pipe_obj) { - ASSERT_IRQL_PASSIVE(); - -#if DBG - WDF_USB_PIPE_INFORMATION pipe_info; - WDF_USB_PIPE_INFORMATION_INIT(&pipe_info); - WdfUsbTargetPipeGetInformation(wdf_pipe_obj, &pipe_info); - ASSERT(WdfUsbPipeTypeInterrupt == pipe_info.PipeType); -#endif // DBG - -} - -#pragma code_seg() - -AndroidUsbInterruptPipeFileObject::~AndroidUsbInterruptPipeFileObject() { - ASSERT_IRQL_LOW_OR_DISPATCH(); -} - -#pragma data_seg() -#pragma code_seg() diff --git a/host/windows/usb/driver/android_usb_interrupt_file_object.h b/host/windows/usb/driver/android_usb_interrupt_file_object.h deleted file mode 100644 index 5bf097beb..000000000 --- a/host/windows/usb/driver/android_usb_interrupt_file_object.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_USB_INTERRUPT_PIPE_FILE_OBJECT_H__ -#define ANDROID_USB_INTERRUPT_PIPE_FILE_OBJECT_H__ -/** \file - This file consists of declaration of class AndroidUsbInterruptPipeFileObject - that encapsulates extension to an interrupt pipe file objects. -*/ - -#include "android_usb_pipe_file_object.h" - -/** AndroidUsbInterruptPipeFileObject class encapsulates extension for a KMDF - file object that represent opened interrupt pipe. Instances of this class - must be allocated from NonPagedPool. -*/ -class AndroidUsbInterruptPipeFileObject : public AndroidUsbPipeFileObject { - public: - /** \brief Constructs the object. - - This method must be called at low IRQL. - @param dev_obj[in] Our device object for which this file has been created - @param wdf_fo[in] KMDF file object this extension wraps - @param wdf_pipe_obj[in] KMDF pipe for this file - */ - AndroidUsbInterruptPipeFileObject(AndroidUsbDeviceObject* dev_obj, - WDFFILEOBJECT wdf_fo, - WDFUSBPIPE wdf_pipe_obj); - - /** \brief Destructs the object. - - This method can be called at any IRQL. - */ - virtual ~AndroidUsbInterruptPipeFileObject(); -}; - -#endif // ANDROID_USB_INTERRUPT_PIPE_FILE_OBJECT_H__ diff --git a/host/windows/usb/driver/android_usb_new_delete.h b/host/windows/usb/driver/android_usb_new_delete.h deleted file mode 100644 index dc4634df2..000000000 --- a/host/windows/usb/driver/android_usb_new_delete.h +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_USB_NEW_DELETE_H__ -#define ANDROID_USB_NEW_DELETE_H__ -/** \file - This file consists implementations of our 'new' and 'delete' operators -*/ - -#include "android_usb_pool_tags.h" - -/** \brief Checks if given pool type is one of NonPaged pool kinds. - - All numeric values for all NonPaged pool types are even numbers while all - numeric values for all PagedPool types are odd numbers (see definition of - POOL_TYPE enum). So this routine utilizes this to see whether given pool - type is one of NonPaged pool kinds. This routine can be called at any IRQL. - @param pool_type[in] Pool type - @return True if pool type is one of NonPaged pool types, false otherwise -*/ -__forceinline bool IsPoolNonPaged(POOL_TYPE pool_type) { - return (0 == (pool_type & 0x1)); -} - -/** @name Operators new and delete - - In Kernel Mode development each memory allocation must specify type of the - pool from which memory should be allocated, usualy PagedPool or NonPagedPool. - Because of that "traditional" operator 'new' that takes only one parameter - (memory size) is not good so we modify that operator by adding two more - parameters: pool type and memory tag (last one is optional but highly - encouraged). To prevent from mistakes, traditional operator 'new' is also - defined. It will allocate requested number of bytes from NonPagedPool with - default memory tag but it will always assert on checked (debug) builds. - Since there is no infrastructure for C++ exceptions in Kernel Mode we are - not using them to report memory allocation error. So, on failure operators - 'new' are returning NULL instead of throwing an exception. -*/ -///@{ - -/** \brief Main operator new - - This is the main operator new that allocates specified number of bytes from - the specified pool and assigns a custom tag to the allocated memory. - Inherits IRQL restrictions for ExAllocatePoolWithTag (see the DDK doc). - @param size[in] Number of bytes to allocate. - @param pool_type[in] Type of the pool to allocate from. - @param pool_tag[in] A tag to attach to the allocated memory. Since utilities - that display tags use their ASCII representations it's advisable to - use tag values that are ASCII symbols, f.i. 'ATag'. Note that due to - inversion of bytes in stored ULONG value, to read 'ATag' in the tag - displaying utility, the actual value passed to operator 'new' must be - 'gaTA' - @return Pointer to allocated memory on success, NULL on error. -*/ -__forceinline void* __cdecl operator new(size_t size, - POOL_TYPE pool_type, - ULONG pool_tag) { - ASSERT((pool_type < MaxPoolType) && (0 != size)); - // Enforce IRQL restriction check. - ASSERT(IsPoolNonPaged(pool_type) || (KeGetCurrentIrql() < DISPATCH_LEVEL)); - return size ? ExAllocatePoolWithTag(pool_type, - static_cast(size), - pool_tag) : - NULL; -} - -/** \brief - Short operator new that attaches a default tag to the allocated memory. - - This version of operator new allocates specified number of bytes from the - specified pool and assigns a default tag (GANDR_POOL_TAG_DEFAULT) to the - allocated memory. Inherits IRQL restrictions for ExAllocatePoolWithTag. - @param size[in] Number of bytes to allocate. - @param pool_type[in] Type of the pool to allocate from. - @return Pointer to allocated memory on success, NULL on error. -*/ -__forceinline void* __cdecl operator new(size_t size, POOL_TYPE pool_type) { - ASSERT((pool_type < MaxPoolType) && (0 != size)); - // Enforce IRQL restriction check. - ASSERT(IsPoolNonPaged(pool_type) || (KeGetCurrentIrql() < DISPATCH_LEVEL)); - return size ? ExAllocatePoolWithTag(pool_type, - static_cast(size), - GANDR_POOL_TAG_DEFAULT) : - NULL; -} - -/** \brief Traditional operator new that should never be used. - - Using of this version of operator 'new' is prohibited in Kernel Mode - development. For the sake of safety it is implemented though to allocate - requested number of bytes from the NonPagedPool and attach default tag - to the allocated memory. It will assert on checked (debug) builds. - Inherits IRQL restrictions for ExAllocatePoolWithTag. - @param size[in] Number of bytes to allocate. - @return Pointer to memory allocated from NonPagedPool on success or NULL on - error. -*/ -__forceinline void* __cdecl operator new(size_t size) { - ASSERTMSG("\n!!! Using of operator new(size_t size) is detected!\n" - "This is illegal in our driver C++ development environment to use " - "this version of operator 'new'. Please switch to\n" - "new(size_t size, POOL_TYPE pool_type) or " - "new(size_t size, POOL_TYPE pool_type, ULONG pool_tag) ASAP!!!\n", - false); - ASSERT(0 != size); - return size ? ExAllocatePoolWithTag(NonPagedPool, - static_cast(size), - GANDR_POOL_TAG_DEFAULT) : - NULL; -} - -/** \brief Operator delete. - - Frees memory allocated by 'new' operator. - @param pointer[in] Memory to free. If this parameter is NULL operator does - nothing but asserts on checked build. Inherits IRQL restrictions - for ExFreePool. -*/ -__forceinline void __cdecl operator delete(void* pointer) { - ASSERT(NULL != pointer); - if (NULL != pointer) - ExFreePool(pointer); -} - -/** \brief Operator delete for arrays. - - Frees memory allocated by 'new' operator. - @param pointer[in] Memory to free. If this parameter is NULL operator does - nothing but asserts on checked build. Inherits IRQL restrictions - for ExFreePool. -*/ -__forceinline void __cdecl operator delete[](void* pointer) { - ASSERT(NULL != pointer); - if (NULL != pointer) - ExFreePool(pointer); -} - -///@} - -#endif // ANDROID_USB_NEW_DELETE_H__ diff --git a/host/windows/usb/driver/android_usb_pipe_file_object.cpp b/host/windows/usb/driver/android_usb_pipe_file_object.cpp deleted file mode 100644 index 384668348..000000000 --- a/host/windows/usb/driver/android_usb_pipe_file_object.cpp +++ /dev/null @@ -1,738 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** \file - This file consists of implementation of class AndroidUsbPipeFileObject that - encapsulates a common extension for pipe file objects. -*/ -#pragma data_seg() -#pragma code_seg() - -#include "precomp.h" -#include "android_usb_pipe_file_object.h" - -#pragma data_seg() -#pragma code_seg("PAGE") - -AndroidUsbPipeFileObject::AndroidUsbPipeFileObject( - AndroidUsbDeviceObject* dev_obj, - WDFFILEOBJECT wdf_fo, - WDFUSBPIPE wdf_pipe_obj) - : AndroidUsbFileObject(AndroidUsbFileObjectTypePipe, dev_obj, wdf_fo), - wdf_pipe_(wdf_pipe_obj) { - ASSERT_IRQL_PASSIVE(); - ASSERT(NULL != wdf_pipe_obj); -} - -#pragma code_seg() - -AndroidUsbPipeFileObject::~AndroidUsbPipeFileObject() { - ASSERT_IRQL_LOW_OR_DISPATCH(); -} - -#pragma code_seg("PAGE") - -NTSTATUS AndroidUsbPipeFileObject::InitializePipe( - const WDF_USB_PIPE_INFORMATION* pipe_info) { - ASSERT_IRQL_LOW(); - ASSERT(IsPipeAttached()); - if (!IsPipeAttached()) - return STATUS_INTERNAL_ERROR; - - // Initialize base class - NTSTATUS status = AndroidUsbFileObject::Initialize(); - ASSERT(NT_SUCCESS(status)); - if (!NT_SUCCESS(status)) - return status; - - // Save pipe information - pipe_information_ = *pipe_info; - - // We will provide size check ourselves (less surprizes always better) - WdfUsbTargetPipeSetNoMaximumPacketSizeCheck(wdf_pipe()); - - GoogleDbgPrint("\n===== File %p for %s pipe. max_transfer_size = %X, max_packet_size = %X", - this, is_input_pipe() ? "read" : "write", - max_transfer_size(), max_packet_size()); - return STATUS_SUCCESS; -} - -#pragma code_seg() - -void AndroidUsbPipeFileObject::OnEvtIoRead(WDFREQUEST request, - size_t length) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - - // Make sure that this is an input pipe - if (is_output_pipe()) { - GoogleDbgPrint("\n!!!! Attempt to read from output pipe %p", this); - WdfRequestComplete(request, STATUS_ACCESS_DENIED); - return; - } - - // Make sure zero length I/O doesn't go through - if (0 == length) { - WdfRequestCompleteWithInformation(request, STATUS_SUCCESS, 0); - return; - } - - // Get MDL for this request. - PMDL request_mdl = NULL; - NTSTATUS status = WdfRequestRetrieveOutputWdmMdl(request, &request_mdl); - ASSERT(NT_SUCCESS(status) && (NULL != request_mdl)); - if (NT_SUCCESS(status)) { - CommonBulkReadWrite(request, - request_mdl, - static_cast(length), - true, - 0, - false); - } else { - WdfRequestComplete(request, status); - } -} - -void AndroidUsbPipeFileObject::OnEvtIoWrite(WDFREQUEST request, - size_t length) { - - // Make sure that this is an output pipe - if (is_input_pipe()) { - GoogleDbgPrint("\n!!!! Attempt to write to input pipe %p", this); - WdfRequestComplete(request, STATUS_ACCESS_DENIED); - return; - } - - // Make sure zero length I/O doesn't go through - if (0 == length) { - WdfRequestCompleteWithInformation(request, STATUS_SUCCESS, 0); - return; - } - - // Get MDL for this request. - PMDL request_mdl = NULL; - NTSTATUS status = WdfRequestRetrieveInputWdmMdl(request, &request_mdl); - ASSERT(NT_SUCCESS(status) && (NULL != request_mdl)); - if (NT_SUCCESS(status)) { - CommonBulkReadWrite(request, - request_mdl, - static_cast(length), - false, - 0, - false); - } else { - WdfRequestComplete(request, status); - } -} - -void AndroidUsbPipeFileObject::OnEvtIoDeviceControl(WDFREQUEST request, - size_t output_buf_len, - size_t input_buf_len, - ULONG ioctl_code) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - - switch (ioctl_code) { - case ADB_IOCTL_GET_ENDPOINT_INFORMATION: - OnCtlGetEndpointInformation(request, output_buf_len); - break; - - case ADB_IOCTL_BULK_READ: - OnCtlBulkRead(request, output_buf_len, input_buf_len); - break; - - case ADB_IOCTL_BULK_WRITE: - OnCtlBulkWrite(request, output_buf_len, input_buf_len); - break; - - default: - AndroidUsbFileObject::OnEvtIoDeviceControl(request, - output_buf_len, - input_buf_len, - ioctl_code); - break; - } -} - -void AndroidUsbPipeFileObject::OnCtlGetEndpointInformation( - WDFREQUEST request, - size_t output_buf_len) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - - // Verify output buffer - if (output_buf_len < sizeof(AdbEndpointInformation)) { - WdfRequestCompleteWithInformation(request, - STATUS_BUFFER_TOO_SMALL, - sizeof(AdbEndpointInformation)); - return; - } - - // Get the output buffer - NTSTATUS status; - AdbEndpointInformation* ret_info = - reinterpret_cast(OutAddress(request, &status)); - ASSERT(NT_SUCCESS(status) && (NULL != ret_info)); - if (!NT_SUCCESS(status)) { - WdfRequestComplete(request, status); - return; - } - - // Copy endpoint info to the output - ret_info->max_packet_size = pipe_information_.MaximumPacketSize; - ret_info->endpoint_address = pipe_information_.EndpointAddress; - ret_info->polling_interval = pipe_information_.Interval; - ret_info->setting_index = pipe_information_.SettingIndex; - ret_info->endpoint_type = - static_cast(pipe_information_.PipeType); - ret_info->max_transfer_size = pipe_information_.MaximumTransferSize; - - WdfRequestCompleteWithInformation(request, - STATUS_SUCCESS, - sizeof(AdbEndpointInformation)); -} - -void AndroidUsbPipeFileObject::OnCtlBulkRead(WDFREQUEST request, - size_t output_buf_len, - size_t input_buf_len) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - - // Make sure that this is an input pipe - if (is_output_pipe()) { - GoogleDbgPrint("\n!!!! Attempt to IOCTL read from output pipe %p", this); - WdfRequestComplete(request, STATUS_ACCESS_DENIED); - return; - } - - // Make sure zero length I/O doesn't go through - if (0 == output_buf_len) { - WdfRequestCompleteWithInformation(request, STATUS_SUCCESS, 0); - return; - } - - // Verify buffers - ASSERT(input_buf_len >= sizeof(AdbBulkTransfer)); - if (input_buf_len < sizeof(AdbBulkTransfer)) { - WdfRequestComplete(request, STATUS_INVALID_BUFFER_SIZE); - return; - } - - // Get the input buffer - NTSTATUS status; - AdbBulkTransfer* transfer_param = - reinterpret_cast(InAddress(request, &status)); - ASSERT(NT_SUCCESS(status) && (NULL != transfer_param)); - if (!NT_SUCCESS(status)) { - WdfRequestComplete(request, status); - return; - } - - // Get MDL for this request. - PMDL request_mdl = NULL; - status = WdfRequestRetrieveOutputWdmMdl(request, &request_mdl); - ASSERT(NT_SUCCESS(status) && (NULL != request_mdl)); - if (NT_SUCCESS(status)) { - // Perform the read - CommonBulkReadWrite(request, - request_mdl, - static_cast(output_buf_len), - true, - transfer_param->time_out, - true); - } else { - WdfRequestComplete(request, status); - } -} - -void AndroidUsbPipeFileObject::OnCtlBulkWrite(WDFREQUEST request, - size_t output_buf_len, - size_t input_buf_len) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - - // Make sure that this is an output pipe - if (is_input_pipe()) { - GoogleDbgPrint("\n!!!! Attempt to IOCTL write to input pipe %p", this); - WdfRequestComplete(request, STATUS_ACCESS_DENIED); - return; - } - - // Verify buffers - ASSERT(input_buf_len >= sizeof(AdbBulkTransfer)); - // Output buffer points to ULONG that receives number of transferred bytes - ASSERT(output_buf_len >= sizeof(ULONG)); - if ((input_buf_len < sizeof(AdbBulkTransfer)) || - (output_buf_len < sizeof(ULONG))) { - WdfRequestComplete(request, STATUS_INVALID_BUFFER_SIZE); - return; - } - - // Get the input buffer - NTSTATUS status = STATUS_SUCCESS; - AdbBulkTransfer* transfer_param = - reinterpret_cast(InAddress(request, &status)); - ASSERT(NT_SUCCESS(status) && (NULL != transfer_param)); - if (!NT_SUCCESS(status)) { - WdfRequestComplete(request, status); - return; - } - - // Get the output buffer - ULONG* ret_transfer = - reinterpret_cast(OutAddress(request, &status)); - ASSERT(NT_SUCCESS(status) && (NULL != ret_transfer)); - if (!NT_SUCCESS(status)) { - WdfRequestComplete(request, status); - return; - } - - // Cache these param to prevent us from sudden change after we've chacked it. - // This is common practice in protecting ourselves from malicious code: - // 1. Never trust anything that comes from the User Mode. - // 2. Never assume that anything that User Mode buffer has will remain - // unchanged. - void* transfer_buffer = transfer_param->GetWriteBuffer(); - ULONG transfer_size = transfer_param->transfer_size; - - // Make sure zero length I/O doesn't go through - if (0 == transfer_size) { - *ret_transfer = 0; - WdfRequestCompleteWithInformation(request, STATUS_SUCCESS, sizeof(ULONG)); - return; - } - - // Make sure that buffer is not NULL - ASSERT(NULL != transfer_buffer); - if (NULL == transfer_buffer) { - WdfRequestComplete(request, STATUS_INVALID_PARAMETER); - return; - } - - // At this point we are ready to build MDL for the user buffer. - PMDL write_mdl = - IoAllocateMdl(transfer_buffer, transfer_size, FALSE, FALSE, NULL); - ASSERT(NULL != write_mdl); - if (NULL == write_mdl) { - WdfRequestComplete(request, STATUS_INSUFFICIENT_RESOURCES); - return; - } - - // Now we need to probe/lock this mdl - __try { - MmProbeAndLockPages(write_mdl, - WdfRequestGetRequestorMode(request), - IoReadAccess); - status = STATUS_SUCCESS; - } __except (EXCEPTION_EXECUTE_HANDLER) { - status = GetExceptionCode(); - ASSERTMSG("\n!!!!! AndroidUsbPipeFileObject::OnCtlBulkWrite exception", - false); - } - - if (!NT_SUCCESS(status)) { - IoFreeMdl(write_mdl); - WdfRequestComplete(request, status); - return; - } - - // Perform the write - status = CommonBulkReadWrite(request, - write_mdl, - transfer_size, - false, - transfer_param->time_out, - true); - if (!NT_SUCCESS(status)) { - // If CommonBulkReadWrite failed we need to unlock and free MDL here - MmUnlockPages(write_mdl); - IoFreeMdl(write_mdl); - } -} - -NTSTATUS AndroidUsbPipeFileObject::CommonBulkReadWrite( - WDFREQUEST request, - PMDL transfer_mdl, - ULONG length, - bool is_read, - ULONG time_out, - bool is_ioctl) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - - ASSERT(IsPipeAttached()); - if (!IsPipeAttached()) { - WdfRequestComplete(request, STATUS_INVALID_DEVICE_STATE); - return STATUS_INVALID_DEVICE_STATE; - } - - // Quick access check. Might be redundant though... - ASSERT((is_read && is_input_pipe()) || (!is_read && is_output_pipe())); - if ((is_read && is_output_pipe()) || (!is_read && is_input_pipe())) { - WdfRequestComplete(request, STATUS_ACCESS_DENIED); - return STATUS_ACCESS_DENIED; - } - - // Set URB flags - ULONG urb_flags = USBD_SHORT_TRANSFER_OK | (is_read ? - USBD_TRANSFER_DIRECTION_IN : - USBD_TRANSFER_DIRECTION_OUT); - - // Calculate transfer length for this stage. - ULONG stage_len = - (length > GetTransferGranularity()) ? GetTransferGranularity() : length; - - // Get virtual address that we're gonna use in the transfer. - // We rely here on the fact that we're in the context of the calling thread. - void* virtual_address = MmGetMdlVirtualAddress(transfer_mdl); - - // Allocate our private MDL for this address which we will use for the transfer - PMDL new_mdl = IoAllocateMdl(virtual_address, length, FALSE, FALSE, NULL); - ASSERT(NULL != new_mdl); - if (NULL == new_mdl) { - WdfRequestComplete(request, STATUS_INSUFFICIENT_RESOURCES); - return STATUS_INSUFFICIENT_RESOURCES; - } - - // Map the portion of user buffer that we're going to transfer at this stage - // to our mdl. - IoBuildPartialMdl(transfer_mdl, new_mdl, virtual_address, stage_len); - - // Allocate memory for URB and associate it with this request - WDF_OBJECT_ATTRIBUTES mem_attrib; - WDF_OBJECT_ATTRIBUTES_INIT(&mem_attrib); - mem_attrib.ParentObject = request; - - WDFMEMORY urb_mem = NULL; - PURB urb = NULL; - NTSTATUS status = - WdfMemoryCreate(&mem_attrib, - NonPagedPool, - GANDR_POOL_TAG_BULKRW_URB, - sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER), - &urb_mem, - reinterpret_cast(&urb)); - ASSERT(NT_SUCCESS(status) && (NULL != urb)); - if (!NT_SUCCESS(status)) { - IoFreeMdl(new_mdl); - WdfRequestComplete(request, STATUS_INSUFFICIENT_RESOURCES); - return STATUS_INSUFFICIENT_RESOURCES; - } - - // Get USB pipe handle for our pipe and initialize transfer request for it - USBD_PIPE_HANDLE usbd_pipe_hndl = usbd_pipe(); - ASSERT(NULL != usbd_pipe_hndl); - if (NULL == usbd_pipe_hndl) { - IoFreeMdl(new_mdl); - WdfRequestComplete(request, STATUS_INTERNAL_ERROR); - return STATUS_INTERNAL_ERROR; - } - - // Initialize URB with request information - UsbBuildInterruptOrBulkTransferRequest( - urb, - sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER), - usbd_pipe_hndl, - NULL, - new_mdl, - stage_len, - urb_flags, - NULL); - - // Build transfer request - status = WdfUsbTargetPipeFormatRequestForUrb(wdf_pipe(), - request, - urb_mem, - NULL); - ASSERT(NT_SUCCESS(status)); - if (!NT_SUCCESS(status)) { - IoFreeMdl(new_mdl); - WdfRequestComplete(request, status); - return status; - } - - // Initialize our request context. - AndroidUsbWdfRequestContext* context = - GetAndroidUsbWdfRequestContext(request); - ASSERT(NULL != context); - if (NULL == context) { - IoFreeMdl(new_mdl); - WdfRequestComplete(request, STATUS_INTERNAL_ERROR); - return STATUS_INTERNAL_ERROR; - } - - context->object_type = AndroidUsbWdfObjectTypeRequest; - context->urb_mem = urb_mem; - context->transfer_mdl = transfer_mdl; - context->mdl = new_mdl; - context->length = length; - context->transfer_size = stage_len; - context->num_xfer = 0; - context->virtual_address = virtual_address; - context->is_read = is_read; - context->initial_time_out = time_out; - context->is_ioctl = is_ioctl; - - // Set our completion routine - WdfRequestSetCompletionRoutine(request, - CommonReadWriteCompletionEntry, - this); - - // Init send options (our timeout goes here) - WDF_REQUEST_SEND_OPTIONS send_options; - if (0 != time_out) { - WDF_REQUEST_SEND_OPTIONS_INIT(&send_options, WDF_REQUEST_SEND_OPTION_TIMEOUT); - WDF_REQUEST_SEND_OPTIONS_SET_TIMEOUT(&send_options, WDF_REL_TIMEOUT_IN_MS(time_out)); - } - - // Timestamp first WdfRequestSend - KeQuerySystemTime(&context->sent_at); - - // Send request asynchronously. - if (WdfRequestSend(request, wdf_pipe_io_target(), - (0 == time_out) ? WDF_NO_SEND_OPTIONS : &send_options)) { - return STATUS_SUCCESS; - } - - // Something went wrong here - status = WdfRequestGetStatus(request); - ASSERT(!NT_SUCCESS(status)); - GoogleDbgPrint("\n!!!!! CommonBulkReadWrite: WdfRequestGetStatus (is_read = %u) failed: %08X", - is_read, status); - WdfRequestCompleteWithInformation(request, status, 0); - - return status; -} - -void AndroidUsbPipeFileObject::OnCommonReadWriteCompletion( - WDFREQUEST request, - PWDF_REQUEST_COMPLETION_PARAMS completion_params, - AndroidUsbWdfRequestContext* context) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - - NTSTATUS status = completion_params->IoStatus.Status; - if (!NT_SUCCESS(status)){ - GoogleDbgPrint("\n========== Request completed with failure: %X", status); - IoFreeMdl(context->mdl); - // If this was IOCTL-originated write we must unlock and free - // our transfer MDL. - if (context->is_ioctl && !context->is_read) { - MmUnlockPages(context->transfer_mdl); - IoFreeMdl(context->transfer_mdl); - } - WdfRequestComplete(request, status); - return; - } - - // Get our URB buffer - PURB urb - = reinterpret_cast(WdfMemoryGetBuffer(context->urb_mem, NULL)); - ASSERT(NULL != urb); - - // Lets see how much has been transfered and update our counters accordingly - ULONG bytes_transfered = - urb->UrbBulkOrInterruptTransfer.TransferBufferLength; - // We expect writes to transfer entire packet - ASSERT((bytes_transfered == context->transfer_size) || context->is_read); - context->num_xfer += bytes_transfered; - context->length -= bytes_transfered; - - // Is there anything left to transfer? Now, by the protocol we should - // successfuly complete partial reads, instead of waiting on full set - // of requested bytes being accumulated in the read buffer. - if ((0 == context->length) || context->is_read) { - status = STATUS_SUCCESS; - - // This was the last transfer - if (context->is_ioctl && !context->is_read) { - // For IOCTL-originated writes we have to return transfer size through - // the IOCTL's output buffer. - ULONG* ret_transfer = - reinterpret_cast(OutAddress(request, NULL)); - ASSERT(NULL != ret_transfer); - if (NULL != ret_transfer) - *ret_transfer = context->num_xfer; - WdfRequestSetInformation(request, sizeof(ULONG)); - - // We also must unlock / free transfer MDL - MmUnlockPages(context->transfer_mdl); - IoFreeMdl(context->transfer_mdl); - } else { - // For other requests we report transfer size through the request I/O - // completion status. - WdfRequestSetInformation(request, context->num_xfer); - } - IoFreeMdl(context->mdl); - WdfRequestComplete(request, status); - return; - } - - // There are something left for the transfer. Prepare for it. - // Required to free any mapping made on the partial MDL and - // reset internal MDL state. - MmPrepareMdlForReuse(context->mdl); - - // Update our virtual address - context->virtual_address = - reinterpret_cast(context->virtual_address) + bytes_transfered; - - // Calculate size of this transfer - ULONG stage_len = - (context->length > GetTransferGranularity()) ? GetTransferGranularity() : - context->length; - - IoBuildPartialMdl(context->transfer_mdl, - context->mdl, - context->virtual_address, - stage_len); - - // Reinitialize the urb and context - urb->UrbBulkOrInterruptTransfer.TransferBufferLength = stage_len; - context->transfer_size = stage_len; - - // Format the request to send a URB to a USB pipe. - status = WdfUsbTargetPipeFormatRequestForUrb(wdf_pipe(), - request, - context->urb_mem, - NULL); - ASSERT(NT_SUCCESS(status)); - if (!NT_SUCCESS(status)) { - if (context->is_ioctl && !context->is_read) { - MmUnlockPages(context->transfer_mdl); - IoFreeMdl(context->transfer_mdl); - } - IoFreeMdl(context->mdl); - WdfRequestComplete(request, status); - return; - } - - // Reset the completion routine - WdfRequestSetCompletionRoutine(request, - CommonReadWriteCompletionEntry, - this); - - // Send the request asynchronously. - if (!WdfRequestSend(request, wdf_pipe_io_target(), WDF_NO_SEND_OPTIONS)) { - if (context->is_ioctl && !context->is_read) { - MmUnlockPages(context->transfer_mdl); - IoFreeMdl(context->transfer_mdl); - } - status = WdfRequestGetStatus(request); - IoFreeMdl(context->mdl); - WdfRequestComplete(request, status); - } -} - -NTSTATUS AndroidUsbPipeFileObject::ResetPipe() { - ASSERT_IRQL_PASSIVE(); - - // This routine synchronously submits a URB_FUNCTION_RESET_PIPE - // request down the stack. - NTSTATUS status = WdfUsbTargetPipeAbortSynchronously(wdf_pipe(), - WDF_NO_HANDLE, - NULL); - if (NT_SUCCESS(status)) { - status = WdfUsbTargetPipeResetSynchronously(wdf_pipe(), - WDF_NO_HANDLE, - NULL); - if (!NT_SUCCESS(status)) - GoogleDbgPrint("\n!!!!! AndroidUsbPipeFileObject::ResetPipe failed %X", status); - } else { - GoogleDbgPrint("\n!!!!! WdfUsbTargetPipeAbortSynchronously failed %X", status); - } - - return status; -} - -NTSTATUS AndroidUsbPipeFileObject::QueueResetPipePassiveCallback() { - ASSERT_IRQL_LOW_OR_DISPATCH(); - - // Initialize workitem - WDF_OBJECT_ATTRIBUTES attr; - WDF_OBJECT_ATTRIBUTES_INIT(&attr); - WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(&attr, AndroidUsbWorkitemContext); - attr.ParentObject = wdf_device(); - - WDFWORKITEM wdf_work_item = NULL; - WDF_WORKITEM_CONFIG workitem_config; - WDF_WORKITEM_CONFIG_INIT(&workitem_config, ResetPipePassiveCallbackEntry); - NTSTATUS status = WdfWorkItemCreate(&workitem_config, - &attr, - &wdf_work_item); - ASSERT(NT_SUCCESS(status) && (NULL != wdf_work_item)); - if (!NT_SUCCESS(status)) - return status; - - // Initialize our extension to work item - AndroidUsbWorkitemContext* context = - GetAndroidUsbWorkitemContext(wdf_work_item); - ASSERT(NULL != context); - if (NULL == context) { - WdfObjectDelete(wdf_work_item); - return STATUS_INTERNAL_ERROR; - } - - context->object_type = AndroidUsbWdfObjectTypeWorkitem; - context->pipe_file_ext = this; - - // Enqueue this work item. - WdfWorkItemEnqueue(wdf_work_item); - - return STATUS_SUCCESS; -} - -void AndroidUsbPipeFileObject::CommonReadWriteCompletionEntry( - WDFREQUEST request, - WDFIOTARGET wdf_target, - PWDF_REQUEST_COMPLETION_PARAMS completion_params, - WDFCONTEXT completion_context) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - - AndroidUsbWdfRequestContext* - context = GetAndroidUsbWdfRequestContext(request); - ASSERT((NULL != context) && (AndroidUsbWdfObjectTypeRequest == context->object_type)); - - AndroidUsbPipeFileObject* pipe_file_ext = - reinterpret_cast(completion_context); - ASSERT((NULL != pipe_file_ext) && - (pipe_file_ext->wdf_pipe() == (WDFUSBPIPE)wdf_target)); - - pipe_file_ext->OnCommonReadWriteCompletion(request, - completion_params, - context); -} - -void AndroidUsbPipeFileObject::ResetPipePassiveCallbackEntry( - WDFWORKITEM wdf_work_item) { - ASSERT_IRQL_PASSIVE(); - - AndroidUsbWorkitemContext* context = - GetAndroidUsbWorkitemContext(wdf_work_item); - ASSERT((NULL != context) && - (AndroidUsbWdfObjectTypeWorkitem == context->object_type)); - if ((NULL == context) || - (AndroidUsbWdfObjectTypeWorkitem != context->object_type)) { - WdfObjectDelete(wdf_work_item); - return; - } - - // In the sample they reset the device if pipe reset failed - AndroidUsbDeviceObject* wdf_device_ext = - context->pipe_file_ext->device_object(); - - NTSTATUS status = context->pipe_file_ext->ResetPipe(); - if (!NT_SUCCESS(status)) - status = wdf_device_ext->ResetDevice(); - - WdfObjectDelete(wdf_work_item); -} - -#pragma data_seg() -#pragma code_seg() diff --git a/host/windows/usb/driver/android_usb_pipe_file_object.h b/host/windows/usb/driver/android_usb_pipe_file_object.h deleted file mode 100644 index b0db9a813..000000000 --- a/host/windows/usb/driver/android_usb_pipe_file_object.h +++ /dev/null @@ -1,305 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_USB_PIPE_FILE_OBJECT_H__ -#define ANDROID_USB_PIPE_FILE_OBJECT_H__ -/** \file - This file consists of declaration of class AndroidUsbPipeFileObject that - encapsulates a common extension for pipe file objects. -*/ - -#include "android_usb_file_object.h" - -/** AndroidUsbPipeFileObject class encapsulates extension for a KMDF file - object that represents opened pipe. Instances of this class must be - allocated from NonPagedPool. -*/ -class AndroidUsbPipeFileObject : public AndroidUsbFileObject { - public: - /** \brief Constructs the object. - - This method must be called at low IRQL. - @param dev_obj[in] Our device object for which this file has been created - @param wdf_fo[in] KMDF file object this extension wraps - @param wdf_pipe_obj[in] KMDF pipe for this file - */ - AndroidUsbPipeFileObject(AndroidUsbDeviceObject* dev_obj, - WDFFILEOBJECT wdf_fo, - WDFUSBPIPE wdf_pipe_obj); - - /** \brief Destructs the object. - - This method can be called at any IRQL. - */ - virtual ~AndroidUsbPipeFileObject(); - - /** \brief Initializes the pipe file object extension - - This method internally calls AndroidUsbFileObject::Initialize() - This method must be called at low IRQL - @param pipe_info[in] Pipe information - @return STATUS_SUCCESS or an appropriate error code - */ - virtual NTSTATUS InitializePipe(const WDF_USB_PIPE_INFORMATION* pipe_info); - - /** \brief Read event handler - - This method is called when a read request comes to the file object this - extension wraps. This method is an override. - This method can be called IRQL <= DISPATCH_LEVEL. - @param request[in] A handle to a framework request object. - @param length[in] The number of bytes to be read. - @return Successful status or an appropriate error code - */ - virtual void OnEvtIoRead(WDFREQUEST request, size_t length); - - /** \brief Write event handler - - This method is called when a write request comes to the file object this - extension wraps. This method is an override. - This method can be called IRQL <= DISPATCH_LEVEL. - @param request[in] A handle to a framework request object. - @param length[in] The number of bytes to be written. - @return Successful status or an appropriate error code - */ - virtual void OnEvtIoWrite(WDFREQUEST request, size_t length); - - /** \brief IOCTL event handler - - This method is called when a device control request comes to the file - object this extension wraps. We hanlde the following IOCTLs here: - 1. ADB_CTL_GET_ENDPOINT_INFORMATION - 2. ADB_CTL_BULK_READ - 3. ADB_CTL_BULK_WRITE - This method can be called IRQL <= DISPATCH_LEVEL. - @param request[in] A handle to a framework request object. - @param output_buf_len[in] The length, in bytes, of the request's output - buffer, if an output buffer is available. - @param input_buf_len[in] The length, in bytes, of the request's input - buffer, if an input buffer is available. - @param ioctl_code[in] The driver-defined or system-defined I/O control code - that is associated with the request. - @return Successful status or an appropriate error code - */ - virtual void OnEvtIoDeviceControl(WDFREQUEST request, - size_t output_buf_len, - size_t input_buf_len, - ULONG ioctl_code); - - protected: - /** \brief Handler for ADB_CTL_GET_ENDPOINT_INFORMATION IOCTL request - - @param request[in] A handle to a framework request object. - @param output_buf_len[in] The length, in bytes, of the request's output - buffer, if an output buffer is available. - */ - virtual void OnCtlGetEndpointInformation(WDFREQUEST request, - size_t output_buf_len); - - /** \brief Handler for ADB_CTL_BULK_READ IOCTL request - - @param request[in] A handle to a framework request object. - @param output_buf_len[in] The length, in bytes, of the request's output - buffer, if an output buffer is available. - @param input_buf_len[in] The length, in bytes, of the request's input - buffer, if an input buffer is available. - */ - virtual void OnCtlBulkRead(WDFREQUEST request, - size_t output_buf_len, - size_t input_buf_len); - - /** \brief Handler for ADB_CTL_BULK_WRITE IOCTL request - - @param request[in] A handle to a framework request object. - @param output_buf_len[in] The length, in bytes, of the request's output - buffer, if an output buffer is available. - @param input_buf_len[in] The length, in bytes, of the request's input - buffer, if an input buffer is available. - */ - virtual void OnCtlBulkWrite(WDFREQUEST request, - size_t output_buf_len, - size_t input_buf_len); - - /** \brief Performs common bulk read / write on the pipe - - This method is called from bulk and interrupt pipe file extensions to - perform read to / write from the pipe this file represents. Typicaly, - this method is called from OnEvtIoRead / OnEvtIoWrite / - OnEvtIoDeviceControl methods. One very special case for this method is - IOCTL-originated write request. If this is IOCTL-originated write request - we can't report transfer size through the request's status block. Instead, - for IOCTL-originated writes, the output buffer must a) exist and b) point - to an ULONG that will receive size of the transfer. Besides, for this type - of writes we create / lock write buffer MDL ourselves so we need to unlock - and free it in the completion routine. - This method can be called at IRQL <= DISPATCH_LEVEL. - @param request[in] A handle to a framework request object. - @param transfer_mdl[in] MDL for the transferring buffer. The MDL must be - locked prior to this call. - @param length[in] The number of bytes to be read / written. If this method - is actually IOCTL originated write request this parameter must be - taken from AdbBulkTransfer.transfer_size by the caller of this - method. AdbBulkTransfer is available at the beginning of the input - buffer for bulk read / write IOCTLs. - @param is_read[in] If true this is a read operation, otherwise it's write - operation. - @param time_out[in] Number of milliseconds for this request to complete. - If this parameter is zero there will be no timeout associated with - the request. Otherwise, if request doesn't complete within the given - timeframe it will be cancelled. - @param is_ioctl[in] If 'true' this method has been called from IOCTL - handler. Otherwise it has been called from read / write handler. If - this is IOCTL-originated write request we need to report bytes - transferred through the IOCTL's output buffer. - This method can be called IRQL <= DISPATCH_LEVEL. - @return STATUS_SUCCESS or an appropriate error code - */ - virtual NTSTATUS CommonBulkReadWrite(WDFREQUEST request, - PMDL transfer_mdl, - ULONG length, - bool is_read, - ULONG time_out, - bool is_ioctl); - - /** \brief Handles request completion for CommonBulkReadWrite - - This method is called from CommonReadWriteCompletionEntry. - This method can be called at IRQL <= DISPATCH_LEVEL. - @param request[in] A handle to a framework request object that is being - completed. - @param params[in] A pointer to a WDF_REQUEST_COMPLETION_PARAMS structure - that contains information about the completed request. - @param context[in] Context associated with this request in - CommonBulkReadWrite - This method can be called IRQL <= DISPATCH_LEVEL. - */ - virtual void OnCommonReadWriteCompletion(WDFREQUEST request, - PWDF_REQUEST_COMPLETION_PARAMS completion_params, - AndroidUsbWdfRequestContext* context); - - /** \brief Resets pipe associated with this file - - After reseting the pipe this object might be destroyed. - This method must be called at PASSIVE IRQL. - @param read_device_on_failure[in] If true and reset pipe has failed this - method will attempt to reset the device. - @return STATUS_SUCCESS on success or an appropriate error code - */ - virtual NTSTATUS ResetPipe(); - - /** \brief Queues a workitem to launch pipe reset at PASSIVE IRQL - - This method can be called at IRQL <= DISPATCH_LEVEL. - @return STATUS_SUCCESS or an appropriate error code. - */ - virtual NTSTATUS QueueResetPipePassiveCallback(); - - private: - /** \brief Request completion routine for CommonBulkReadWrite - - This method can be called at IRQL <= DISPATCH_LEVEL. - @param request[in] A handle to a framework request object that is being - completed. - @param wdf_target[in] A handle to an I/O target object that represents the - I/O target that completed the request. In this case this is a pipe. - @param params[in] A pointer to a WDF_REQUEST_COMPLETION_PARAMS structure - that contains information about the completed request. - @param completion_context[in] A handle to driver-supplied context - information, which the driver specified in a previous call to - WdfRequestSetCompletionRoutine. In our case this is a pointer - to this class instance that issued the request. - This method can be called IRQL <= DISPATCH_LEVEL. - */ - static void CommonReadWriteCompletionEntry(WDFREQUEST request, - WDFIOTARGET wdf_target, - PWDF_REQUEST_COMPLETION_PARAMS params, - WDFCONTEXT completion_context); - - /** \brief Entry point for pipe reset workitem callback - - This method is called at PASSIVE IRQL - @param wdf_work_item[in] A handle to a framework work item object. - */ - static void ResetPipePassiveCallbackEntry(WDFWORKITEM wdf_work_item); - - public: - /// Gets KMDF pipe handle for this file - __forceinline WDFUSBPIPE wdf_pipe() const { - return wdf_pipe_; - } - - /// Gets maximum transfer size for this pipe - __forceinline ULONG max_transfer_size() const { - ASSERT(0 != pipe_information_.MaximumTransferSize); - return pipe_information_.MaximumTransferSize; - } - - /// Gets maximum packet size this pipe is capable of - __forceinline ULONG max_packet_size() const { - ASSERT(0 != pipe_information_.MaximumPacketSize); - return pipe_information_.MaximumPacketSize; - } - - /// Gets transfer granularity - // TODO: It looks like device USB is capable of handling - // packets with size greater than pipe_information_.MaximumPacketSize! - // So, looks like we are not bound by this parameter in this driver. - __forceinline ULONG GetTransferGranularity() const { - return max_transfer_size(); - } - - /// Checks if this is an input pipe - __forceinline bool is_input_pipe() const { - return WDF_USB_PIPE_DIRECTION_IN(pipe_information_.EndpointAddress) ? - true : false; - } - - /// Checks if this is an output pipe - __forceinline bool is_output_pipe() const { - return WDF_USB_PIPE_DIRECTION_OUT(pipe_information_.EndpointAddress) ? - true : false; - } - - /// Checks if pipe is attached to this file - __forceinline bool IsPipeAttached() const { - return (NULL != wdf_pipe()); - } - - /// Gets USBD pipe handle - // TODO: Can we cache this? - __forceinline USBD_PIPE_HANDLE usbd_pipe() const { - ASSERT(IsPipeAttached()); - return (IsPipeAttached()) ? WdfUsbTargetPipeWdmGetPipeHandle(wdf_pipe()) : - NULL; - } - - /// Gets I/O target handle for this pipe - // TODO: Can we cache this? - __forceinline WDFIOTARGET wdf_pipe_io_target() const { - ASSERT(IsPipeAttached()); - return (IsPipeAttached()) ? WdfUsbTargetPipeGetIoTarget(wdf_pipe()) : - NULL; - } - - protected: - /// Cached pipe information - WDF_USB_PIPE_INFORMATION pipe_information_; - - /// KMDF pipe handle for this file - WDFUSBPIPE wdf_pipe_; -}; - -#endif // ANDROID_USB_PIPE_FILE_OBJECT_H__ diff --git a/host/windows/usb/driver/android_usb_pool_tags.h b/host/windows/usb/driver/android_usb_pool_tags.h deleted file mode 100644 index 708dcb795..000000000 --- a/host/windows/usb/driver/android_usb_pool_tags.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_USB_POOL_TAGS_H__ -#define ANDROID_USB_POOL_TAGS_H__ -/** \file - This file consists definitions for pool tags used in memory allocations for - the driver. -*/ - -/// Default pool tag for memory allocations (GAND) -#define GANDR_POOL_TAG_DEFAULT 'DNAG' - -/// Pool tag for the driver object (GADR) -#define GANDR_POOL_TAG_DRIVER_OBJECT 'RDAG' - -/// Pool tag for KMDF device object extension (GADx) -#define GANDR_POOL_TAG_KMDF_DEVICE 'xDAG' - -/// Pool tag for target device configuration descriptor (GACD) -#define GANDR_POOL_TAG_DEV_CFG_DESC 'DCAG' - -/// Pool tag for device file object extension (GADf) -#define GANDR_POOL_TAG_DEVICE_FO 'fDAG' - -/// Pool tag for a bulk file object extension (GABx) -#define GANDR_POOL_TAG_BULK_FILE 'xBAG' - -/// Pool tag for an interrupt file object extension (GAIx) -#define GANDR_POOL_TAG_INTERRUPT_FILE 'xIAG' - -/// Pool tag for URB allocated in bulk read / write (GAbu) -#define GANDR_POOL_TAG_BULKRW_URB 'ubAG' - -/// Pool tag for interface pairs (GAip) -#define GANDR_POOL_TAG_INTERF_PAIRS 'piAG' - -#endif // ANDROID_USB_POOL_TAGS_H__ diff --git a/host/windows/usb/driver/android_usb_wdf_object.cpp b/host/windows/usb/driver/android_usb_wdf_object.cpp deleted file mode 100644 index 68e2f9915..000000000 --- a/host/windows/usb/driver/android_usb_wdf_object.cpp +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** \file - This file consists of implementation of a class AndroidUsbWdfObject that - encapsulates a basic extension to all KMDF objects. Currently, device and - file object extensions ared derived from it. -*/ -#pragma data_seg() -#pragma code_seg() - -#include "precomp.h" -#include "android_usb_wdf_object.h" - -#pragma data_seg() -#pragma code_seg("PAGE") - -AndroidUsbWdfObject::AndroidUsbWdfObject(AndroidUsbWdfObjectType obj_type) - : wdf_object_(NULL), - object_type_(obj_type) { - ASSERT_IRQL_LOW(); - ASSERT(obj_type < AndroidUsbWdfObjectTypeMax); -} - -#pragma code_seg() - -AndroidUsbWdfObject::~AndroidUsbWdfObject() { - ASSERT_IRQL_LOW_OR_DISPATCH(); -} - -#pragma code_seg("PAGE") - -NTSTATUS AndroidUsbWdfObject::InitObjectAttributes( - PWDF_OBJECT_ATTRIBUTES wdf_obj_attr, - WDFOBJECT parent) { - ASSERT_IRQL_LOW(); - - // Enforce file object extension exception. - ASSERT(!Is(AndroidUsbWdfObjectTypeFile)); - if (Is(AndroidUsbWdfObjectTypeFile)) - return STATUS_INTERNAL_ERROR; - - // Initialize attributes and set cleanup and destroy callbacks - WDF_OBJECT_ATTRIBUTES_INIT(wdf_obj_attr); - WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(wdf_obj_attr, - AndroidUsbWdfObjectContext); - wdf_obj_attr->EvtCleanupCallback = EvtCleanupCallbackEntry; - wdf_obj_attr->EvtDestroyCallback = EvtDestroyCallbackEntry; - wdf_obj_attr->ParentObject = parent; - wdf_obj_attr->SynchronizationScope = GetWdfSynchronizationScope(); - - return STATUS_SUCCESS; -} - -NTSTATUS AndroidUsbWdfObject::InitializeContext() { - ASSERT_IRQL_LOW(); - ASSERT(IsAttached()); - if (!IsAttached()) - return STATUS_INTERNAL_ERROR; - - // Initialize our extension to that object - AndroidUsbWdfObjectContext* context = - GetAndroidUsbWdfObjectContext(wdf_object()); - ASSERT(NULL != context); - if (NULL == context) - return STATUS_INTERNAL_ERROR; - - // Make sure that extension has not been initialized - ASSERT((0 == context->object_type) && (NULL == context->wdf_object_ext)); - if ((0 != context->object_type) || (NULL != context->wdf_object_ext)) - return STATUS_INTERNAL_ERROR; - - context->object_type = object_type(); - context->wdf_object_ext = this; - ASSERT(this == GetAndroidUsbWdfObjectFromHandle(wdf_object())); - - return STATUS_SUCCESS; -} - -#pragma code_seg() - -WDF_SYNCHRONIZATION_SCOPE AndroidUsbWdfObject::GetWdfSynchronizationScope() { - ASSERT_IRQL_LOW_OR_DISPATCH(); - - // By default we don't want KMDF to synchronize access to our objects - return WdfSynchronizationScopeNone; -} - -void AndroidUsbWdfObject::OnEvtCleanupCallback() { - ASSERT_IRQL_LOW_OR_DISPATCH(); - GoogleDbgPrint("\n----- Object %p of type %u is cleaned up", - this, object_type()); -} - -void AndroidUsbWdfObject::OnEvtDestroyCallback() { - ASSERT_IRQL_LOW_OR_DISPATCH(); - GoogleDbgPrint("\n----- Object %p of type %u is destroyed", - this, object_type()); -} - -void AndroidUsbWdfObject::EvtCleanupCallbackEntry(WDFOBJECT wdf_obj) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - - AndroidUsbWdfObjectContext* context = GetAndroidUsbWdfObjectContext(wdf_obj); - ASSERT(NULL != context); - if (NULL != context) { - // For file objects we will be always called here even though we didn't - // create any extension for them. In this case the context must not be - // initialized. - ASSERT(((0 == context->object_type) && (NULL == context->wdf_object_ext)) || - ((0 != context->object_type) && (NULL != context->wdf_object_ext))); - if (NULL != context->wdf_object_ext) { - ASSERT(context->wdf_object_ext->Is(context->object_type)); - context->wdf_object_ext->OnEvtCleanupCallback(); - } - } -} - -void AndroidUsbWdfObject::EvtDestroyCallbackEntry(WDFOBJECT wdf_obj) { - ASSERT_IRQL_LOW_OR_DISPATCH(); - - AndroidUsbWdfObjectContext* context = - GetAndroidUsbWdfObjectContext(wdf_obj); - ASSERT(NULL != context); - if (NULL != context) { - // For file objects we will be always called here even though we didn't - // create any extension for them. In this case the context must not be - // initialized. - ASSERT(((0 == context->object_type) && (NULL == context->wdf_object_ext)) || - ((0 != context->object_type) && (NULL != context->wdf_object_ext))); - if (NULL != context->wdf_object_ext) { - ASSERT(context->wdf_object_ext->Is(context->object_type)); - context->wdf_object_ext->OnEvtDestroyCallback(); - delete context->wdf_object_ext; - } - } -} - -#pragma data_seg() -#pragma code_seg() diff --git a/host/windows/usb/driver/android_usb_wdf_object.h b/host/windows/usb/driver/android_usb_wdf_object.h deleted file mode 100644 index aedd14a1d..000000000 --- a/host/windows/usb/driver/android_usb_wdf_object.h +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_USB_WDF_OBJECT_H__ -#define ANDROID_USB_WDF_OBJECT_H__ -/** \file - This file consists of declaration of a class AndroidUsbWdfObject that - encapsulates a basic extension to all KMDF objects. Currently, device and - file object extensions ared derived from it. -*/ - -/** AndroidUsbWdfObject class encapsulates a basic extension to all KMDF - objects. Currently, device and file object extensions ared derived from it. - Instances of this and derived classes must be allocated from NonPagedPool. -*/ -class AndroidUsbWdfObject { - public: - /** \brief Constructs the object. - - @param obj_type[in] Type of the object that this wrapper represents. - This method must be called at low IRQL. - */ - AndroidUsbWdfObject(AndroidUsbWdfObjectType obj_type); - - /** \brief Destructs the object. - - This method can be called at any IRQL. - */ - virtual ~AndroidUsbWdfObject(); - - /** \brief Initializes object attributes for new KMDF object. - - Each KMDF extension object must perform attribute initializations in order - to register an extension with KMDF framework. Since all our extensions are - derived from the base AndroidUsbWdfObject we use a single WDF object - extension context for all KMDF objects that we extend. So we can initialize - and register our context extension structure here. Note that object - attributes for file object wrappers are initialized globaly, when device - object is created. So file object extensions must not call this method. - This method must be called at low IRQL. - @param wdf_obj_attr[out] Object attributes to initialize. - @param parent[in] Parent object for this object. Can be NULL. - @return STATUS_SUCCESS on success or an appropriate error code. - */ - virtual NTSTATUS InitObjectAttributes(PWDF_OBJECT_ATTRIBUTES wdf_obj_attr, - WDFOBJECT parent); - - /** \brief Initializes context for this extension - - This method initializes AndroidUsbWdfObjectContext structure that KMDF - allocated for the object that is being extended with this class. - InitObjectAttributes method must be called prior to the call to this - method. Besides, before calling this method, instance of this class must - be already attached to the KMDF object it represents. Otherwise this - method will fail with STATUS_INTERNAL_ERROR. - This method must be called at low IRQL. - @return STATUS_SUCCESS on success or an appropriate error code - */ - virtual NTSTATUS InitializeContext(); - - - protected: - /** \brief Returns syncronisation scope for this extension type. - - This method is called from InitObjectAttributes method to specify what - type of synchronization is required for instances of this type. By - default we return WdfSynchronizationScopeNone which makes KMDF not - to synchronize access to this type of object. - This method can be called at IRQL <= DISPATCH_LEVEL. - */ - virtual WDF_SYNCHRONIZATION_SCOPE GetWdfSynchronizationScope(); - - /** \brief Handler for cleanup event fired for associated KMDF object. - - The framework calls this callback function when either the framework or a - driver attempts to delete the object. - This method can be called at IRQL <= DISPATCH_LEVEL. - */ - virtual void OnEvtCleanupCallback(); - - /** \brief Handler for destroy callback - - The framework calls the EvtDestroyCallback callback function after the - object's reference count has been decremented to zero. The framework - deletes the object immediately after the EvtDestroyCallback callback - function returns. - This callback can be called at IRQL <= DISPATCH_LEVEL. - */ - virtual void OnEvtDestroyCallback(); - - /** \brief Removes driver's references on an object so it can be deleted. - - The framework calls the callback function when either the framework or a - driver attempts to delete the object. - This callback can be called at IRQL <= DISPATCH_LEVEL. - @param wdf_obj[in] A handle to a framework object this class wraps. - */ - static void EvtCleanupCallbackEntry(WDFOBJECT wdf_obj); - - /** \brief Called when framework object is being deleted - - The framework calls the EvtDestroyCallback callback function after the - object's reference count has been decremented to zero. The framework - deletes the object immediately after the EvtDestroyCallback callback - function returns. - This callback can be called at IRQL <= DISPATCH_LEVEL. - @param wdf_obj[in] A handle to a framework object this class wraps. - */ - static void EvtDestroyCallbackEntry(WDFOBJECT wdf_obj); - - public: - - /// Gets KMDF object extended with this instance - __forceinline WDFOBJECT wdf_object() const { - return wdf_object_; - } - - /// Sets KMDF object associated with this extension - __forceinline void set_wdf_object(WDFOBJECT wdf_obj) { - ASSERT(NULL == wdf_object_); - wdf_object_ = wdf_obj; - } - - /// Gets KMDF object type for this extension - __forceinline AndroidUsbWdfObjectType object_type() const { - return object_type_; - } - - /** \brief Checks if this extension represends KMDF object of the given type - - @param obj_type[in] Object type to check - @return true if this wrapper represents object of that type and - false otherwise. - */ - __forceinline Is(AndroidUsbWdfObjectType obj_type) const { - return (obj_type == object_type()); - } - - /// Checks if extension is attached to a KMDF object - __forceinline bool IsAttached() const { - return (NULL != wdf_object()); - } - - protected: - /// KMDF object that is extended with this instance - WDFOBJECT wdf_object_; - - /// KMDF object type for this extension - AndroidUsbWdfObjectType object_type_; -}; - -/** \brief Gets our extension for the given KMDF object - - This method can be called at any IRQL - @param wdf_obj[in] KMDF handle describing an object - @return Instance of AndroidUsbWdfObject associated with this object or NULL - if association is not found. -*/ -__forceinline AndroidUsbWdfObject* GetAndroidUsbWdfObjectFromHandle( - WDFOBJECT wdf_obj) { - ASSERT(NULL != wdf_obj); - if (NULL != wdf_obj) { - AndroidUsbWdfObjectContext* context = - GetAndroidUsbWdfObjectContext(wdf_obj); - ASSERT((NULL != context) && (NULL != context->wdf_object_ext) && - (context->wdf_object_ext->Is(context->object_type))); - if ((NULL != context) && (NULL != context->wdf_object_ext) && - context->wdf_object_ext->Is(context->object_type)) { - return context->wdf_object_ext; - } - } - return NULL; -} - -#endif // ANDROID_USB_WDF_OBJECT_H__ diff --git a/host/windows/usb/driver/makefile b/host/windows/usb/driver/makefile deleted file mode 100644 index 3c0d3a5b8..000000000 --- a/host/windows/usb/driver/makefile +++ /dev/null @@ -1,36 +0,0 @@ -!IF 0 - -Copyright (C) 2006 The Android Open Source Project - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Module Name: - - makefile. - -Notes: - - DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source - file to this component. This file merely indirects to the real make file - that is shared by all the components of Windows NT (DDK) - -!ENDIF - -!if "$(DDK_TARGET_OS)"=="Win2K" -!message This driver is not intended to target the Windows 2000 platform. -!elseif "$(DDK_TARGET_OS)"=="WinNET" -!INCLUDE $(NTMAKEENV)\makefile.def -!else -!INCLUDE $(NTMAKEENV)\makefile.def -!endif - diff --git a/host/windows/usb/driver/makefile.inc b/host/windows/usb/driver/makefile.inc deleted file mode 100644 index 1955cef72..000000000 --- a/host/windows/usb/driver/makefile.inc +++ /dev/null @@ -1,7 +0,0 @@ -_LNG=$(LANGUAGE) -_INX=. -STAMP=stampinf -f $@ -a $(_BUILDARCH) - -$(OBJ_PATH)\$(O)\$(INF_NAME).inf: $(_INX)\$(INF_NAME).inx - copy $(_INX)\$(@B).inx $@ - $(STAMP) diff --git a/host/windows/usb/driver/precomp.h b/host/windows/usb/driver/precomp.h deleted file mode 100644 index 97be2a6a6..000000000 --- a/host/windows/usb/driver/precomp.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** \file - Standard precompile file -*/ -#pragma warning(disable:4200) -#pragma warning(disable:4201) // nameless struct/union -#pragma warning(disable:4214) // bit field types other than int -extern "C" { -#include -#include -#include -#include -#include "usbdi.h" -#include "usbdlib.h" -#include -#include -} // extern "C" -#pragma warning(default:4200) -#pragma warning(default:4201) -#pragma warning(default:4214) - -#include "adb_api_extra.h" -#include "android_usb_common_defines.h" -#include "android_usb_pool_tags.h" -#include "android_usb_driver_defines.h" -#include "android_usb_new_delete.h" -#include "android_usb_inl.h" diff --git a/host/windows/usb/driver/sources b/host/windows/usb/driver/sources deleted file mode 100644 index 07fce7eaa..000000000 --- a/host/windows/usb/driver/sources +++ /dev/null @@ -1,32 +0,0 @@ -!IF 0 - -Copyright (C) 2007 The Android Open Source Project - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Module Name: - - sources. - -Abstract: - - This file specifies the target component being built and the list of - sources files needed to build that component. Also specifies optional - compiler switches and libraries that are unique for the component being - built. - -!ENDIF - -!include sources.inc - -SOURCES= $(MOST_SOURCES) android_usb.rc diff --git a/host/windows/usb/driver/sources.inc b/host/windows/usb/driver/sources.inc deleted file mode 100644 index 5928f73b8..000000000 --- a/host/windows/usb/driver/sources.inc +++ /dev/null @@ -1,84 +0,0 @@ -!IF 0 - -Copyright (C) 2007 The Android Open Source Project - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Module Name: - - sources. - -Abstract: - - This file specifies the target component being built and the list of - sources files needed to build that driver. Also specifies optional - compiler switches and libraries that are unique for the component being - built. - -!ENDIF - -TARGETNAME=androidusb -!IF "$(DDKBUILDENV)"=="chk" -TARGETPATH=..\build\Debug -!ELSE -TARGETPATH=..\build\Release -!ENDIF -TARGETTYPE=DRIVER -KMDF_VERSION=1 -USECXX_FLAG=/TP -USER_C_FLAGS=$(USER_C_FLAGS) /wd4100 /wd4002 /wd4509 /wd4390 /TP - -INCLUDES=$(INCLUDES); \ - $(IFSKIT_INC_PATH); \ - ..\common; \ - ..\api; - -TARGETLIBS=$(DDK_LIB_PATH)\usbd.lib - -MSC_WARNING_LEVEL=/W4 /WX /Wp64 -MSC_OPTIMIZATION = /Oi /Ob1 -C_DEFINES=$(C_DEFINES) -DEXPLODE_POOLTAGS -DRTL_USE_AVL_TABLES - -RCOPTIONS=$(RCOPTIONS) /dVER_COMPANYNAME_STR="\"Google Inc\"" -RCOPTIONS=$(RCOPTIONS) /dVER_LEGALCOPYRIGHT_YEARS="\"2007\"" -RCOPTIONS=$(RCOPTIONS) /dVER_LEGALCOPYRIGHT_STR="\"\251 Google Inc. All rights reserved.\"" -RCOPTIONS=$(RCOPTIONS) /dVER_PRODUCTNAME_STR="\"Google Android USB Driver\"" -RCOPTIONS=$(RCOPTIONS) /dVER_PRODUCTVERSION="1,00,01,001" -RCOPTIONS=$(RCOPTIONS) /dVER_PRODUCTVERSION_STR="\"1.00\"" - -!IF 0 - -By overriding .rsrc section properties (!D removes Discardable attribute) -we make sure that all our vtables will be placed properly into non-discardable -data segment. Because of the nature of this driver we don't need to have -vtables in NonPaged data sections because all our objects can be paged. -Otherwise we may want to add /SECTION:.rsrc,X option that locks section in memory - -!ENDIF - -LINKER_FLAGS=$(LINKER_FLAGS) /MAP /MAPINFO:LINES /SECTION:.rsrc,!D - -MOST_SOURCES= \ - android_usb_driver_object.cpp \ - android_usb_wdf_object.cpp \ - android_usb_device_object.cpp \ - android_usb_file_object.cpp \ - android_usb_device_file_object.cpp \ - android_usb_pipe_file_object.cpp \ - android_usb_bulk_file_object.cpp \ - android_usb_interrupt_file_object.cpp - -PRECOMPILED_INCLUDE=precomp.h -PRECOMPILED_PCH=precomp.pch -PRECOMPILED_OBJ=precomp.obj - diff --git a/host/windows/usb/test/android_usb_test/android_usb_test.cpp b/host/windows/usb/test/android_usb_test/android_usb_test.cpp deleted file mode 100644 index a5c390693..000000000 --- a/host/windows/usb/test/android_usb_test/android_usb_test.cpp +++ /dev/null @@ -1,1366 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// android_usb_test.cpp : Defines the entry point for the console application. -// - -#include "stdafx.h" -#include -#include - -#define MAX_PAYLOAD 4096 - -#define A_SYNC 0x434e5953 -#define A_CNXN 0x4e584e43 -#define A_OPEN 0x4e45504f -#define A_OKAY 0x59414b4f -#define A_CLSE 0x45534c43 -#define A_WRTE 0x45545257 - -#define A_VERSION 0x01000000 - -struct message { - unsigned int command; /* command identifier constant */ - unsigned int arg0; /* first argument */ - unsigned int arg1; /* second argument */ - unsigned int data_length; /* length of payload (0 is allowed) */ - unsigned int data_crc32; /* crc32 of data payload */ - unsigned int magic; /* command ^ 0xffffffff */ -}; - -USB_DEVICE_DESCRIPTOR test_dev_desc = { - sizeof(USB_DEVICE_DESCRIPTOR), - 1, // bDescriptorType - 0x200, // bcdUSB - 0xFF, // bDeviceClass - 0xFF, // bDeviceSubClass - 0xFF, // bDeviceProtocol - 64, // bMaxPacketSize - 0x18D1, // idVendor - 0xDDDD, // idProduct - 0x100, // bcdDevice - 1, // iManufacturer - 2, // iProduct - 3, // iSerialNumber - 1 // bNumConfigurations -}; - -USB_CONFIGURATION_DESCRIPTOR test_config_desc = { - 9, // bLength - 2, // bDescriptorType - 32, // wTotalLength - 1, // bNumInterfaces - 1, // bConfigurationValue - 4, // iConfiguration - 64, // bmAttributes - 50 // MaxPower -}; - -USB_INTERFACE_DESCRIPTOR test_interface_desc = { - 9, // bLength - 4, // bDescriptorType - 0, // bInterfaceNumber - 0, // bAlternateSetting - 2, // bNumEndpoints - 0xFF, // bInterfaceClass - 0xFF, // bInterfaceSubClass - 0xFF, // bInterfaceProtocol - 5 // iInterface -}; - -AdbEndpointInformation test_pipe_00 = { - 1024, // MaximumPacketSize - 0xFFFFFFFF, // MaximumTransferSize - static_cast(3), // PipeType - 0x81, // EndpointAddress - 0, // Interval - 0 // SettingIndex -}; - -AdbEndpointInformation test_pipe_01 = { - 1024, // MaximumPacketSize - 0xFFFFFFFF, // MaximumTransferSize - static_cast(3), // PipeType - 0x02, // EndpointAddress - 0, // Interval - 0 // SettingIndex -}; - -AdbEndpointInformation* test_read_pipe = &test_pipe_00; -AdbEndpointInformation* test_write_pipe = &test_pipe_01; - -const UCHAR test_read_pipe_index = 0; -const UCHAR test_write_pipe_index = 1; - -bool device_active = false; - -GUID adb_class_id = ANDROID_USB_CLASS_ID; -const wchar_t test_interface_name[] = L"\\\\?\\usb#vid_18d1&pid_dddd#123456789abcdef#{F72FE0D4-CBCB-407d-8814-9ED673D0DD6B}"; -bool RunInterfaceEnumTest(); -bool RunInterfaceEnumTest(bool exclude_not_present, - bool exclude_removed, - bool active_only); -bool RunInterfaceCreateTest(); -bool RunEndpointInfoTest(); -bool RunEndpointInfoTest(ADBAPIHANDLE adb_interface, UCHAR index); -bool RunEndpointOpenTest(); -bool RunEndpointOpenTest(ADBAPIHANDLE adb_interface, UCHAR index); -bool RunEndpointIoTest(ULONG time_out_base); -bool RunTimeoutsTest(); -bool RunGeneralTests(); -bool DeviceHandShake(); -bool CheckEndpointInfo(UCHAR index, AdbEndpointInformation* info); - -int _tmain(int argc, _TCHAR* argv[]) { - argc = argc; - argv = argv; - - // General startup tests. - if (!RunGeneralTests()) - return 1; - - return 0; -} - -bool RunGeneralTests() { - // Test interface enum - if (!RunInterfaceEnumTest()) - return false; - - // Test interface create - if (!RunInterfaceCreateTest()) - return false; - - // Test endpoint information - if (!RunEndpointInfoTest()) - return false; - - // Test endpoint open - if (!RunEndpointOpenTest()) - return false; - - // Test timeout i/o - if (!RunTimeoutsTest()) - return false; - - // Test read / write (no timeouts) - if (!RunEndpointIoTest(0)) - return false; - - // Test read / write (OK timeouts) - if (!RunEndpointIoTest(10)) - return false; - - return true; -/* - if (!DeviceHandShake()) - return false; - - return true; -*/ -} - -bool DeviceHandShake() { - printf("\n\n===== Running DeviceHandShake... "); - - // Get interface - ADBAPIHANDLE adb_interface = AdbCreateInterface(adb_class_id, - DEVICE_VENDOR_ID, - DEVICE_COMPOSITE_PRODUCT_ID, - DEVICE_INTERFACE_ID); - if (NULL == adb_interface) { - adb_interface = AdbCreateInterface(adb_class_id, - DEVICE_VENDOR_ID, - DEVICE_SINGLE_PRODUCT_ID, - 0xFF); - } - - if (NULL == adb_interface) { - printf("\n AdbCreateInterface returned error %u", GetLastError()); - return false; - } - - char interf_name[1024]; - unsigned long name_size = sizeof(interf_name); - - if (!AdbGetInterfaceName(adb_interface, interf_name, &name_size, true)) { - printf("\n AdbGetInterfaceName returned error %u", GetLastError()); - AdbCloseHandle(adb_interface); - return false; - } - - printf("\n Interface name is %s", interf_name); - - char* ser_num = NULL; - name_size = 0; - if (!AdbGetSerialNumber(adb_interface, ser_num, &name_size, true)) { - ser_num = reinterpret_cast(malloc(name_size)); - if (NULL != ser_num) { - if (!AdbGetSerialNumber(adb_interface, ser_num, &name_size, true)) { - printf("\n AdbGetSerialNumber returned error %u", GetLastError()); - AdbCloseHandle(adb_interface); - return false; - } - printf("\n Interface serial number is %s", ser_num); - free(ser_num); - } - } else { - printf("\nAdbGetSerialNumber(adb_interface, ser_num, &name_size, true)"); - } - - // Get default read endpoint - ADBAPIHANDLE adb_read = AdbOpenDefaultBulkReadEndpoint(adb_interface, - AdbOpenAccessTypeReadWrite, - AdbOpenSharingModeReadWrite); - if (NULL == adb_read) { - printf("\n AdbOpenDefaultBulkReadEndpoint returned error %u", GetLastError()); - AdbCloseHandle(adb_interface); - return false; - } - - // Get default write endpoint - ADBAPIHANDLE adb_write = AdbOpenDefaultBulkWriteEndpoint(adb_interface, - AdbOpenAccessTypeReadWrite, - AdbOpenSharingModeReadWrite); - if (NULL == adb_write) { - printf("\n AdbOpenDefaultBulkWriteEndpoint returned error %u", GetLastError()); - AdbCloseHandle(adb_read); - AdbCloseHandle(adb_interface); - return false; - } - - // Send connect message - message msg_send; - msg_send.command = A_CNXN; - msg_send.arg0 = A_VERSION; - msg_send.arg1 = MAX_PAYLOAD; - msg_send.data_length = 0; - msg_send.data_crc32 = 0; - msg_send.magic = msg_send.command ^ 0xffffffff; - - ULONG written_bytes = 0; - bool write_res = AdbWriteEndpointSync(adb_write, &msg_send, sizeof(msg_send), &written_bytes, 0); - if (!write_res) { - printf("\n AdbWriteEndpointSync returned error %u", GetLastError()); - AdbCloseHandle(adb_write); - AdbCloseHandle(adb_read); - AdbCloseHandle(adb_interface); - return false; - } - - // Receive handshake - message msg_rcv; - ULONG read_bytes = 0; - bool read_res = AdbReadEndpointSync(adb_read, &msg_rcv, sizeof(msg_rcv), &read_bytes, 0); - if (!read_res) { - printf("\n AdbReadEndpointSync returned error %u", GetLastError()); - AdbCloseHandle(adb_write); - AdbCloseHandle(adb_read); - AdbCloseHandle(adb_interface); - return false; - } - - printf("\n Read handshake: %u bytes received", read_bytes); - char* cmd_ansi = reinterpret_cast(&msg_rcv.command); - printf("\n command = %08X (%c%c%c%c)", msg_rcv.command, - cmd_ansi[0], cmd_ansi[1], cmd_ansi[2], cmd_ansi[3]); - printf("\n arg0 = %08X", msg_rcv.arg0); - printf("\n arg1 = %08X", msg_rcv.arg1); - printf("\n data_length = %u", msg_rcv.data_length); - printf("\n data_crc32 = %08X", msg_rcv.data_crc32); - printf("\n magic = %08X", msg_rcv.magic); - - if (0 != msg_rcv.data_length) { - char* buf = reinterpret_cast(malloc(msg_rcv.data_length)); - read_res = AdbReadEndpointSync(adb_read, buf, msg_rcv.data_length, &read_bytes, 0); - if (!read_res) { - printf("\n AdbReadEndpointSync (data) returned error %u", GetLastError()); - free(buf); - AdbCloseHandle(adb_write); - AdbCloseHandle(adb_read); - AdbCloseHandle(adb_interface); - return false; - } - - for (ULONG n = 0; n < read_bytes; n++) { - if (0 == (n % 16)) - printf("\n "); - printf("%02X ", buf[n]); - } - - printf("\n %s", buf); - - delete buf; - } - - printf("\nPress any key to close handles..."); - getch(); - AdbCloseHandle(adb_write); - AdbCloseHandle(adb_read); - AdbCloseHandle(adb_interface); - - return true; -} - -bool RunInterfaceEnumTest() { - if (!RunInterfaceEnumTest(true, true, true)) - return false; - - if (!RunInterfaceEnumTest(false, false, false)) - return false; - - if (device_active) { - return true; - } else { - // Device has not found in the list of active devices - printf("\nPlease start the USB device emulator to run the tests"); - return false; - } -} - -bool RunInterfaceEnumTest(bool exclude_not_present, - bool exclude_removed, - bool active_only) { - printf("\n\n=== Running RunInterfaceEnumTest(%s, %s, %s)... ", - exclude_not_present ? "true" : "false", - exclude_removed ? "true" : "false", - active_only ? "true" : "false"); - - ADBAPIHANDLE adb_handle = - AdbEnumInterfaces(adb_class_id, exclude_not_present, exclude_removed, active_only); - if (NULL == adb_handle) { - printf("\n Unable to AdbEnumInterfaces. Error %u", GetLastError()); - return false; - } - - bool res; - - do { - AdbInterfaceInfo* info = NULL; - ULONG size = 0; - - res = AdbNextInterface(adb_handle, NULL, &size); - // We expect 'false' and GetLastError() being either ERROR_NO_MORE_ITEMS - // or ERROR_INSUFFICIENT_BUFFER - if (res || ((ERROR_INSUFFICIENT_BUFFER != GetLastError()) && - (ERROR_NO_MORE_ITEMS != GetLastError()))) { - printf("\n Unexpected AdbNextInterface(NULL) result. Res = %u, Error = %u", - res, GetLastError()); - AdbCloseHandle(adb_handle); - return false; - } - - if (ERROR_INSUFFICIENT_BUFFER == GetLastError()) { - info = reinterpret_cast(malloc(size)); - // Try one byte less than required length - size--; - res = AdbNextInterface(adb_handle, info, &size); - if (res || (ERROR_INSUFFICIENT_BUFFER != GetLastError())) { - printf("\n Unexpected AdbNextInterface(small) result. Res = %u, Error = %u", - res, GetLastError()); - free(info); - AdbCloseHandle(adb_handle); - return false; - } - - size++; - res = AdbNextInterface(adb_handle, info, &size); - - if (res) { - if (exclude_not_present && active_only && - (0 == wcsicmp(info->device_name, test_interface_name))) { - device_active = true; - } - } else { - printf("\n AdbNextInterface failed: %u", GetLastError()); - free(info); - AdbCloseHandle(adb_handle); - return false; - } - - free(info); - } else { - res = false; - } - } while (res); - - res = AdbCloseHandle(adb_handle); - if (!res) { - printf("\n Unable to AdbCloseHandle: %u", GetLastError()); - return false; - } - - // Closing closed handle - res = AdbCloseHandle(adb_handle); - if (res || (ERROR_INVALID_HANDLE != GetLastError())) { - printf("\n Unexpected AdbCloseHandle(closed) result. Ret = %u, Error = %u", - res, GetLastError()); - return false; - } - - printf(" SUCCESS."); - return true; -} - -bool RunInterfaceCreateTest() { - printf("\n\n=== Running RunInterfaceCreateTest()... "); - - ADBAPIHANDLE adb_interface = AdbCreateInterface(adb_class_id, - DEVICE_VENDOR_ID, - DEVICE_EMULATOR_PROD_ID, - 0xFF); - if (NULL == adb_interface) { - printf("\n AdbCreateInterface returned error %u", GetLastError()); - return false; - } - - // Gather information - USB_DEVICE_DESCRIPTOR dev_desc; - USB_CONFIGURATION_DESCRIPTOR config_desc; - USB_INTERFACE_DESCRIPTOR interface_desc; - - bool res = AdbGetUsbDeviceDescriptor(adb_interface, &dev_desc); - if (!res) { - printf("\n AdbGetUsbDeviceDescriptor error %u", GetLastError()); - res = AdbCloseHandle(adb_interface); - if (!res) - printf("\n Unable to AdbCloseHandle. Error %u", GetLastError()); - return false; - } - - res = AdbGetUsbConfigurationDescriptor(adb_interface, &config_desc); - if (!res) { - printf("\n AdbGetUsbDeviceDescriptor error %u", GetLastError()); - res = AdbCloseHandle(adb_interface); - if (!res) - printf("\n Unable to AdbCloseHandle. Error %u", GetLastError()); - return false; - } - - res = AdbGetUsbInterfaceDescriptor(adb_interface, &interface_desc); - if (!res) { - printf("\n AdbGetUsbDeviceDescriptor error %u", GetLastError()); - res = AdbCloseHandle(adb_interface); - if (!res) - printf("\n Unable to AdbCloseHandle. Error %u", GetLastError()); - return false; - } - - wchar_t* wide_buffer = NULL; - char* char_buffer = NULL; - ULONG buffer_size = 0; - - res = AdbGetInterfaceName(adb_interface, wide_buffer, &buffer_size, false); - if (!res) { - if (ERROR_INSUFFICIENT_BUFFER != GetLastError()) { - printf("\n Unable to AdbGetInterfaceName(NULL). Error %u", GetLastError()); - AdbCloseHandle(adb_interface); - return false; - } - wide_buffer = reinterpret_cast(malloc(buffer_size * sizeof(wchar_t))); - res = AdbGetInterfaceName(adb_interface, wide_buffer, &buffer_size, false); - if (!res) { - printf("\n Unable to AdbGetInterfaceName(%u). Error %u", buffer_size, GetLastError()); - AdbCloseHandle(adb_interface); - return false; - } - } - - res = AdbGetInterfaceName(adb_interface, char_buffer, &buffer_size, true); - if (!res) { - if (ERROR_INSUFFICIENT_BUFFER != GetLastError()) { - printf("\n Unable to AdbGetInterfaceName(NULL). Error %u", GetLastError()); - AdbCloseHandle(adb_interface); - return false; - } - char_buffer = reinterpret_cast(malloc(buffer_size * sizeof(char))); - res = AdbGetInterfaceName(adb_interface, char_buffer, &buffer_size, true); - if (!res) { - printf("\n Unable to AdbGetInterfaceName(%u). Error %u", buffer_size, GetLastError()); - AdbCloseHandle(adb_interface); - return false; - } - } - - res = AdbCloseHandle(adb_interface); - if (!res) { - res = AdbCloseHandle(adb_interface); - if (!res) - printf("\n Unable to AdbCloseHandle. Error %u", GetLastError()); - return false; - } - - res = AdbCloseHandle(adb_interface); - if (res || (ERROR_INVALID_HANDLE != GetLastError())) { - printf("\n Unexpected AdbCloseHandle(closed) result. Ret = %u, Error = %u", - res, GetLastError()); - return false; - } - - if (0 != memcmp(&dev_desc, &test_dev_desc, sizeof(USB_DEVICE_DESCRIPTOR))) { - printf("\n Wrong USB_DEVICE_DESCRIPTOR"); - return false; - } - - if (0 != memcmp(&config_desc, &test_config_desc, sizeof(USB_CONFIGURATION_DESCRIPTOR))) { - printf("\n Wrong USB_CONFIGURATION_DESCRIPTOR"); - return false; - } - - if (0 != memcmp(&interface_desc, &test_interface_desc, sizeof(USB_INTERFACE_DESCRIPTOR))) { - printf("\n Wrong USB_INTERFACE_DESCRIPTOR"); - return false; - } - - printf(" SUCCESS."); - return true; -} - -bool RunEndpointInfoTest() { - printf("\n\n=== Running RunEndpointInfoTest()"); - ADBAPIHANDLE adb_interface = AdbCreateInterface(adb_class_id, - DEVICE_VENDOR_ID, - DEVICE_EMULATOR_PROD_ID, - 0xFF); - if (NULL == adb_interface) { - printf("\n AdbCreateInterface returned error %u", GetLastError()); - return false; - } - - USB_INTERFACE_DESCRIPTOR interface_desc; - BOOL res = AdbGetUsbInterfaceDescriptor(adb_interface, &interface_desc); - if (!res) { - printf("\n AdbGetUsbDeviceDescriptor error %u", GetLastError()); - res = AdbCloseHandle(adb_interface); - if (!res) - printf("\n Unable to AdbCloseHandle. Error %u", GetLastError()); - return false; - } - - if (0 != memcmp(&interface_desc, &test_interface_desc, sizeof(USB_INTERFACE_DESCRIPTOR))) { - printf("\n Wrong USB_INTERFACE_DESCRIPTOR"); - res = AdbCloseHandle(adb_interface); - if (!res) - printf("\n Unable to AdbCloseHandle. Error %u", GetLastError()); - return false; - } - - for (UCHAR index = 0; index < interface_desc.bNumEndpoints; index++) { - if (!RunEndpointInfoTest(adb_interface, index)) { - res = AdbCloseHandle(adb_interface); - if (!res) - printf("\n Unable to AdbCloseHandle. Error %u", GetLastError()); - return false; - } - } - - if (RunEndpointInfoTest(adb_interface, index)) { - printf("\n Unexpected success of RunEndpointInfoTest(%u - invalid index)", index); - res = AdbCloseHandle(adb_interface); - if (!res) - printf("\n Unable to AdbCloseHandle. Error %u", GetLastError()); - return false; - } - - if (!RunEndpointInfoTest(adb_interface, ADB_QUERY_BULK_WRITE_ENDPOINT_INDEX)) - return false; - - if (!RunEndpointInfoTest(adb_interface, ADB_QUERY_BULK_READ_ENDPOINT_INDEX)) - return false; - - res = AdbCloseHandle(adb_interface); - if (!res) { - printf("\n Unable to AdbCloseHandle. Error %u", GetLastError()); - return false; - } - - return true; -} - -bool RunEndpointInfoTest(ADBAPIHANDLE adb_interface, UCHAR index) { - printf("\n======= Running RunEndpointInfoTest(%X)... ", index); - - AdbEndpointInformation info; - - if (!AdbGetEndpointInformation(adb_interface, index, &info)) { - if ((index < 2) || (ADB_QUERY_BULK_WRITE_ENDPOINT_INDEX == index) || - (ADB_QUERY_BULK_READ_ENDPOINT_INDEX == index)) { - printf("\n AdbGetEndpointInformation(u) failed: %u", index, GetLastError()); - } - return false; - } - - if (!CheckEndpointInfo(index, &info)) { - printf("\n Wrong AdbEndpointInformation(%X)", index); - return false; - } - - printf(" SUCCESS."); - return true; -} - -bool RunEndpointOpenTest() { - printf("\n\n=== Running RunEndpointOpenTest()... "); - ADBAPIHANDLE adb_interface = AdbCreateInterface(adb_class_id, - DEVICE_VENDOR_ID, - DEVICE_EMULATOR_PROD_ID, - 0xFF); - if (NULL == adb_interface) { - printf("\n AdbCreateInterface returned error %u", GetLastError()); - return false; - } - - USB_INTERFACE_DESCRIPTOR interface_desc; - BOOL res = AdbGetUsbInterfaceDescriptor(adb_interface, &interface_desc); - if (!res) { - printf("\n AdbGetUsbDeviceDescriptor error %u", GetLastError()); - res = AdbCloseHandle(adb_interface); - if (!res) - printf("\n Unable to AdbCloseHandle. Error %u", GetLastError()); - return false; - } - - ADBAPIHANDLE adb_endpoint = AdbOpenDefaultBulkReadEndpoint(adb_interface, - AdbOpenAccessTypeReadWrite, - AdbOpenSharingModeReadWrite); - if (NULL == adb_endpoint) { - printf("\n AdbOpenDefaultBulkReadEndpoint error %u", GetLastError()); - res = AdbCloseHandle(adb_interface); - if (!res) - printf("\n Unable to AdbCloseHandle. Error %u", GetLastError()); - return false; - } - - // Make sure that we can't write to it - ULONG transfer = 0; - res = AdbWriteEndpointSync(adb_endpoint, - &adb_endpoint, - sizeof(adb_endpoint), - &transfer, - 0); - if (res || (ERROR_ACCESS_DENIED != GetLastError())) { - printf("\n AdbWriteEndpoint failure: Ret = %u, error = %u", res, GetLastError()); - AdbCloseHandle(adb_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - AdbCloseHandle(adb_endpoint); - - adb_endpoint = AdbOpenDefaultBulkWriteEndpoint(adb_interface, - AdbOpenAccessTypeReadWrite, - AdbOpenSharingModeReadWrite); - if (NULL == adb_endpoint) { - printf("\n AdbOpenDefaultBulkWriteEndpoint error %u", GetLastError()); - res = AdbCloseHandle(adb_interface); - if (!res) - printf("\n Unable to AdbCloseHandle. Error %u", GetLastError()); - return false; - } - - // Make sure we cannot read from it - ULONG to_read; - res = AdbReadEndpointSync(adb_endpoint, - &to_read, - sizeof(to_read), - &transfer, - 0); - if (res || (ERROR_ACCESS_DENIED != GetLastError())) { - printf("\n AdbReadEndpoint failure: Ret = %u, error = %u", res, GetLastError()); - AdbCloseHandle(adb_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - AdbCloseHandle(adb_endpoint); - - for (UCHAR index = 0; index < interface_desc.bNumEndpoints; index++) { - if (!RunEndpointOpenTest(adb_interface, index)) { - res = AdbCloseHandle(adb_interface); - if (!res) - printf("\n Unable to AdbCloseHandle. Error %u", GetLastError()); - return false; - } - } - - if (RunEndpointOpenTest(adb_interface, index)) { - printf("\nRunEndpointOpenTest failed: succeeded on invalid EP %u", index); - res = AdbCloseHandle(adb_interface); - if (!res) - printf("\n Unable to AdbCloseHandle. Error %u", GetLastError()); - return false; - } - - if (!RunEndpointOpenTest(adb_interface, ADB_QUERY_BULK_WRITE_ENDPOINT_INDEX)) { - res = AdbCloseHandle(adb_interface); - if (!res) - printf("\n Unable to AdbCloseHandle. Error %u", GetLastError()); - return false; - } - - if (!RunEndpointOpenTest(adb_interface, ADB_QUERY_BULK_READ_ENDPOINT_INDEX)) { - res = AdbCloseHandle(adb_interface); - if (!res) - printf("\n Unable to AdbCloseHandle. Error %u", GetLastError()); - return false; - } - - res = AdbCloseHandle(adb_interface); - if (!res) { - printf("\n Unable to AdbCloseHandle. Error %u", GetLastError()); - return false; - } - - return true; -} - -bool RunEndpointOpenTest(ADBAPIHANDLE adb_interface, UCHAR index) { - printf("\n======= Running RunEndpointOpenTest(%X)... ", index); - ADBAPIHANDLE adb_endpoint = AdbOpenEndpoint(adb_interface, - index, - AdbOpenAccessTypeReadWrite, - AdbOpenSharingModeReadWrite); - if (NULL == adb_endpoint) { - if ((index < 2) || (ADB_QUERY_BULK_WRITE_ENDPOINT_INDEX == index) || - (ADB_QUERY_BULK_READ_ENDPOINT_INDEX == index)) { - printf("\n AdbOpenEndpoint(%X) error %u", index, GetLastError()); - } - return false; - } - - ADBAPIHANDLE parent = AdbGetEndpointInterface(adb_endpoint); - if (parent != adb_interface) { - printf("\n AdbGetEndpointInterface(%X) failure: expected %p returned %p, error %u", - index, adb_interface, parent, GetLastError()); - AdbCloseHandle(adb_endpoint); - return false; - } - - AdbEndpointInformation info; - if (!AdbQueryInformationEndpoint(adb_endpoint, &info)) { - printf("\n Unable to AdbGetEndpointInformationForHandle(%X): %u", - index, GetLastError()); - AdbCloseHandle(adb_endpoint); - return false; - } - - if (!CheckEndpointInfo(index, &info)) { - printf("\n Wrong AdbEndpointInformation(%X)", index); - AdbCloseHandle(adb_endpoint); - return false; - } - - AdbCloseHandle(adb_endpoint); - - printf(" SUCCESS"); - return true; -} - -bool RunEndpointIoTest(ULONG time_out_base) { - printf("\n\n=== Running RunEndpointIoTest(%u)... ", time_out_base); - ADBAPIHANDLE adb_interface = AdbCreateInterface(adb_class_id, - DEVICE_VENDOR_ID, - DEVICE_EMULATOR_PROD_ID, - 0xFF); - if (NULL == adb_interface) { - printf("\n AdbCreateInterface returned error %u", GetLastError()); - return false; - } - - ADBAPIHANDLE adb_read_endpoint = - AdbOpenDefaultBulkReadEndpoint(adb_interface, - AdbOpenAccessTypeReadWrite, - AdbOpenSharingModeReadWrite); - if (NULL == adb_read_endpoint) { - printf("\n AdbOpenDefaultBulkReadEndpoint error %u", GetLastError()); - AdbCloseHandle(adb_interface); - return false; - } - - ADBAPIHANDLE adb_write_endpoint = - AdbOpenDefaultBulkWriteEndpoint(adb_interface, - AdbOpenAccessTypeReadWrite, - AdbOpenSharingModeReadWrite); - if (NULL == adb_write_endpoint) { - printf("\n AdbOpenDefaultBulkWriteEndpoint error %u", GetLastError()); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - AdbEndpointInformation read_info; - AdbEndpointInformation write_info; - - if (!AdbQueryInformationEndpoint(adb_read_endpoint, &read_info)) { - printf("\n AdbQueryInformationEndpoint(read) error %u", GetLastError()); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - if (!AdbQueryInformationEndpoint(adb_write_endpoint, &write_info)) { - printf("\n AdbQueryInformationEndpoint(write) error %u", GetLastError()); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - char read_buf[40960]; - char write_buf[40960]; - ULONG written, read; - ULONG small_block = 101; - ULONG partial_small_block = small_block - 10; - ULONG large_block = write_info.max_packet_size * 3 + 3; - - bool wr_res; - bool rd_res; - - // Simple synchronous write / read of a small block - memset(write_buf, '0', small_block); - wr_res = AdbWriteEndpointSync(adb_write_endpoint, write_buf, small_block, &written, time_out_base * small_block); - if (!wr_res || (written != small_block)) { - printf("\n AdbWriteEndpointSync(%u) failure (%u). Written %u. Error %u", - small_block, wr_res, written, GetLastError()); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - rd_res = AdbReadEndpointSync(adb_read_endpoint, read_buf, small_block, &read, time_out_base * small_block); - if (!rd_res || (small_block != read)) { - printf("\n AdbReadEndpointSync(%u) failure (%u). Read %u. Error %u", - small_block, rd_res, read, GetLastError()); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - if (0 != memcmp(read_buf, write_buf, read)) { - printf("\n Simple sync r/w %u data wrong.", small_block); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - // Simple synchronous write / read of a large block - memset(write_buf, '1', large_block); - wr_res = AdbWriteEndpointSync(adb_write_endpoint, write_buf, large_block, &written, time_out_base * large_block); - if (!wr_res || (written != large_block)) { - printf("\n AdbWriteEndpointSync(%u) failure (%u). Written %u. Error %u", - large_block, wr_res, written, GetLastError()); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - rd_res = AdbReadEndpointSync(adb_read_endpoint, read_buf, large_block, &read, time_out_base * large_block); - if (!rd_res || (large_block != read)) { - printf("\n AdbReadEndpointSync(%u) failure (%u). Read %u. Error %u", - large_block, rd_res, read, GetLastError()); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - if (0 != memcmp(read_buf, write_buf, read)) { - printf("\n Simple sync r/w %u data wrong.", large_block); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - // Simple synchronous write / partial read of a small block - memset(write_buf, 'u', small_block); - wr_res = AdbWriteEndpointSync(adb_write_endpoint, write_buf, partial_small_block, &written, time_out_base * small_block); - if (!wr_res || (written != partial_small_block)) { - printf("\n AdbWriteEndpointSync(%u) failure (%u). Written %u. Error %u", - partial_small_block, wr_res, written, GetLastError()); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - rd_res = AdbReadEndpointSync(adb_read_endpoint, read_buf, small_block, &read, time_out_base * small_block); - if (!rd_res || (partial_small_block != read)) { - printf("\n AdbReadEndpointSync(%u) failure (%u). Read %u. Error %u", - partial_small_block, rd_res, read, GetLastError()); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - if (0 != memcmp(read_buf, write_buf, read)) { - printf("\n Simple sync r/w %u data wrong.", small_block); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - // Simple Aynchronous write / read - memset(write_buf, 'A', small_block); - - ADBAPIHANDLE adb_w_complete = - AdbWriteEndpointAsync(adb_write_endpoint, write_buf, small_block, &written, time_out_base * small_block, NULL); - - if (NULL == adb_w_complete) { - printf("\n AdbWriteEndpointAsync(%u) error %u", - small_block, GetLastError()); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - wr_res = AdbGetOvelappedIoResult(adb_w_complete, NULL, &written, true); - if (!wr_res || (small_block != written)) { - printf("\n AdbGetOvelappedIoResult(write %u) failure (%u). Error %u, written %u", - small_block, wr_res, GetLastError(), written); - AdbCloseHandle(adb_w_complete); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - AdbCloseHandle(adb_w_complete); - - ADBAPIHANDLE adb_r_complete = - AdbReadEndpointAsync(adb_read_endpoint, read_buf, small_block, &read, time_out_base * small_block, NULL); - if (NULL == adb_r_complete) { - printf("\n AdbReadEndpointAsync(%u) error %u", small_block, GetLastError()); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - rd_res = AdbGetOvelappedIoResult(adb_r_complete, NULL, &read, true); - if (!rd_res || (read != small_block)) { - printf("\n AdbGetOvelappedIoResult(read %u) failure (%u). Error %u, read %u", - small_block, rd_res, GetLastError(), read); - AdbCloseHandle(adb_r_complete); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - AdbCloseHandle(adb_r_complete); - - if (0 != memcmp(read_buf, write_buf, read)) { - printf("\n Simple async r/w %u data wrong", small_block); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - // Large Aynchronous write / read - memset(write_buf, 'B', large_block); - - adb_w_complete = - AdbWriteEndpointAsync(adb_write_endpoint, write_buf, large_block, &written, time_out_base * large_block, NULL); - - if (NULL == adb_w_complete) { - printf("\n AdbWriteEndpointAsync(%u) error %u", - large_block, GetLastError()); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - wr_res = AdbGetOvelappedIoResult(adb_w_complete, NULL, &written, true); - if (!wr_res || (large_block != written)) { - printf("\n AdbGetOvelappedIoResult(write %u) failure (%u). Error %u, written %u", - large_block, wr_res, GetLastError(), written); - AdbCloseHandle(adb_w_complete); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - AdbCloseHandle(adb_w_complete); - - adb_r_complete = - AdbReadEndpointAsync(adb_read_endpoint, read_buf, large_block, &read, time_out_base * large_block, NULL); - if (NULL == adb_r_complete) { - printf("\n AdbReadEndpointAsync(%u) error %u", large_block, GetLastError()); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - rd_res = AdbGetOvelappedIoResult(adb_r_complete, NULL, &read, true); - if (!rd_res || (read != large_block)) { - printf("\n AdbGetOvelappedIoResult(read %u) failure (%u). Error %u, read %u", - large_block, rd_res, GetLastError(), read); - AdbCloseHandle(adb_r_complete); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - AdbCloseHandle(adb_r_complete); - - if (0 != memcmp(read_buf, write_buf, read)) { - printf("\n Simple async r/w %u data wrong", large_block); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - // We disable this test because our new read model is no longer accumulative -#if 0 - // One async read, many async writes - ULONG total = write_info.max_packet_size * 5 + 3; - ULONG block1 = write_info.max_packet_size + 1; - ULONG block2 = write_info.max_packet_size * 3 + 7; - ULONG block3 = total - block2 - block1; - memset(write_buf, 'a', block1); - memset(write_buf + block1, 'b', block2); - memset(write_buf + block1 + block2, 'c', block3); - - adb_r_complete = - AdbReadEndpointAsync(adb_read_endpoint, read_buf, total, &read, time_out_base * total, NULL); - if (NULL == adb_r_complete) { - printf("\n AdbReadEndpointAsync(%u) error %u", total, GetLastError()); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - rd_res = AdbGetOvelappedIoResult(adb_r_complete, NULL, &read, false); - if (rd_res || (GetLastError() != ERROR_IO_INCOMPLETE)) { - printf("\n AdbGetOvelappedIoResult(read %u) failure (%u). Error %u, read %u", - total, rd_res, GetLastError(), read); - AdbCloseHandle(adb_r_complete); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - ADBAPIHANDLE adb_w_complete1 = - AdbWriteEndpointAsync(adb_write_endpoint, write_buf, block1, &written, time_out_base * block1, NULL); - if (NULL == adb_w_complete1) { - printf("\n Multiwrite block 1 AdbWriteEndpointAsync(%u) error %u", - block1, GetLastError()); - AdbCloseHandle(adb_r_complete); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - ADBAPIHANDLE adb_w_complete2 = - AdbWriteEndpointAsync(adb_write_endpoint, write_buf + block1, block2, &written, time_out_base * block2, NULL); - if (NULL == adb_w_complete2) { - printf("\n Multiwrite block 2 AdbWriteEndpointAsync(%u) error %u", - block1, GetLastError()); - AdbCloseHandle(adb_w_complete1); - AdbCloseHandle(adb_r_complete); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - ADBAPIHANDLE adb_w_complete3 = - AdbWriteEndpointAsync(adb_write_endpoint, write_buf + block1 + block2, block3, &written, time_out_base * block3, NULL); - if (NULL == adb_w_complete3) { - printf("\n Multiwrite block 3 AdbWriteEndpointAsync(%u) error %u", - block1, GetLastError()); - AdbCloseHandle(adb_w_complete2); - AdbCloseHandle(adb_w_complete1); - AdbCloseHandle(adb_r_complete); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - rd_res = AdbGetOvelappedIoResult(adb_r_complete, NULL, &read, true); - if (!rd_res || (read != total)) { - printf("\n AdbGetOvelappedIoResult(read %u) failure (%u). Error %u, read %u", - total, rd_res, GetLastError(), read); - AdbCloseHandle(adb_w_complete3); - AdbCloseHandle(adb_w_complete2); - AdbCloseHandle(adb_w_complete1); - AdbCloseHandle(adb_r_complete); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - AdbCloseHandle(adb_r_complete); - - wr_res = AdbGetOvelappedIoResult(adb_w_complete3, NULL, &written, true); - if (!wr_res || (block3 != written)) { - printf("\n Multiwrite block 3 AdbGetOvelappedIoResult(write %u) failure (%u). Error %u, written %u", - block3, wr_res, GetLastError(), written); - AdbCloseHandle(adb_w_complete3); - AdbCloseHandle(adb_w_complete2); - AdbCloseHandle(adb_w_complete1); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - AdbCloseHandle(adb_w_complete3); - - wr_res = AdbGetOvelappedIoResult(adb_w_complete2, NULL, &written, true); - if (!wr_res || (block2 != written)) { - printf("\n Multiwrite block 2 AdbGetOvelappedIoResult(write %u) failure (%u). Error %u, written %u", - block2, wr_res, GetLastError(), written); - AdbCloseHandle(adb_w_complete2); - AdbCloseHandle(adb_w_complete1); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - AdbCloseHandle(adb_w_complete2); - - wr_res = AdbGetOvelappedIoResult(adb_w_complete1, NULL, &written, true); - if (!wr_res || (block1 != written)) { - printf("\n Multiwrite block 1 AdbGetOvelappedIoResult(write %u) failure (%u). Error %u, written %u", - block1, wr_res, GetLastError(), written); - AdbCloseHandle(adb_w_complete1); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - AdbCloseHandle(adb_w_complete1); -#endif // 0 - -#if 0 - // Async writes are not syncronized - if (0 != memcmp(read_buf, write_buf, block1)) { - printf("\n First block wrong"); - } else { - if (0 != memcmp(read_buf + block1, write_buf + block1, block2)) { - printf("\n Second block wrong"); - } else { - if (0 != memcmp(read_buf + block1 + block2, write_buf + block1 + block2, block3)) { - printf("\n Second block wrong"); - } - } - } -#endif // 0 - - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - - printf(" SUCCESS."); - return true; -} - -bool RunTimeoutsTest() { - printf("\n\n=== Running RunTimeoutsTest... "); - ADBAPIHANDLE adb_interface = AdbCreateInterface(adb_class_id, - DEVICE_VENDOR_ID, - DEVICE_EMULATOR_PROD_ID, - 0xFF); - if (NULL == adb_interface) { - printf("\n AdbCreateInterface returned error %u", GetLastError()); - return false; - } - - ADBAPIHANDLE adb_read_endpoint = - AdbOpenDefaultBulkReadEndpoint(adb_interface, - AdbOpenAccessTypeReadWrite, - AdbOpenSharingModeReadWrite); - if (NULL == adb_read_endpoint) { - printf("\n AdbOpenDefaultBulkReadEndpoint error %u", GetLastError()); - AdbCloseHandle(adb_interface); - return false; - } - - ADBAPIHANDLE adb_write_endpoint = - AdbOpenDefaultBulkWriteEndpoint(adb_interface, - AdbOpenAccessTypeReadWrite, - AdbOpenSharingModeReadWrite); - if (NULL == adb_write_endpoint) { - printf("\n AdbOpenDefaultBulkWriteEndpoint error %u", GetLastError()); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - char read_buf[40960]; - char write_buf[40960]; - ULONG written, read; - ULONG small_block = 60; - - // Test virtually no timeouts - for (int n = 0; n < 8; n++) { - memset(write_buf, 'S', small_block); - bool wr_res = AdbWriteEndpointSync(adb_write_endpoint, write_buf, small_block, &written, 0xFFFFFFF); - if (!wr_res || (written != small_block)) { - printf("\n AdbWriteEndpointSync(%u) failure (%u). Written %u. Error %u", - small_block, wr_res, written, GetLastError()); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - bool rd_res = AdbReadEndpointSync(adb_read_endpoint, read_buf, small_block, &read, 0xFFFFFFF); - if (!rd_res || (small_block != read)) { - printf("\n AdbReadEndpointSync(%u) failure (%u). Read %u. Error %u", - small_block, rd_res, read, GetLastError()); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - if (0 != memcmp(read_buf, write_buf, read)) { - printf("\n Simple sync r/w %u data wrong.", small_block); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - } -/* - ULONG large_block = 2048; - - // Test rediculously small timeouts - for (n = 0; n < 20; n++) { - memset(write_buf, 'L', large_block); - bool wr_res = AdbWriteEndpointSync(adb_write_endpoint, write_buf, large_block, &written, 1); - if (!wr_res || (written != small_block)) { - printf("\n AdbWriteEndpointSync(%u) failure (%u). Written %u. Error %u", - large_block, wr_res, written, GetLastError()); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - bool rd_res = AdbReadEndpointSync(adb_read_endpoint, read_buf, large_block, &read, 1); - if (!rd_res || (small_block != read)) { - printf("\n AdbReadEndpointSync(%u) failure (%u). Read %u. Error %u", - large_block, rd_res, read, GetLastError()); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - - if (0 != memcmp(read_buf, write_buf, read)) { - printf("\n Simple sync r/w %u data wrong.", small_block); - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - return false; - } - } -*/ - AdbCloseHandle(adb_write_endpoint); - AdbCloseHandle(adb_read_endpoint); - AdbCloseHandle(adb_interface); - - printf(" SUCCESS."); - return true; -} - -bool CheckEndpointInfo(UCHAR index, AdbEndpointInformation* info) { - AdbEndpointInformation* cmp; - - switch (index) { - case test_read_pipe_index: - case ADB_QUERY_BULK_READ_ENDPOINT_INDEX: - cmp = test_read_pipe; - break; - - default: - cmp = test_write_pipe; - break; - }; - - if ((info->max_packet_size != cmp->max_packet_size) || - (info->endpoint_address != cmp->endpoint_address) || - (info->polling_interval != cmp->polling_interval) || - (info->setting_index != cmp->setting_index) || - (info->endpoint_type != cmp->endpoint_type) || - (info->max_transfer_size != cmp->max_transfer_size)) { - return false; - } - - return true; -} - -/* - printf("\n***** USB_DEVICE_DESCRIPTOR"); - printf("\n bDescriptorType = %u", dev_desc.bDescriptorType); - printf("\n bcdUSB = x%02X", dev_desc.bcdUSB); - printf("\n bDeviceClass = x%02X", dev_desc.bDeviceClass); - printf("\n bDeviceSubClass = x%02X", dev_desc.bDeviceSubClass); - printf("\n bDeviceProtocol = x%02X", dev_desc.bDeviceProtocol); - printf("\n bMaxPacketSize = %u", dev_desc.bMaxPacketSize0); - printf("\n idVendor = x%04X", dev_desc.idVendor); - printf("\n idProduct = x%04X", dev_desc.idProduct); - printf("\n bcdDevice = x%02X", dev_desc.bcdDevice); - printf("\n iManufacturer = %u", dev_desc.iManufacturer); - printf("\n iProduct = %u", dev_desc.iProduct); - printf("\n iSerialNumber = %u", dev_desc.iSerialNumber); - printf("\n bNumConfigurations = %u", dev_desc.bNumConfigurations); - - printf("\n\n***** USB_CONFIGURATION_DESCRIPTOR"); - printf("\n bDescriptorType = %u", config_desc.bDescriptorType); - printf("\n wTotalLength = %u", config_desc.wTotalLength); - printf("\n bNumInterfaces = %u", config_desc.bNumInterfaces); - printf("\n bConfigurationValue = %u", config_desc.bConfigurationValue); - printf("\n iConfiguration = %u", config_desc.iConfiguration); - printf("\n bmAttributes = %u", config_desc.bmAttributes); - printf("\n MaxPower = %u", config_desc.MaxPower); - - printf("\n\n***** USB_INTERFACE_DESCRIPTOR"); - printf("\n bLength = %u", interface_desc.bLength); - printf("\n bDescriptorType = %u", interface_desc.bDescriptorType); - printf("\n bInterfaceNumber = %u", interface_desc.bInterfaceNumber); - printf("\n bAlternateSetting = %u", interface_desc.bAlternateSetting); - printf("\n bNumEndpoints = %u", interface_desc.bNumEndpoints); - printf("\n bInterfaceClass = x%02X", interface_desc.bInterfaceClass); - printf("\n bInterfaceSubClass = x%02X", interface_desc.bInterfaceSubClass); - printf("\n bInterfaceProtocol = x%02X", interface_desc.bInterfaceProtocol); - printf("\n iInterface = %u", interface_desc.iInterface); - - printf("\n***** ENDPOINT[%X]", index); - printf("\n MaximumPacketSize = %u", info.max_packet_size); - printf("\n EndpointAddress = x%02X", info.endpoint_address); - printf("\n Interval = %u", info.polling_interval); - printf("\n SettingIndex = %u", info.setting_index); - printf("\n PipeType = %u", info.endpoint_type); - printf("\n MaximumTransferSize = %u", info.max_transfer_size); -*/ diff --git a/host/windows/usb/test/android_usb_test/android_usb_test.sln b/host/windows/usb/test/android_usb_test/android_usb_test.sln deleted file mode 100644 index 1202096b7..000000000 --- a/host/windows/usb/test/android_usb_test/android_usb_test.sln +++ /dev/null @@ -1,29 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "android_usb_test", "android_usb_test.vcproj", "{9C6DBEED-9D2C-4FD8-B83D-88254035F78B}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AdbWinApi", "..\..\api\AdbWinApi.vcproj", "{C0A471E9-6892-4270-96DE-DB5F8D526FB1}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {9C6DBEED-9D2C-4FD8-B83D-88254035F78B}.Debug.ActiveCfg = Debug|Win32 - {9C6DBEED-9D2C-4FD8-B83D-88254035F78B}.Debug.Build.0 = Debug|Win32 - {9C6DBEED-9D2C-4FD8-B83D-88254035F78B}.Release.ActiveCfg = Release|Win32 - {9C6DBEED-9D2C-4FD8-B83D-88254035F78B}.Release.Build.0 = Release|Win32 - {C0A471E9-6892-4270-96DE-DB5F8D526FB1}.Debug.ActiveCfg = Debug|Win32 - {C0A471E9-6892-4270-96DE-DB5F8D526FB1}.Debug.Build.0 = Debug|Win32 - {C0A471E9-6892-4270-96DE-DB5F8D526FB1}.Release.ActiveCfg = Release|Win32 - {C0A471E9-6892-4270-96DE-DB5F8D526FB1}.Release.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/host/windows/usb/test/android_usb_test/android_usb_test.vcproj b/host/windows/usb/test/android_usb_test/android_usb_test.vcproj deleted file mode 100644 index ff93586f7..000000000 --- a/host/windows/usb/test/android_usb_test/android_usb_test.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/host/windows/usb/test/android_usb_test/stdafx.cpp b/host/windows/usb/test/android_usb_test/stdafx.cpp deleted file mode 100644 index 536a4ef11..000000000 --- a/host/windows/usb/test/android_usb_test/stdafx.cpp +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// stdafx.cpp : source file that includes just the standard includes -// android_usb_test.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file diff --git a/host/windows/usb/test/android_usb_test/stdafx.h b/host/windows/usb/test/android_usb_test/stdafx.h deleted file mode 100644 index ab0e1651c..000000000 --- a/host/windows/usb/test/android_usb_test/stdafx.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#pragma once - - -#include -#include -#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit - -#include -#pragma warning(disable: 4200) -extern "C" { -#include -} -#include "android_usb_common_defines.h" -#include "adb_api.h" - -// TODO: reference additional headers your program requires here diff --git a/host/windows/usb/test/device_emulator/DeviceEmulator.cpp b/host/windows/usb/test/device_emulator/DeviceEmulator.cpp deleted file mode 100644 index 155a6f667..000000000 --- a/host/windows/usb/test/device_emulator/DeviceEmulator.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** \file - This file definies entry point for the DLL. - This project has been created from DDK's SoftUSBLoopback sample project - that is located at $(DDK_PATH)\src\Test\DSF\USB\SoftUSBLoopback -*/ - -#include "stdafx.h" -#include "resource.h" -#include -#include -#include -#include "LoopbackDevice.h" -#include "DeviceEmulator.h" - -class CDeviceEmulatorModule : public CAtlDllModuleT { - public: - DECLARE_LIBID(LIBID_DeviceEmulatorLib) - DECLARE_REGISTRY_APPID_RESOURCEID(IDR_DEVICEEMULATOR, "{D1C80253-8DB4-4F72-BF74-270A0EDA1FA9}") -}; - -CDeviceEmulatorModule _AtlModule; - -///////////////////////////////////////////////////////////////////////////// -// DLL Entry Point - -extern "C" -BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { - hInstance; - return _AtlModule.DllMain(dwReason, lpReserved); -} - -///////////////////////////////////////////////////////////////////////////// -// Used to determine whether the DLL can be unloaded by OLE - -STDAPI DllCanUnloadNow(void) { - return (_AtlModule.DllCanUnloadNow()); -} - -///////////////////////////////////////////////////////////////////////////// -// Returns a class factory to create an object of the requested type - -STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { - return _AtlModule.DllGetClassObject(rclsid, riid, ppv); -} - -///////////////////////////////////////////////////////////////////////////// -// DllRegisterServer - Adds entries to the system registry - -STDAPI DllRegisterServer(void) { - // registers object, typelib and all interfaces in typelib - HRESULT hr = _AtlModule.DllRegisterServer(); - return hr; -} - -///////////////////////////////////////////////////////////////////////////// -// DllUnregisterServer - Removes entries from the system registry - -STDAPI DllUnregisterServer(void) { - HRESULT hr = _AtlModule.DllUnregisterServer(); - return hr; -} - - - - - diff --git a/host/windows/usb/test/device_emulator/DeviceEmulator.def b/host/windows/usb/test/device_emulator/DeviceEmulator.def deleted file mode 100644 index 2a7cd7cf9..000000000 --- a/host/windows/usb/test/device_emulator/DeviceEmulator.def +++ /dev/null @@ -1,16 +0,0 @@ -;Module Name: -; -; DeviceEmulator.def -; -;Abstract: -; Declares the module parameters -; - -LIBRARY "DeviceEmulator.DLL" - -EXPORTS - DllCanUnloadNow PRIVATE - DllGetClassObject PRIVATE - DllRegisterServer PRIVATE - DllUnregisterServer PRIVATE - diff --git a/host/windows/usb/test/device_emulator/DeviceEmulator.idl b/host/windows/usb/test/device_emulator/DeviceEmulator.idl deleted file mode 100644 index 9b60eb225..000000000 --- a/host/windows/usb/test/device_emulator/DeviceEmulator.idl +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** \file - This file consists of library definition for DeviceEmulator device. - This project has been created from DDK's SoftUSBLoopback sample project - that is located at $(DDK_PATH)\src\Test\DSF\USB\SoftUSBLoopback -*/ - -import "oaidl.idl"; -import "ocidl.idl"; - -[ - uuid(0C206596-5CC2-4d16-898D-4D1699BB6282), - version(1.0), - helpstring("DeviceEmulator 1.0 Type Library") -] -library DeviceEmulatorLib -{ - importlib("stdole2.tlb"); - importlib("dsfif.tlb"); - - - [ - object, - uuid(0A7E88B6-E38F-4d78-ABA3-AA30DC836B7D), - oleautomation, - dual, - nonextensible, - helpstring("ILoopbackDevice Interface"), - pointer_default(unique) - ] - interface ILoopbackDevice : IDispatch - { - [ - propget, - id(1), - helpstring("property DSFDevice") - ] - HRESULT DSFDevice([out, retval] DSFDevice** ppDSFDEevice); - - [ - id(2), - helpstring("Demonstrates how to use the queue method to read/write data") - ] - HRESULT _stdcall DoPolledLoopback([in] long LoopInterval); - - [ - id(3), - helpstring("Demonstrates how to use the eventing mechanism to read/write data") - ] - HRESULT _stdcall StartEventProcessing(); - - [ - id(4), - helpstring("Starts event-driven simulation and returns immediately to caller.") - ] - HRESULT _stdcall StartAsyncEventProcessing(); - - [ - id(5), - helpstring("Stops event-driven simulation started by a prior call to StartAsyncEventProcessing.") - ] - HRESULT _stdcall StopAsyncEventProcessing(); - - [ - id(6), - helpstring("Check to see if there is any key strokes to be processed") - ] - HRESULT AreKeystrokesWaiting([out, retval] VARIANT_BOOL *pfvarKeysWaiting); - }; - - [ - uuid(4F28A221-47B1-4f74-9ECC-CEADEDA0A287), - nonextensible, - helpstring("Loopback device event interface."), - - ] - dispinterface ILoopbackDeviceEvents - { - properties: - methods: - [ - id(1), - helpstring("Detemine if the device should stop polling the endpoint for data") - ] - HRESULT _stdcall ContinueToPoll([out,retval] VARIANT_BOOL *pfvarConitnue); - - [ - id(2), - helpstring("Detemine if the device should stop the event processing") - ] - HRESULT _stdcall ContinueEventProcessing([out,retval] VARIANT_BOOL *pfvarConitnue); - } - - [ - uuid(9A0BD4A6-E346-4668-A89C-ACA546212CD4), - helpstring("LoopbackDevice Class") - ] - coclass LoopbackDevice - { - [default] interface ILoopbackDevice; - [default, source] dispinterface ILoopbackDeviceEvents; - }; -}; - diff --git a/host/windows/usb/test/device_emulator/DeviceEmulator.rc b/host/windows/usb/test/device_emulator/DeviceEmulator.rc deleted file mode 100644 index 89fcd042b..000000000 --- a/host/windows/usb/test/device_emulator/DeviceEmulator.rc +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** \file - Resource file for Device USB emulator. -*/ -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "winres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""winres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "1 TYPELIB ""DeviceEmulator.tlb""\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,0,0,1 - PRODUCTVERSION 1,0,0,1 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904e4" - BEGIN - VALUE "CompanyName", "Google, Inc." - VALUE "FileDescription", "Device USB Device Emulator" - VALUE "FileVersion", "1.0.0.1" - VALUE "LegalCopyright", "Copyright (C) 2007 The Android Open Source Project" - VALUE "InternalName", "DeviceEmulator.dll" - VALUE "OriginalFilename", "DeviceEmulator.dll" - VALUE "ProductName", "Android" - VALUE "ProductVersion", "1.0.0.1" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1252 - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// REGISTRY -// - -IDR_DEVICEEMULATOR REGISTRY "DeviceEmulator.rgs" -IDR_LOOPBACKDEVICE REGISTRY "LoopbackDevice.rgs" - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE -BEGIN - IDS_PROJNAME "DeviceEmulator" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// -1 TYPELIB "DeviceEmulator.tlb" - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - - diff --git a/host/windows/usb/test/device_emulator/DeviceEmulator.rgs b/host/windows/usb/test/device_emulator/DeviceEmulator.rgs deleted file mode 100644 index a660ea560..000000000 --- a/host/windows/usb/test/device_emulator/DeviceEmulator.rgs +++ /dev/null @@ -1,12 +0,0 @@ -HKCR -{ - NoRemove AppID - { - '%APPID%' = s 'DeviceEmulator' - 'DeviceEmulator.EXE' - { - val AppID = s '%APPID%' - } - } -} - diff --git a/host/windows/usb/test/device_emulator/LoopbackDevice.cpp b/host/windows/usb/test/device_emulator/LoopbackDevice.cpp deleted file mode 100644 index 64ca8c6ba..000000000 --- a/host/windows/usb/test/device_emulator/LoopbackDevice.cpp +++ /dev/null @@ -1,796 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** \file - This file consists of implementation of the class CLoopbackDevice: - Implements the interface ILoopbackDevice and - configures the loopback device to be a valid USB device. - The device then processes input to its endpoint in one of - two ways. - - 1. By running in polled mode where the data is simply - passed from the OUT Endpoint to the IN Endpoint - - or - 2. In Event mode where the loopback device receives a - callback to indicate that data needs to be processed, - and then processes the data. - This project has been created from DDK's SoftUSBLoopback sample project - that is located at $(DDK_PATH)\src\Test\DSF\USB\SoftUSBLoopback -*/ - -#include "stdafx.h" -#include -#include -#include -#include -#include -#include "android_usb_common_defines.h" -#include "adb_api_extra.h" -#include "LoopbackDevice.h" -#include "DeviceEmulator_i.c" - -// These are the indexes of the string descriptors. They are used both -// as the indexes of the strings with SoftUSBDevice.Strings and as the -// string descriptor index property values on the various objects (e.g. -// SoftUSBDevice.Manufacturer = STRING_IDX_MANUFACTURER). - -#define STRING_IDX_MANUFACTURER 1 -#define STRING_IDX_PRODUCT_DESC 2 -#define STRING_IDX_SERIAL_NO 3 -#define STRING_IDX_CONFIG 4 -#define STRING_IDX_INTERFACE 5 - -CLoopbackDevice::CLoopbackDevice() { - InitMemberVariables(); -} - -CLoopbackDevice::~CLoopbackDevice() { - // Release the conneciton point - ReleaseConnectionPoint(); - - // Release any interface which the device is holding - RELEASE(m_piConnectionPoint); - RELEASE(m_piINEndpoint); - RELEASE(m_piOUTEndpoint); - - if (NULL != m_piSoftUSBDevice) { - (void)m_piSoftUSBDevice->Destroy(); - RELEASE(m_piSoftUSBDevice); - } - - InitMemberVariables(); -} - -void CLoopbackDevice::InitMemberVariables() { - m_piSoftUSBDevice = NULL; - m_piINEndpoint = NULL; - m_piOUTEndpoint = NULL; - m_piConnectionPoint = NULL; - m_iInterfaceString = 0; - m_iConfigString = 0; - m_dwConnectionCookie = 0; -} - -HRESULT CLoopbackDevice::FinalConstruct() { - // Perform tasks which may fail when the class CLoopbackDevice - // is finally constructed. This involves creating the USB device - // object and initializing the device so that it is recognized - // as a valid USB device by the controller - HRESULT hr = S_OK; - - hr = CreateUSBDevice(); - IfFailHrGo(hr); - - hr = ConfigureDevice(); - IfFailHrGo(hr); - -Exit: - return hr; -} - -void CLoopbackDevice::FinalRelease() { -} - -HRESULT CLoopbackDevice::CreateUSBDevice() { - // Creates the USB device and initializes the device member variables - // and creates and initializes the device qualifier. The device qualifier - // is required for USB2.0 devices. - - HRESULT hr = S_OK; - ISoftUSBDeviceQualifier* piDeviceQual = NULL; - USHORT prod_id = DEVICE_EMULATOR_PROD_ID; - - hr = ::CoCreateInstance(CLSID_SoftUSBDevice, - NULL, - CLSCTX_INPROC_SERVER, - __uuidof(ISoftUSBDevice), - reinterpret_cast(&m_piSoftUSBDevice)); - - IfFailHrGo(hr); - - // Create the device qualifer - hr = ::CoCreateInstance(CLSID_SoftUSBDeviceQualifier, - NULL, - CLSCTX_INPROC_SERVER, - __uuidof(ISoftUSBDeviceQualifier), - reinterpret_cast(&piDeviceQual)); - - IfFailHrGo(hr); - - // Setup the device qualifier - // binary coded decimal USB version 2.0 - IfFailHrGo(piDeviceQual->put_USB(0x0200)); - // FF=Vendor specfic device class - IfFailHrGo(piDeviceQual->put_DeviceClass(0xff)); - // FF = Vendor specific device sub-class - IfFailHrGo(piDeviceQual->put_DeviceSubClass(0xff)); - // FF = Vendor specific device protocol - IfFailHrGo(piDeviceQual->put_DeviceProtocol(0xff)); - // Max packet size endpoint 0 - IfFailHrGo(piDeviceQual->put_MaxPacketSize0(64)); - // Number of configurations - IfFailHrGo(piDeviceQual->put_NumConfigurations(1)); - - // Setup the device - // binary coded decimal USB version 2.0 - IfFailHrGo(m_piSoftUSBDevice->put_USB(0x0200)); - // FF=Vendor specfic device class - IfFailHrGo(m_piSoftUSBDevice->put_DeviceClass(0xff)); - // FF = Vendor specific device sub-class - IfFailHrGo(m_piSoftUSBDevice->put_DeviceSubClass(0xff)); - // FF = Vendor specific device protocol - IfFailHrGo(m_piSoftUSBDevice->put_DeviceProtocol(0xff)); - // Max packet size endpoint 0 - IfFailHrGo(m_piSoftUSBDevice->put_MaxPacketSize0(64)); - // Vendor ID - Google - IfFailHrGo(m_piSoftUSBDevice->put_Vendor(DEVICE_VENDOR_ID)); - // product id - Device Emulator - IfFailHrGo(m_piSoftUSBDevice->put_Product(static_cast(prod_id))); - // Binary decimal coded version 1.0 - IfFailHrGo(m_piSoftUSBDevice->put_Device(0x0100)); - // Device does not suppport remote wake up - IfFailHrGo(m_piSoftUSBDevice->put_RemoteWakeup(VARIANT_FALSE)); - // Index of the manufacturer string - IfFailHrGo(m_piSoftUSBDevice->put_Manufacturer(STRING_IDX_MANUFACTURER)); - // Index of the product descripton string - IfFailHrGo(m_piSoftUSBDevice->put_ProductDesc(STRING_IDX_PRODUCT_DESC)); - // Index of the serial number string - IfFailHrGo(m_piSoftUSBDevice->put_SerialNumber(STRING_IDX_SERIAL_NO)); - // Indicate that the device is self-powered - IfFailHrGo(m_piSoftUSBDevice->put_SelfPowered(VARIANT_TRUE)); - // Indicate that the device has power - IfFailHrGo(m_piSoftUSBDevice->put_Powered(VARIANT_TRUE)); - - // Create the strings associated with the device - IfFailHrGo(CreateStrings()); - - // Add the device qualifier - IfFailHrGo(m_piSoftUSBDevice->put_DeviceQualifier(piDeviceQual)); - -Exit: - RELEASE(piDeviceQual); - return hr; -} - - -HRESULT CLoopbackDevice::ConfigureConfig(ISoftUSBConfiguration* piConfig) { - HRESULT hr = S_OK; - // config number passed to SetConfig - IfFailHrGo(piConfig->put_ConfigurationValue(1)); - // Index of string descriptor - IfFailHrGo(piConfig->put_Configuration((BYTE)m_iConfigString)); - // Self powered - IfFailHrGo(piConfig->put_Attributes(0x40)); - // Max power in 2mA units: 50 = 100mA - IfFailHrGo(piConfig->put_MaxPower(50)); - -Exit: - return hr; -} - -HRESULT CLoopbackDevice::ConfigureINEndpoint() { - HRESULT hr = S_OK; - - if (NULL == m_piINEndpoint) { - IfFailHrGo(E_UNEXPECTED); - } - - // Endpoint #1 IN - IfFailHrGo(m_piINEndpoint->put_EndpointAddress(0x81)); - // Bulk data endpoint - IfFailHrGo(m_piINEndpoint->put_Attributes(0x02)); - IfFailHrGo(m_piINEndpoint->put_MaxPacketSize(1024)); - IfFailHrGo(m_piINEndpoint->put_Interval(0)); - IfFailHrGo(m_piINEndpoint->put_Halted(FALSE)); - // back pointer to the device - IfFailHrGo(m_piINEndpoint->put_USBDevice(reinterpret_cast(m_piSoftUSBDevice))); - -Exit: - return hr; -} - -HRESULT CLoopbackDevice::ConfigureOUTEndpoint() { - HRESULT hr = S_OK; - - if (NULL == m_piOUTEndpoint) { - IfFailHrGo(E_UNEXPECTED); - } - - // Endpoint #2 OUT - IfFailHrGo(m_piOUTEndpoint->put_EndpointAddress(0x02)); - // Bulk data endpoint - IfFailHrGo(m_piOUTEndpoint->put_Attributes(0x02)); - IfFailHrGo(m_piOUTEndpoint->put_MaxPacketSize(1024)); - IfFailHrGo(m_piOUTEndpoint->put_Interval(0)); - IfFailHrGo(m_piOUTEndpoint->put_Halted(FALSE)); - //back pointer to the device - IfFailHrGo(m_piOUTEndpoint->put_USBDevice(reinterpret_cast(m_piSoftUSBDevice))); - -Exit: - return hr; -} - -HRESULT CLoopbackDevice::ConfigureInterface(ISoftUSBInterface* piInterface) { - HRESULT hr = S_OK; - - IfFailHrGo(piInterface->put_InterfaceNumber(0)); - IfFailHrGo(piInterface->put_AlternateSetting(0)); - // Vendor specific class code - IfFailHrGo(piInterface->put_InterfaceClass(0xFF)); - // Vendor specific sub class code - IfFailHrGo(piInterface->put_InterfaceSubClass(0xFF)); - // Vendor specific protcol - IfFailHrGo(piInterface->put_InterfaceProtocol(0xFF)); - //Index for string describing the interface - IfFailHrGo(piInterface->put_Interface((BYTE)m_iInterfaceString)); - -Exit: - return hr; -} - -HRESULT CLoopbackDevice::ConfigureDevice() { - HRESULT hr = S_OK; - ISoftUSBConfiguration* piConfig = NULL; - ISoftUSBInterface* piInterface = NULL; - ISoftUSBConfigList* piConfigList = NULL; - ISoftUSBInterfaceList* piInterfaceList = NULL; - ISoftUSBEndpointList* piEndpointList= NULL; - VARIANT varIndex; - VariantInit(&varIndex); - - // All members of the collection will be added at the default locations - // so set up the index appropriately - varIndex.vt = VT_ERROR; - varIndex.scode = DISP_E_PARAMNOTFOUND; - - // Create the IN Endpoint - hr = CoCreateInstance(CLSID_SoftUSBEndpoint, - NULL, - CLSCTX_INPROC_SERVER, - __uuidof(ISoftUSBEndpoint), - reinterpret_cast(&m_piINEndpoint)); - IfFailHrGo(hr); - - // Setup the IN Endpoint - IfFailHrGo(ConfigureINEndpoint()); - - // Create the OUT Endpoint - hr = CoCreateInstance(CLSID_SoftUSBEndpoint, - NULL, - CLSCTX_INPROC_SERVER, - __uuidof(ISoftUSBEndpoint), - reinterpret_cast(&m_piOUTEndpoint)); - IfFailHrGo(hr); - - // Setup the OUT Endpoint - IfFailHrGo(ConfigureOUTEndpoint()); - - // Create the device interface - hr = CoCreateInstance(CLSID_SoftUSBInterface, - NULL, - CLSCTX_INPROC_SERVER, - __uuidof(ISoftUSBInterface), - reinterpret_cast(&piInterface)); - IfFailHrGo(hr); - - // Setup the device interface - IfFailHrGo(ConfigureInterface(piInterface)); - - // Add the Endpoints to the endpoint list - IfFailHrGo(piInterface->get_Endpoints(&piEndpointList)); - IfFailHrGo(piEndpointList->Add(reinterpret_cast(m_piINEndpoint), varIndex)); - IfFailHrGo(piEndpointList->Add(reinterpret_cast(m_piOUTEndpoint), varIndex)); - - // Create the configuration - hr = CoCreateInstance(CLSID_SoftUSBConfiguration, - NULL, - CLSCTX_INPROC_SERVER, - __uuidof(ISoftUSBConfiguration), - reinterpret_cast(&piConfig)); - IfFailHrGo(hr); - - // Set the configuration data up - IfFailHrGo(ConfigureConfig(piConfig)); - - // Add the interface to the interface collection - IfFailHrGo(piConfig->get_Interfaces(&piInterfaceList)); - IfFailHrGo(piInterfaceList->Add(reinterpret_cast(piInterface), varIndex)); - - // Add the configuration to the configuration collection - IfFailHrGo(m_piSoftUSBDevice->get_Configurations(&piConfigList)); - IfFailHrGo(piConfigList->Add(reinterpret_cast(piConfig), varIndex)); - -Exit: - RELEASE(piConfig); - RELEASE(piInterface); - RELEASE(piConfigList); - RELEASE(piInterfaceList); - RELEASE(piEndpointList); - return hr; -} - -HRESULT CLoopbackDevice::CreateStrings() { - HRESULT hr = S_OK; - ISoftUSBStringList* piStringList = NULL; - ISoftUSBString* piStringManufacturer = NULL; - ISoftUSBString* piStringProductDesc = NULL; - ISoftUSBString* piStringSerialNo = NULL; - ISoftUSBString* piStringConfig = NULL; - ISoftUSBString* piStringEndpoint = NULL; - BSTR bstrManufacturer = ::SysAllocString(L"Google, Inc"); - BSTR bstrProductDesc = ::SysAllocString(L"USB Emulating Device"); - BSTR bstrSerialNo = ::SysAllocString(L"123456789ABCDEF"); - BSTR bstrConfig = ::SysAllocString(L"Configuration with a single interface"); - BSTR bstrEndpoint = ::SysAllocString(L"Interface with bulk IN endpoint and bulk OUT endpoint"); - VARIANT varIndex; - VariantInit(&varIndex); - - // Check that all BSTR allocations succeeded - IfFalseHrGo(0 != ::SysStringLen(bstrManufacturer), E_OUTOFMEMORY); - IfFalseHrGo(0 != ::SysStringLen(bstrProductDesc), E_OUTOFMEMORY); - IfFalseHrGo(0 != ::SysStringLen(bstrSerialNo), E_OUTOFMEMORY); - IfFalseHrGo(0 != ::SysStringLen(bstrConfig), E_OUTOFMEMORY); - IfFalseHrGo(0 != ::SysStringLen(bstrEndpoint), E_OUTOFMEMORY); - - //Set up the varaint used as the index - varIndex.vt = VT_I4; - varIndex.lVal = STRING_IDX_MANUFACTURER; - - //Create and initialize the string descriptors. Also create a string - //descriptor index for each. This index is used both to set the string's - //descriptors position in the m_piSoftUSBDevice.Strings and is the index value - //the GetDescriptors request from the host. Note that we don't use - //string descriptor index zero because that is a reserved value for a - //device's language ID descriptor. - - //Get the string list from the device - hr = m_piSoftUSBDevice->get_Strings(&piStringList); - IfFailHrGo(hr); - - hr = CoCreateInstance(CLSID_SoftUSBString, - NULL, - CLSCTX_INPROC_SERVER, - __uuidof(ISoftUSBString), - reinterpret_cast(&piStringManufacturer)); - IfFailHrGo(hr); - - IfFailHrGo(piStringManufacturer->put_Value(bstrManufacturer)); - IfFailHrGo(piStringList->Add(reinterpret_cast(piStringManufacturer), varIndex)); - - hr = CoCreateInstance(CLSID_SoftUSBString, - NULL, - CLSCTX_INPROC_SERVER, - __uuidof(ISoftUSBString), - reinterpret_cast(&piStringProductDesc)); - - IfFailHrGo(hr); - IfFailHrGo(piStringProductDesc->put_Value(bstrProductDesc)); - varIndex.lVal = STRING_IDX_PRODUCT_DESC; - IfFailHrGo(piStringList->Add(reinterpret_cast(piStringProductDesc), varIndex)); - - hr = CoCreateInstance(CLSID_SoftUSBString, - NULL, - CLSCTX_INPROC_SERVER, - __uuidof(ISoftUSBString), - reinterpret_cast(&piStringSerialNo)); - IfFailHrGo(hr); - IfFailHrGo(piStringSerialNo->put_Value(bstrSerialNo)); - varIndex.lVal = STRING_IDX_SERIAL_NO; - IfFailHrGo(piStringList->Add(reinterpret_cast(piStringSerialNo), varIndex)); - - hr = CoCreateInstance(CLSID_SoftUSBString, - NULL, - CLSCTX_INPROC_SERVER, - __uuidof(ISoftUSBString), - reinterpret_cast(&piStringConfig)); - IfFailHrGo(hr); - IfFailHrGo(piStringConfig->put_Value(bstrConfig)); - varIndex.lVal = STRING_IDX_CONFIG; - m_iConfigString = varIndex.lVal; - IfFailHrGo(piStringList->Add(reinterpret_cast(piStringConfig), varIndex)); - - hr = CoCreateInstance(CLSID_SoftUSBString, - NULL, - CLSCTX_INPROC_SERVER, - __uuidof(ISoftUSBString), - reinterpret_cast(&piStringEndpoint)); - IfFailHrGo(hr); - IfFailHrGo(piStringEndpoint->put_Value(bstrEndpoint)); - varIndex.lVal = STRING_IDX_INTERFACE; - m_iInterfaceString = varIndex.lVal; - IfFailHrGo(piStringList->Add(reinterpret_cast(piStringEndpoint), varIndex)); - -Exit: - RELEASE(piStringList); - RELEASE(piStringManufacturer); - RELEASE(piStringProductDesc); - RELEASE(piStringSerialNo); - RELEASE(piStringConfig); - RELEASE(piStringEndpoint); - ::SysFreeString(bstrManufacturer); - ::SysFreeString(bstrProductDesc); - ::SysFreeString(bstrSerialNo); - ::SysFreeString(bstrConfig); - ::SysFreeString(bstrEndpoint); - - return hr; -} - -HRESULT CLoopbackDevice::ReleaseConnectionPoint() { - HRESULT hr = S_OK; - - if (NULL != m_piConnectionPoint) { - m_piConnectionPoint->Unadvise(m_dwConnectionCookie); - m_dwConnectionCookie = 0; - } - - RELEASE(m_piConnectionPoint); - - return hr; -} - - -HRESULT CLoopbackDevice::SetupConnectionPoint(IUnknown* punkObject, - REFIID iidConnectionPoint) { - HRESULT hr = S_OK; - IConnectionPointContainer* piConnectionPointContainer = NULL; - IUnknown* punkSink = NULL; - - //If there is already connection point enabled, disable it - if(NULL != m_piConnectionPoint) { - IfFailHrGo(ReleaseConnectionPoint()); - } - - IfFailHrGo(punkObject->QueryInterface(IID_IConnectionPointContainer, - reinterpret_cast(&piConnectionPointContainer))); - - IfFailHrGo(piConnectionPointContainer->FindConnectionPoint(iidConnectionPoint, - &m_piConnectionPoint)); - - // Get the IUknown of this interface as this is the event sink - punkSink = (this)->GetUnknown(); - - if(NULL == punkSink) { - IfFailHrGo(E_UNEXPECTED); - } - - IfFailHrGo(m_piConnectionPoint->Advise(punkSink, &m_dwConnectionCookie)); - - -Exit: - return hr; -} - -STDMETHODIMP CLoopbackDevice::get_DSFDevice(DSFDevice** ppDSFDevice) { - HRESULT hr = S_OK; - DSFDevice* pDSFDevice = NULL; - - //Validate the the UDB device exists else this is an - //internal error - if (NULL == m_piSoftUSBDevice) { - IfFailHrGo(E_UNEXPECTED); - } - - if (NULL == ppDSFDevice) { - IfFailHrGo(E_POINTER); - } - - IfFailHrGo(m_piSoftUSBDevice->get_DSFDevice(&pDSFDevice)); - IfFailHrGo(reinterpret_cast(pDSFDevice)->QueryInterface(__uuidof(IDispatch), reinterpret_cast(ppDSFDevice))); - -Exit: - if (NULL != pDSFDevice) - reinterpret_cast(pDSFDevice)->Release(); - - return hr; -} - - -STDMETHODIMP CLoopbackDevice::DoPolledLoopback(long lTimeInterval) { -/* - Demonstrates how to use the drain OUT queue and queue IN data - methods to communicate with the host controller. - - The code checks to see if there is any data in the OUT, if no - data is present an event is fired to indicate if the function - should exit. If the function should not exit then the function - sleeps for the time interval before re-checking the queue. - - If there is data then the function reads the data and passes the - data to the IN queue. This simply provides a loopback mechanism - to the host controller. -*/ - HRESULT hr = S_OK; - BOOL fKeepLooping = TRUE; - // Number of items currently in the queue - ULONG ulNoOfQueuedItems = 0; - // Only going to read one transfer at a time - ULONG ulTransfers = 1; - SOFTUSB_OUT_TRANSFER* pOUTTransfer = NULL; - // Copied the message status - BYTE bStatus = 0; - // Copied the message data - BYTE* pDataBuffer = NULL; - // Holds the size of the data buffer - ULONG cbDataBuffer = 0; - VARIANT_BOOL fvarContinue = VARIANT_TRUE; - - if (NULL == m_piINEndpoint || NULL == m_piOUTEndpoint) { - IfFailHrGo(E_UNEXPECTED); - } - - while (fKeepLooping) { - // Reset the number of queued items - ulNoOfQueuedItems = 0; - - // Check to see if there is any data in the out queue - IfFailHrGo(m_piOUTEndpoint->DrainOUTQueue(0, &ulNoOfQueuedItems, NULL)); - - if (0 == ulNoOfQueuedItems) { - // There is no data in the list so we need to check - // If we should continue to loop - // Fire Event to check if more processing is required - IfFailHrGo(Fire_ContinueToPoll(&fvarContinue)); - - // Check to see if the return value is VARIANT_FALSE - if (VARIANT_FALSE == fvarContinue) - fKeepLooping = FALSE; - - if (fKeepLooping) - ::Sleep(lTimeInterval); - } else { - // There is data to read, loop until we have moved all - // the data from the OUT queue to the IN queue moving - // one data item at a time - do { - // Get the OUT data - IfFailHrGo(m_piOUTEndpoint->DrainOUTQueue(ulTransfers, - &ulNoOfQueuedItems, - &pOUTTransfer)); - - // Setup the IN data - bStatus= pOUTTransfer->bStatus; - cbDataBuffer = pOUTTransfer->cbData; - pDataBuffer =&pOUTTransfer->Data[0]; - - // Send the data to the out queue - IfFailHrGo(m_piINEndpoint->QueueINData(pDataBuffer, - cbDataBuffer, - bStatus, - SOFTUSB_FOREVER)); - - // Free the memory used by pOUTTransfer - m_piOUTEndpoint->FreeOUTQueue(pOUTTransfer); - pOUTTransfer = NULL; - - // Force a context switch - ::Sleep(1); - } while (0 != ulNoOfQueuedItems); - } - } - -Exit: - // If one of the calls failed pOUTTransfer will be NON-NULL - // And needs to be freed - if (NULL != pOUTTransfer) { - // Free the memory used by pOUTTransfer - m_piOUTEndpoint->FreeOUTQueue(pOUTTransfer); - pOUTTransfer = NULL; - } - - return hr; -} - -STDMETHODIMP CLoopbackDevice::StartEventProcessing() { -/* - Demonstrates how to setup event sinks so that the - event mechanism can be used to control data flow to and - from the USB controller. In this example an event sink - is installed on the OUT USB endpoint, when the controller - has data to send to the device the OnWriteTransfer event - will fire, this will occur on an arbitrary thread. The - device then simply copies this data and passes it the - IN queue of the IN Endpoint. -*/ - HRESULT hr = S_OK; - BOOL fKeepLooping = TRUE; - VARIANT_BOOL fvarContinue = VARIANT_TRUE; - - // Set up event sink on the OUT endpoint - IfFailHrGo(SetupConnectionPoint(m_piOUTEndpoint, __uuidof(ISoftUSBEndpointEvents))); - - // Loop waiting for Events to be fired - while (TRUE == fKeepLooping) { - // Context switch to allow other threads to process - ::Sleep(1); - - // Fire Event to check if the caller want to continue processing - IfFailHrGo(Fire_ContinueEventProcessing(&fvarContinue)); - - // Check to see if the return value is VARIANT_FALSE - if (VARIANT_FALSE == fvarContinue) - fKeepLooping = FALSE; - } - - // Remove the event sink from the OUT endpoint - IfFailHrGo(ReleaseConnectionPoint()); - -Exit: - return hr; -} - -STDMETHODIMP CLoopbackDevice::StartAsyncEventProcessing() { -/* - Demonstrates how to setup event sinks so that the event mechanism can - be used to control data flow to and from the USB controller. In this - example an event sink is installed on the OUT USB endpoint, when the - controller has data to send to the device the OnWriteTransfer event - will fire, this will occur on an arbitrary thread. The device then - simply copies this data and passes it the IN queue of the IN - Endpoint. Control returns to the caller and event processing - continues in an arbitrary thread. To terminate event processing call - StopAsyncEventProcessing. -*/ - HRESULT hr = S_OK; - - // Set up event sink on the OUT endpoint - IfFailHrGo(SetupConnectionPoint(m_piOUTEndpoint, __uuidof(ISoftUSBEndpointEvents))); - -Exit: - return hr; -} - -STDMETHODIMP CLoopbackDevice::StopAsyncEventProcessing() { - HRESULT hr = S_OK; - // Remove the event sink on the OUT endpoint - IfFailHrGo(ReleaseConnectionPoint()); - -Exit: - return hr; -} - - - -STDMETHODIMP CLoopbackDevice::AreKeystrokesWaiting( - VARIANT_BOOL* pfvarKeyWaiting) { -/* - Implements IDeviceEmulator::AreKeystrokesWaiting. It calls the low level - IO function _kbhit to see if the keyboard has been struck. If the Keyboard - has been hit the function return VARIANT_TRUE otherwise it returns VARIANT_FALSE -*/ - HRESULT hr = S_OK; - int iKeyHit = 0; - - if (NULL == pfvarKeyWaiting) { - IfFailHrGo(E_POINTER); - } - - *pfvarKeyWaiting = VARIANT_FALSE; - - iKeyHit = _kbhit(); - - if (0 != iKeyHit) - *pfvarKeyWaiting = VARIANT_TRUE; - -Exit: - return hr; -} - -//ISoftUSBEndpointEvents - -STDMETHODIMP CLoopbackDevice::OnSetupTransfer(BYTE DataToggle, - BYTE* pbDataBuffer, - ULONG cbDataBuffer, - BYTE *pbStatus) { - HRESULT hr = E_NOTIMPL; - UNREFERENCED_PARAMETER(DataToggle); - UNREFERENCED_PARAMETER(pbDataBuffer); - UNREFERENCED_PARAMETER(cbDataBuffer); - UNREFERENCED_PARAMETER(pbStatus); - return hr; -} - -STDMETHODIMP CLoopbackDevice::OnWriteTransfer(BYTE DataToggle, - BYTE* pbDataBuffer, - ULONG cbDataBuffer, - BYTE * pbStatus) { - - HRESULT hr = S_OK; - BYTE bINStatus = USB_ACK; - UNREFERENCED_PARAMETER(DataToggle); - - // Check that the IN endpoint is valid - if (NULL == m_piINEndpoint) { - IfFailHrGo(E_UNEXPECTED); - } - - // Send the data to the IN Endpoint - IfFailHrGo(m_piINEndpoint->QueueINData(pbDataBuffer, - cbDataBuffer, - bINStatus, - SOFTUSB_FOREVER)); - - // ACK the status as the data was successfully sent to the IN endpoint - *pbStatus = USB_ACK; - -Exit: - if (FAILED(hr)) - *pbStatus = USB_STALL; - - return hr; -} - -STDMETHODIMP CLoopbackDevice::OnReadTransfer(BYTE DataToggle, - BYTE* pbDataBuffer, - ULONG cbDataBuffer, - ULONG* cbDataWritten, - BYTE* pbStatus) { - HRESULT hr = E_NOTIMPL; - UNREFERENCED_PARAMETER(DataToggle); - UNREFERENCED_PARAMETER(pbDataBuffer); - UNREFERENCED_PARAMETER(cbDataBuffer); - UNREFERENCED_PARAMETER(cbDataWritten); - UNREFERENCED_PARAMETER(pbStatus); - return hr; -} - -STDMETHODIMP CLoopbackDevice::OnDeviceRequest(USBSETUPREQUEST *pSetupRequest, - ULONG_PTR* RequestHandle, - BYTE* pbHostData, - ULONG cbHostData, - BYTE** ppbResponseData, - ULONG* pcbResponseData, - BYTE* pbSetupStatus) { - HRESULT hr = E_NOTIMPL; - UNREFERENCED_PARAMETER(pSetupRequest); - UNREFERENCED_PARAMETER(RequestHandle); - UNREFERENCED_PARAMETER(pbHostData); - UNREFERENCED_PARAMETER(cbHostData); - UNREFERENCED_PARAMETER(ppbResponseData); - UNREFERENCED_PARAMETER(pcbResponseData); - UNREFERENCED_PARAMETER(pbSetupStatus); - return hr; -} - -STDMETHODIMP CLoopbackDevice::OnDeviceRequestComplete( - ULONG_PTR RequestHandle, - BYTE* pbFinalRequestStatus) { - HRESULT hr = E_NOTIMPL; - UNREFERENCED_PARAMETER(RequestHandle); - UNREFERENCED_PARAMETER(pbFinalRequestStatus); - return hr; -} diff --git a/host/windows/usb/test/device_emulator/LoopbackDevice.h b/host/windows/usb/test/device_emulator/LoopbackDevice.h deleted file mode 100644 index 0df3fbabc..000000000 --- a/host/windows/usb/test/device_emulator/LoopbackDevice.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** \file - This file consists of definition of the class CLoopbackDevice - This project has been created from DDK's SoftUSBLoopback sample project - that is located at $(DDK_PATH)\src\Test\DSF\USB\SoftUSBLoopback -*/ - -#pragma once -#include "resource.h" - -#include "DeviceEmulator.h" -#include "LoopbackDeviceEvents.h" - - -//Release and Add ref macros -#define ADDREF(punk) { \ - if ((punk) != NULL) { \ - (punk)->AddRef(); \ - } \ -} - - -#define RELEASE(punk) { \ - if ((punk) != NULL) { \ - IUnknown *_punkXxx = (punk); \ - (punk) = NULL; \ - _punkXxx->Release(); \ - } \ -} - -//HR check -#define IfFailHrGo(EXPR) { hr = (EXPR); if(FAILED(hr)) goto Exit; } -#define IfFalseHrGo(EXPR, HR) { if(!(EXPR)) { hr = (HR); goto Exit; } } - -#pragma warning(disable: 4995) //Pragma deprecated - -class ATL_NO_VTABLE CLoopbackDevice : - public CComObjectRootEx, - public CComCoClass, - public IConnectionPointContainerImpl, - public CProxy_ILoopbackDeviceEvents, - public ISoftUSBEndpointEvents, - public IDispatchImpl { - public: - CLoopbackDevice(); - virtual ~CLoopbackDevice(); -DECLARE_REGISTRY_RESOURCEID(IDR_LOOPBACKDEVICE) - - -BEGIN_COM_MAP(CLoopbackDevice) - COM_INTERFACE_ENTRY(ILoopbackDevice) - COM_INTERFACE_ENTRY(IDispatch) - COM_INTERFACE_ENTRY(ISoftUSBEndpointEvents) - COM_INTERFACE_ENTRY(IConnectionPointContainer) -END_COM_MAP() - -BEGIN_CONNECTION_POINT_MAP(CLoopbackDevice) - CONNECTION_POINT_ENTRY(__uuidof(ILoopbackDeviceEvents)) -END_CONNECTION_POINT_MAP() - - - DECLARE_PROTECT_FINAL_CONSTRUCT() - - HRESULT FinalConstruct(); - - void FinalRelease(); - - private: - void InitMemberVariables(); - - HRESULT CreateUSBDevice(); - HRESULT CreateStrings(); - HRESULT ConfigureDevice(); - HRESULT ConfigureOUTEndpoint(); - HRESULT ConfigureINEndpoint(); - HRESULT ConfigureInterface(ISoftUSBInterface* piInterface); - HRESULT ConfigureConfig(ISoftUSBConfiguration* piConfig); - - HRESULT SetupConnectionPoint(IUnknown* punkObject, - REFIID iidConnectionPoint); - HRESULT ReleaseConnectionPoint(); - - // Underlying SoftUSBDevice object - ISoftUSBDevice *m_piSoftUSBDevice; - // IN Endpoint - ISoftUSBEndpoint *m_piINEndpoint; - // OUT Endpoint - ISoftUSBEndpoint *m_piOUTEndpoint; - // Connection point interface - IConnectionPoint *m_piConnectionPoint; - // Connection point cookie. - DWORD m_dwConnectionCookie; - // Index of interface identifier string - int m_iInterfaceString; - // Index of config identifier string - int m_iConfigString; - - public: - //ILoopbackDevice - STDMETHOD(get_DSFDevice)(DSFDevice** ppDSFDevice); - STDMETHOD(DoPolledLoopback)(long lTimeInterval); - STDMETHOD(StartEventProcessing)(); - STDMETHOD(StartAsyncEventProcessing)(); - STDMETHOD(StopAsyncEventProcessing)(); - STDMETHOD(AreKeystrokesWaiting)(VARIANT_BOOL* pfvarKeyWaiting); - - //ISoftUSBEndpointEvents - STDMETHOD(OnSetupTransfer)(BYTE DataToggle, BYTE* pbDataBuffer, - ULONG cbDataBuffer, BYTE* pbStatus); - - STDMETHOD(OnWriteTransfer)(BYTE DataToggle, BYTE* pbDataBuffer, - ULONG cbDataBuffer, BYTE* pbStatus); - - STDMETHOD(OnReadTransfer)(BYTE DataToggle, BYTE* pbDataBuffer, - ULONG cbDataBuffer,ULONG* cbDataWritten, - BYTE* pbStatus); - - STDMETHOD(OnDeviceRequest)(USBSETUPREQUEST* pSetupRequest, - ULONG_PTR* RequestHandle, - BYTE* pbHostData, ULONG cbHostData, - BYTE** ppbResponseData, - ULONG* pcbResponseData,BYTE* pbSetupStatus); - - STDMETHOD(OnDeviceRequestComplete)(ULONG_PTR RequestHandle, - BYTE* pbFinalRequestStatus); -}; - -OBJECT_ENTRY_AUTO(__uuidof(LoopbackDevice), CLoopbackDevice) diff --git a/host/windows/usb/test/device_emulator/LoopbackDevice.rgs b/host/windows/usb/test/device_emulator/LoopbackDevice.rgs deleted file mode 100644 index 422f654d1..000000000 --- a/host/windows/usb/test/device_emulator/LoopbackDevice.rgs +++ /dev/null @@ -1,27 +0,0 @@ -HKCR -{ - DeviceEmulator.LoopbackDevice.1 = s 'LoopbackDevice Class' - { - CLSID = s '{9A0BD4A6-E346-4668-A89C-ACA546212CD4}' - } - DeviceEmulator.LoopbackDevice = s 'LoopbackDevice Class' - { - CLSID = s '{9A0BD4A6-E346-4668-A89C-ACA546212CD4}' - CurVer = s 'DeviceEmulator.LoopbackDevice.1' - } - NoRemove CLSID - { - ForceRemove {9A0BD4A6-E346-4668-A89C-ACA546212CD4} = s 'LoopbackDevice Class' - { - ProgID = s 'DeviceEmulator.LoopbackDevice.1' - VersionIndependentProgID = s 'DeviceEmulator.LoopbackDevice' - ForceRemove 'Programmable' - InprocServer32 = s '%MODULE%' - { - val ThreadingModel = s 'Apartment' - } - 'TypeLib' = s '{0C206596-5CC2-4d16-898D-4D1699BB6282}' - } - } -} - diff --git a/host/windows/usb/test/device_emulator/LoopbackDeviceEvents.h b/host/windows/usb/test/device_emulator/LoopbackDeviceEvents.h deleted file mode 100644 index 9bde9e0d3..000000000 --- a/host/windows/usb/test/device_emulator/LoopbackDeviceEvents.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** \file - This file consists of definition of the template class which implements the - event interface ILoopbackDeviceEvents. - This project has been created from DDK's SoftUSBLoopback sample project - that is located at $(DDK_PATH)\src\Test\DSF\USB\SoftUSBLoopback -*/ - -template -class CProxy_ILoopbackDeviceEvents : - public IConnectionPointImpl { - public: - HRESULT _stdcall Fire_ContinueToPoll(VARIANT_BOOL *pfvarContinue) { - HRESULT hr = S_OK; - T* pThis = static_cast(this); - int cConnections = m_vec.GetSize(); - - for (int iConnection = 0; iConnection < cConnections; iConnection++) { - pThis->Lock(); - CComPtr punkConnection = m_vec.GetAt(iConnection); - pThis->Unlock(); - - IDispatch * pConnection = static_cast(punkConnection.p); - - if (pConnection) { - CComVariant varResult; - - DISPPARAMS params = { NULL, NULL, 0, 0 }; - hr = pConnection->Invoke(1, IID_NULL, LOCALE_USER_DEFAULT, - DISPATCH_METHOD, ¶ms, &varResult, - NULL, NULL); - - //Set the return parameter - *pfvarContinue = varResult.boolVal; - } - } - return hr; - } - - HRESULT _stdcall Fire_ContinueEventProcessing(VARIANT_BOOL *pfvarContinue) { - HRESULT hr = S_OK; - T * pThis = static_cast(this); - int cConnections = m_vec.GetSize(); - - for (int iConnection = 0; iConnection < cConnections; iConnection++) { - pThis->Lock(); - CComPtr punkConnection = m_vec.GetAt(iConnection); - pThis->Unlock(); - - IDispatch * pConnection = static_cast(punkConnection.p); - - if (pConnection) { - CComVariant varResult; - - DISPPARAMS params = { NULL, NULL, 0, 0 }; - hr = pConnection->Invoke(2, IID_NULL, LOCALE_USER_DEFAULT, - DISPATCH_METHOD, ¶ms, &varResult, - NULL, NULL); - - //Set the return parameter - *pfvarContinue = varResult.boolVal; - } - } - return hr; - } -}; - diff --git a/host/windows/usb/test/device_emulator/device_emulator.sln b/host/windows/usb/test/device_emulator/device_emulator.sln deleted file mode 100644 index 3fff7caf1..000000000 --- a/host/windows/usb/test/device_emulator/device_emulator.sln +++ /dev/null @@ -1,21 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "device_emulator", "device_emulator.vcproj", "{EAB61831-9DDA-40AA-A5EF-2D9E8F9A5C59}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {EAB61831-9DDA-40AA-A5EF-2D9E8F9A5C59}.Debug.ActiveCfg = Debug|Win32 - {EAB61831-9DDA-40AA-A5EF-2D9E8F9A5C59}.Debug.Build.0 = Debug|Win32 - {EAB61831-9DDA-40AA-A5EF-2D9E8F9A5C59}.Release.ActiveCfg = Release|Win32 - {EAB61831-9DDA-40AA-A5EF-2D9E8F9A5C59}.Release.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/host/windows/usb/test/device_emulator/device_emulator.vcproj b/host/windows/usb/test/device_emulator/device_emulator.vcproj deleted file mode 100644 index 34a66c31a..000000000 --- a/host/windows/usb/test/device_emulator/device_emulator.vcproj +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/host/windows/usb/test/device_emulator/makefile b/host/windows/usb/test/device_emulator/makefile deleted file mode 100644 index 66f1c8e5c..000000000 --- a/host/windows/usb/test/device_emulator/makefile +++ /dev/null @@ -1,8 +0,0 @@ -# -# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source -# file to this component. This file merely indirects to the real make file -# that is shared by all the driver components of the Windows NT DDK -# - -!INCLUDE $(NTMAKEENV)\makefile.def - diff --git a/host/windows/usb/test/device_emulator/resource.h b/host/windows/usb/test/device_emulator/resource.h deleted file mode 100644 index 6e5e435ac..000000000 --- a/host/windows/usb/test/device_emulator/resource.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** \file - This file defines resources used by Emulator.rc - This project has been created from DDK's SoftUSBLoopback sample project - that is located at $(DDK_PATH)\src\Test\DSF\USB\SoftUSBLoopback -*/ - -#define IDS_PROJNAME 100 -#define IDR_DEVICEEMULATOR 101 -#define IDR_LOOPBACKDEVICE 102 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 201 -#define _APS_NEXT_COMMAND_VALUE 32768 -#define _APS_NEXT_CONTROL_VALUE 201 -#define _APS_NEXT_SYMED_VALUE 103 -#endif -#endif - diff --git a/host/windows/usb/test/device_emulator/sources b/host/windows/usb/test/device_emulator/sources deleted file mode 100644 index b65a1d8f2..000000000 --- a/host/windows/usb/test/device_emulator/sources +++ /dev/null @@ -1,56 +0,0 @@ -TARGETNAME= DeviceEmulator -TARGETTYPE=DYNLINK - -DLLENTRY=_DllMainCRTStartup - -DLLDEF=DeviceEmulator.def - -USE_NATIVE_EH=ASYNC - -MUI = 0 -MUI_COMMENT=TEST_TOOL, Device Simulation Framework - -PRECOMPILED_CXX = 1 - -MSC_WARNING_LEVEL=/W4 /WX - -USE_ATL = 1 -ATL_VER = 70 - -USE_MSVCRT = 1 -USE_OBJECT_ROOT=1 - -!IF "$(DDKBUILDENV)"=="chk" -TARGETPATH=..\..\build\Debug -!ELSE -TARGETPATH=..\..\build\Release -!ENDIF - - -C_DEFINES = $(C_DEFINES) -DDSF_USER_MODE -DUNICODE - -PRECOMPILED_CXX=1 - -TARGETLIBS= \ - $(SDK_LIB_PATH)\kernel32.lib \ - $(SDK_LIB_PATH)\user32.lib \ - $(SDK_LIB_PATH)\advapi32.lib \ - $(SDK_LIB_PATH)\ole32.lib \ - $(SDK_LIB_PATH)\oleaut32.lib \ - $(SDK_LIB_PATH)\uuid.lib \ - $(SDK_LIB_PATH)\shlwapi.lib \ - $(DDK_LIB_PATH)\SoftUSBIf.lib \ - - -INCLUDES=\ - ..\..\api; \ - ..\..\common; \ - $(DDK_LIB_DEST)\$(TARGET_DIRECTORY); \ - $(DDK_INC_PATH); \ - -SOURCES= \ - DeviceEmulator.idl \ - LoopbackDevice.cpp \ - DeviceEmulator.cpp \ - DeviceEmulator.rc \ - diff --git a/host/windows/usb/test/device_emulator/stdafx.cpp b/host/windows/usb/test/device_emulator/stdafx.cpp deleted file mode 100644 index 5e452ed90..000000000 --- a/host/windows/usb/test/device_emulator/stdafx.cpp +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "stdafx.h" - diff --git a/host/windows/usb/test/device_emulator/stdafx.h b/host/windows/usb/test/device_emulator/stdafx.h deleted file mode 100644 index 8651cd045..000000000 --- a/host/windows/usb/test/device_emulator/stdafx.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#ifndef STRICT -#define STRICT -#endif - -// Modify the following defines if you have to target a platform prior to the ones specified below. -// Refer to MSDN for the latest info on corresponding values for different platforms. -#ifndef WINVER // Allow use of features specific to Windows 95 and Windows NT 4 or later. -#define WINVER 0x0500 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later. -#endif - -#ifndef _WIN32_WINNT // Allow use of features specific to Windows NT 4 or later. -#define _WIN32_WINNT 0x0500 // Change this to the appropriate value to target Windows 2000 or later. -#endif - -#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later. -#define _WIN32_WINDOWS 0x0500 // Change this to the appropriate value to target Windows Me or later. -#endif - -#ifndef _WIN32_IE // Allow use of features specific to IE 4.0 or later. -#define _WIN32_IE 0x0501 // Change this to the appropriate value to target IE 5.0 or later. -#endif - -#define _ATL_APARTMENT_THREADED -#define _ATL_NO_AUTOMATIC_NAMESPACE - -#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit - -// turns off ATL's hiding of some common and often safely ignored warning messages -#define _ATL_ALL_WARNINGS - - -#include "resource.h" -#include -#include - -using namespace ATL; -