[NTOSKRNL]

Properly handle (as Windows does) WC in case last dot was eaten in path name translation
Fixes last FindFile failing tests

svn path=/trunk/; revision=58833
This commit is contained in:
Pierre Schweitzer 2013-04-22 19:36:33 +00:00
parent 4517988f68
commit dc93e99c9f

View file

@ -669,7 +669,7 @@ FindFirstFileExW(IN LPCWSTR lpFileName,
PFIND_DATA_HANDLE FindDataHandle; PFIND_DATA_HANDLE FindDataHandle;
PFIND_FILE_DATA FindFileData; PFIND_FILE_DATA FindFileData;
UNICODE_STRING NtPath, FilePattern; UNICODE_STRING NtPath, FilePattern, FileName;
PWSTR NtPathBuffer; PWSTR NtPathBuffer;
RTL_RELATIVE_NAME_U RelativePath; RTL_RELATIVE_NAME_U RelativePath;
ULONG DeviceNameInfo = 0; ULONG DeviceNameInfo = 0;
@ -679,6 +679,8 @@ FindFirstFileExW(IN LPCWSTR lpFileName,
IO_STATUS_BLOCK IoStatusBlock; IO_STATUS_BLOCK IoStatusBlock;
HANDLE hDirectory = NULL; HANDLE hDirectory = NULL;
BOOLEAN HadADot = FALSE;
/* /*
* May represent many FILE_BOTH_DIR_INFORMATION * May represent many FILE_BOTH_DIR_INFORMATION
* or many FILE_FULL_DIR_INFORMATION structures. * or many FILE_FULL_DIR_INFORMATION structures.
@ -693,6 +695,12 @@ FindFirstFileExW(IN LPCWSTR lpFileName,
return INVALID_HANDLE_VALUE; return INVALID_HANDLE_VALUE;
} }
RtlInitUnicodeString(&FileName, lpFileName);
if (FileName.Length != 0 && FileName.Buffer[FileName.Length / sizeof(WCHAR) - 1] == L'.')
{
HadADot = TRUE;
}
if (!RtlDosPathNameToNtPathName_U(lpFileName, if (!RtlDosPathNameToNtPathName_U(lpFileName,
&NtPath, &NtPath,
(PCWSTR*)&FilePattern.Buffer, (PCWSTR*)&FilePattern.Buffer,
@ -856,6 +864,15 @@ FindFirstFileExW(IN LPCWSTR lpFileName,
PatternIndex++; PatternIndex++;
} }
/* Handle partial wc if our last dot was eaten */
if (HadADot)
{
if (FilePattern.Buffer[FilePattern.Length / sizeof(WCHAR) - 1] == L'*')
{
FilePattern.Buffer[FilePattern.Length / sizeof(WCHAR) - 1] = L'<';
}
}
} }
Status = NtQueryDirectoryFile(hDirectory, Status = NtQueryDirectoryFile(hDirectory,