xref: /aosp_15_r20/external/lzma/C/DllSecur.c (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker /* DllSecur.c -- DLL loading security
2*f6dc9357SAndroid Build Coastguard Worker 2023-12-03 : Igor Pavlov : Public domain */
3*f6dc9357SAndroid Build Coastguard Worker 
4*f6dc9357SAndroid Build Coastguard Worker #include "Precomp.h"
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "7zWindows.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker #include "DllSecur.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker typedef BOOL (WINAPI *Func_SetDefaultDllDirectories)(DWORD DirectoryFlags);
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker #define MY_LOAD_LIBRARY_SEARCH_USER_DIRS 0x400
19*f6dc9357SAndroid Build Coastguard Worker #define MY_LOAD_LIBRARY_SEARCH_SYSTEM32  0x800
20*f6dc9357SAndroid Build Coastguard Worker 
21*f6dc9357SAndroid Build Coastguard Worker #define DELIM "\0"
22*f6dc9357SAndroid Build Coastguard Worker 
23*f6dc9357SAndroid Build Coastguard Worker static const char * const g_Dlls =
24*f6dc9357SAndroid Build Coastguard Worker          "userenv"
25*f6dc9357SAndroid Build Coastguard Worker   DELIM  "setupapi"
26*f6dc9357SAndroid Build Coastguard Worker   DELIM  "apphelp"
27*f6dc9357SAndroid Build Coastguard Worker   DELIM  "propsys"
28*f6dc9357SAndroid Build Coastguard Worker   DELIM  "dwmapi"
29*f6dc9357SAndroid Build Coastguard Worker   DELIM  "cryptbase"
30*f6dc9357SAndroid Build Coastguard Worker   DELIM  "oleacc"
31*f6dc9357SAndroid Build Coastguard Worker   DELIM  "clbcatq"
32*f6dc9357SAndroid Build Coastguard Worker   DELIM  "version"
33*f6dc9357SAndroid Build Coastguard Worker   #ifndef _CONSOLE
34*f6dc9357SAndroid Build Coastguard Worker   DELIM  "uxtheme"
35*f6dc9357SAndroid Build Coastguard Worker   #endif
36*f6dc9357SAndroid Build Coastguard Worker   DELIM;
37*f6dc9357SAndroid Build Coastguard Worker 
38*f6dc9357SAndroid Build Coastguard Worker #endif
39*f6dc9357SAndroid Build Coastguard Worker 
40*f6dc9357SAndroid Build Coastguard Worker #ifdef __clang__
41*f6dc9357SAndroid Build Coastguard Worker   #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
42*f6dc9357SAndroid Build Coastguard Worker #endif
43*f6dc9357SAndroid Build Coastguard Worker #if defined (_MSC_VER) && _MSC_VER >= 1900
44*f6dc9357SAndroid Build Coastguard Worker // sysinfoapi.h: kit10: GetVersion was declared deprecated
45*f6dc9357SAndroid Build Coastguard Worker #pragma warning(disable : 4996)
46*f6dc9357SAndroid Build Coastguard Worker #endif
47*f6dc9357SAndroid Build Coastguard Worker 
48*f6dc9357SAndroid Build Coastguard Worker #define IF_NON_VISTA_SET_DLL_DIRS_AND_RETURN \
49*f6dc9357SAndroid Build Coastguard Worker     if ((UInt16)GetVersion() != 6) { \
50*f6dc9357SAndroid Build Coastguard Worker       const \
51*f6dc9357SAndroid Build Coastguard Worker        Func_SetDefaultDllDirectories setDllDirs = \
52*f6dc9357SAndroid Build Coastguard Worker       (Func_SetDefaultDllDirectories) Z7_CAST_FUNC_C GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), \
53*f6dc9357SAndroid Build Coastguard Worker            "SetDefaultDllDirectories"); \
54*f6dc9357SAndroid Build Coastguard Worker       if (setDllDirs) if (setDllDirs(MY_LOAD_LIBRARY_SEARCH_SYSTEM32 | MY_LOAD_LIBRARY_SEARCH_USER_DIRS)) return; }
55*f6dc9357SAndroid Build Coastguard Worker 
My_SetDefaultDllDirectories(void)56*f6dc9357SAndroid Build Coastguard Worker void My_SetDefaultDllDirectories(void)
57*f6dc9357SAndroid Build Coastguard Worker {
58*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
59*f6dc9357SAndroid Build Coastguard Worker   IF_NON_VISTA_SET_DLL_DIRS_AND_RETURN
60*f6dc9357SAndroid Build Coastguard Worker   #endif
61*f6dc9357SAndroid Build Coastguard Worker }
62*f6dc9357SAndroid Build Coastguard Worker 
63*f6dc9357SAndroid Build Coastguard Worker 
LoadSecurityDlls(void)64*f6dc9357SAndroid Build Coastguard Worker void LoadSecurityDlls(void)
65*f6dc9357SAndroid Build Coastguard Worker {
66*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
67*f6dc9357SAndroid Build Coastguard Worker   // at Vista (ver 6.0) : CoCreateInstance(CLSID_ShellLink, ...) doesn't work after SetDefaultDllDirectories() : Check it ???
68*f6dc9357SAndroid Build Coastguard Worker   IF_NON_VISTA_SET_DLL_DIRS_AND_RETURN
69*f6dc9357SAndroid Build Coastguard Worker   {
70*f6dc9357SAndroid Build Coastguard Worker     wchar_t buf[MAX_PATH + 100];
71*f6dc9357SAndroid Build Coastguard Worker     const char *dll;
72*f6dc9357SAndroid Build Coastguard Worker     unsigned pos = GetSystemDirectoryW(buf, MAX_PATH + 2);
73*f6dc9357SAndroid Build Coastguard Worker     if (pos == 0 || pos > MAX_PATH)
74*f6dc9357SAndroid Build Coastguard Worker       return;
75*f6dc9357SAndroid Build Coastguard Worker     if (buf[pos - 1] != '\\')
76*f6dc9357SAndroid Build Coastguard Worker       buf[pos++] = '\\';
77*f6dc9357SAndroid Build Coastguard Worker     for (dll = g_Dlls; *dll != 0;)
78*f6dc9357SAndroid Build Coastguard Worker     {
79*f6dc9357SAndroid Build Coastguard Worker       wchar_t *dest = &buf[pos];
80*f6dc9357SAndroid Build Coastguard Worker       for (;;)
81*f6dc9357SAndroid Build Coastguard Worker       {
82*f6dc9357SAndroid Build Coastguard Worker         const char c = *dll++;
83*f6dc9357SAndroid Build Coastguard Worker         if (c == 0)
84*f6dc9357SAndroid Build Coastguard Worker           break;
85*f6dc9357SAndroid Build Coastguard Worker         *dest++ = (Byte)c;
86*f6dc9357SAndroid Build Coastguard Worker       }
87*f6dc9357SAndroid Build Coastguard Worker       dest[0] = '.';
88*f6dc9357SAndroid Build Coastguard Worker       dest[1] = 'd';
89*f6dc9357SAndroid Build Coastguard Worker       dest[2] = 'l';
90*f6dc9357SAndroid Build Coastguard Worker       dest[3] = 'l';
91*f6dc9357SAndroid Build Coastguard Worker       dest[4] = 0;
92*f6dc9357SAndroid Build Coastguard Worker       // lstrcatW(buf, L".dll");
93*f6dc9357SAndroid Build Coastguard Worker       LoadLibraryExW(buf, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
94*f6dc9357SAndroid Build Coastguard Worker     }
95*f6dc9357SAndroid Build Coastguard Worker   }
96*f6dc9357SAndroid Build Coastguard Worker   #endif
97*f6dc9357SAndroid Build Coastguard Worker }
98*f6dc9357SAndroid Build Coastguard Worker 
99*f6dc9357SAndroid Build Coastguard Worker #endif // _WIN32
100