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 char buffer[MAX_PATH];
46 int ret = snprintf(buffer, MAX_PATH, "%s.%s", libraryName, GetSharedLibraryExtension());
47 if (ret > 0 && ret < MAX_PATH)
48 {
49 switch (searchType)
50 {
51 case SearchType::ApplicationDir:
52 mModule = LoadLibraryA(buffer);
53 break;
54 case SearchType::SystemDir:
55 mModule = LoadLibraryExA(buffer, nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32);
56 break;
57 }
58 }
59 }
60
~Win32Library()61 ~Win32Library() override
62 {
63 if (mModule)
64 {
65 FreeLibrary(mModule);
66 }
67 }
68
getSymbol(const char * symbolName)69 void *getSymbol(const char *symbolName) override
70 {
71 if (!mModule)
72 {
73 return nullptr;
74 }
75
76 return reinterpret_cast<void *>(GetProcAddress(mModule, symbolName));
77 }
78
getNative() const79 void *getNative() const override { return reinterpret_cast<void *>(mModule); }
80
81 private:
82 HMODULE mModule = nullptr;
83 };
84
OpenSharedLibrary(const char * libraryName,SearchType searchType)85 Library *OpenSharedLibrary(const char *libraryName, SearchType searchType)
86 {
87 return new Win32Library(libraryName, searchType);
88 }
89 } // namespace angle
90