23 #define FIND_DATA_SIZE 0x4000 24 #define FIND_DEVICE_HANDLE ((HANDLE)0x1) 134 sizeof(lpFindFileData->cFileName),
150 #define ULARGE_INTEGER_2_FILETIME(ft, ul) \ 152 (ft).dwHighDateTime = (ul).u.HighPart; \ 153 (ft).dwLowDateTime = (ul).u.LowPart ; \ 160 lpFindFileData->dwFileAttributes = DirInfo.FullDirInfo->FileAttributes;
166 lpFindFileData->nFileSizeHigh = DirInfo.FullDirInfo->EndOfFile.u.HighPart;
167 lpFindFileData->nFileSizeLow = DirInfo.FullDirInfo->EndOfFile.u.LowPart;
171 lpFindFileData->dwReserved0 = DirInfo.FullDirInfo->EaSize;
173 lpFindFileData->dwReserved0 = 0;
176 lpFindFileData->dwReserved1 = 0;
181 sizeof(lpFindFileData->cFileName),
182 DirInfo.BothDirInfo->FileName,
183 DirInfo.BothDirInfo->FileNameLength);
186 sizeof(lpFindFileData->cAlternateFileName),
187 DirInfo.BothDirInfo->ShortName,
188 DirInfo.BothDirInfo->ShortNameLength);
193 sizeof(lpFindFileData->cFileName),
194 DirInfo.FullDirInfo->FileName,
195 DirInfo.FullDirInfo->FileNameLength);
215 OUT PWIN32_FIND_STREAM_DATA lpFindStreamData)
219 ASSERT(FindStreamData->CurrentInfo);
221 switch (FindStreamData->InfoLevel)
223 case FindStreamInfoStandard:
225 ULONG StreamNameLen =
min(FindStreamData->CurrentInfo->StreamNameLength,
226 sizeof(lpFindStreamData->cStreamName) -
sizeof(
WCHAR));
230 lpFindStreamData->StreamSize.QuadPart = FindStreamData->CurrentInfo->StreamSize.QuadPart;
232 FindStreamData->CurrentInfo->StreamName,
288 Ansi.
Buffer = lpFindFileData->cFileName;
300 Ansi.
Buffer = lpFindFileData->cAlternateFileName;
302 Ansi.
MaximumLength =
sizeof(lpFindFileData->cAlternateFileName);
352 Ansi.
Buffer = lpFindFileData->cFileName;
363 Ansi.
Buffer = lpFindFileData->cAlternateFileName;
365 Ansi.
MaximumLength =
sizeof(lpFindFileData->cAlternateFileName);
388 TRACE(
"FindNextFileW(%p, 0x%p)\n", hFindFile, lpFindFileData);
418 sizeof(FindFileData->
Buffer),
450 ? NextDirInfo.BothDirInfo->FileName
451 : NextDirInfo.FullDirInfo->FileName);
455 BufferEnd < (
ULONG_PTR)&NextDirInfo.FullDirInfo->FileNameLength +
sizeof(NextDirInfo.FullDirInfo->FileNameLength) ||
504 TRACE(
"FindClose(hFindFile %p)\n", hFindFile);
520 switch (FindDataHandle->
Type)
551 RtlFreeHeap(RtlGetProcessHeap(), 0, FindDataHandle);
678 ULONG DeviceNameInfo = 0;
717 DPRINT(
"FilePattern.Buffer = '%S'\n", FilePattern.
Buffer);
720 DPRINT(
"NtPath - Before = '%wZ'\n", &NtPath);
723 NtPathBuffer = NtPath.
Buffer;
735 if (DeviceNameInfo != 0)
781 DPRINT(
"NtPath - After = '%wZ'\n", &NtPath);
782 DPRINT(
"FilePattern = '%wZ'\n", &FilePattern);
816 if (FilePattern.
Length == 0)
826 if (FilePattern.
Length == 6 &&
835 while (PatternIndex < FilePattern.
Length /
sizeof(
WCHAR))
837 if (PatternIndex > 0)
839 if (FilePattern.
Buffer[PatternIndex] ==
L'.' &&
840 FilePattern.
Buffer[PatternIndex - 1] ==
L'*')
842 FilePattern.
Buffer[PatternIndex - 1] =
L'<';
846 if (FilePattern.
Buffer[PatternIndex] ==
L'?')
848 FilePattern.
Buffer[PatternIndex] =
L'>';
849 if (PatternIndex > 0)
851 if (FilePattern.
Buffer[PatternIndex - 1] ==
L'.')
853 FilePattern.
Buffer[PatternIndex - 1] =
L'\"';
857 else if (FilePattern.
Buffer[PatternIndex] ==
L'*')
859 if (PatternIndex > 0)
861 if (FilePattern.
Buffer[PatternIndex - 1] ==
L'.')
863 FilePattern.
Buffer[PatternIndex - 1] =
L'\"';
885 sizeof(DirectoryInfo),
925 FindFileData->
Handle = hDirectory;
936 RtlFreeHeap(RtlGetProcessHeap(), 0, FindDataHandle);
942 return (
HANDLE)FindDataHandle;
958 IN STREAM_INFO_LEVELS InfoLevel,
971 if (
dwFlags != 0 || InfoLevel != FindStreamInfoStandard ||
972 lpFindStreamData ==
NULL)
1011 if (!FindDataHandle)
1029 RtlFreeHeap(RtlGetProcessHeap(), 0, FindDataHandle);
1090 RtlFreeHeap(RtlGetProcessHeap(), 0, FindDataHandle);
1100 return (
HANDLE)FindDataHandle;
#define ERROR_INVALID_PARAMETER
BOOL WINAPI FindNextFileW(IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData)
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
DIR_INFORMATION NextDirInfo
PUNICODE_STRING WINAPI Basep8BitStringToStaticUnicodeString(IN LPCSTR String)
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define OBJ_CASE_INSENSITIVE
FINDEX_INFO_LEVELS InfoLevel
PRTL_CONVERT_STRINGA BasepUnicodeStringTo8BitString
#define FILE_DIRECTORY_FILE
PFILE_STREAM_INFORMATION CurrentInfo
HANDLE WINAPI FindFirstFileExW(IN LPCWSTR lpFileName, IN FINDEX_INFO_LEVELS fInfoLevelId, OUT LPVOID lpFindFileData, IN FINDEX_SEARCH_OPS fSearchOp, LPVOID lpSearchFilter, IN DWORD dwAdditionalFlags)
HANDLE ContainingDirectory
#define ERROR_INVALID_HANDLE
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
static VOID CopyDeviceFindData(OUT LPWIN32_FIND_DATAW lpFindFileData, IN LPCWSTR lpFileName, IN ULONG DeviceNameInfo)
NTSYSAPI NTSTATUS NTAPI RtlEnterCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
#define ERROR_NOT_ENOUGH_MEMORY
#define INVALID_HANDLE_VALUE
struct _WIN32_FIND_DATAA * LPWIN32_FIND_DATAA
PFIND_STREAM_DATA FindStreamData
BOOL WINAPI FindNextFileA(IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAA lpFindFileData)
DEBUG_CHANNEL(kernel32file)
struct _FIND_STREAM_DATA FIND_STREAM_DATA
#define STATUS_BUFFER_TOO_SMALL
struct _FIND_FILE_DATA * PFIND_FILE_DATA
static VOID CopyFindData(OUT LPWIN32_FIND_DATAW lpFindFileData, IN FINDEX_INFO_LEVELS fInfoLevelId, IN DIR_INFORMATION DirInfo)
struct _FIND_DATA_HANDLE FIND_DATA_HANDLE
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
NTSYSAPI NTSTATUS NTAPI RtlLeaveCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
NTSTRSAFEAPI RtlStringCbCopyNW(_Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_reads_bytes_(cbToCopy) STRSAFE_LPCWSTR pszSrc, _In_ size_t cbToCopy)
RTL_CRITICAL_SECTION Lock
#define EXCEPTION_EXECUTE_HANDLER
struct _FILE_STREAM_INFORMATION * PFILE_STREAM_INFORMATION
DWORD BaseSetLastNTError(IN NTSTATUS Status)
#define ERROR_FILE_NOT_FOUND
#define FILE_ATTRIBUTE_REPARSE_POINT
#define ERROR_NO_MORE_FILES
#define FILE_ATTRIBUTE_DIRECTORY
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
#define FIND_FIRST_EX_CASE_SENSITIVE
NTSYSAPI NTSTATUS NTAPI NtOpenFile(OUT PHANDLE phFile, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG ShareMode, IN ULONG OpenMode)
#define STATUS_OBJECT_TYPE_MISMATCH
#define FILE_LIST_DIRECTORY
HANDLE WINAPI FindFirstFileExA(IN LPCSTR lpFileName, IN FINDEX_INFO_LEVELS fInfoLevelId, OUT LPVOID lpFindFileData, IN FINDEX_SEARCH_OPS fSearchOp, LPVOID lpSearchFilter, IN DWORD dwAdditionalFlags)
FINDEX_SEARCH_OPS SearchOp
NTSTATUS NTAPI NtCreateFile(OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG CreateDisposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength)
PFILE_STREAM_INFORMATION FileStreamInfo
#define _SEH2_YIELD(STMT_)
NTSYSAPI NTSTATUS NTAPI RtlInitializeCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
#define NT_SUCCESS(StatCode)
STREAM_INFO_LEVELS InfoLevel
PFIND_FILE_DATA FindFileData
#define STATUS_OBJECT_PATH_NOT_FOUND
#define ULARGE_INTEGER_2_FILETIME(ft, ul)
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
#define FILE_ATTRIBUTE_ARCHIVE
struct _FIND_FILE_DATA FIND_FILE_DATA
#define FILE_SHARE_DELETE
enum _FINDEX_SEARCH_OPS FINDEX_SEARCH_OPS
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
struct _FIND_DATA_HANDLE * PFIND_DATA_HANDLE
NTSTATUS NTAPI NtQueryInformationFile(HANDLE hFile, PIO_STATUS_BLOCK io, PVOID ptr, ULONG len, FILE_INFORMATION_CLASS FileInformationClass)
static const WCHAR Cleanup[]
enum _FIND_DATA_TYPE FIND_DATA_TYPE
union _FIND_DATA_HANDLE::@451 u
HANDLE WINAPI FindFirstStreamW(IN LPCWSTR lpFileName, IN STREAM_INFO_LEVELS InfoLevel, OUT LPVOID lpFindStreamData, IN DWORD dwFlags)
struct _FileName FileName
#define STATUS_OBJECT_NAME_NOT_FOUND
#define STATUS_BUFFER_OVERFLOW
union _DIR_INFORMATION DIR_INFORMATION
#define FIELD_OFFSET(t, f)
static OUT PIO_STATUS_BLOCK IoStatusBlock
struct _FIND_STREAM_DATA * PFIND_STREAM_DATA
static VOID CopyStreamData(IN OUT PFIND_STREAM_DATA FindStreamData, OUT PWIN32_FIND_STREAM_DATA lpFindStreamData)
BOOL WINAPI FindNextStreamW(IN HANDLE hFindStream, OUT LPVOID lpFindStreamData)
#define FILE_SYNCHRONOUS_IO_NONALERT
#define ERROR_NOT_SUPPORTED
#define FIND_DEVICE_HANDLE
struct _WIN32_FIND_DATAW * LPWIN32_FIND_DATAW
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
NTSYSAPI PVOID WINAPI RtlReAllocateHeap(HANDLE, ULONG, PVOID, SIZE_T)
#define InitializeObjectAttributes(p, n, a, r, s)
#define RtlCopyMemory(Destination, Source, Length)
UNICODE_STRING RelativeName
#define ERROR_PATH_NOT_FOUND
#define _SEH2_EXCEPT(...)
enum _FINDEX_INFO_LEVELS FINDEX_INFO_LEVELS
#define _SEH2_GetExceptionCode()
NTSYSAPI NTSTATUS NTAPI RtlDeleteCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
NTSTATUS NTAPI NtQueryDirectoryFile(IN HANDLE FileHandle, IN HANDLE EventHandle OPTIONAL, IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, IN PVOID ApcContext OPTIONAL, OUT PIO_STATUS_BLOCK IoStatusBlock, OUT PVOID FileInformation, IN ULONG Length, IN FILE_INFORMATION_CLASS FileInformationClass, IN BOOLEAN ReturnSingleEntry, IN PUNICODE_STRING FileName OPTIONAL, IN BOOLEAN RestartScan)
NTSYSAPI ULONG NTAPI RtlIsDosDeviceName_U(_In_ PCWSTR Name)
HANDLE WINAPI FindFirstFileA(IN LPCSTR lpFileName, OUT LPWIN32_FIND_DATAA lpFindFileData)
CHAR cAlternateFileName[14]
NTSYSAPI BOOLEAN NTAPI RtlDosPathNameToNtPathName_U(_In_opt_z_ PCWSTR DosPathName, _Out_ PUNICODE_STRING NtPathName, _Out_opt_ PCWSTR *NtFileNamePart, _Out_opt_ PRTL_RELATIVE_NAME_U DirectoryInfo)
#define RtlCompareMemory(s1, s2, l)
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
BYTE Buffer[FIND_DATA_SIZE]
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
BOOL WINAPI FindClose(HANDLE hFindFile)