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