1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/native_library.h"
6
7#include <windows.h>
8
9#include "base/file_util.h"
10#include "base/threading/thread_restrictions.h"
11#include "base/utf_string_conversions.h"
12
13namespace base {
14
15typedef HMODULE (WINAPI* LoadLibraryFunction)(const wchar_t* file_name);
16
17NativeLibrary LoadNativeLibraryHelper(const FilePath& library_path,
18                                      LoadLibraryFunction load_library_api) {
19  // LoadLibrary() opens the file off disk.
20  base::ThreadRestrictions::AssertIOAllowed();
21
22  // Switch the current directory to the library directory as the library
23  // may have dependencies on DLLs in this directory.
24  bool restore_directory = false;
25  FilePath current_directory;
26  if (file_util::GetCurrentDirectory(&current_directory)) {
27    FilePath plugin_path = library_path.DirName();
28    if (!plugin_path.empty()) {
29      file_util::SetCurrentDirectory(plugin_path);
30      restore_directory = true;
31    }
32  }
33
34  HMODULE module = (*load_library_api)(library_path.value().c_str());
35  if (restore_directory)
36    file_util::SetCurrentDirectory(current_directory);
37
38  return module;
39}
40
41// static
42NativeLibrary LoadNativeLibrary(const FilePath& library_path,
43                                std::string* error) {
44  return LoadNativeLibraryHelper(library_path, LoadLibraryW);
45}
46
47NativeLibrary LoadNativeLibraryDynamically(const FilePath& library_path) {
48  typedef HMODULE (WINAPI* LoadLibraryFunction)(const wchar_t* file_name);
49
50  LoadLibraryFunction load_library;
51  load_library = reinterpret_cast<LoadLibraryFunction>(
52      GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryW"));
53
54  return LoadNativeLibraryHelper(library_path, load_library);
55}
56
57// static
58void UnloadNativeLibrary(NativeLibrary library) {
59  FreeLibrary(library);
60}
61
62// static
63void* GetFunctionPointerFromNativeLibrary(NativeLibrary library,
64                                          const char* name) {
65  return GetProcAddress(library, name);
66}
67
68// static
69string16 GetNativeLibraryName(const string16& name) {
70  return name + ASCIIToUTF16(".dll");
71}
72
73}  // namespace base
74