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 Workervoid 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 Workervoid 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