- Copy all data in FindFirstFileA. - Changed back to the old code in FindFirstFileExW, because too many things are broken or useless. Modified: trunk/reactos/lib/kernel32/file/find.c _____
Modified: trunk/reactos/lib/kernel32/file/find.c --- trunk/reactos/lib/kernel32/file/find.c 2005-07-29 21:55:09 UTC (rev 16881) +++ trunk/reactos/lib/kernel32/file/find.c 2005-07-29 21:59:06 UTC (rev 16882) @@ -250,6 +250,8 @@
&FileNameU,
FALSE); } + memcpy(lpFindFileData, &FindFileData, offsetof(WIN32_FIND_DATAA, cFileName)); + }
@@ -347,20 +349,19 @@ DWORD dwAdditionalFlags ) { + OBJECT_ATTRIBUTES ObjectAttributes; PKERNEL32_FIND_FILE_DATA IData; IO_STATUS_BLOCK IoStatusBlock; - NTSTATUS Status; - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING DosFilePath; - UNICODE_STRING NtName; - UNICODE_STRING FileNameU; - UNICODE_STRING NtFilePath; + UNICODE_STRING NtPathU; + UNICODE_STRING PatternStr; + NTSTATUS Status; PWSTR e1, e2; WCHAR CurrentDir[256]; PWCHAR SlashlessFileName; PWSTR SearchPath; PWCHAR SearchPattern; ULONG Length; + BOOLEAN bResult;
/* ..... @@ -375,16 +376,17 @@ lpSearchFilter, dwAdditionalFlags);
- RtlInitUnicodeString(&FileNameU, lpFileName);
Length = wcslen(lpFileName); if (L'\' == lpFileName[Length - 1]) { - SlashlessFileName = RtlAllocateHeap(hProcessHeap, 0, Length * sizeof(WCHAR)); + SlashlessFileName = RtlAllocateHeap(hProcessHeap, + 0, + Length * sizeof(WCHAR)); if (NULL == SlashlessFileName) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return (INVALID_HANDLE_VALUE); + return INVALID_HANDLE_VALUE; } memcpy(SlashlessFileName, lpFileName, (Length - 1) * sizeof(WCHAR)); SlashlessFileName[Length - 1] = L'\0'; @@ -402,167 +404,176 @@
if (NULL == SearchPattern) { - CHECKPOINT; - SearchPattern = (PWCHAR)lpFileName; - Length = GetCurrentDirectoryW(sizeof(CurrentDir) / sizeof(WCHAR), SearchPath); - if (0 == Length) - { - if (NULL != SlashlessFileName) { - RtlFreeHeap(hProcessHeap, 0, SlashlessFileName); - } - return (INVALID_HANDLE_VALUE); + CHECKPOINT; + SearchPattern = (PWCHAR)lpFileName; + Length = GetCurrentDirectoryW(sizeof(CurrentDir) / sizeof(WCHAR), SearchPath); + if (0 == Length) + { + if (NULL != SlashlessFileName) + { + RtlFreeHeap(hProcessHeap, + 0, + SlashlessFileName); + } + return INVALID_HANDLE_VALUE; } if (Length > sizeof(CurrentDir) / sizeof(WCHAR)) { - SearchPath = RtlAllocateHeap(hProcessHeap, HEAP_ZERO_MEMORY, Length * sizeof(WCHAR)); - if (NULL == SearchPath) - { - if (NULL != SlashlessFileName) { - RtlFreeHeap(hProcessHeap, 0, SlashlessFileName); - } - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return (INVALID_HANDLE_VALUE); + SearchPath = RtlAllocateHeap(hProcessHeap, + HEAP_ZERO_MEMORY, + Length * sizeof(WCHAR)); + if (NULL == SearchPath) + { + if (NULL != SlashlessFileName) + { + RtlFreeHeap(hProcessHeap, + 0, + SlashlessFileName); + } + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return INVALID_HANDLE_VALUE; } GetCurrentDirectoryW(Length, SearchPath); } } else { - CHECKPOINT; - SearchPattern++; - Length = SearchPattern - lpFileName; - if (Length + 1 > sizeof(CurrentDir) / sizeof(WCHAR)) - { - SearchPath = RtlAllocateHeap(hProcessHeap, HEAP_ZERO_MEMORY, (Length + 1) * sizeof(WCHAR)); - if (NULL == SearchPath) { - if (NULL != SlashlessFileName) { - RtlFreeHeap(hProcessHeap, 0, SlashlessFileName); - } - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return (INVALID_HANDLE_VALUE); - } - } - memcpy(SearchPath, lpFileName, Length * sizeof(WCHAR)); - SearchPath[Length] = 0; + CHECKPOINT; + SearchPattern++; + Length = SearchPattern - lpFileName; + if (Length + 1 > sizeof(CurrentDir) / sizeof(WCHAR)) + { + SearchPath = RtlAllocateHeap(hProcessHeap, + HEAP_ZERO_MEMORY, + (Length + 1) * sizeof(WCHAR)); + if (NULL == SearchPath) + { + if (NULL != SlashlessFileName) + { + RtlFreeHeap(hProcessHeap, + 0, + SlashlessFileName); + } + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return INVALID_HANDLE_VALUE; + } + } + memcpy(SearchPath, lpFileName, Length * sizeof(WCHAR)); + SearchPath[Length] = 0; }
- if( FALSE == RtlDosPathNameToNtPathName_U( - (PWSTR)SearchPath, - &NtName, - &DosFilePath.Buffer, - (PCURDIR)&NtFilePath - ) ) + bResult = RtlDosPathNameToNtPathName_U ((LPWSTR)SearchPath, + &NtPathU, + NULL, + NULL); + if (SearchPath != CurrentDir) { - RtlFreeHeap(hProcessHeap, 0, SearchPath); - if (NULL != SlashlessFileName) { - RtlFreeHeap(hProcessHeap, 0, SlashlessFileName); - } - SetLastError(ERROR_PATH_NOT_FOUND); - return (INVALID_HANDLE_VALUE); + RtlFreeHeap(hProcessHeap, + 0, + SearchPath); } - - - if (SearchPath != CurrentDir) { - RtlFreeHeap(hProcessHeap, 0, SearchPath); + if (FALSE == bResult) + { + if (NULL != SlashlessFileName) + { + RtlFreeHeap(hProcessHeap, + 0, + SlashlessFileName); + } + return INVALID_HANDLE_VALUE; }
- DPRINT("NtName '%S'\n", NtName.Buffer); + DPRINT("NtPathU '%S'\n", NtPathU.Buffer);
IData = RtlAllocateHeap (hProcessHeap, HEAP_ZERO_MEMORY, sizeof(KERNEL32_FIND_FILE_DATA) + FIND_DATA_SIZE); if (NULL == IData) { - RtlFreeHeap (hProcessHeap, 0, NtName.Buffer); - if (NULL != SlashlessFileName) { - RtlFreeHeap(hProcessHeap, 0, SlashlessFileName); + RtlFreeHeap (hProcessHeap, + 0, + NtPathU.Buffer); + if (NULL != SlashlessFileName) + { + RtlFreeHeap(hProcessHeap, + 0, + SlashlessFileName); } SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return (INVALID_HANDLE_VALUE); + return INVALID_HANDLE_VALUE; }
/* change pattern: "*.*" --> "*" */ - if (!wcscmp (SearchPattern, L"*.*")) { - RtlInitUnicodeString(&DosFilePath, L"*"); - } else { - RtlInitUnicodeString(&DosFilePath, SearchPattern); + if (!wcscmp (SearchPattern, L"*.*")) + { + RtlInitUnicodeString(&PatternStr, L"*"); } + else + { + RtlInitUnicodeString(&PatternStr, SearchPattern); + }
- DPRINT("NtName '%S' DosFilePath '%S'\n", - NtName.Buffer, DosFilePath.Buffer); + DPRINT("NtPathU '%S' Pattern '%S'\n", + NtPathU.Buffer, PatternStr.Buffer);
- InitializeObjectAttributes( &ObjectAttributes, - &NtName, - dwAdditionalFlags, - NtFilePath.Buffer, - NULL ); + InitializeObjectAttributes (&ObjectAttributes, + &NtPathU, + 0, + NULL, + NULL);
- Status = - NtOpenFile( - &IData->DirectoryHandle, - SYNCHRONIZE | FILE_LIST_DIRECTORY, - &ObjectAttributes, - &IoStatusBlock, - FILE_SHARE_READ | FILE_SHARE_WRITE, - FILE_DIRECTORY_FILE | FILE_OPEN_FOR_BACKUP_INTENT | FILE_SYNCHRONOUS_IO_NONALERT - ); + Status = NtOpenFile (&IData->DirectoryHandle, + SYNCHRONIZE|FILE_LIST_DIRECTORY, + &ObjectAttributes, + &IoStatusBlock, + FILE_SHARE_READ|FILE_SHARE_WRITE, + FILE_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT);
- if( !NT_SUCCESS(Status) ) - { - DPRINT1("NtOpenFile() - failed (Status %lx)\n", Status); - SetLastError( Status ); - return (INVALID_HANDLE_VALUE); - } + RtlFreeHeap (hProcessHeap, + 0, + NtPathU.Buffer);
- RtlFreeHeap(hProcessHeap, 0, NtName.Buffer); - if (!NT_SUCCESS(Status)) { - RtlFreeHeap (hProcessHeap, 0, IData); - if (NULL != SlashlessFileName) { - RtlFreeHeap(hProcessHeap, 0, SlashlessFileName); - } - SetLastErrorByStatus (Status); - return (INVALID_HANDLE_VALUE); + RtlFreeHeap (hProcessHeap, 0, IData); + if (NULL != SlashlessFileName) + { + RtlFreeHeap(hProcessHeap, + 0, + SlashlessFileName); + } + SetLastErrorByStatus (Status); + return INVALID_HANDLE_VALUE; } - - if ( 0 == DosFilePath.Length ) { - DPRINT1("0 == DosFilePath.Length\n"); - NtClose(IData->DirectoryHandle); - SetLastError(ERROR_FILE_NOT_FOUND); - return INVALID_HANDLE_VALUE; - } + IData->pFileInfo = (PVOID)((ULONG_PTR)IData + sizeof(KERNEL32_FIND_FILE_DATA));
- IData->pFileInfo = (PVOID)((ULONG_PTR)IData + sizeof(KERNEL32_FIND_FILE_DATA)); IData->pFileInfo->FileIndex = 0; - - Status = - NtQueryDirectoryFile( - IData->DirectoryHandle, - NULL, - NULL, - NULL, - &IoStatusBlock, - (PVOID)IData->pFileInfo, - FIND_DATA_SIZE, - FileBothDirectoryInformation, - TRUE, - &DosFilePath, - FALSE - );
- if (NULL != SlashlessFileName) { - RtlFreeHeap(hProcessHeap, 0, SlashlessFileName); + Status = NtQueryDirectoryFile (IData->DirectoryHandle, + NULL, + NULL, + NULL, + &IoStatusBlock, + (PVOID)IData->pFileInfo, + FIND_DATA_SIZE, + FileBothDirectoryInformation, + TRUE, + &PatternStr, + TRUE); + if (NULL != SlashlessFileName) + { + RtlFreeHeap(hProcessHeap, + 0, + SlashlessFileName); } - - if( !NT_SUCCESS(Status) ) { - DPRINT1("NtQueryDirectoryFile() - failed (Status %lx)\n", Status); - RtlFreeHeap(hProcessHeap, 0, IData); - NtClose(IData->DirectoryHandle); - SetLastError(Status); - return (INVALID_HANDLE_VALUE); + if (!NT_SUCCESS(Status)) + { + DPRINT("Status %lx\n", Status); + CloseHandle (IData->DirectoryHandle); + RtlFreeHeap (hProcessHeap, 0, IData); + SetLastErrorByStatus (Status); + return INVALID_HANDLE_VALUE; } - DPRINT("Found %.*S\n",IData->pFileInfo->FileNameLength/sizeof(WCHAR), IData->pFileInfo->FileName);
/* copy data into WIN32_FIND_DATA structure */