all repos — mgba @ b2d406a411b31acce5bbf0246af32a80c22ca834

mGBA Game Boy Advance Emulator

src/third-party/lzma/DllSecur.c (view raw)

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