xref: /aosp_15_r20/development/host/windows/usb/api/AdbWinApi.cpp (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
1*90c8c64dSAndroid Build Coastguard Worker /*
2*90c8c64dSAndroid Build Coastguard Worker  * Copyright (C) 2008 The Android Open Source Project
3*90c8c64dSAndroid Build Coastguard Worker  *
4*90c8c64dSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*90c8c64dSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*90c8c64dSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*90c8c64dSAndroid Build Coastguard Worker  *
8*90c8c64dSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*90c8c64dSAndroid Build Coastguard Worker  *
10*90c8c64dSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*90c8c64dSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*90c8c64dSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*90c8c64dSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*90c8c64dSAndroid Build Coastguard Worker  * limitations under the License.
15*90c8c64dSAndroid Build Coastguard Worker  */
16*90c8c64dSAndroid Build Coastguard Worker 
17*90c8c64dSAndroid Build Coastguard Worker // AdbWinApi.cpp : Implementation of DLL Exports.
18*90c8c64dSAndroid Build Coastguard Worker 
19*90c8c64dSAndroid Build Coastguard Worker #include "stdafx.h"
20*90c8c64dSAndroid Build Coastguard Worker #include "adb_api.h"
21*90c8c64dSAndroid Build Coastguard Worker #include "adb_winusb_api.h"
22*90c8c64dSAndroid Build Coastguard Worker 
23*90c8c64dSAndroid Build Coastguard Worker extern "C" {
24*90c8c64dSAndroid Build Coastguard Worker int _forceCRTManifest;
25*90c8c64dSAndroid Build Coastguard Worker int _forceMFCManifest;
26*90c8c64dSAndroid Build Coastguard Worker int _forceAtlDllManifest;
27*90c8c64dSAndroid Build Coastguard Worker };
28*90c8c64dSAndroid Build Coastguard Worker 
29*90c8c64dSAndroid Build Coastguard Worker /// References InstantiateWinUsbInterface declared in adb_api.cpp
30*90c8c64dSAndroid Build Coastguard Worker extern PFN_INSTWINUSBINTERFACE InstantiateWinUsbInterface;
31*90c8c64dSAndroid Build Coastguard Worker 
32*90c8c64dSAndroid Build Coastguard Worker class CAdbWinApiModule : public CAtlDllModuleT< CAdbWinApiModule > {
33*90c8c64dSAndroid Build Coastguard Worker  public:
CAdbWinApiModule()34*90c8c64dSAndroid Build Coastguard Worker   CAdbWinApiModule()
35*90c8c64dSAndroid Build Coastguard Worker       : CAtlDllModuleT< CAdbWinApiModule >(),
36*90c8c64dSAndroid Build Coastguard Worker         adbwinusbapi_handle_(NULL),
37*90c8c64dSAndroid Build Coastguard Worker         is_initialized_(false) {
38*90c8c64dSAndroid Build Coastguard Worker   }
39*90c8c64dSAndroid Build Coastguard Worker 
~CAdbWinApiModule()40*90c8c64dSAndroid Build Coastguard Worker   ~CAdbWinApiModule() {
41*90c8c64dSAndroid Build Coastguard Worker     // Unload AdbWinUsbApi.dll before we exit
42*90c8c64dSAndroid Build Coastguard Worker     if (NULL != adbwinusbapi_handle_) {
43*90c8c64dSAndroid Build Coastguard Worker       FreeLibrary(adbwinusbapi_handle_);
44*90c8c64dSAndroid Build Coastguard Worker     }
45*90c8c64dSAndroid Build Coastguard Worker   }
46*90c8c64dSAndroid Build Coastguard Worker 
47*90c8c64dSAndroid Build Coastguard Worker   /** \brief Loads AdbWinUsbApi.dll and caches its InstantiateWinUsbInterface
48*90c8c64dSAndroid Build Coastguard Worker     export.
49*90c8c64dSAndroid Build Coastguard Worker 
50*90c8c64dSAndroid Build Coastguard Worker     This method is called from DllMain on DLL_PROCESS_ATTACH event. In this
51*90c8c64dSAndroid Build Coastguard Worker     method we will check if WINUSB.DLL required by AdbWinUsbApi.dll is
52*90c8c64dSAndroid Build Coastguard Worker     installed, and if it is we will load AdbWinUsbApi.dll and cache address of
53*90c8c64dSAndroid Build Coastguard Worker     InstantiateWinUsbInterface routine exported from AdbWinUsbApi.dll
54*90c8c64dSAndroid Build Coastguard Worker   */
AttachToAdbWinUsbApi()55*90c8c64dSAndroid Build Coastguard Worker   void AttachToAdbWinUsbApi() {
56*90c8c64dSAndroid Build Coastguard Worker     // We only need to run this only once.
57*90c8c64dSAndroid Build Coastguard Worker     if (is_initialized_) {
58*90c8c64dSAndroid Build Coastguard Worker       return;
59*90c8c64dSAndroid Build Coastguard Worker     }
60*90c8c64dSAndroid Build Coastguard Worker 
61*90c8c64dSAndroid Build Coastguard Worker     // Just mark that we have ran initialization.
62*90c8c64dSAndroid Build Coastguard Worker     is_initialized_ = true;
63*90c8c64dSAndroid Build Coastguard Worker 
64*90c8c64dSAndroid Build Coastguard Worker     // Before we can load AdbWinUsbApi.dll we must make sure that WINUSB.DLL
65*90c8c64dSAndroid Build Coastguard Worker     // has been installed. Build path to the file.
66*90c8c64dSAndroid Build Coastguard Worker     wchar_t path_to_winusb_dll[MAX_PATH+1];
67*90c8c64dSAndroid Build Coastguard Worker     if (!GetSystemDirectory(path_to_winusb_dll, MAX_PATH)) {
68*90c8c64dSAndroid Build Coastguard Worker       return;
69*90c8c64dSAndroid Build Coastguard Worker     }
70*90c8c64dSAndroid Build Coastguard Worker     wcscat(path_to_winusb_dll, L"\\WINUSB.DLL");
71*90c8c64dSAndroid Build Coastguard Worker 
72*90c8c64dSAndroid Build Coastguard Worker     if (0xFFFFFFFF == GetFileAttributes(path_to_winusb_dll)) {
73*90c8c64dSAndroid Build Coastguard Worker       // WINUSB.DLL is not installed. We don't (in fact, can't) load
74*90c8c64dSAndroid Build Coastguard Worker       // AdbWinUsbApi.dll
75*90c8c64dSAndroid Build Coastguard Worker       return;
76*90c8c64dSAndroid Build Coastguard Worker     }
77*90c8c64dSAndroid Build Coastguard Worker 
78*90c8c64dSAndroid Build Coastguard Worker     // WINUSB.DLL is installed. Lets load AdbWinUsbApi.dll and cache its
79*90c8c64dSAndroid Build Coastguard Worker     // InstantiateWinUsbInterface export.
80*90c8c64dSAndroid Build Coastguard Worker     // We require that AdbWinUsbApi.dll is located in the same folder
81*90c8c64dSAndroid Build Coastguard Worker     // where AdbWinApi.dll and adb.exe are located, so by Windows
82*90c8c64dSAndroid Build Coastguard Worker     // conventions we can pass just module name, and not the full path.
83*90c8c64dSAndroid Build Coastguard Worker     adbwinusbapi_handle_ = LoadLibrary(L"AdbWinUsbApi.dll");
84*90c8c64dSAndroid Build Coastguard Worker     if (NULL != adbwinusbapi_handle_) {
85*90c8c64dSAndroid Build Coastguard Worker       InstantiateWinUsbInterface = reinterpret_cast<PFN_INSTWINUSBINTERFACE>
86*90c8c64dSAndroid Build Coastguard Worker           (GetProcAddress(adbwinusbapi_handle_, "InstantiateWinUsbInterface"));
87*90c8c64dSAndroid Build Coastguard Worker     }
88*90c8c64dSAndroid Build Coastguard Worker   }
89*90c8c64dSAndroid Build Coastguard Worker 
90*90c8c64dSAndroid Build Coastguard Worker  protected:
91*90c8c64dSAndroid Build Coastguard Worker   /// Handle to the loaded AdbWinUsbApi.dll
92*90c8c64dSAndroid Build Coastguard Worker   HINSTANCE adbwinusbapi_handle_;
93*90c8c64dSAndroid Build Coastguard Worker 
94*90c8c64dSAndroid Build Coastguard Worker   /// Flags whether or not this module has been initialized.
95*90c8c64dSAndroid Build Coastguard Worker   bool      is_initialized_;
96*90c8c64dSAndroid Build Coastguard Worker };
97*90c8c64dSAndroid Build Coastguard Worker 
98*90c8c64dSAndroid Build Coastguard Worker CAdbWinApiModule _AtlModule;
99*90c8c64dSAndroid Build Coastguard Worker 
100*90c8c64dSAndroid Build Coastguard Worker // DLL Entry Point
DllMain(HINSTANCE instance,DWORD reason,LPVOID reserved)101*90c8c64dSAndroid Build Coastguard Worker extern "C" BOOL WINAPI DllMain(HINSTANCE instance,
102*90c8c64dSAndroid Build Coastguard Worker                                DWORD reason,
103*90c8c64dSAndroid Build Coastguard Worker                                LPVOID reserved) {
104*90c8c64dSAndroid Build Coastguard Worker   // Lets see if we need to initialize InstantiateWinUsbInterface
105*90c8c64dSAndroid Build Coastguard Worker   // variable. We do that only once, on condition that this DLL is
106*90c8c64dSAndroid Build Coastguard Worker   // being attached to the process and InstantiateWinUsbInterface
107*90c8c64dSAndroid Build Coastguard Worker   // address has not been calculated yet.
108*90c8c64dSAndroid Build Coastguard Worker   if (DLL_PROCESS_ATTACH == reason) {
109*90c8c64dSAndroid Build Coastguard Worker     _AtlModule.AttachToAdbWinUsbApi();
110*90c8c64dSAndroid Build Coastguard Worker   }
111*90c8c64dSAndroid Build Coastguard Worker   return _AtlModule.DllMain(reason, reserved);
112*90c8c64dSAndroid Build Coastguard Worker }
113