Merge pull request #461 from negativeExponent/libchdr
[pcsx_rearmed.git] / deps / lzma-16.04 / C / DllSecur.c
1 /* DllSecur.c -- DLL loading security\r
2 2016-10-04 : Igor Pavlov : Public domain */\r
3 \r
4 #include "Precomp.h"\r
5 \r
6 #ifdef _WIN32\r
7 \r
8 #include <windows.h>\r
9 \r
10 #include "DllSecur.h"\r
11 \r
12 #ifndef UNDER_CE\r
13 \r
14 typedef BOOL (WINAPI *Func_SetDefaultDllDirectories)(DWORD DirectoryFlags);\r
15 \r
16 #define MY_LOAD_LIBRARY_SEARCH_USER_DIRS 0x400\r
17 #define MY_LOAD_LIBRARY_SEARCH_SYSTEM32  0x800\r
18 \r
19 static const char * const g_Dlls =\r
20   #ifndef _CONSOLE\r
21   "UXTHEME\0"\r
22   #endif\r
23   "USERENV\0"\r
24   "SETUPAPI\0"\r
25   "APPHELP\0"\r
26   "PROPSYS\0"\r
27   "DWMAPI\0"\r
28   "CRYPTBASE\0"\r
29   "OLEACC\0"\r
30   "CLBCATQ\0"\r
31   ;\r
32 \r
33 #endif\r
34 \r
35 void LoadSecurityDlls()\r
36 {\r
37   #ifndef UNDER_CE\r
38   \r
39   wchar_t buf[MAX_PATH + 100];\r
40 \r
41   {\r
42     // at Vista (ver 6.0) : CoCreateInstance(CLSID_ShellLink, ...) doesn't work after SetDefaultDllDirectories() : Check it ???\r
43     OSVERSIONINFO vi;\r
44     vi.dwOSVersionInfoSize = sizeof(vi);\r
45     if (!GetVersionEx(&vi) || vi.dwMajorVersion != 6 || vi.dwMinorVersion != 0)\r
46     {\r
47       Func_SetDefaultDllDirectories setDllDirs = (Func_SetDefaultDllDirectories)\r
48           GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "SetDefaultDllDirectories");\r
49       if (setDllDirs)\r
50         if (setDllDirs(MY_LOAD_LIBRARY_SEARCH_SYSTEM32 | MY_LOAD_LIBRARY_SEARCH_USER_DIRS))\r
51           return;\r
52     }\r
53   }\r
54 \r
55   {\r
56     unsigned len = GetSystemDirectoryW(buf, MAX_PATH + 2);\r
57     if (len == 0 || len > MAX_PATH)\r
58       return;\r
59   }\r
60   {\r
61     const char *dll;\r
62     unsigned pos = (unsigned)lstrlenW(buf);\r
63 \r
64     if (buf[pos - 1] != '\\')\r
65       buf[pos++] = '\\';\r
66     \r
67     for (dll = g_Dlls; dll[0] != 0;)\r
68     {\r
69       unsigned k = 0;\r
70       for (;;)\r
71       {\r
72         char c = *dll++;\r
73         buf[pos + k] = c;\r
74         k++;\r
75         if (c == 0)\r
76           break;\r
77       }\r
78 \r
79       lstrcatW(buf, L".dll");\r
80       LoadLibraryExW(buf, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);\r
81     }\r
82   }\r
83   \r
84   #endif\r
85 }\r
86 \r
87 #endif\r