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