Christian Costa : d3dxof: Fix object files size limitation by mapping them into memory.
Alexandre Julliard
julliard at winehq.org
Wed Feb 4 09:15:34 CST 2009
Module: wine
Branch: master
Commit: 5bc9da3411cf2730186132f6d13643d0d5fa7972
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5bc9da3411cf2730186132f6d13643d0d5fa7972
Author: Christian Costa <titan.costa at wanadoo.fr>
Date: Tue Feb 3 22:58:34 2009 +0100
d3dxof: Fix object files size limitation by mapping them into memory.
---
dlls/d3dxof/d3dxof.c | 52 ++++++++++++++++++++++-------------------
dlls/d3dxof/d3dxof_private.h | 2 +
2 files changed, 30 insertions(+), 24 deletions(-)
diff --git a/dlls/d3dxof/d3dxof.c b/dlls/d3dxof/d3dxof.c
index 6aa0032..fb52a19 100644
--- a/dlls/d3dxof/d3dxof.c
+++ b/dlls/d3dxof/d3dxof.c
@@ -46,8 +46,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3dxof);
#define XOFFILE_FORMAT_FLOAT_BITS_32 MAKEFOUR('0','0','3','2')
#define XOFFILE_FORMAT_FLOAT_BITS_64 MAKEFOUR('0','0','6','4')
-#define MAX_INPUT_SIZE 2000000
-
static const struct IDirectXFileVtbl IDirectXFile_Vtbl;
static const struct IDirectXFileBinaryVtbl IDirectXFileBinary_Vtbl;
static const struct IDirectXFileDataVtbl IDirectXFileData_Vtbl;
@@ -130,8 +128,11 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV
IDirectXFileEnumObjectImpl* object;
HRESULT hr;
DWORD header[4];
- DWORD size;
HANDLE hFile = INVALID_HANDLE_VALUE;
+ HANDLE file_mapping = 0;
+ LPBYTE buffer = NULL;
+ DWORD file_size = 0;
+
LPDXFILELOADMEMORY lpdxflm = NULL;
TRACE("(%p/%p)->(%p,%x,%p)\n", This, iface, pvSource, dwLoadOptions, ppEnumObj);
@@ -150,17 +151,27 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV
return DXFILEERR_FILENOTFOUND;
}
- if (!ReadFile(hFile, header, 16, &size, NULL))
+ file_size = GetFileSize(hFile, NULL);
+ if (file_size < 16)
{
- hr = DXFILEERR_BADVALUE;
+ hr = DXFILEERR_BADFILETYPE;
+ goto error;
+ }
+
+ file_mapping = CreateFileMappingA(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
+ if (!file_mapping)
+ {
+ hr = DXFILEERR_BADFILETYPE;
goto error;
}
- if (size < 16)
+ buffer = MapViewOfFile(file_mapping, FILE_MAP_READ, 0, 0, 0);
+ if (!buffer)
{
hr = DXFILEERR_BADFILETYPE;
goto error;
}
+ memcpy(header, buffer, 16);
}
else if (dwLoadOptions == DXFILELOAD_FROMMEMORY)
{
@@ -224,6 +235,8 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV
object->source = dwLoadOptions;
object->hFile = hFile;
+ object->file_mapping = file_mapping;
+ object->buffer = buffer;
object->pDirectXFile = This;
object->buf.pdxf = This;
object->buf.txt = (header[2] == XOFFILE_FORMAT_TEXT);
@@ -232,22 +245,8 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV
if (dwLoadOptions == DXFILELOAD_FROMFILE)
{
- object->buf.buffer = HeapAlloc(GetProcessHeap(), 0, MAX_INPUT_SIZE+1);
- if (!object->buf.buffer)
- {
- ERR("Out of memory\n");
- hr = DXFILEERR_BADALLOC;
- goto error;
- }
-
- ReadFile(hFile, object->buf.buffer, MAX_INPUT_SIZE+1, &object->buf.rem_bytes, NULL);
- if (object->buf.rem_bytes > MAX_INPUT_SIZE)
- {
- FIXME("File size > %d not supported yet\n", MAX_INPUT_SIZE);
- HeapFree(GetProcessHeap(), 0, object->buf.buffer);
- hr = DXFILEERR_PARSEERROR;
- goto error;
- }
+ object->buf.buffer = buffer + 16;
+ object->buf.rem_bytes = file_size - 16;
}
else
{
@@ -255,7 +254,7 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV
object->buf.rem_bytes = lpdxflm->dSize;
}
- TRACE("Read %d bytes\n", object->buf.rem_bytes);
+ TRACE("Object size is %d bytes\n", object->buf.rem_bytes + 16);
*ppEnumObj = (LPDIRECTXFILEENUMOBJECT)object;
@@ -286,6 +285,10 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV
return DXFILE_OK;
error:
+ if (buffer)
+ UnmapViewOfFile(buffer);
+ if (file_mapping)
+ CloseHandle(file_mapping);
if (hFile != INVALID_HANDLE_VALUE)
CloseHandle(hFile);
*ppEnumObj = NULL;
@@ -972,7 +975,8 @@ static ULONG WINAPI IDirectXFileEnumObjectImpl_Release(IDirectXFileEnumObject* i
}
if (This->source == DXFILELOAD_FROMFILE)
{
- HeapFree(GetProcessHeap(), 0, This->buf.buffer);
+ UnmapViewOfFile(This->buffer);
+ CloseHandle(This->file_mapping);
CloseHandle(This->hFile);
}
HeapFree(GetProcessHeap(), 0, This);
diff --git a/dlls/d3dxof/d3dxof_private.h b/dlls/d3dxof/d3dxof_private.h
index 585f9d5..978b312 100644
--- a/dlls/d3dxof/d3dxof_private.h
+++ b/dlls/d3dxof/d3dxof_private.h
@@ -149,6 +149,8 @@ typedef struct {
LONG ref;
DXFILELOADOPTIONS source;
HANDLE hFile;
+ HANDLE file_mapping;
+ LPBYTE buffer;
parse_buffer buf;
IDirectXFileImpl* pDirectXFile;
ULONG nb_xobjects;
More information about the wine-cvs
mailing list