tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

DllSecur.c (1894B)


      1 /* DllSecur.c -- DLL loading security
      2 2016-10-04 : 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 
     14 typedef 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 
     19 static 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  ;
     32 
     33 #endif
     34 
     35 void LoadSecurityDlls()
     36 {
     37  #ifndef UNDER_CE
     38  
     39  wchar_t buf[MAX_PATH + 100];
     40 
     41  {
     42    // at Vista (ver 6.0) : CoCreateInstance(CLSID_ShellLink, ...) doesn't work after SetDefaultDllDirectories() : Check it ???
     43    OSVERSIONINFO vi;
     44    vi.dwOSVersionInfoSize = sizeof(vi);
     45    if (!GetVersionEx(&vi) || vi.dwMajorVersion != 6 || vi.dwMinorVersion != 0)
     46    {
     47      Func_SetDefaultDllDirectories setDllDirs = (Func_SetDefaultDllDirectories)
     48          GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "SetDefaultDllDirectories");
     49      if (setDllDirs)
     50        if (setDllDirs(MY_LOAD_LIBRARY_SEARCH_SYSTEM32 | MY_LOAD_LIBRARY_SEARCH_USER_DIRS))
     51          return;
     52    }
     53  }
     54 
     55  {
     56    unsigned len = GetSystemDirectoryW(buf, MAX_PATH + 2);
     57    if (len == 0 || len > MAX_PATH)
     58      return;
     59  }
     60  {
     61    const char *dll;
     62    unsigned pos = (unsigned)lstrlenW(buf);
     63 
     64    if (buf[pos - 1] != '\\')
     65      buf[pos++] = '\\';
     66    
     67    for (dll = g_Dlls; dll[0] != 0;)
     68    {
     69      unsigned k = 0;
     70      for (;;)
     71      {
     72        char c = *dll++;
     73        buf[pos + k] = c;
     74        k++;
     75        if (c == 0)
     76          break;
     77      }
     78 
     79      lstrcatW(buf, L".dll");
     80      LoadLibraryExW(buf, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
     81    }
     82  }
     83  
     84  #endif
     85 }
     86 
     87 #endif