You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
3.8 KiB
113 lines
3.8 KiB
/*
|
|
* 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);
|
|
}
|