mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-08-31 19:26:42 +00:00
* lib/kernel32/debug/break.c: Add @implemented and @unimplemented to APIs. * lib/kernel32/debug/debugger.c: Ditto. * lib/kernel32/debug/output.c: Ditto. * lib/kernel32/except/except.c: Ditto. * lib/kernel32/file/backup.c: Ditto. * lib/kernel32/file/cnotify.c: Ditto. * lib/kernel32/file/copy.c: Ditto. * lib/kernel32/file/create.c: Ditto. * lib/kernel32/file/curdir.c: Ditto. * lib/kernel32/file/delete.c: Ditto. * lib/kernel32/file/deviceio.c: Ditto. * lib/kernel32/file/dir.c: Ditto. * lib/kernel32/file/dosdev.c: Ditto. * lib/kernel32/file/file.c: Ditto. * lib/kernel32/file/find.c: Ditto. * lib/kernel32/file/iocompl.c: Ditto. * lib/kernel32/file/lfile.c: Ditto. * lib/kernel32/file/lock.c: Ditto. * lib/kernel32/file/mailslot.c: Ditto. * lib/kernel32/file/move.c: Ditto. * lib/kernel32/file/npipe.c: Ditto. * lib/kernel32/file/pipe.c: Ditto. * lib/kernel32/file/rw.c: Ditto. * lib/kernel32/file/tape.c: Ditto. * lib/kernel32/file/volume.c: Ditto. * lib/kernel32/mem/global.c: Ditto. * lib/kernel32/mem/heap.c: Ditto. * lib/kernel32/mem/isbad.c: Ditto. * lib/kernel32/mem/local.c: Ditto. * lib/kernel32/mem/procmem.c: Ditto. * lib/kernel32/mem/section.c: Ditto. * lib/kernel32/mem/virtual.c: Ditto. * lib/kernel32/misc/atom.c: Ditto. * lib/kernel32/misc/comm.c: Ditto. * lib/kernel32/misc/computername.c: Ditto. * lib/kernel32/misc/console.c: Ditto. * lib/kernel32/misc/env.c: Ditto. * lib/kernel32/misc/error.c: Ditto. * lib/kernel32/misc/errormsg.c: Ditto. * lib/kernel32/misc/handle.c: Ditto. * lib/kernel32/misc/ldr.c: Ditto. * lib/kernel32/misc/mbchars.c: Ditto. * lib/kernel32/misc/muldiv.c: Ditto. * lib/kernel32/misc/perfcnt.c: Ditto. * lib/kernel32/misc/profile.c: Ditto. * lib/kernel32/misc/res.c: Ditto. * lib/kernel32/misc/stubs.c: Ditto. * lib/kernel32/misc/sysinfo.c: Ditto. * lib/kernel32/misc/time.c: Ditto. * lib/kernel32/misc/toolhelp.c: Ditto. * lib/kernel32/process/cmdline.c: Ditto. * lib/kernel32/process/create.c: Ditto. * lib/kernel32/process/proc.c: Ditto. * lib/kernel32/process/session.c: Ditto. * lib/kernel32/string/lstring.c: Ditto. * lib/kernel32/synch/critical.c: Ditto. * lib/kernel32/synch/event.c: Ditto. * lib/kernel32/synch/intrlck.c: Ditto. * lib/kernel32/synch/mutex.c: Ditto. * lib/kernel32/synch/sem.c: Ditto. * lib/kernel32/synch/timer.c: Ditto. * lib/kernel32/synch/wait.c: Ditto. * lib/kernel32/thread/fiber.c: Ditto. * lib/kernel32/thread/fls.c: Ditto. * lib/kernel32/thread/thread.c: Ditto. * lib/kernel32/thread/tls.c: Ditto. svn path=/trunk/; revision=5045
583 lines
15 KiB
C
583 lines
15 KiB
C
/* $Id: find.c,v 1.37 2003/07/10 18:50:51 chorns Exp $
|
|
*
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
* PROJECT: ReactOS system libraries
|
|
* FILE: lib/kernel32/file/find.c
|
|
* PURPOSE: Find functions
|
|
* PROGRAMMER: Ariadne ( [email protected])
|
|
* UPDATE HISTORY:
|
|
* Created 01/11/98
|
|
*/
|
|
|
|
/* INCLUDES *****************************************************************/
|
|
|
|
#include <k32.h>
|
|
|
|
#define NDEBUG
|
|
#include <kernel32/kernel32.h>
|
|
|
|
|
|
/* TYPES ********************************************************************/
|
|
|
|
#ifndef offsetof
|
|
#define offsetof(TYPE, MEMBER) ((size_t) &( ((TYPE *) 0)->MEMBER ))
|
|
#endif
|
|
|
|
#define FIND_DATA_SIZE (16*1024)
|
|
|
|
typedef struct _KERNEL32_FIND_FILE_DATA
|
|
{
|
|
HANDLE DirectoryHandle;
|
|
PFILE_BOTH_DIRECTORY_INFORMATION pFileInfo;
|
|
} KERNEL32_FIND_FILE_DATA, *PKERNEL32_FIND_FILE_DATA;
|
|
|
|
|
|
/* FUNCTIONS ****************************************************************/
|
|
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
WINBOOL
|
|
STDCALL
|
|
InternalFindNextFile (
|
|
HANDLE hFindFile
|
|
)
|
|
{
|
|
PKERNEL32_FIND_FILE_DATA IData;
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
NTSTATUS Status;
|
|
|
|
IData = (PKERNEL32_FIND_FILE_DATA)hFindFile;
|
|
|
|
if (IData->pFileInfo->NextEntryOffset != 0)
|
|
{
|
|
IData->pFileInfo = (PVOID)IData->pFileInfo + IData->pFileInfo->NextEntryOffset;
|
|
DPRINT("Found %.*S\n",IData->pFileInfo->FileNameLength, IData->pFileInfo->FileName);
|
|
return TRUE;
|
|
}
|
|
IData->pFileInfo = (PVOID)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,
|
|
FALSE,
|
|
NULL,
|
|
FALSE);
|
|
if (!NT_SUCCESS(Status))
|
|
{
|
|
SetLastErrorByStatus (Status);
|
|
return FALSE;
|
|
}
|
|
DPRINT("Found %.*S\n",IData->pFileInfo->FileNameLength, IData->pFileInfo->FileName);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
HANDLE
|
|
STDCALL
|
|
InternalFindFirstFile (
|
|
LPCWSTR lpFileName
|
|
)
|
|
{
|
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
|
PKERNEL32_FIND_FILE_DATA IData;
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
UNICODE_STRING NtPathU;
|
|
UNICODE_STRING PatternStr;
|
|
NTSTATUS Status;
|
|
PWSTR e1, e2;
|
|
WCHAR CurrentDir[256];
|
|
PWSTR SearchPath;
|
|
PWCHAR SearchPattern;
|
|
ULONG Length;
|
|
BOOLEAN bResult;
|
|
|
|
DPRINT("FindFirstFileW(lpFileName %S)\n",
|
|
lpFileName);
|
|
|
|
e1 = wcsrchr(lpFileName, L'/');
|
|
e2 = wcsrchr(lpFileName, L'\\');
|
|
SearchPattern = max(e1, e2);
|
|
SearchPath = CurrentDir;
|
|
|
|
if (NULL == SearchPattern)
|
|
{
|
|
CHECKPOINT;
|
|
SearchPattern = (PWCHAR)lpFileName;
|
|
Length = GetCurrentDirectoryW(sizeof(CurrentDir) / sizeof(WCHAR), SearchPath);
|
|
if (0 == Length)
|
|
{
|
|
return NULL;
|
|
}
|
|
if (Length > sizeof(CurrentDir) / sizeof(WCHAR))
|
|
{
|
|
SearchPath = RtlAllocateHeap(hProcessHeap,
|
|
HEAP_ZERO_MEMORY,
|
|
Length * sizeof(WCHAR));
|
|
if (NULL == SearchPath)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
return NULL;
|
|
}
|
|
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)
|
|
{
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
return NULL;
|
|
}
|
|
}
|
|
memcpy(SearchPath, lpFileName, Length * sizeof(WCHAR));
|
|
SearchPath[Length] = 0;
|
|
}
|
|
|
|
bResult = RtlDosPathNameToNtPathName_U ((LPWSTR)SearchPath,
|
|
&NtPathU,
|
|
NULL,
|
|
NULL);
|
|
if (SearchPath != CurrentDir)
|
|
{
|
|
RtlFreeHeap(hProcessHeap,
|
|
0,
|
|
SearchPath);
|
|
}
|
|
if (FALSE == bResult)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
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,
|
|
NtPathU.Buffer);
|
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
return NULL;
|
|
}
|
|
|
|
/* change pattern: "*.*" --> "*" */
|
|
if (!wcscmp (SearchPattern, L"*.*"))
|
|
{
|
|
RtlInitUnicodeStringFromLiteral(&PatternStr, L"*");
|
|
}
|
|
else
|
|
{
|
|
RtlInitUnicodeString(&PatternStr, SearchPattern);
|
|
}
|
|
|
|
DPRINT("NtPathU \'%S\' Pattern \'%S\'\n",
|
|
NtPathU.Buffer, PatternStr.Buffer);
|
|
|
|
InitializeObjectAttributes (&ObjectAttributes,
|
|
&NtPathU,
|
|
0,
|
|
NULL,
|
|
NULL);
|
|
|
|
Status = NtOpenFile (&IData->DirectoryHandle,
|
|
FILE_LIST_DIRECTORY,
|
|
&ObjectAttributes,
|
|
&IoStatusBlock,
|
|
FILE_OPEN_IF,
|
|
OPEN_EXISTING);
|
|
|
|
RtlFreeHeap (hProcessHeap,
|
|
0,
|
|
NtPathU.Buffer);
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
{
|
|
RtlFreeHeap (hProcessHeap, 0, IData);
|
|
SetLastErrorByStatus (Status);
|
|
return(NULL);
|
|
}
|
|
IData->pFileInfo = (PVOID)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,
|
|
&PatternStr,
|
|
TRUE);
|
|
if (!NT_SUCCESS(Status))
|
|
{
|
|
DPRINT("Status %lx\n", Status);
|
|
RtlFreeHeap (hProcessHeap, 0, IData);
|
|
SetLastErrorByStatus (Status);
|
|
return NULL;
|
|
}
|
|
DPRINT("Found %.*S\n",IData->pFileInfo->FileNameLength, IData->pFileInfo->FileName);
|
|
|
|
return IData;
|
|
}
|
|
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
HANDLE
|
|
STDCALL
|
|
FindFirstFileA (
|
|
LPCTSTR lpFileName,
|
|
LPWIN32_FIND_DATAA lpFindFileData
|
|
)
|
|
{
|
|
PKERNEL32_FIND_FILE_DATA IData;
|
|
UNICODE_STRING FileNameU;
|
|
ANSI_STRING FileName;
|
|
|
|
RtlInitAnsiString (&FileName,
|
|
(LPSTR)lpFileName);
|
|
|
|
/* convert ansi (or oem) string to unicode */
|
|
if (bIsFileApiAnsi)
|
|
RtlAnsiStringToUnicodeString (&FileNameU,
|
|
&FileName,
|
|
TRUE);
|
|
else
|
|
RtlOemStringToUnicodeString (&FileNameU,
|
|
&FileName,
|
|
TRUE);
|
|
|
|
IData = InternalFindFirstFile (FileNameU.Buffer);
|
|
|
|
RtlFreeUnicodeString (&FileNameU);
|
|
|
|
if (IData == NULL)
|
|
{
|
|
DPRINT("Failing request\n");
|
|
return INVALID_HANDLE_VALUE;
|
|
}
|
|
|
|
DPRINT("IData->pFileInfo->FileNameLength %d\n",
|
|
IData->pFileInfo->FileNameLength);
|
|
|
|
/* copy data into WIN32_FIND_DATA structure */
|
|
lpFindFileData->dwFileAttributes = IData->pFileInfo->FileAttributes;
|
|
memcpy (&lpFindFileData->ftCreationTime,
|
|
&IData->pFileInfo->CreationTime,
|
|
sizeof(FILETIME));
|
|
memcpy (&lpFindFileData->ftLastAccessTime,
|
|
&IData->pFileInfo->LastAccessTime,
|
|
sizeof(FILETIME));
|
|
memcpy (&lpFindFileData->ftLastWriteTime,
|
|
&IData->pFileInfo->LastWriteTime,
|
|
sizeof(FILETIME));
|
|
lpFindFileData->nFileSizeHigh = IData->pFileInfo->EndOfFile.u.HighPart;
|
|
lpFindFileData->nFileSizeLow = IData->pFileInfo->EndOfFile.u.LowPart;
|
|
|
|
FileNameU.Length = IData->pFileInfo->FileNameLength;
|
|
FileNameU.MaximumLength = FileNameU.Length + sizeof(WCHAR);
|
|
FileNameU.Buffer = IData->pFileInfo->FileName;
|
|
|
|
FileName.Length = 0;
|
|
FileName.MaximumLength = MAX_PATH;
|
|
FileName.Buffer = lpFindFileData->cFileName;
|
|
|
|
/* convert unicode string to ansi (or oem) */
|
|
if (bIsFileApiAnsi)
|
|
RtlUnicodeStringToAnsiString (&FileName,
|
|
&FileNameU,
|
|
FALSE);
|
|
else
|
|
RtlUnicodeStringToOemString (&FileName,
|
|
&FileNameU,
|
|
FALSE);
|
|
|
|
DPRINT("IData->pFileInfo->ShortNameLength %d\n",
|
|
IData->pFileInfo->ShortNameLength);
|
|
|
|
FileNameU.Length = IData->pFileInfo->ShortNameLength;
|
|
FileNameU.MaximumLength = FileNameU.Length + sizeof(WCHAR);
|
|
FileNameU.Buffer = IData->pFileInfo->ShortName;
|
|
|
|
FileName.Length = 0;
|
|
FileName.MaximumLength = 14;
|
|
FileName.Buffer = lpFindFileData->cAlternateFileName;
|
|
|
|
/* convert unicode string to ansi (or oem) */
|
|
if (bIsFileApiAnsi)
|
|
RtlUnicodeStringToAnsiString (&FileName,
|
|
&FileNameU,
|
|
FALSE);
|
|
else
|
|
RtlUnicodeStringToOemString (&FileName,
|
|
&FileNameU,
|
|
FALSE);
|
|
|
|
return (HANDLE)IData;
|
|
}
|
|
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
WINBOOL
|
|
STDCALL
|
|
FindNextFileA (
|
|
HANDLE hFindFile,
|
|
LPWIN32_FIND_DATAA lpFindFileData)
|
|
{
|
|
PKERNEL32_FIND_FILE_DATA IData;
|
|
UNICODE_STRING FileNameU;
|
|
ANSI_STRING FileName;
|
|
|
|
IData = (PKERNEL32_FIND_FILE_DATA)hFindFile;
|
|
if (IData == NULL)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if (!InternalFindNextFile (hFindFile))
|
|
{
|
|
DPRINT("InternalFindNextFile() failed\n");
|
|
return FALSE;
|
|
}
|
|
|
|
DPRINT("IData->pFileInfo->FileNameLength %d\n",
|
|
IData->pFileInfo->FileNameLength);
|
|
|
|
/* copy data into WIN32_FIND_DATA structure */
|
|
lpFindFileData->dwFileAttributes = IData->pFileInfo->FileAttributes;
|
|
memcpy (&lpFindFileData->ftCreationTime,
|
|
&IData->pFileInfo->CreationTime,
|
|
sizeof(FILETIME));
|
|
memcpy (&lpFindFileData->ftLastAccessTime,
|
|
&IData->pFileInfo->LastAccessTime,
|
|
sizeof(FILETIME));
|
|
memcpy (&lpFindFileData->ftLastWriteTime,
|
|
&IData->pFileInfo->LastWriteTime,
|
|
sizeof(FILETIME));
|
|
lpFindFileData->nFileSizeHigh = IData->pFileInfo->EndOfFile.u.HighPart;
|
|
lpFindFileData->nFileSizeLow = IData->pFileInfo->EndOfFile.u.LowPart;
|
|
|
|
FileNameU.Length = IData->pFileInfo->FileNameLength;
|
|
FileNameU.MaximumLength = FileNameU.Length + sizeof(WCHAR);
|
|
FileNameU.Buffer = IData->pFileInfo->FileName;
|
|
|
|
FileName.Length = 0;
|
|
FileName.MaximumLength = MAX_PATH;
|
|
FileName.Buffer = lpFindFileData->cFileName;
|
|
|
|
/* convert unicode string to ansi (or oem) */
|
|
if (bIsFileApiAnsi)
|
|
RtlUnicodeStringToAnsiString (&FileName,
|
|
&FileNameU,
|
|
FALSE);
|
|
else
|
|
RtlUnicodeStringToOemString (&FileName,
|
|
&FileNameU,
|
|
FALSE);
|
|
|
|
DPRINT("IData->pFileInfo->ShortNameLength %d\n",
|
|
IData->pFileInfo->ShortNameLength);
|
|
|
|
FileNameU.Length = IData->pFileInfo->ShortNameLength;
|
|
FileNameU.MaximumLength = FileNameU.Length + sizeof(WCHAR);
|
|
FileNameU.Buffer = IData->pFileInfo->ShortName;
|
|
|
|
FileName.Length = 0;
|
|
FileName.MaximumLength = 14;
|
|
FileName.Buffer = lpFindFileData->cAlternateFileName;
|
|
|
|
/* convert unicode string to ansi (or oem) */
|
|
if (bIsFileApiAnsi)
|
|
RtlUnicodeStringToAnsiString (&FileName,
|
|
&FileNameU,
|
|
FALSE);
|
|
else
|
|
RtlUnicodeStringToOemString (&FileName,
|
|
&FileNameU,
|
|
FALSE);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
BOOL
|
|
STDCALL
|
|
FindClose (
|
|
HANDLE hFindFile
|
|
)
|
|
{
|
|
PKERNEL32_FIND_FILE_DATA IData;
|
|
|
|
DPRINT("FindClose(hFindFile %x)\n",hFindFile);
|
|
|
|
if (!hFindFile || hFindFile == INVALID_HANDLE_VALUE)
|
|
{
|
|
SetLastError (ERROR_INVALID_HANDLE);
|
|
return FALSE;
|
|
}
|
|
|
|
IData = (PKERNEL32_FIND_FILE_DATA)hFindFile;
|
|
|
|
CloseHandle (IData->DirectoryHandle);
|
|
RtlFreeHeap (hProcessHeap, 0, IData);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
HANDLE
|
|
STDCALL
|
|
FindFirstFileW (
|
|
LPCWSTR lpFileName,
|
|
LPWIN32_FIND_DATAW lpFindFileData
|
|
)
|
|
{
|
|
PKERNEL32_FIND_FILE_DATA IData;
|
|
|
|
IData = InternalFindFirstFile (lpFileName);
|
|
if (IData == NULL)
|
|
{
|
|
DPRINT("Failing request\n");
|
|
return INVALID_HANDLE_VALUE;
|
|
}
|
|
|
|
/* copy data into WIN32_FIND_DATA structure */
|
|
lpFindFileData->dwFileAttributes = IData->pFileInfo->FileAttributes;
|
|
memcpy (&lpFindFileData->ftCreationTime,
|
|
&IData->pFileInfo->CreationTime,
|
|
sizeof(FILETIME));
|
|
memcpy (&lpFindFileData->ftLastAccessTime,
|
|
&IData->pFileInfo->LastAccessTime,
|
|
sizeof(FILETIME));
|
|
memcpy (&lpFindFileData->ftLastWriteTime,
|
|
&IData->pFileInfo->LastWriteTime,
|
|
sizeof(FILETIME));
|
|
lpFindFileData->nFileSizeHigh = IData->pFileInfo->EndOfFile.u.HighPart;
|
|
lpFindFileData->nFileSizeLow = IData->pFileInfo->EndOfFile.u.LowPart;
|
|
memcpy (lpFindFileData->cFileName,
|
|
IData->pFileInfo->FileName,
|
|
IData->pFileInfo->FileNameLength);
|
|
lpFindFileData->cFileName[IData->pFileInfo->FileNameLength / sizeof(WCHAR)] = 0;
|
|
memcpy (lpFindFileData->cAlternateFileName,
|
|
IData->pFileInfo->ShortName,
|
|
IData->pFileInfo->ShortNameLength);
|
|
lpFindFileData->cAlternateFileName[IData->pFileInfo->ShortNameLength / sizeof(WCHAR)] = 0;
|
|
return IData;
|
|
}
|
|
|
|
|
|
/*
|
|
* @implemented
|
|
*/
|
|
WINBOOL
|
|
STDCALL
|
|
FindNextFileW (
|
|
HANDLE hFindFile,
|
|
LPWIN32_FIND_DATAW lpFindFileData
|
|
)
|
|
{
|
|
PKERNEL32_FIND_FILE_DATA IData;
|
|
|
|
IData = (PKERNEL32_FIND_FILE_DATA)hFindFile;
|
|
if (!InternalFindNextFile(hFindFile))
|
|
{
|
|
DPRINT("Failing request\n");
|
|
return FALSE;
|
|
}
|
|
|
|
/* copy data into WIN32_FIND_DATA structure */
|
|
lpFindFileData->dwFileAttributes = IData->pFileInfo->FileAttributes;
|
|
memcpy (&lpFindFileData->ftCreationTime,
|
|
&IData->pFileInfo->CreationTime,
|
|
sizeof(FILETIME));
|
|
memcpy (&lpFindFileData->ftLastAccessTime,
|
|
&IData->pFileInfo->LastAccessTime,
|
|
sizeof(FILETIME));
|
|
memcpy (&lpFindFileData->ftLastWriteTime,
|
|
&IData->pFileInfo->LastWriteTime,
|
|
sizeof(FILETIME));
|
|
lpFindFileData->nFileSizeHigh = IData->pFileInfo->EndOfFile.u.HighPart;
|
|
lpFindFileData->nFileSizeLow = IData->pFileInfo->EndOfFile.u.LowPart;
|
|
memcpy (lpFindFileData->cFileName,
|
|
IData->pFileInfo->FileName,
|
|
IData->pFileInfo->FileNameLength);
|
|
lpFindFileData->cFileName[IData->pFileInfo->FileNameLength / sizeof(WCHAR)] = 0;
|
|
memcpy (lpFindFileData->cAlternateFileName,
|
|
IData->pFileInfo->ShortName,
|
|
IData->pFileInfo->ShortNameLength);
|
|
lpFindFileData->cAlternateFileName[IData->pFileInfo->ShortNameLength / sizeof(WCHAR)] = 0;
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
* @unimplemented
|
|
*/
|
|
HANDLE
|
|
STDCALL
|
|
FindFirstFileExW (
|
|
LPCWSTR lpFileName,
|
|
FINDEX_INFO_LEVELS fInfoLevelId,
|
|
LPVOID lpFindFileData,
|
|
FINDEX_SEARCH_OPS fSearchOp,
|
|
LPVOID lpSearchFilter,
|
|
DWORD dwAdditionalFlags
|
|
)
|
|
{
|
|
/* FIXME */
|
|
return (HANDLE) 0;
|
|
}
|
|
|
|
|
|
/*
|
|
* @unimplemented
|
|
*/
|
|
HANDLE
|
|
STDCALL
|
|
FindFirstFileExA (
|
|
LPCSTR lpFileName,
|
|
FINDEX_INFO_LEVELS fInfoLevelId,
|
|
LPVOID lpFindFileData,
|
|
FINDEX_SEARCH_OPS fSearchOp,
|
|
LPVOID lpSearchFilter,
|
|
DWORD dwAdditionalFlags
|
|
)
|
|
{
|
|
/* FIXME */
|
|
return (HANDLE) 0;
|
|
}
|
|
|
|
|
|
/* EOF */
|