mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 19:22:58 +00:00
Fixed WIN32_FIND_DATA[A/W] structs and resulting bugs
svn path=/trunk/; revision=1060
This commit is contained in:
parent
67200bd4f9
commit
b820741431
3 changed files with 255 additions and 237 deletions
|
@ -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;
|
||||
|
@ -76,7 +84,6 @@ 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,9 +4278,32 @@ 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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue