• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2019 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // system_utils_win32.cpp: Implementation of OS-specific functions for Windows.
7 
8 #include "system_utils.h"
9 
10 #include <windows.h>
11 #include <array>
12 
13 namespace angle
14 {
UnsetEnvironmentVar(const char * variableName)15 bool UnsetEnvironmentVar(const char *variableName)
16 {
17     return (SetEnvironmentVariableA(variableName, nullptr) == TRUE);
18 }
19 
SetEnvironmentVar(const char * variableName,const char * value)20 bool SetEnvironmentVar(const char *variableName, const char *value)
21 {
22     return (SetEnvironmentVariableA(variableName, value) == TRUE);
23 }
24 
GetEnvironmentVar(const char * variableName)25 std::string GetEnvironmentVar(const char *variableName)
26 {
27     std::array<char, MAX_PATH> oldValue;
28     DWORD result =
29         GetEnvironmentVariableA(variableName, oldValue.data(), static_cast<DWORD>(oldValue.size()));
30     if (result == 0)
31     {
32         return std::string();
33     }
34     else
35     {
36         return std::string(oldValue.data());
37     }
38 }
39 
40 class Win32Library : public Library
41 {
42   public:
Win32Library(const char * libraryName,SearchType searchType)43     Win32Library(const char *libraryName, SearchType searchType)
44     {
45         switch (searchType)
46         {
47             case SearchType::ApplicationDir:
48                 mModule = LoadLibraryA(libraryName);
49                 break;
50             case SearchType::SystemDir:
51                 mModule = LoadLibraryExA(libraryName, nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32);
52                 break;
53         }
54     }
55 
~Win32Library()56     ~Win32Library() override
57     {
58         if (mModule)
59         {
60             FreeLibrary(mModule);
61         }
62     }
63 
getSymbol(const char * symbolName)64     void *getSymbol(const char *symbolName) override
65     {
66         if (!mModule)
67         {
68             return nullptr;
69         }
70 
71         return reinterpret_cast<void *>(GetProcAddress(mModule, symbolName));
72     }
73 
getNative() const74     void *getNative() const override { return reinterpret_cast<void *>(mModule); }
75 
76   private:
77     HMODULE mModule = nullptr;
78 };
79 
OpenSharedLibrary(const char * libraryName,SearchType searchType)80 Library *OpenSharedLibrary(const char *libraryName, SearchType searchType)
81 {
82     char buffer[MAX_PATH];
83     int ret = snprintf(buffer, MAX_PATH, "%s.%s", libraryName, GetSharedLibraryExtension());
84     if (ret > 0 && ret < MAX_PATH)
85     {
86         return new Win32Library(buffer, searchType);
87     }
88     else
89     {
90         fprintf(stderr, "Error loading shared library: 0x%x", ret);
91         return nullptr;
92     }
93 }
94 
OpenSharedLibraryWithExtension(const char * libraryName)95 Library *OpenSharedLibraryWithExtension(const char *libraryName)
96 {
97     return new Win32Library(libraryName, SearchType::SystemDir);
98 }
99 }  // namespace angle
100