[PATCH] d3dx9: Add utility functions for loading files and resources into memory

Tony Wasserka tony.wasserka at freenet.de
Mon Jun 1 11:25:32 CDT 2009


---
 dlls/d3dx9_36/Makefile.in        |    3 +-
 dlls/d3dx9_36/d3dx9_36_private.h |    4 ++
 dlls/d3dx9_36/util.c             |  104 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 110 insertions(+), 1 deletions(-)
 create mode 100644 dlls/d3dx9_36/util.c

diff --git a/dlls/d3dx9_36/Makefile.in b/dlls/d3dx9_36/Makefile.in
index 16fd41c..c094071 100644
--- a/dlls/d3dx9_36/Makefile.in
+++ b/dlls/d3dx9_36/Makefile.in
@@ -13,7 +13,8 @@ C_SRCS = \
 	mesh.c \
 	shader.c \
 	sprite.c \
-	surface.c
+	surface.c \
+	util.c
 
 RC_SRCS = version.rc
 
diff --git a/dlls/d3dx9_36/d3dx9_36_private.h b/dlls/d3dx9_36/d3dx9_36_private.h
index cd4122d..4460f67 100644
--- a/dlls/d3dx9_36/d3dx9_36_private.h
+++ b/dlls/d3dx9_36/d3dx9_36_private.h
@@ -26,6 +26,10 @@
 #include "wingdi.h"
 #include "d3dx9.h"
 
+/* for internal use */
+HRESULT map_view_of_file(LPCWSTR filename, LPVOID *buffer, DWORD *length);
+HRESULT load_resource_into_memory(HMODULE module, HRSRC resinfo, LPVOID *buffer, DWORD *length);
+
 
 /* ID3DXFont */
 typedef struct ID3DXFontImpl
diff --git a/dlls/d3dx9_36/util.c b/dlls/d3dx9_36/util.c
new file mode 100644
index 0000000..ff41ee7
--- /dev/null
+++ b/dlls/d3dx9_36/util.c
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2009 Tony Wasserka
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+
+#include "wine/debug.h"
+#include "d3dx9_36_private.h"
+
+/************************************************************
+ * map_view_of_file
+ *
+ * Loads a file into buffer and stores the number of read bytes in length.
+ *
+ * PARAMS
+ *   filename [I] name of the file to be loaded
+ *   buffer   [O] pointer to destination buffer
+ *   length   [O] size of the obtained data
+ *
+ * RETURNS
+ *   Success: D3D_OK
+ *   Failure:
+ *     see error codes for CreateFileW, GetFileSize, CreateFileMapping and MapViewOfFile
+ *
+ * NOTES
+ *   The caller must UnmapViewOfFile when it doesn't need the data anymore
+ *
+ */
+HRESULT map_view_of_file(LPCWSTR filename, LPVOID *buffer, DWORD *length)
+{
+    HANDLE hfile, hmapping = NULL;
+
+    hfile = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
+    if(hfile == INVALID_HANDLE_VALUE) goto error;
+
+    *length = GetFileSize(hfile, NULL);
+    if(*length == INVALID_FILE_SIZE) goto error;
+
+    hmapping = CreateFileMappingW(hfile, NULL, PAGE_READONLY, 0, 0, NULL);
+    if(!hmapping) goto error;
+
+    *buffer = MapViewOfFile(hmapping, FILE_MAP_READ, 0, 0, 0);
+    if(*buffer == NULL) goto error;
+
+    CloseHandle(hmapping);
+    CloseHandle(hfile);
+
+    return S_OK;
+
+error:
+    CloseHandle(hmapping);
+    CloseHandle(hfile);
+    return HRESULT_FROM_WIN32(GetLastError());
+}
+
+/************************************************************
+ * load_resource_into_memory
+ *
+ * Loads a resource into buffer and stores the number of
+ * read bytes in length.
+ *
+ * PARAMS
+ *   module  [I] handle to the module
+ *   resinfo [I] handle to the resource's information block
+ *   buffer  [O] pointer to destination buffer
+ *   length  [O] size of the obtained data
+ *
+ * RETURNS
+ *   Success: D3D_OK
+ *   Failure:
+ *     See error codes for SizeofResource, LoadResource and LockResource
+ *
+ * NOTES
+ *   The memory doesn't need to be freed by the caller manually
+ *
+ */
+HRESULT load_resource_into_memory(HMODULE module, HRSRC resinfo, LPVOID *buffer, DWORD *length)
+{
+    HGLOBAL resource;
+
+    *length = SizeofResource(module, resinfo);
+    if(*length == 0) return HRESULT_FROM_WIN32(GetLastError());
+
+    resource = LoadResource(module, resinfo);
+    if( !resource ) return HRESULT_FROM_WIN32(GetLastError());
+
+    *buffer = LockResource(resource);
+    if(*buffer == NULL) return HRESULT_FROM_WIN32(GetLastError());
+
+    return S_OK;
+}
-- 
1.6.0.2


--------------040802010501010800000509--



More information about the wine-patches mailing list