/* 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
