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
{
struct
{
DWORD LowPart;
LONG HighPart;
};
struct
{
DWORD LowPart;
@ -45,6 +50,11 @@ typedef union _LARGE_INTEGER
typedef union _ULARGE_INTEGER
{
struct
{
DWORD LowPart;
DWORD HighPart;
};
struct
{
DWORD LowPart;
@ -60,8 +70,6 @@ typedef struct _LIST_ENTRY {
struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY;
typedef struct _PARTITION_INFORMATION {
BYTE PartitionType;
BOOLEAN BootIndicator;
@ -70,13 +78,12 @@ typedef struct _PARTITION_INFORMATION {
LARGE_INTEGER StartingOffset;
LARGE_INTEGER PartitionLength;
LARGE_INTEGER HiddenSectors;
} PARTITION_INFORMATION ;
} PARTITION_INFORMATION;
typedef struct _SINGLE_LIST_ENTRY {
struct _SINGLE_LIST_ENTRY *Next;
} SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
typedef struct _CRITICAL_SECTION_DEBUG {
WORD Type;
WORD CreatorBackTraceIndex;
@ -4262,7 +4269,7 @@ typedef struct _VS_FIXEDFILEINFO {
DWORD dwFileDateLS;
} VS_FIXEDFILEINFO;
typedef struct _WIN32_FIND_DATA {
typedef struct _WIN32_FIND_DATAA {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
@ -4271,16 +4278,39 @@ typedef struct _WIN32_FIND_DATA {
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
TCHAR cFileName[ MAX_PATH ];
TCHAR cAlternateFileName[ 14 ];
} WIN32_FIND_DATA, *LPWIN32_FIND_DATA, *PWIN32_FIND_DATA;
CHAR cFileName[ MAX_PATH ];
CHAR cAlternateFileName[ 14 ];
} WIN32_FIND_DATAA, *LPWIN32_FIND_DATAA, *PWIN32_FIND_DATAA;
typedef struct _WIN32_FIND_DATAW {
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_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 ;
WCHAR *cStreamName;
} WIN32_STREAM_ID;
typedef struct _WINDOWPLACEMENT {

View file

@ -2107,14 +2107,14 @@ HANDLE
STDCALL
FindFirstFileW(
LPCWSTR lpFileName,
LPWIN32_FIND_DATA lpFindFileData
LPWIN32_FIND_DATAW lpFindFileData
);
WINBOOL
STDCALL
FindNextFileW(
HANDLE hFindFile,
LPWIN32_FIND_DATA lpFindFileData
LPWIN32_FIND_DATAW lpFindFileData
);
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
* PROJECT: ReactOS system libraries
@ -14,12 +14,11 @@
#include <ddk/ntddk.h>
#include <ntdll/rtl.h>
#include <windows.h>
#include <wchar.h>
#include <string.h>
#define NDEBUG
#include <kernel32/kernel32.h>
/* TYPES ********************************************************************/
typedef struct _KERNEL32_FIND_FILE_DATA
@ -30,61 +29,14 @@ typedef struct _KERNEL32_FIND_FILE_DATA
UNICODE_STRING PatternStr;
} 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 {
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;
}
/* FUNCTIONS ****************************************************************/
WINBOOL
STDCALL
InternalFindNextFile (
HANDLE hFindFile,
LPWIN32_FIND_DATA lpFindFileData
HANDLE hFindFile
)
{
PKERNEL32_FIND_FILE_DATA IData;
@ -112,8 +64,6 @@ InternalFindNextFile (
return FALSE;
}
FileDataToWin32Data (lpFindFileData, IData);
return TRUE;
}
@ -121,8 +71,7 @@ InternalFindNextFile (
HANDLE
STDCALL
InternalFindFirstFile (
LPCWSTR lpFileName,
LPWIN32_FIND_DATA lpFindFileData
LPCWSTR lpFileName
)
{
OBJECT_ATTRIBUTES ObjectAttributes;
@ -210,8 +159,6 @@ InternalFindFirstFile (
}
DPRINT("Found %S\n",IData->FileInfo.FileName);
FileDataToWin32Data(lpFindFileData, IData);
return IData;
}
@ -220,11 +167,10 @@ HANDLE
STDCALL
FindFirstFileA (
LPCTSTR lpFileName,
LPWIN32_FIND_DATA lpFindFileData
LPWIN32_FIND_DATAA lpFindFileData
)
{
PKERNEL32_FIND_FILE_DATA IData;
PWIN32_FIND_DATA_ASCII Ret;
UNICODE_STRING FileNameU;
ANSI_STRING FileName;
@ -241,11 +187,9 @@ FindFirstFileA (
&FileName,
TRUE);
IData = InternalFindFirstFile (FileNameU.Buffer, lpFindFileData);
IData = InternalFindFirstFile (FileNameU.Buffer);
RtlFreeHeap (RtlGetProcessHeap (),
0,
FileNameU.Buffer);
RtlFreeUnicodeString (&FileNameU);
if (IData == NULL)
{
@ -253,18 +197,30 @@ FindFirstFileA (
return INVALID_HANDLE_VALUE;
}
Ret = (PWIN32_FIND_DATA_ASCII)lpFindFileData;
DPRINT("IData->FileInfo.FileNameLength %d\n",
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.MaximumLength = FileNameU.Length + sizeof(WCHAR);
FileNameU.Buffer = IData->FileInfo.FileName;
FileName.Length = 0;
FileName.MaximumLength = MAX_PATH;
FileName.Buffer = Ret->cFileName;
FileName.Buffer = lpFindFileData->cFileName;
/* convert unicode string to ansi (or oem) */
if (bIsFileApiAnsi)
@ -281,11 +237,11 @@ FindFirstFileA (
FileNameU.Length = IData->FileInfo.ShortNameLength * sizeof(WCHAR);
FileNameU.MaximumLength = FileNameU.Length + sizeof(WCHAR);
FileNameU.Buffer = IData->FileInfo.FileName;
FileNameU.Buffer = IData->FileInfo.ShortName;
FileName.Length = 0;
FileName.MaximumLength = 14;
FileName.Buffer = Ret->cAlternateFileName;
FileName.Buffer = lpFindFileData->cAlternateFileName;
/* convert unicode string to ansi (or oem) */
if (bIsFileApiAnsi)
@ -297,15 +253,16 @@ FindFirstFileA (
&FileNameU,
FALSE);
return IData;
return (HANDLE)IData;
}
WINBOOL
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;
UNICODE_STRING FileNameU;
ANSI_STRING FileName;
@ -316,24 +273,36 @@ FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData)
return FALSE;
}
if (!InternalFindNextFile (hFindFile, lpFindFileData))
if (!InternalFindNextFile (hFindFile))
{
DPRINT("InternalFindNextFile() failed\n");
return FALSE;
}
Ret = (PWIN32_FIND_DATA_ASCII)lpFindFileData;
DPRINT("IData->FileInfo.FileNameLength %d\n",
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.MaximumLength = FileNameU.Length + sizeof(WCHAR);
FileNameU.Buffer = IData->FileInfo.FileName;
FileName.Length = 0;
FileName.MaximumLength = MAX_PATH;
FileName.Buffer = Ret->cFileName;
FileName.Buffer = lpFindFileData->cFileName;
/* convert unicode string to ansi (or oem) */
if (bIsFileApiAnsi)
@ -350,11 +319,11 @@ FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData)
FileNameU.Length = IData->FileInfo.ShortNameLength * sizeof(WCHAR);
FileNameU.MaximumLength = FileNameU.Length + sizeof(WCHAR);
FileNameU.Buffer = IData->FileInfo.FileName;
FileNameU.Buffer = IData->FileInfo.ShortName;
FileName.Length = 0;
FileName.MaximumLength = 14;
FileName.Buffer = Ret->cAlternateFileName;
FileName.Buffer = lpFindFileData->cAlternateFileName;
/* convert unicode string to ansi (or oem) */
if (bIsFileApiAnsi)
@ -401,25 +370,35 @@ HANDLE
STDCALL
FindFirstFileW (
LPCWSTR lpFileName,
LPWIN32_FIND_DATA lpFindFileData
LPWIN32_FIND_DATAW lpFindFileData
)
{
PWIN32_FIND_DATA_UNICODE Ret;
PKERNEL32_FIND_FILE_DATA IData;
IData = InternalFindFirstFile (lpFileName, lpFindFileData);
IData = InternalFindFirstFile (lpFileName);
if (IData == NULL)
{
DPRINT("Failing request\n");
return INVALID_HANDLE_VALUE;
}
Ret = (PWIN32_FIND_DATA_UNICODE)lpFindFileData;
memcpy (Ret->cFileName,
/* 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;
memcpy (lpFindFileData->cFileName,
IData->FileInfo.FileName,
IData->FileInfo.FileNameLength);
memcpy (Ret->cAlternateFileName,
memcpy (lpFindFileData->cAlternateFileName,
IData->FileInfo.ShortName,
IData->FileInfo.ShortNameLength);
@ -431,26 +410,35 @@ WINBOOL
STDCALL
FindNextFileW (
HANDLE hFindFile,
LPWIN32_FIND_DATA lpFindFileData
LPWIN32_FIND_DATAW lpFindFileData
)
{
PWIN32_FIND_DATA_UNICODE Ret;
PKERNEL32_FIND_FILE_DATA IData;
IData = (PKERNEL32_FIND_FILE_DATA)hFindFile;
if (!InternalFindNextFile(hFindFile, lpFindFileData))
if (!InternalFindNextFile(hFindFile))
{
DPRINT("Failing request\n");
return FALSE;
}
Ret = (PWIN32_FIND_DATA_UNICODE)lpFindFileData;
memcpy (Ret->cFileName,
/* 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;
memcpy (lpFindFileData->cFileName,
IData->FileInfo.FileName,
IData->FileInfo.FileNameLength);
memcpy (Ret->cAlternateFileName,
memcpy (lpFindFileData->cAlternateFileName,
IData->FileInfo.ShortName,
IData->FileInfo.ShortNameLength);