| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- /* DllSecur.c -- DLL loading security
- 2016-10-04 : Igor Pavlov : Public domain */
- #include "Precomp.h"
- #ifdef _WIN32
- #include <windows.h>
- #include "DllSecur.h"
- #ifndef UNDER_CE
- typedef BOOL (WINAPI *Func_SetDefaultDllDirectories)(DWORD DirectoryFlags);
- #define MY_LOAD_LIBRARY_SEARCH_USER_DIRS 0x400
- #define MY_LOAD_LIBRARY_SEARCH_SYSTEM32 0x800
- static const char * const g_Dlls =
- #ifndef _CONSOLE
- "UXTHEME\0"
- #endif
- "USERENV\0"
- "SETUPAPI\0"
- "APPHELP\0"
- "PROPSYS\0"
- "DWMAPI\0"
- "CRYPTBASE\0"
- "OLEACC\0"
- "CLBCATQ\0"
- ;
- #endif
- void LoadSecurityDlls()
- {
- #ifndef UNDER_CE
-
- wchar_t buf[MAX_PATH + 100];
- {
- // at Vista (ver 6.0) : CoCreateInstance(CLSID_ShellLink, ...) doesn't work after SetDefaultDllDirectories() : Check it ???
- OSVERSIONINFO vi;
- vi.dwOSVersionInfoSize = sizeof(vi);
- if (!GetVersionEx(&vi) || vi.dwMajorVersion != 6 || vi.dwMinorVersion != 0)
- {
- Func_SetDefaultDllDirectories setDllDirs = (Func_SetDefaultDllDirectories)
- GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "SetDefaultDllDirectories");
- if (setDllDirs)
- if (setDllDirs(MY_LOAD_LIBRARY_SEARCH_SYSTEM32 | MY_LOAD_LIBRARY_SEARCH_USER_DIRS))
- return;
- }
- }
- {
- unsigned len = GetSystemDirectoryW(buf, MAX_PATH + 2);
- if (len == 0 || len > MAX_PATH)
- return;
- }
- {
- const char *dll;
- unsigned pos = (unsigned)lstrlenW(buf);
- if (buf[pos - 1] != '\\')
- buf[pos++] = '\\';
-
- for (dll = g_Dlls; dll[0] != 0;)
- {
- unsigned k = 0;
- for (;;)
- {
- char c = *dll++;
- buf[pos + k] = c;
- k++;
- if (c == 0)
- break;
- }
- lstrcatW(buf, L".dll");
- LoadLibraryExW(buf, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
- }
- }
-
- #endif
- }
- #endif
|