75 lines
1.4 KiB
C++
75 lines
1.4 KiB
C++
/*++
|
|
|
|
Copyright (c) 2002 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
LoadLibraryCWD.cpp
|
|
|
|
Abstract:
|
|
|
|
Some applications rely on the fact that LoadLibrary will search the current
|
|
working directory (CWD) in-order to find dlls that are there. This is a
|
|
security hole, so we apply shims to only the apps that really need it.
|
|
|
|
Notes:
|
|
|
|
This is a general purpose shim.
|
|
|
|
History:
|
|
|
|
05/01/2002 linstev Created
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
|
|
IMPLEMENT_SHIM_BEGIN(LoadLibraryCWD)
|
|
#include "ShimHookMacro.h"
|
|
|
|
APIHOOK_ENUM_BEGIN
|
|
APIHOOK_ENUM_END
|
|
|
|
typedef BOOL (WINAPI *_pfn_SetDllDirectoryW)(LPCWSTR lpPathName);
|
|
|
|
BOOL
|
|
NOTIFY_FUNCTION(
|
|
DWORD fdwReason
|
|
)
|
|
{
|
|
if (fdwReason == DLL_PROCESS_ATTACH) {
|
|
|
|
HMODULE hMod = GetModuleHandleW(L"KERNEL32.DLL");
|
|
|
|
if (hMod) {
|
|
|
|
// Get the API
|
|
_pfn_SetDllDirectoryW pfn = (_pfn_SetDllDirectoryW)
|
|
GetProcAddress(hMod, "SetDllDirectoryW");
|
|
|
|
if (pfn) {
|
|
// Success, the API exists
|
|
LOGN(eDbgLevelError, "DLL search order now starts with current directory");
|
|
pfn(L".");
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
LOGN(eDbgLevelError, "ERROR: DLL search order API does not exist");
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*++
|
|
|
|
Register hooked functions
|
|
|
|
--*/
|
|
|
|
HOOK_BEGIN
|
|
CALL_NOTIFY_FUNCTION
|
|
HOOK_END
|
|
|
|
IMPLEMENT_SHIM_END
|