in rts/linker/PEi386.c [758:823]
HsPtr addLibrarySearchPath_PEi386(pathchar* dll_path)
{
HINSTANCE hDLL = LoadLibraryW(L"Kernel32.DLL");
LPAddDLLDirectory AddDllDirectory = (LPAddDLLDirectory)GetProcAddress((HMODULE)hDLL, "AddDllDirectory");
HsPtr result = NULL;
const unsigned int init_buf_size = 4096;
int bufsize = init_buf_size;
// Make sure the path is an absolute path
WCHAR* abs_path = malloc(sizeof(WCHAR) * init_buf_size);
DWORD wResult = GetFullPathNameW(dll_path, bufsize, abs_path, NULL);
if (!wResult){
sysErrorBelch("addLibrarySearchPath[GetFullPathNameW]: %" PATH_FMT " (Win32 error %lu)", dll_path, GetLastError());
}
else if (wResult > init_buf_size) {
abs_path = realloc(abs_path, sizeof(WCHAR) * wResult);
if (!GetFullPathNameW(dll_path, bufsize, abs_path, NULL)) {
sysErrorBelch("addLibrarySearchPath[GetFullPathNameW]: %" PATH_FMT " (Win32 error %lu)", dll_path, GetLastError());
}
}
if (AddDllDirectory) {
result = AddDllDirectory(abs_path);
}
else
{
warnMissingKBLibraryPaths();
WCHAR* str = malloc(sizeof(WCHAR) * init_buf_size);
wResult = GetEnvironmentVariableW(L"PATH", str, bufsize);
if (wResult > init_buf_size) {
str = realloc(str, sizeof(WCHAR) * wResult);
bufsize = wResult;
wResult = GetEnvironmentVariableW(L"PATH", str, bufsize);
if (!wResult) {
sysErrorBelch("addLibrarySearchPath[GetEnvironmentVariableW]: %" PATH_FMT " (Win32 error %lu)", dll_path, GetLastError());
}
}
bufsize = wResult + 2 + pathlen(abs_path);
wchar_t* newPath = malloc(sizeof(wchar_t) * bufsize);
wcscpy(newPath, abs_path);
wcscat(newPath, L";");
wcscat(newPath, str);
if (!SetEnvironmentVariableW(L"PATH", (LPCWSTR)newPath)) {
sysErrorBelch("addLibrarySearchPath[SetEnvironmentVariableW]: %" PATH_FMT " (Win32 error %lu)", abs_path, GetLastError());
}
free(newPath);
free(abs_path);
return str;
}
if (!result) {
sysErrorBelch("addLibrarySearchPath: %" PATH_FMT " (Win32 error %lu)", abs_path, GetLastError());
free(abs_path);
return NULL;
}
free(abs_path);
return result;
}