mirror of
https://github.com/reactos/reactos.git
synced 2025-06-20 07:36:05 +00:00
Handle file names like ./somename in SearchPath()
svn path=/trunk/; revision=9959
This commit is contained in:
parent
820eaf8fce
commit
1c2af8076a
1 changed files with 107 additions and 62 deletions
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: dir.c,v 1.46 2004/06/28 19:46:17 navaraf Exp $
|
/* $Id: dir.c,v 1.47 2004/07/01 22:35:35 gvg Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS system libraries
|
* PROJECT: ReactOS system libraries
|
||||||
|
@ -753,75 +753,120 @@ SearchPathW (
|
||||||
PWCHAR EnvironmentBufferW = NULL;
|
PWCHAR EnvironmentBufferW = NULL;
|
||||||
PWCHAR AppPathW = NULL;
|
PWCHAR AppPathW = NULL;
|
||||||
WCHAR Buffer;
|
WCHAR Buffer;
|
||||||
//WCHAR drv[3];
|
BOOL HasExtension;
|
||||||
|
LPCWSTR p;
|
||||||
|
PWCHAR Name;
|
||||||
|
|
||||||
DPRINT("SearchPath\n");
|
DPRINT("SearchPath\n");
|
||||||
|
|
||||||
if (lpPath == NULL)
|
HasExtension = FALSE;
|
||||||
|
p = lpFileName + wcslen(lpFileName);
|
||||||
|
while (lpFileName < p &&
|
||||||
|
L'\\' != *(p - 1) &&
|
||||||
|
L'/' != *(p - 1) &&
|
||||||
|
L':' != *(p - 1))
|
||||||
{
|
{
|
||||||
|
HasExtension = HasExtension || L'.' == *(p - 1);
|
||||||
AppPathW = (PWCHAR) RtlAllocateHeap(GetProcessHeap(),
|
p--;
|
||||||
HEAP_GENERATE_EXCEPTIONS|HEAP_ZERO_MEMORY,
|
}
|
||||||
MAX_PATH * sizeof(WCHAR));
|
if (lpFileName < p)
|
||||||
|
{
|
||||||
|
if (HasExtension || NULL == lpExtension)
|
||||||
wcscat (AppPathW, NtCurrentPeb()->ProcessParameters->ImagePathName.Buffer);
|
|
||||||
|
|
||||||
len = wcslen (AppPathW);
|
|
||||||
|
|
||||||
while (len && AppPathW[len - 1] != L'\\')
|
|
||||||
len--;
|
|
||||||
|
|
||||||
if (len) AppPathW[len-1] = L'\0';
|
|
||||||
|
|
||||||
len = GetEnvironmentVariableW(L"PATH", &Buffer, 0);
|
|
||||||
len += 1 + GetCurrentDirectoryW(0, &Buffer);
|
|
||||||
len += 1 + GetSystemDirectoryW(&Buffer, 0);
|
|
||||||
len += 1 + GetWindowsDirectoryW(&Buffer, 0);
|
|
||||||
len += 1 + wcslen(AppPathW) * sizeof(WCHAR);
|
|
||||||
|
|
||||||
EnvironmentBufferW = (PWCHAR) RtlAllocateHeap(GetProcessHeap(),
|
|
||||||
HEAP_GENERATE_EXCEPTIONS|HEAP_ZERO_MEMORY,
|
|
||||||
len * sizeof(WCHAR));
|
|
||||||
if (EnvironmentBufferW == NULL)
|
|
||||||
{
|
{
|
||||||
SetLastError(ERROR_OUTOFMEMORY);
|
Name = (PWCHAR) lpFileName;
|
||||||
return 0;
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Name = RtlAllocateHeap(GetProcessHeap(),
|
||||||
|
HEAP_GENERATE_EXCEPTIONS,
|
||||||
|
(wcslen(lpFileName) + wcslen(lpExtension) + 1)
|
||||||
|
* sizeof(WCHAR));
|
||||||
|
if (NULL == Name)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_OUTOFMEMORY);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
wcscat(wcscpy(Name, lpFileName), lpExtension);
|
||||||
|
}
|
||||||
|
if (RtlDoesFileExists_U(Name))
|
||||||
|
{
|
||||||
|
retCode = RtlGetFullPathName_U (Name,
|
||||||
|
nBufferLength * sizeof(WCHAR),
|
||||||
|
lpBuffer,
|
||||||
|
lpFilePart);
|
||||||
|
}
|
||||||
|
if (Name != lpFileName)
|
||||||
|
{
|
||||||
|
RtlFreeHeap(GetProcessHeap(), 0, Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (lpPath == NULL)
|
||||||
|
{
|
||||||
|
|
||||||
|
AppPathW = (PWCHAR) RtlAllocateHeap(GetProcessHeap(),
|
||||||
|
HEAP_GENERATE_EXCEPTIONS|HEAP_ZERO_MEMORY,
|
||||||
|
MAX_PATH * sizeof(WCHAR));
|
||||||
|
|
||||||
|
|
||||||
|
wcscat (AppPathW, NtCurrentPeb()->ProcessParameters->ImagePathName.Buffer);
|
||||||
|
|
||||||
|
len = wcslen (AppPathW);
|
||||||
|
|
||||||
|
while (len && AppPathW[len - 1] != L'\\')
|
||||||
|
len--;
|
||||||
|
|
||||||
|
if (len) AppPathW[len-1] = L'\0';
|
||||||
|
|
||||||
|
len = GetEnvironmentVariableW(L"PATH", &Buffer, 0);
|
||||||
|
len += 1 + GetCurrentDirectoryW(0, &Buffer);
|
||||||
|
len += 1 + GetSystemDirectoryW(&Buffer, 0);
|
||||||
|
len += 1 + GetWindowsDirectoryW(&Buffer, 0);
|
||||||
|
len += 1 + wcslen(AppPathW) * sizeof(WCHAR);
|
||||||
|
|
||||||
|
EnvironmentBufferW = (PWCHAR) RtlAllocateHeap(GetProcessHeap(),
|
||||||
|
HEAP_GENERATE_EXCEPTIONS|HEAP_ZERO_MEMORY,
|
||||||
|
len * sizeof(WCHAR));
|
||||||
|
if (EnvironmentBufferW == NULL)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_OUTOFMEMORY);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
pos = GetCurrentDirectoryW(len, EnvironmentBufferW);
|
||||||
|
EnvironmentBufferW[pos++] = L';';
|
||||||
|
EnvironmentBufferW[pos] = 0;
|
||||||
|
pos += GetSystemDirectoryW(&EnvironmentBufferW[pos], len - pos);
|
||||||
|
EnvironmentBufferW[pos++] = L';';
|
||||||
|
EnvironmentBufferW[pos] = 0;
|
||||||
|
pos += GetWindowsDirectoryW(&EnvironmentBufferW[pos], len - pos);
|
||||||
|
EnvironmentBufferW[pos++] = L';';
|
||||||
|
EnvironmentBufferW[pos] = 0;
|
||||||
|
pos += GetEnvironmentVariableW(L"PATH", &EnvironmentBufferW[pos], len - pos);
|
||||||
|
EnvironmentBufferW[pos++] = L';';
|
||||||
|
EnvironmentBufferW[pos] = 0;
|
||||||
|
wcscat (EnvironmentBufferW, AppPathW);
|
||||||
|
|
||||||
|
RtlFreeHeap (RtlGetProcessHeap (),
|
||||||
|
0,
|
||||||
|
AppPathW);
|
||||||
|
|
||||||
|
lpPath = EnvironmentBufferW;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pos = GetCurrentDirectoryW(len, EnvironmentBufferW);
|
retCode = RtlDosSearchPath_U ((PWCHAR)lpPath, (PWCHAR)lpFileName, (PWCHAR)lpExtension,
|
||||||
EnvironmentBufferW[pos++] = L';';
|
nBufferLength * sizeof(WCHAR), lpBuffer, lpFilePart);
|
||||||
EnvironmentBufferW[pos] = 0;
|
|
||||||
pos += GetSystemDirectoryW(&EnvironmentBufferW[pos], len - pos);
|
|
||||||
EnvironmentBufferW[pos++] = L';';
|
|
||||||
EnvironmentBufferW[pos] = 0;
|
|
||||||
pos += GetWindowsDirectoryW(&EnvironmentBufferW[pos], len - pos);
|
|
||||||
EnvironmentBufferW[pos++] = L';';
|
|
||||||
EnvironmentBufferW[pos] = 0;
|
|
||||||
pos += GetEnvironmentVariableW(L"PATH", &EnvironmentBufferW[pos], len - pos);
|
|
||||||
EnvironmentBufferW[pos++] = L';';
|
|
||||||
EnvironmentBufferW[pos] = 0;
|
|
||||||
wcscat (EnvironmentBufferW, AppPathW);
|
|
||||||
|
|
||||||
RtlFreeHeap (RtlGetProcessHeap (),
|
if (EnvironmentBufferW != NULL)
|
||||||
0,
|
{
|
||||||
AppPathW);
|
RtlFreeHeap(GetProcessHeap(), 0, EnvironmentBufferW);
|
||||||
|
}
|
||||||
lpPath = EnvironmentBufferW;
|
if (retCode == 0)
|
||||||
|
{
|
||||||
}
|
SetLastError(ERROR_FILE_NOT_FOUND);
|
||||||
|
}
|
||||||
retCode = RtlDosSearchPath_U ((PWCHAR)lpPath, (PWCHAR)lpFileName, (PWCHAR)lpExtension,
|
|
||||||
nBufferLength * sizeof(WCHAR), lpBuffer, lpFilePart);
|
|
||||||
|
|
||||||
if (EnvironmentBufferW != NULL)
|
|
||||||
{
|
|
||||||
RtlFreeHeap(GetProcessHeap(), 0, EnvironmentBufferW);
|
|
||||||
}
|
|
||||||
if (retCode == 0)
|
|
||||||
{
|
|
||||||
SetLastError(ERROR_FILE_NOT_FOUND);
|
|
||||||
}
|
}
|
||||||
return retCode / sizeof(WCHAR);
|
return retCode / sizeof(WCHAR);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue