Fixed WIN32_FIND_DATA[A/W] structs and resulting bugs

svn path=/trunk/; revision=1060
This commit is contained in:
Eric Kohl 2000-03-15 23:13:29 +00:00
parent 67200bd4f9
commit b820741431
3 changed files with 255 additions and 237 deletions

View file

@ -35,6 +35,11 @@
typedef union _LARGE_INTEGER typedef union _LARGE_INTEGER
{ {
struct
{
DWORD LowPart;
LONG HighPart;
};
struct struct
{ {
DWORD LowPart; DWORD LowPart;
@ -45,6 +50,11 @@ typedef union _LARGE_INTEGER
typedef union _ULARGE_INTEGER typedef union _ULARGE_INTEGER
{ {
struct
{
DWORD LowPart;
DWORD HighPart;
};
struct struct
{ {
DWORD LowPart; DWORD LowPart;
@ -55,28 +65,25 @@ typedef union _ULARGE_INTEGER
#include <security.h> #include <security.h>
typedef struct _LIST_ENTRY { typedef struct _LIST_ENTRY {
struct _LIST_ENTRY *Flink; struct _LIST_ENTRY *Flink;
struct _LIST_ENTRY *Blink; struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY; } LIST_ENTRY, *PLIST_ENTRY;
typedef struct _PARTITION_INFORMATION {
BYTE PartitionType;
BOOLEAN BootIndicator;
BOOLEAN RecognizedPartition;
BOOLEAN RewritePartition;
LARGE_INTEGER StartingOffset;
LARGE_INTEGER PartitionLength;
LARGE_INTEGER HiddenSectors;
} PARTITION_INFORMATION;
typedef struct _SINGLE_LIST_ENTRY {
struct _SINGLE_LIST_ENTRY *Next;
} SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
typedef struct _PARTITION_INFORMATION {
BYTE PartitionType;
BOOLEAN BootIndicator;
BOOLEAN RecognizedPartition;
BOOLEAN RewritePartition;
LARGE_INTEGER StartingOffset;
LARGE_INTEGER PartitionLength;
LARGE_INTEGER HiddenSectors;
} PARTITION_INFORMATION ;
typedef struct _SINGLE_LIST_ENTRY {
struct _SINGLE_LIST_ENTRY *Next;
} SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
typedef struct _CRITICAL_SECTION_DEBUG { typedef struct _CRITICAL_SECTION_DEBUG {
WORD Type; WORD Type;
WORD CreatorBackTraceIndex; WORD CreatorBackTraceIndex;
@ -97,18 +104,18 @@ typedef struct _CRITICAL_SECTION {
DWORD Reserved; DWORD Reserved;
} CRITICAL_SECTION, *PCRITICAL_SECTION, *LPCRITICAL_SECTION; } CRITICAL_SECTION, *PCRITICAL_SECTION, *LPCRITICAL_SECTION;
typedef struct _GENERIC_MAPPING { typedef struct _GENERIC_MAPPING {
ACCESS_MASK GenericRead; ACCESS_MASK GenericRead;
ACCESS_MASK GenericWrite; ACCESS_MASK GenericWrite;
ACCESS_MASK GenericExecute; ACCESS_MASK GenericExecute;
ACCESS_MASK GenericAll; ACCESS_MASK GenericAll;
} GENERIC_MAPPING, *PGENERIC_MAPPING; } GENERIC_MAPPING, *PGENERIC_MAPPING;
typedef struct _PRIVILEGE_SET { typedef struct _PRIVILEGE_SET {
DWORD PrivilegeCount; DWORD PrivilegeCount;
DWORD Control; DWORD Control;
LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY]; LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
} PRIVILEGE_SET, *PPRIVILEGE_SET, *LPPRIVILEGE_SET; } PRIVILEGE_SET, *PPRIVILEGE_SET, *LPPRIVILEGE_SET;
#ifdef __i386__ #ifdef __i386__
@ -150,7 +157,7 @@ typedef struct _CONTEXT {
DWORD Ebp; DWORD Ebp;
DWORD Eip; DWORD Eip;
DWORD SegCs; DWORD SegCs;
DWORD EFlags; DWORD EFlags;
DWORD Esp; DWORD Esp;
DWORD SegSs; DWORD SegSs;
@ -4137,7 +4144,7 @@ typedef struct _textrange {
LPSTR lpstrText; LPSTR lpstrText;
} TEXTRANGE; } TEXTRANGE;
typedef struct tagTOGGLEKEYS { typedef struct tagTOGGLEKEYS {
DWORD cbSize; DWORD cbSize;
DWORD dwFlags; DWORD dwFlags;
} TOGGLEKEYS; } TOGGLEKEYS;
@ -4148,17 +4155,17 @@ typedef struct _TOKEN_CONTROL {
LUID ModifiedId; LUID ModifiedId;
TOKEN_SOURCE TokenSource; TOKEN_SOURCE TokenSource;
} TOKEN_CONTROL, *PTOKEN_CONTROL ; } TOKEN_CONTROL, *PTOKEN_CONTROL ;
typedef struct { typedef struct {
UINT cbSize; UINT cbSize;
UINT uFlags; UINT uFlags;
HWND hwnd; HWND hwnd;
UINT uId; UINT uId;
RECT rect; RECT rect;
HINSTANCE hinst; HINSTANCE hinst;
LPTSTR lpszText; LPTSTR lpszText;
} TOOLINFO, *PTOOLINFO, *LPTOOLINFO; } TOOLINFO, *PTOOLINFO, *LPTOOLINFO;
typedef struct { typedef struct {
NMHDR hdr; NMHDR hdr;
LPTSTR lpszText; LPTSTR lpszText;
@ -4240,85 +4247,108 @@ typedef struct tagUSEROBJECTFLAGS {
WINBOOL fReserved; WINBOOL fReserved;
DWORD dwFlags; DWORD dwFlags;
} USEROBJECTFLAGS; } USEROBJECTFLAGS;
typedef struct _VERIFY_INFORMATION { typedef struct _VERIFY_INFORMATION {
LARGE_INTEGER StartingOffset; LARGE_INTEGER StartingOffset;
DWORD Length; DWORD Length;
} VERIFY_INFORMATION ; } VERIFY_INFORMATION ;
typedef struct _VS_FIXEDFILEINFO { typedef struct _VS_FIXEDFILEINFO {
DWORD dwSignature; DWORD dwSignature;
DWORD dwStrucVersion; DWORD dwStrucVersion;
DWORD dwFileVersionMS; DWORD dwFileVersionMS;
DWORD dwFileVersionLS; DWORD dwFileVersionLS;
DWORD dwProductVersionMS; DWORD dwProductVersionMS;
DWORD dwProductVersionLS; DWORD dwProductVersionLS;
DWORD dwFileFlagsMask; DWORD dwFileFlagsMask;
DWORD dwFileFlags; DWORD dwFileFlags;
DWORD dwFileOS; DWORD dwFileOS;
DWORD dwFileType; DWORD dwFileType;
DWORD dwFileSubtype; DWORD dwFileSubtype;
DWORD dwFileDateMS; DWORD dwFileDateMS;
DWORD dwFileDateLS; DWORD dwFileDateLS;
} VS_FIXEDFILEINFO; } VS_FIXEDFILEINFO;
typedef struct _WIN32_FIND_DATA { typedef struct _WIN32_FIND_DATAA {
DWORD dwFileAttributes; DWORD dwFileAttributes;
FILETIME ftCreationTime; FILETIME ftCreationTime;
FILETIME ftLastAccessTime; FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime; FILETIME ftLastWriteTime;
DWORD nFileSizeHigh; DWORD nFileSizeHigh;
DWORD nFileSizeLow; DWORD nFileSizeLow;
DWORD dwReserved0; DWORD dwReserved0;
DWORD dwReserved1; DWORD dwReserved1;
TCHAR cFileName[ MAX_PATH ]; CHAR cFileName[ MAX_PATH ];
TCHAR cAlternateFileName[ 14 ]; CHAR cAlternateFileName[ 14 ];
} WIN32_FIND_DATA, *LPWIN32_FIND_DATA, *PWIN32_FIND_DATA; } WIN32_FIND_DATAA, *LPWIN32_FIND_DATAA, *PWIN32_FIND_DATAA;
typedef struct _WIN32_STREAM_ID { typedef struct _WIN32_FIND_DATAW {
DWORD dwStreamId; DWORD dwFileAttributes;
DWORD dwStreamAttributes; FILETIME ftCreationTime;
LARGE_INTEGER Size; FILETIME ftLastAccessTime;
DWORD dwStreamNameSize; FILETIME ftLastWriteTime;
WCHAR *cStreamName ; DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
WCHAR cFileName[ MAX_PATH ];
WCHAR cAlternateFileName[ 14 ];
} WIN32_FIND_DATAW, *LPWIN32_FIND_DATAW, *PWIN32_FIND_DATAW;
#ifdef UNICODE
#define WIN32_FIND_DATA WIN32_FIND_DATAW
#define PWIN32_FIND_DATA PWIN32_FIND_DATAW
#define LPWIN32_FIND_DATA LPWIN32_FIND_DATAW
#else
#define WIN32_FIND_DATA WIN32_FIND_DATAA
#define PWIN32_FIND_DATA PWIN32_FIND_DATAA
#define LPWIN32_FIND_DATA LPWIN32_FIND_DATAA
#endif
typedef struct _WIN32_STREAM_ID {
DWORD dwStreamId;
DWORD dwStreamAttributes;
LARGE_INTEGER Size;
DWORD dwStreamNameSize;
WCHAR *cStreamName;
} WIN32_STREAM_ID; } WIN32_STREAM_ID;
typedef struct _WINDOWPLACEMENT { typedef struct _WINDOWPLACEMENT {
UINT length; UINT length;
UINT flags; UINT flags;
UINT showCmd; UINT showCmd;
POINT ptMinPosition; POINT ptMinPosition;
POINT ptMaxPosition; POINT ptMaxPosition;
RECT rcNormalPosition; RECT rcNormalPosition;
} WINDOWPLACEMENT; } WINDOWPLACEMENT;
typedef struct _WNDCLASS { typedef struct _WNDCLASS {
UINT style; UINT style;
WNDPROC lpfnWndProc; WNDPROC lpfnWndProc;
int cbClsExtra; int cbClsExtra;
int cbWndExtra; int cbWndExtra;
HANDLE hInstance; HANDLE hInstance;
HICON hIcon; HICON hIcon;
HCURSOR hCursor; HCURSOR hCursor;
HBRUSH hbrBackground; HBRUSH hbrBackground;
LPCTSTR lpszMenuName; LPCTSTR lpszMenuName;
LPCTSTR lpszClassName; LPCTSTR lpszClassName;
} WNDCLASS, *LPWNDCLASS; } WNDCLASS, *LPWNDCLASS;
typedef struct _WNDCLASSEX { typedef struct _WNDCLASSEX {
UINT cbSize; UINT cbSize;
UINT style; UINT style;
WNDPROC lpfnWndProc; WNDPROC lpfnWndProc;
int cbClsExtra; int cbClsExtra;
int cbWndExtra; int cbWndExtra;
HANDLE hInstance; HANDLE hInstance;
HICON hIcon; HICON hIcon;
HCURSOR hCursor; HCURSOR hCursor;
HBRUSH hbrBackground; HBRUSH hbrBackground;
LPCTSTR lpszMenuName; LPCTSTR lpszMenuName;
LPCTSTR lpszClassName; LPCTSTR lpszClassName;
HICON hIconSm; HICON hIconSm;
} WNDCLASSEX, *LPWNDCLASSEX; } WNDCLASSEX, *LPWNDCLASSEX;
typedef struct _CONNECTDLGSTRUCT { typedef struct _CONNECTDLGSTRUCT {
DWORD cbStructure; DWORD cbStructure;
@ -4372,7 +4402,7 @@ typedef VOID CALLBACK (*LPOVERLAPPED_COMPLETION_ROUTINE) (DWORD, DWORD,
/* /*
Structures for the extensions to OpenGL Structures for the extensions to OpenGL
*/ */
typedef struct _POINTFLOAT typedef struct _POINTFLOAT
{ {
FLOAT x; FLOAT x;
FLOAT y; FLOAT y;
@ -4389,31 +4419,31 @@ typedef struct _GLYPHMETRICSFLOAT
typedef struct tagLAYERPLANEDESCRIPTOR typedef struct tagLAYERPLANEDESCRIPTOR
{ {
WORD nSize; WORD nSize;
WORD nVersion; WORD nVersion;
DWORD dwFlags; DWORD dwFlags;
BYTE iPixelType; BYTE iPixelType;
BYTE cColorBits; BYTE cColorBits;
BYTE cRedBits; BYTE cRedBits;
BYTE cRedShift; BYTE cRedShift;
BYTE cGreenBits; BYTE cGreenBits;
BYTE cGreenShift; BYTE cGreenShift;
BYTE cBlueBits; BYTE cBlueBits;
BYTE cBlueShift; BYTE cBlueShift;
BYTE cAlphaBits; BYTE cAlphaBits;
BYTE cAlphaShift; BYTE cAlphaShift;
BYTE cAccumBits; BYTE cAccumBits;
BYTE cAccumRedBits; BYTE cAccumRedBits;
BYTE cAccumGreenBits; BYTE cAccumGreenBits;
BYTE cAccumBlueBits; BYTE cAccumBlueBits;
BYTE cAccumAlphaBits; BYTE cAccumAlphaBits;
BYTE cDepthBits; BYTE cDepthBits;
BYTE cStencilBits; BYTE cStencilBits;
BYTE cAuxBuffers; BYTE cAuxBuffers;
BYTE iLayerPlane; BYTE iLayerPlane;
BYTE bReserved; BYTE bReserved;
COLORREF crTransparent; COLORREF crTransparent;
} LAYERPLANEDESCRIPTOR, *PLAYERPLANEDESCRIPTOR, *LPLAYERPLANEDESCRIPTOR; } LAYERPLANEDESCRIPTOR, *PLAYERPLANEDESCRIPTOR, *LPLAYERPLANEDESCRIPTOR;
typedef struct tagPIXELFORMATDESCRIPTOR typedef struct tagPIXELFORMATDESCRIPTOR
{ {

View file

@ -2107,14 +2107,14 @@ HANDLE
STDCALL STDCALL
FindFirstFileW( FindFirstFileW(
LPCWSTR lpFileName, LPCWSTR lpFileName,
LPWIN32_FIND_DATA lpFindFileData LPWIN32_FIND_DATAW lpFindFileData
); );
WINBOOL WINBOOL
STDCALL STDCALL
FindNextFileW( FindNextFileW(
HANDLE hFindFile, HANDLE hFindFile,
LPWIN32_FIND_DATA lpFindFileData LPWIN32_FIND_DATAW lpFindFileData
); );
WINBOOL WINBOOL

View file

@ -1,4 +1,4 @@
/* $Id: find.c,v 1.24 2000/03/15 12:25:47 ekohl Exp $ /* $Id: find.c,v 1.25 2000/03/15 23:13:29 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries * PROJECT: ReactOS system libraries
@ -14,12 +14,11 @@
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <ntdll/rtl.h> #include <ntdll/rtl.h>
#include <windows.h> #include <windows.h>
#include <wchar.h>
#include <string.h>
#define NDEBUG #define NDEBUG
#include <kernel32/kernel32.h> #include <kernel32/kernel32.h>
/* TYPES ********************************************************************/ /* TYPES ********************************************************************/
typedef struct _KERNEL32_FIND_FILE_DATA typedef struct _KERNEL32_FIND_FILE_DATA
@ -30,61 +29,14 @@ typedef struct _KERNEL32_FIND_FILE_DATA
UNICODE_STRING PatternStr; UNICODE_STRING PatternStr;
} KERNEL32_FIND_FILE_DATA, *PKERNEL32_FIND_FILE_DATA; } KERNEL32_FIND_FILE_DATA, *PKERNEL32_FIND_FILE_DATA;
typedef struct _WIN32_FIND_DATA_UNICODE {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
WCHAR cFileName[ MAX_PATH ];
WCHAR cAlternateFileName[ 14 ];
} WIN32_FIND_DATA_UNICODE, *PWIN32_FIND_DATA_UNICODE;
typedef struct _WIN32_FIND_DATA_ASCII { /* FUNCTIONS ****************************************************************/
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
CHAR cFileName[ MAX_PATH ];
CHAR cAlternateFileName[ 14 ];
} WIN32_FIND_DATA_ASCII, *PWIN32_FIND_DATA_ASCII;
/* FUNCTIONS *****************************************************************/
static void
FileDataToWin32Data (
LPWIN32_FIND_DATA lpFindFileData,
PKERNEL32_FIND_FILE_DATA IData
)
{
lpFindFileData->dwFileAttributes = IData->FileInfo.FileAttributes;
memcpy (&lpFindFileData->ftCreationTime,
&IData->FileInfo.CreationTime,
sizeof(FILETIME));
memcpy (&lpFindFileData->ftLastAccessTime,
&IData->FileInfo.LastAccessTime,
sizeof(FILETIME));
memcpy (&lpFindFileData->ftLastWriteTime,
&IData->FileInfo.LastWriteTime,
sizeof(FILETIME));
lpFindFileData->nFileSizeHigh = IData->FileInfo.EndOfFile.u.HighPart;
lpFindFileData->nFileSizeLow = IData->FileInfo.EndOfFile.u.LowPart;
}
WINBOOL WINBOOL
STDCALL STDCALL
InternalFindNextFile ( InternalFindNextFile (
HANDLE hFindFile, HANDLE hFindFile
LPWIN32_FIND_DATA lpFindFileData
) )
{ {
PKERNEL32_FIND_FILE_DATA IData; PKERNEL32_FIND_FILE_DATA IData;
@ -112,8 +64,6 @@ InternalFindNextFile (
return FALSE; return FALSE;
} }
FileDataToWin32Data (lpFindFileData, IData);
return TRUE; return TRUE;
} }
@ -121,8 +71,7 @@ InternalFindNextFile (
HANDLE HANDLE
STDCALL STDCALL
InternalFindFirstFile ( InternalFindFirstFile (
LPCWSTR lpFileName, LPCWSTR lpFileName
LPWIN32_FIND_DATA lpFindFileData
) )
{ {
OBJECT_ATTRIBUTES ObjectAttributes; OBJECT_ATTRIBUTES ObjectAttributes;
@ -210,8 +159,6 @@ InternalFindFirstFile (
} }
DPRINT("Found %S\n",IData->FileInfo.FileName); DPRINT("Found %S\n",IData->FileInfo.FileName);
FileDataToWin32Data(lpFindFileData, IData);
return IData; return IData;
} }
@ -220,11 +167,10 @@ HANDLE
STDCALL STDCALL
FindFirstFileA ( FindFirstFileA (
LPCTSTR lpFileName, LPCTSTR lpFileName,
LPWIN32_FIND_DATA lpFindFileData LPWIN32_FIND_DATAA lpFindFileData
) )
{ {
PKERNEL32_FIND_FILE_DATA IData; PKERNEL32_FIND_FILE_DATA IData;
PWIN32_FIND_DATA_ASCII Ret;
UNICODE_STRING FileNameU; UNICODE_STRING FileNameU;
ANSI_STRING FileName; ANSI_STRING FileName;
@ -241,11 +187,9 @@ FindFirstFileA (
&FileName, &FileName,
TRUE); TRUE);
IData = InternalFindFirstFile (FileNameU.Buffer, lpFindFileData); IData = InternalFindFirstFile (FileNameU.Buffer);
RtlFreeHeap (RtlGetProcessHeap (), RtlFreeUnicodeString (&FileNameU);
0,
FileNameU.Buffer);
if (IData == NULL) if (IData == NULL)
{ {
@ -253,18 +197,30 @@ FindFirstFileA (
return INVALID_HANDLE_VALUE; return INVALID_HANDLE_VALUE;
} }
Ret = (PWIN32_FIND_DATA_ASCII)lpFindFileData;
DPRINT("IData->FileInfo.FileNameLength %d\n", DPRINT("IData->FileInfo.FileNameLength %d\n",
IData->FileInfo.FileNameLength); IData->FileInfo.FileNameLength);
/* copy data into WIN32_FIND_DATA structure */
lpFindFileData->dwFileAttributes = IData->FileInfo.FileAttributes;
memcpy (&lpFindFileData->ftCreationTime,
&IData->FileInfo.CreationTime,
sizeof(FILETIME));
memcpy (&lpFindFileData->ftLastAccessTime,
&IData->FileInfo.LastAccessTime,
sizeof(FILETIME));
memcpy (&lpFindFileData->ftLastWriteTime,
&IData->FileInfo.LastWriteTime,
sizeof(FILETIME));
lpFindFileData->nFileSizeHigh = IData->FileInfo.EndOfFile.u.HighPart;
lpFindFileData->nFileSizeLow = IData->FileInfo.EndOfFile.u.LowPart;
FileNameU.Length = IData->FileInfo.FileNameLength * sizeof(WCHAR); FileNameU.Length = IData->FileInfo.FileNameLength * sizeof(WCHAR);
FileNameU.MaximumLength = FileNameU.Length + sizeof(WCHAR); FileNameU.MaximumLength = FileNameU.Length + sizeof(WCHAR);
FileNameU.Buffer = IData->FileInfo.FileName; FileNameU.Buffer = IData->FileInfo.FileName;
FileName.Length = 0; FileName.Length = 0;
FileName.MaximumLength = MAX_PATH; FileName.MaximumLength = MAX_PATH;
FileName.Buffer = Ret->cFileName; FileName.Buffer = lpFindFileData->cFileName;
/* convert unicode string to ansi (or oem) */ /* convert unicode string to ansi (or oem) */
if (bIsFileApiAnsi) if (bIsFileApiAnsi)
@ -281,11 +237,11 @@ FindFirstFileA (
FileNameU.Length = IData->FileInfo.ShortNameLength * sizeof(WCHAR); FileNameU.Length = IData->FileInfo.ShortNameLength * sizeof(WCHAR);
FileNameU.MaximumLength = FileNameU.Length + sizeof(WCHAR); FileNameU.MaximumLength = FileNameU.Length + sizeof(WCHAR);
FileNameU.Buffer = IData->FileInfo.FileName; FileNameU.Buffer = IData->FileInfo.ShortName;
FileName.Length = 0; FileName.Length = 0;
FileName.MaximumLength = 14; FileName.MaximumLength = 14;
FileName.Buffer = Ret->cAlternateFileName; FileName.Buffer = lpFindFileData->cAlternateFileName;
/* convert unicode string to ansi (or oem) */ /* convert unicode string to ansi (or oem) */
if (bIsFileApiAnsi) if (bIsFileApiAnsi)
@ -297,15 +253,16 @@ FindFirstFileA (
&FileNameU, &FileNameU,
FALSE); FALSE);
return IData; return (HANDLE)IData;
} }
WINBOOL WINBOOL
STDCALL STDCALL
FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData) FindNextFileA (
HANDLE hFindFile,
LPWIN32_FIND_DATAA lpFindFileData)
{ {
PWIN32_FIND_DATA_ASCII Ret;
PKERNEL32_FIND_FILE_DATA IData; PKERNEL32_FIND_FILE_DATA IData;
UNICODE_STRING FileNameU; UNICODE_STRING FileNameU;
ANSI_STRING FileName; ANSI_STRING FileName;
@ -316,24 +273,36 @@ FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData)
return FALSE; return FALSE;
} }
if (!InternalFindNextFile (hFindFile, lpFindFileData)) if (!InternalFindNextFile (hFindFile))
{ {
DPRINT("InternalFindNextFile() failed\n"); DPRINT("InternalFindNextFile() failed\n");
return FALSE; return FALSE;
} }
Ret = (PWIN32_FIND_DATA_ASCII)lpFindFileData;
DPRINT("IData->FileInfo.FileNameLength %d\n", DPRINT("IData->FileInfo.FileNameLength %d\n",
IData->FileInfo.FileNameLength); IData->FileInfo.FileNameLength);
/* copy data into WIN32_FIND_DATA structure */
lpFindFileData->dwFileAttributes = IData->FileInfo.FileAttributes;
memcpy (&lpFindFileData->ftCreationTime,
&IData->FileInfo.CreationTime,
sizeof(FILETIME));
memcpy (&lpFindFileData->ftLastAccessTime,
&IData->FileInfo.LastAccessTime,
sizeof(FILETIME));
memcpy (&lpFindFileData->ftLastWriteTime,
&IData->FileInfo.LastWriteTime,
sizeof(FILETIME));
lpFindFileData->nFileSizeHigh = IData->FileInfo.EndOfFile.u.HighPart;
lpFindFileData->nFileSizeLow = IData->FileInfo.EndOfFile.u.LowPart;
FileNameU.Length = IData->FileInfo.FileNameLength * sizeof(WCHAR); FileNameU.Length = IData->FileInfo.FileNameLength * sizeof(WCHAR);
FileNameU.MaximumLength = FileNameU.Length + sizeof(WCHAR); FileNameU.MaximumLength = FileNameU.Length + sizeof(WCHAR);
FileNameU.Buffer = IData->FileInfo.FileName; FileNameU.Buffer = IData->FileInfo.FileName;
FileName.Length = 0; FileName.Length = 0;
FileName.MaximumLength = MAX_PATH; FileName.MaximumLength = MAX_PATH;
FileName.Buffer = Ret->cFileName; FileName.Buffer = lpFindFileData->cFileName;
/* convert unicode string to ansi (or oem) */ /* convert unicode string to ansi (or oem) */
if (bIsFileApiAnsi) if (bIsFileApiAnsi)
@ -350,11 +319,11 @@ FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData)
FileNameU.Length = IData->FileInfo.ShortNameLength * sizeof(WCHAR); FileNameU.Length = IData->FileInfo.ShortNameLength * sizeof(WCHAR);
FileNameU.MaximumLength = FileNameU.Length + sizeof(WCHAR); FileNameU.MaximumLength = FileNameU.Length + sizeof(WCHAR);
FileNameU.Buffer = IData->FileInfo.FileName; FileNameU.Buffer = IData->FileInfo.ShortName;
FileName.Length = 0; FileName.Length = 0;
FileName.MaximumLength = 14; FileName.MaximumLength = 14;
FileName.Buffer = Ret->cAlternateFileName; FileName.Buffer = lpFindFileData->cAlternateFileName;
/* convert unicode string to ansi (or oem) */ /* convert unicode string to ansi (or oem) */
if (bIsFileApiAnsi) if (bIsFileApiAnsi)
@ -401,25 +370,35 @@ HANDLE
STDCALL STDCALL
FindFirstFileW ( FindFirstFileW (
LPCWSTR lpFileName, LPCWSTR lpFileName,
LPWIN32_FIND_DATA lpFindFileData LPWIN32_FIND_DATAW lpFindFileData
) )
{ {
PWIN32_FIND_DATA_UNICODE Ret;
PKERNEL32_FIND_FILE_DATA IData; PKERNEL32_FIND_FILE_DATA IData;
IData = InternalFindFirstFile (lpFileName, lpFindFileData); IData = InternalFindFirstFile (lpFileName);
if (IData == NULL) if (IData == NULL)
{ {
DPRINT("Failing request\n"); DPRINT("Failing request\n");
return INVALID_HANDLE_VALUE; return INVALID_HANDLE_VALUE;
} }
Ret = (PWIN32_FIND_DATA_UNICODE)lpFindFileData; /* copy data into WIN32_FIND_DATA structure */
lpFindFileData->dwFileAttributes = IData->FileInfo.FileAttributes;
memcpy (Ret->cFileName, memcpy (&lpFindFileData->ftCreationTime,
&IData->FileInfo.CreationTime,
sizeof(FILETIME));
memcpy (&lpFindFileData->ftLastAccessTime,
&IData->FileInfo.LastAccessTime,
sizeof(FILETIME));
memcpy (&lpFindFileData->ftLastWriteTime,
&IData->FileInfo.LastWriteTime,
sizeof(FILETIME));
lpFindFileData->nFileSizeHigh = IData->FileInfo.EndOfFile.u.HighPart;
lpFindFileData->nFileSizeLow = IData->FileInfo.EndOfFile.u.LowPart;
memcpy (lpFindFileData->cFileName,
IData->FileInfo.FileName, IData->FileInfo.FileName,
IData->FileInfo.FileNameLength); IData->FileInfo.FileNameLength);
memcpy (Ret->cAlternateFileName, memcpy (lpFindFileData->cAlternateFileName,
IData->FileInfo.ShortName, IData->FileInfo.ShortName,
IData->FileInfo.ShortNameLength); IData->FileInfo.ShortNameLength);
@ -431,26 +410,35 @@ WINBOOL
STDCALL STDCALL
FindNextFileW ( FindNextFileW (
HANDLE hFindFile, HANDLE hFindFile,
LPWIN32_FIND_DATA lpFindFileData LPWIN32_FIND_DATAW lpFindFileData
) )
{ {
PWIN32_FIND_DATA_UNICODE Ret;
PKERNEL32_FIND_FILE_DATA IData; PKERNEL32_FIND_FILE_DATA IData;
IData = (PKERNEL32_FIND_FILE_DATA)hFindFile; IData = (PKERNEL32_FIND_FILE_DATA)hFindFile;
if (!InternalFindNextFile(hFindFile, lpFindFileData)) if (!InternalFindNextFile(hFindFile))
{ {
DPRINT("Failing request\n"); DPRINT("Failing request\n");
return FALSE; return FALSE;
} }
Ret = (PWIN32_FIND_DATA_UNICODE)lpFindFileData; /* copy data into WIN32_FIND_DATA structure */
lpFindFileData->dwFileAttributes = IData->FileInfo.FileAttributes;
memcpy (Ret->cFileName, memcpy (&lpFindFileData->ftCreationTime,
&IData->FileInfo.CreationTime,
sizeof(FILETIME));
memcpy (&lpFindFileData->ftLastAccessTime,
&IData->FileInfo.LastAccessTime,
sizeof(FILETIME));
memcpy (&lpFindFileData->ftLastWriteTime,
&IData->FileInfo.LastWriteTime,
sizeof(FILETIME));
lpFindFileData->nFileSizeHigh = IData->FileInfo.EndOfFile.u.HighPart;
lpFindFileData->nFileSizeLow = IData->FileInfo.EndOfFile.u.LowPart;
memcpy (lpFindFileData->cFileName,
IData->FileInfo.FileName, IData->FileInfo.FileName,
IData->FileInfo.FileNameLength); IData->FileInfo.FileNameLength);
memcpy (lpFindFileData->cAlternateFileName,
memcpy (Ret->cAlternateFileName,
IData->FileInfo.ShortName, IData->FileInfo.ShortName,
IData->FileInfo.ShortNameLength); IData->FileInfo.ShortNameLength);