88 lines
2 KiB
C++
88 lines
2 KiB
C++
/******************************************************************************
|
|
|
|
Copyright (c) 2002 Microsoft Corporation
|
|
|
|
Module Name:
|
|
safelib.cpp
|
|
|
|
Abstract:
|
|
Implements LoadLibraryFromSystemDir function
|
|
|
|
******************************************************************************/
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
// **************************************************************************
|
|
static
|
|
BOOL UseFullPath(void)
|
|
{
|
|
static BOOL s_fUseFullPath = TRUE;
|
|
static BOOL s_fInit = FALSE;
|
|
|
|
OSVERSIONINFO osvi;
|
|
|
|
if (s_fInit)
|
|
return s_fUseFullPath;
|
|
|
|
ZeroMemory(&osvi, sizeof(osvi));
|
|
osvi.dwOSVersionInfoSize = sizeof(osvi);
|
|
|
|
if (GetVersionEx(&osvi))
|
|
{
|
|
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT &&
|
|
(osvi.dwMajorVersion > 5 ||
|
|
(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion >= 1)))
|
|
{
|
|
s_fUseFullPath = FALSE;
|
|
}
|
|
|
|
s_fInit = TRUE;
|
|
}
|
|
|
|
return s_fUseFullPath;
|
|
}
|
|
|
|
// **************************************************************************
|
|
HMODULE WINAPI LoadLibraryFromSystemDir(LPCTSTR szModule)
|
|
{
|
|
HRESULT hr = NOERROR;
|
|
HMODULE hmod = NULL;
|
|
TCHAR szModulePath[MAX_PATH + 1];
|
|
|
|
if (szModule == NULL)
|
|
{
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
goto done;
|
|
}
|
|
|
|
if (UseFullPath())
|
|
{
|
|
DWORD cch;
|
|
|
|
// if the function call fails, make the buffer an empty string, so
|
|
// we will just use the dll name in the append below.
|
|
cch = GetSystemDirectory(szModulePath, ARRAYSIZE(szModulePath));
|
|
if (cch == 0 || cch >= ARRAYSIZE(szModulePath))
|
|
szModulePath[0] = _T('\0');
|
|
}
|
|
else
|
|
{
|
|
szModulePath[0] = _T('\0');
|
|
}
|
|
|
|
hr = PathCchAppend(szModulePath, ARRAYSIZE(szModulePath), szModule);
|
|
if (FAILED(hr))
|
|
{
|
|
SetLastError(HRESULT_CODE(hr));
|
|
goto done;
|
|
}
|
|
|
|
hmod = LoadLibraryEx(szModulePath, NULL, 0);
|
|
if (hmod == NULL)
|
|
goto done;
|
|
|
|
done:
|
|
return hmod;
|
|
}
|