1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/native_library.h" 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <windows.h> 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/file_util.h" 103f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/thread_restrictions.h" 113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h" 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace base { 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 15201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochtypedef HMODULE (WINAPI* LoadLibraryFunction)(const wchar_t* file_name); 16201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 17201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochNativeLibrary LoadNativeLibraryHelper(const FilePath& library_path, 18201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch LoadLibraryFunction load_library_api) { 194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // LoadLibrary() opens the file off disk. 204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch base::ThreadRestrictions::AssertIOAllowed(); 214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Switch the current directory to the library directory as the library 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // may have dependencies on DLLs in this directory. 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool restore_directory = false; 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FilePath current_directory; 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (file_util::GetCurrentDirectory(¤t_directory)) { 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FilePath plugin_path = library_path.DirName(); 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!plugin_path.empty()) { 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott file_util::SetCurrentDirectory(plugin_path); 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott restore_directory = true; 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 34201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch HMODULE module = (*load_library_api)(library_path.value().c_str()); 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (restore_directory) 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott file_util::SetCurrentDirectory(current_directory); 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return module; 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenNativeLibrary LoadNativeLibrary(const FilePath& library_path, 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string* error) { 44201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return LoadNativeLibraryHelper(library_path, LoadLibraryW); 45201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 46201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 47201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochNativeLibrary LoadNativeLibraryDynamically(const FilePath& library_path) { 48201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch typedef HMODULE (WINAPI* LoadLibraryFunction)(const wchar_t* file_name); 49201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 50201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch LoadLibraryFunction load_library; 51201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch load_library = reinterpret_cast<LoadLibraryFunction>( 52201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryW")); 53201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 54201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return LoadNativeLibraryHelper(library_path, load_library); 55201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 56201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 57201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// static 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid UnloadNativeLibrary(NativeLibrary library) { 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott FreeLibrary(library); 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid* GetFunctionPointerFromNativeLibrary(NativeLibrary library, 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* name) { 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return GetProcAddress(library, name); 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstring16 GetNativeLibraryName(const string16& name) { 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return name + ASCIIToUTF16(".dll"); 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace base 74