88 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			88 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/* 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
							 |