[KERNEL32]

Start unifying kernel32 Find* functions.
All calls end in same methods that are working only in unicode now.

Next step would be to unify stream & files using only one struct.

svn path=/trunk/; revision=50913
This commit is contained in:
Pierre Schweitzer 2011-02-26 17:18:21 +00:00
parent 90f36847bc
commit f154358da9

View file

@ -5,6 +5,7 @@
* FILE: lib/kernel32/file/find.c * FILE: lib/kernel32/file/find.c
* PURPOSE: Find functions * PURPOSE: Find functions
* PROGRAMMER: Ariadne ( ariadne@xs4all.nl) * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
* Pierre Schweitzer (pierre.schweitzer@reactos.org)
* UPDATE HISTORY: * UPDATE HISTORY:
* Created 01/11/98 * Created 01/11/98
*/ */
@ -73,34 +74,6 @@ InternalCopyDeviceFindDataW(LPWIN32_FIND_DATAW lpFindFileData,
DeviceName.Length); DeviceName.Length);
} }
static VOID
InternalCopyDeviceFindDataA(LPWIN32_FIND_DATAA lpFindFileData,
PUNICODE_STRING FileName,
ULONG DeviceNameInfo)
{
UNICODE_STRING DeviceName;
ANSI_STRING BufferA;
CHAR Buffer[MAX_PATH];
DeviceName.Length = DeviceName.MaximumLength = (USHORT)(DeviceNameInfo & 0xFFFF);
DeviceName.Buffer = (LPWSTR)((ULONG_PTR)FileName->Buffer + (DeviceNameInfo >> 16));
BufferA.MaximumLength = sizeof(Buffer) - sizeof(Buffer[0]);
BufferA.Buffer = Buffer;
if (bIsFileApiAnsi)
RtlUnicodeStringToAnsiString (&BufferA, &DeviceName, FALSE);
else
RtlUnicodeStringToOemString (&BufferA, &DeviceName, FALSE);
/* Return the data */
RtlZeroMemory(lpFindFileData,
sizeof(*lpFindFileData));
lpFindFileData->dwFileAttributes = FILE_ATTRIBUTE_ARCHIVE;
RtlCopyMemory(lpFindFileData->cFileName,
BufferA.Buffer,
BufferA.Length);
}
static VOID static VOID
InternalCopyFindDataW(LPWIN32_FIND_DATAW lpFindFileData, InternalCopyFindDataW(LPWIN32_FIND_DATAW lpFindFileData,
PFILE_BOTH_DIR_INFORMATION lpFileInfo) PFILE_BOTH_DIR_INFORMATION lpFileInfo)
@ -126,57 +99,6 @@ InternalCopyFindDataW(LPWIN32_FIND_DATAW lpFindFileData,
lpFindFileData->cAlternateFileName[lpFileInfo->ShortNameLength / sizeof(WCHAR)] = 0; lpFindFileData->cAlternateFileName[lpFileInfo->ShortNameLength / sizeof(WCHAR)] = 0;
} }
static VOID
InternalCopyFindDataA(LPWIN32_FIND_DATAA lpFindFileData,
PFILE_BOTH_DIR_INFORMATION lpFileInfo)
{
UNICODE_STRING FileNameU;
ANSI_STRING FileNameA;
lpFindFileData->dwFileAttributes = lpFileInfo->FileAttributes;
lpFindFileData->ftCreationTime.dwHighDateTime = lpFileInfo->CreationTime.u.HighPart;
lpFindFileData->ftCreationTime.dwLowDateTime = lpFileInfo->CreationTime.u.LowPart;
lpFindFileData->ftLastAccessTime.dwHighDateTime = lpFileInfo->LastAccessTime.u.HighPart;
lpFindFileData->ftLastAccessTime.dwLowDateTime = lpFileInfo->LastAccessTime.u.LowPart;
lpFindFileData->ftLastWriteTime.dwHighDateTime = lpFileInfo->LastWriteTime.u.HighPart;
lpFindFileData->ftLastWriteTime.dwLowDateTime = lpFileInfo->LastWriteTime.u.LowPart;
lpFindFileData->nFileSizeHigh = lpFileInfo->EndOfFile.u.HighPart;
lpFindFileData->nFileSizeLow = lpFileInfo->EndOfFile.u.LowPart;
FileNameU.Length = FileNameU.MaximumLength = (USHORT)lpFileInfo->FileNameLength;
FileNameU.Buffer = lpFileInfo->FileName;
FileNameA.MaximumLength = sizeof(lpFindFileData->cFileName) - sizeof(CHAR);
FileNameA.Buffer = lpFindFileData->cFileName;
/* convert unicode string to ansi (or oem) */
if (bIsFileApiAnsi)
RtlUnicodeStringToAnsiString (&FileNameA, &FileNameU, FALSE);
else
RtlUnicodeStringToOemString (&FileNameA, &FileNameU, FALSE);
FileNameA.Buffer[FileNameA.Length] = 0;
TRACE("lpFileInfo->ShortNameLength %d\n", lpFileInfo->ShortNameLength);
FileNameU.Length = FileNameU.MaximumLength = lpFileInfo->ShortNameLength;
FileNameU.Buffer = lpFileInfo->ShortName;
FileNameA.MaximumLength = sizeof(lpFindFileData->cAlternateFileName) - sizeof(CHAR);
FileNameA.Buffer = lpFindFileData->cAlternateFileName;
/* convert unicode string to ansi (or oem) */
if (bIsFileApiAnsi)
RtlUnicodeStringToAnsiString (&FileNameA, &FileNameU, FALSE);
else
RtlUnicodeStringToOemString (&FileNameA, &FileNameU, FALSE);
FileNameA.Buffer[FileNameA.Length] = 0;
}
/* /*
* @implemented * @implemented
@ -186,8 +108,7 @@ WINAPI
InternalFindNextFile ( InternalFindNextFile (
HANDLE hFindFile, HANDLE hFindFile,
PUNICODE_STRING SearchPattern, PUNICODE_STRING SearchPattern,
PVOID lpFindFileData, PVOID lpFindFileData
BOOL bUnicode
) )
{ {
PKERNEL32_FIND_DATA_HEADER IHeader; PKERNEL32_FIND_DATA_HEADER IHeader;
@ -290,16 +211,8 @@ NeedMoreData:
{ {
_SEH2_TRY _SEH2_TRY
{ {
if (bUnicode) InternalCopyFindDataW(lpFindFileData,
{ FoundFile);
InternalCopyFindDataW(lpFindFileData,
FoundFile);
}
else
{
InternalCopyFindDataA(lpFindFileData,
FoundFile);
}
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
@ -334,8 +247,7 @@ WINAPI
InternalFindFirstFile ( InternalFindFirstFile (
LPCWSTR lpFileName, LPCWSTR lpFileName,
BOOLEAN DirectoryOnly, BOOLEAN DirectoryOnly,
PVOID lpFindFileData, PVOID lpFindFileData
BOOL bUnicode
) )
{ {
OBJECT_ATTRIBUTES ObjectAttributes; OBJECT_ATTRIBUTES ObjectAttributes;
@ -460,18 +372,9 @@ InternalFindFirstFile (
DeviceNameInfo = RtlIsDosDeviceName_U((PWSTR)((ULONG_PTR)lpFileName)); DeviceNameInfo = RtlIsDosDeviceName_U((PWSTR)((ULONG_PTR)lpFileName));
if (DeviceNameInfo != 0) if (DeviceNameInfo != 0)
{ {
if (bUnicode) InternalCopyDeviceFindDataW(lpFindFileData,
{ lpFileName,
InternalCopyDeviceFindDataW(lpFindFileData, DeviceNameInfo);
lpFileName,
DeviceNameInfo);
}
else
{
InternalCopyDeviceFindDataA(lpFindFileData,
&FileName,
DeviceNameInfo);
}
return FIND_DEVICE_HANDLE; return FIND_DEVICE_HANDLE;
} }
@ -526,8 +429,7 @@ InternalFindFirstFile (
bResult = InternalFindNextFile((HANDLE)IHeader, bResult = InternalFindNextFile((HANDLE)IHeader,
&PathFileName, &PathFileName,
lpFindFileData, lpFindFileData);
bUnicode);
RtlFreeHeap (hProcessHeap, RtlFreeHeap (hProcessHeap,
0, 0,
@ -551,17 +453,59 @@ InternalFindFirstFile (
*/ */
HANDLE HANDLE
WINAPI WINAPI
FindFirstFileA ( FindFirstFileA(IN LPCSTR lpFileName,
LPCSTR lpFileName, OUT LPWIN32_FIND_DATAA lpFindFileData)
LPWIN32_FIND_DATAA lpFindFileData
)
{ {
return FindFirstFileExA (lpFileName, HANDLE hSearch;
FindExInfoStandard, NTSTATUS Status;
(LPVOID)lpFindFileData, ANSI_STRING Ansi;
FindExSearchNameMatch, UNICODE_STRING UTF8;
NULL, PUNICODE_STRING lpFileNameW;
0); WIN32_FIND_DATAW FindFileDataW;
lpFileNameW = Basep8BitStringToStaticUnicodeString(lpFileName);
if (!lpFileNameW)
{
return INVALID_HANDLE_VALUE;
}
hSearch = FindFirstFileExW(lpFileNameW->Buffer,
FindExInfoStandard,
&FindFileDataW,
FindExSearchNameMatch,
NULL, 0);
if (hSearch == INVALID_HANDLE_VALUE)
{
return INVALID_HANDLE_VALUE;
}
memcpy(lpFindFileData, &FindFileDataW, FIELD_OFFSET(WIN32_FIND_DATA, cFileName));
RtlInitUnicodeString(&UTF8, FindFileDataW.cFileName);
Ansi.Buffer = lpFindFileData->cFileName;
Ansi.Length = 0;
Ansi.MaximumLength = MAX_PATH;
Status = BasepUnicodeStringTo8BitString(&Ansi, &UTF8, FALSE);
if (!NT_SUCCESS(Status))
{
FindClose(hSearch);
BaseSetLastNTError(Status);
return INVALID_HANDLE_VALUE;
}
RtlInitUnicodeString(&UTF8, FindFileDataW.cAlternateFileName);
Ansi.Buffer = lpFindFileData->cAlternateFileName;
Ansi.Length = 0;
Ansi.MaximumLength = 14;
Status = BasepUnicodeStringTo8BitString(&Ansi, &UTF8, FALSE);
if (!NT_SUCCESS(Status))
{
FindClose(hSearch);
BaseSetLastNTError(Status);
return INVALID_HANDLE_VALUE;
}
return hSearch;
} }
@ -570,14 +514,44 @@ FindFirstFileA (
*/ */
BOOL BOOL
WINAPI WINAPI
FindNextFileA ( FindNextFileA(IN HANDLE hFindFile,
HANDLE hFindFile, OUT LPWIN32_FIND_DATAA lpFindFileData)
LPWIN32_FIND_DATAA lpFindFileData)
{ {
return InternalFindNextFile (hFindFile, NTSTATUS Status;
NULL, ANSI_STRING Ansi;
lpFindFileData, UNICODE_STRING UTF8;
FALSE); WIN32_FIND_DATAW FindFileDataW;
if (!FindNextFileW(hFindFile, &FindFileDataW))
{
return FALSE;
}
memcpy(lpFindFileData, &FindFileDataW, FIELD_OFFSET(WIN32_FIND_DATA, cFileName));
RtlInitUnicodeString(&UTF8, FindFileDataW.cFileName);
Ansi.Buffer = lpFindFileData->cFileName;
Ansi.Length = 0;
Ansi.MaximumLength = MAX_PATH;
Status = BasepUnicodeStringTo8BitString(&Ansi, &UTF8, FALSE);
if (!NT_SUCCESS(Status))
{
BaseSetLastNTError(Status);
return FALSE;
}
RtlInitUnicodeString(&UTF8, FindFileDataW.cAlternateFileName);
Ansi.Buffer = lpFindFileData->cAlternateFileName;
Ansi.Length = 0;
Ansi.MaximumLength = 14;
Status = BasepUnicodeStringTo8BitString(&Ansi, &UTF8, FALSE);
if (!NT_SUCCESS(Status))
{
BaseSetLastNTError(Status);
return FALSE;
}
return TRUE;
} }
@ -643,17 +617,15 @@ FindClose (
*/ */
HANDLE HANDLE
WINAPI WINAPI
FindFirstFileW ( FindFirstFileW(IN LPCWSTR lpFileName,
LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
LPWIN32_FIND_DATAW lpFindFileData
)
{ {
return FindFirstFileExW (lpFileName, return FindFirstFileExW(lpFileName,
FindExInfoStandard, FindExInfoStandard,
(LPVOID)lpFindFileData, lpFindFileData,
FindExSearchNameMatch, FindExSearchNameMatch,
NULL, NULL,
0); 0);
} }
/* /*
@ -661,15 +633,12 @@ FindFirstFileW (
*/ */
BOOL BOOL
WINAPI WINAPI
FindNextFileW ( FindNextFileW(IN HANDLE hFindFile,
HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData)
LPWIN32_FIND_DATAW lpFindFileData
)
{ {
return InternalFindNextFile (hFindFile, return InternalFindNextFile(hFindFile,
NULL, NULL,
lpFindFileData, lpFindFileData);
TRUE);
} }
@ -678,12 +647,12 @@ FindNextFileW (
*/ */
HANDLE HANDLE
WINAPI WINAPI
FindFirstFileExW (LPCWSTR lpFileName, FindFirstFileExW(IN LPCWSTR lpFileName,
FINDEX_INFO_LEVELS fInfoLevelId, IN FINDEX_INFO_LEVELS fInfoLevelId,
LPVOID lpFindFileData, OUT LPVOID lpFindFileData,
FINDEX_SEARCH_OPS fSearchOp, IN FINDEX_SEARCH_OPS fSearchOp,
LPVOID lpSearchFilter, LPVOID lpSearchFilter,
DWORD dwAdditionalFlags) IN DWORD dwAdditionalFlags)
{ {
if (fInfoLevelId != FindExInfoStandard) if (fInfoLevelId != FindExInfoStandard)
{ {
@ -701,8 +670,7 @@ FindFirstFileExW (LPCWSTR lpFileName,
return InternalFindFirstFile (lpFileName, return InternalFindFirstFile (lpFileName,
fSearchOp == FindExSearchLimitToDirectories, fSearchOp == FindExSearchLimitToDirectories,
lpFindFileData, lpFindFileData);
TRUE);
} }
SetLastError(ERROR_INVALID_PARAMETER); SetLastError(ERROR_INVALID_PARAMETER);
@ -714,51 +682,64 @@ FindFirstFileExW (LPCWSTR lpFileName,
*/ */
HANDLE HANDLE
WINAPI WINAPI
FindFirstFileExA ( FindFirstFileExA(IN LPCSTR lpFileName,
LPCSTR lpFileName, IN FINDEX_INFO_LEVELS fInfoLevelId,
FINDEX_INFO_LEVELS fInfoLevelId, OUT LPVOID lpFindFileData,
LPVOID lpFindFileData, IN FINDEX_SEARCH_OPS fSearchOp,
FINDEX_SEARCH_OPS fSearchOp, LPVOID lpSearchFilter,
LPVOID lpSearchFilter, IN DWORD dwAdditionalFlags)
DWORD dwAdditionalFlags
)
{ {
UNICODE_STRING FileNameU; HANDLE hSearch;
ANSI_STRING FileNameA; NTSTATUS Status;
HANDLE Handle; ANSI_STRING Ansi;
UNICODE_STRING UTF8;
PUNICODE_STRING lpFileNameW;
WIN32_FIND_DATAW FindFileDataW;
if (fInfoLevelId != FindExInfoStandard) lpFileNameW = Basep8BitStringToStaticUnicodeString(lpFileName);
if (!lpFileNameW)
{ {
SetLastError(ERROR_INVALID_PARAMETER);
return INVALID_HANDLE_VALUE; return INVALID_HANDLE_VALUE;
} }
if (fSearchOp == FindExSearchNameMatch || fSearchOp == FindExSearchLimitToDirectories)
hSearch = FindFirstFileExW(lpFileNameW->Buffer,
fInfoLevelId,
&FindFileDataW,
fSearchOp,
lpSearchFilter,
dwAdditionalFlags);
if (hSearch == INVALID_HANDLE_VALUE)
{ {
if (lpSearchFilter) return INVALID_HANDLE_VALUE;
{
SetLastError(ERROR_INVALID_PARAMETER);
return INVALID_HANDLE_VALUE;
}
RtlInitAnsiString (&FileNameA, (LPSTR)lpFileName);
/* convert ansi (or oem) string to unicode */
if (bIsFileApiAnsi)
RtlAnsiStringToUnicodeString (&FileNameU, &FileNameA, TRUE);
else
RtlOemStringToUnicodeString (&FileNameU, &FileNameA, TRUE);
Handle = InternalFindFirstFile (FileNameU.Buffer,
fSearchOp == FindExSearchLimitToDirectories,
lpFindFileData,
FALSE);
RtlFreeUnicodeString (&FileNameU);
return Handle;
} }
SetLastError(ERROR_INVALID_PARAMETER); memcpy(lpFindFileData, &FindFileDataW, FIELD_OFFSET(WIN32_FIND_DATA, cFileName));
return INVALID_HANDLE_VALUE;
RtlInitUnicodeString(&UTF8, FindFileDataW.cFileName);
Ansi.Buffer = ((LPWIN32_FIND_DATAA)lpFindFileData)->cFileName;
Ansi.Length = 0;
Ansi.MaximumLength = MAX_PATH;
Status = BasepUnicodeStringTo8BitString(&Ansi, &UTF8, FALSE);
if (!NT_SUCCESS(Status))
{
FindClose(hSearch);
BaseSetLastNTError(Status);
return INVALID_HANDLE_VALUE;
}
RtlInitUnicodeString(&UTF8, FindFileDataW.cAlternateFileName);
Ansi.Buffer = ((LPWIN32_FIND_DATAA)lpFindFileData)->cAlternateFileName;
Ansi.Length = 0;
Ansi.MaximumLength = 14;
Status = BasepUnicodeStringTo8BitString(&Ansi, &UTF8, FALSE);
if (!NT_SUCCESS(Status))
{
FindClose(hSearch);
BaseSetLastNTError(Status);
return INVALID_HANDLE_VALUE;
}
return hSearch;
} }