/* | |
* 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. | |
*/ | |
// AdbWinApi.cpp : Implementation of DLL Exports. | |
#include "stdafx.h" | |
#include "adb_api.h" | |
#include "adb_winusb_api.h" | |
extern "C" { | |
int _forceCRTManifest; | |
int _forceMFCManifest; | |
int _forceAtlDllManifest; | |
}; | |
/// References InstantiateWinUsbInterface declared in adb_api.cpp | |
extern PFN_INSTWINUSBINTERFACE InstantiateWinUsbInterface; | |
class CAdbWinApiModule : public CAtlDllModuleT< CAdbWinApiModule > { | |
public: | |
CAdbWinApiModule() | |
: CAtlDllModuleT< CAdbWinApiModule >(), | |
adbwinusbapi_handle_(NULL), | |
is_initialized_(false) { | |
} | |
~CAdbWinApiModule() { | |
// Unload AdbWinUsbApi.dll before we exit | |
if (NULL != adbwinusbapi_handle_) { | |
FreeLibrary(adbwinusbapi_handle_); | |
} | |
} | |
/** \brief Loads AdbWinUsbApi.dll and caches its InstantiateWinUsbInterface | |
export. | |
This method is called from DllMain on DLL_PROCESS_ATTACH event. In this | |
method we will check if WINUSB.DLL required by AdbWinUsbApi.dll is | |
installed, and if it is we will load AdbWinUsbApi.dll and cache address of | |
InstantiateWinUsbInterface routine exported from AdbWinUsbApi.dll | |
*/ | |
void AttachToAdbWinUsbApi() { | |
// We only need to run this only once. | |
if (is_initialized_) { | |
return; | |
} | |
// Just mark that we have ran initialization. | |
is_initialized_ = true; | |
// Before we can load AdbWinUsbApi.dll we must make sure that WINUSB.DLL | |
// has been installed. Build path to the file. | |
wchar_t path_to_winusb_dll[MAX_PATH+1]; | |
if (!GetSystemDirectory(path_to_winusb_dll, MAX_PATH)) { | |
return; | |
} | |
wcscat(path_to_winusb_dll, L"\\WINUSB.DLL"); | |
if (0xFFFFFFFF == GetFileAttributes(path_to_winusb_dll)) { | |
// WINUSB.DLL is not installed. We don't (in fact, can't) load | |
// AdbWinUsbApi.dll | |
return; | |
} | |
// WINUSB.DLL is installed. Lets load AdbWinUsbApi.dll and cache its | |
// InstantiateWinUsbInterface export. | |
// We require that AdbWinUsbApi.dll is located in the same folder | |
// where AdbWinApi.dll and adb.exe are located, so by Windows | |
// conventions we can pass just module name, and not the full path. | |
adbwinusbapi_handle_ = LoadLibrary(L"AdbWinUsbApi.dll"); | |
if (NULL != adbwinusbapi_handle_) { | |
InstantiateWinUsbInterface = reinterpret_cast<PFN_INSTWINUSBINTERFACE> | |
(GetProcAddress(adbwinusbapi_handle_, "InstantiateWinUsbInterface")); | |
} | |
} | |
protected: | |
/// Handle to the loaded AdbWinUsbApi.dll | |
HINSTANCE adbwinusbapi_handle_; | |
/// Flags whether or not this module has been initialized. | |
bool is_initialized_; | |
}; | |
CAdbWinApiModule _AtlModule; | |
// DLL Entry Point | |
extern "C" BOOL WINAPI DllMain(HINSTANCE instance, | |
DWORD reason, | |
LPVOID reserved) { | |
// Lets see if we need to initialize InstantiateWinUsbInterface | |
// variable. We do that only once, on condition that this DLL is | |
// being attached to the process and InstantiateWinUsbInterface | |
// address has not been calculated yet. | |
if (DLL_PROCESS_ATTACH == reason) { | |
_AtlModule.AttachToAdbWinUsbApi(); | |
} | |
return _AtlModule.DllMain(reason, reserved); | |
} |