ReactOS  0.4.14-dev-1233-gf5658fd
blob.c
Go to the documentation of this file.
1 /*
2  * Direct3D blob file
3  *
4  * Copyright 2010 Rico Schüller
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  *
20  */
21 
22 #include "d3dcompiler_private.h"
23 
24 WINE_DEFAULT_DEBUG_CHANNEL(d3dcompiler);
25 
27 {
30 
32  void *data;
33 };
34 
35 static inline struct d3dcompiler_blob *impl_from_ID3DBlob(ID3DBlob *iface)
36 {
37  return CONTAINING_RECORD(iface, struct d3dcompiler_blob, ID3DBlob_iface);
38 }
39 
40 /* IUnknown methods */
41 
43 {
44  TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object);
45 
46  if (IsEqualGUID(riid, &IID_ID3D10Blob)
48  {
49  IUnknown_AddRef(iface);
50  *object = iface;
51  return S_OK;
52  }
53 
54  WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid));
55 
56  *object = NULL;
57  return E_NOINTERFACE;
58 }
59 
61 {
62  struct d3dcompiler_blob *blob = impl_from_ID3DBlob(iface);
64 
65  TRACE("%p increasing refcount to %u\n", blob, refcount);
66 
67  return refcount;
68 }
69 
71 {
72  struct d3dcompiler_blob *blob = impl_from_ID3DBlob(iface);
74 
75  TRACE("%p decreasing refcount to %u\n", blob, refcount);
76 
77  if (!refcount)
78  {
79  HeapFree(GetProcessHeap(), 0, blob->data);
81  }
82 
83  return refcount;
84 }
85 
86 /* ID3DBlob methods */
87 
89 {
90  struct d3dcompiler_blob *blob = impl_from_ID3DBlob(iface);
91 
92  TRACE("iface %p\n", iface);
93 
94  return blob->data;
95 }
96 
98 {
99  struct d3dcompiler_blob *blob = impl_from_ID3DBlob(iface);
100 
101  TRACE("iface %p\n", iface);
102 
103  return blob->size;
104 }
105 
106 static const struct ID3D10BlobVtbl d3dcompiler_blob_vtbl =
107 {
108  /* IUnknown methods */
112  /* ID3DBlob methods */
115 };
116 
118 {
119  blob->ID3DBlob_iface.lpVtbl = &d3dcompiler_blob_vtbl;
120  blob->refcount = 1;
121  blob->size = data_size;
122 
123  blob->data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, data_size);
124  if (!blob->data)
125  {
126  ERR("Failed to allocate D3D blob data memory\n");
127  return E_OUTOFMEMORY;
128  }
129 
130  return S_OK;
131 }
132 
134 {
135  struct d3dcompiler_blob *object;
136  HRESULT hr;
137 
138  TRACE("data_size %lu, blob %p\n", data_size, blob);
139 
140  if (!blob)
141  {
142  WARN("Invalid blob specified.\n");
143  return D3DERR_INVALIDCALL;
144  }
145 
146  object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
147  if (!object)
148  return E_OUTOFMEMORY;
149 
150  hr = d3dcompiler_blob_init(object, data_size);
151  if (FAILED(hr))
152  {
153  WARN("Failed to initialize blob, hr %#x.\n", hr);
154  HeapFree(GetProcessHeap(), 0, object);
155  return hr;
156  }
157 
158  *blob = &object->ID3DBlob_iface;
159 
160  TRACE("Created ID3DBlob %p\n", *blob);
161 
162  return S_OK;
163 }
164 
166 {
167  BOOL add = FALSE;
168 
169  switch(part)
170  {
172  if (tag == TAG_ISGN) add = TRUE;
173  break;
174 
176  if (tag == TAG_OSGN || tag == TAG_OSG5) add = TRUE;
177  break;
178 
180  if (tag == TAG_ISGN || tag == TAG_OSGN || tag == TAG_OSG5) add = TRUE;
181  break;
182 
184  if (tag == TAG_PCSG) add = TRUE;
185  break;
186 
188  if (tag == TAG_ISGN || tag == TAG_OSGN || tag == TAG_OSG5 || tag == TAG_PCSG) add = TRUE;
189  break;
190 
191  case D3D_BLOB_DEBUG_INFO:
192  if (tag == TAG_SDBG) add = TRUE;
193  break;
194 
196  if (tag == TAG_Aon9) add = TRUE;
197  break;
198 
200  if (tag == TAG_XNAP) add = TRUE;
201  break;
202 
203  case D3D_BLOB_XNA_SHADER:
204  if (tag == TAG_XNAS) add = TRUE;
205  break;
206 
207  default:
208  FIXME("Unhandled D3D_BLOB_PART %s.\n", debug_d3dcompiler_d3d_blob_part(part));
209  break;
210  }
211 
212  TRACE("%s tag %s\n", add ? "Add" : "Skip", debugstr_an((const char *)&tag, 4));
213 
214  return add;
215 }
216 
218 {
219  struct dxbc src_dxbc, dst_dxbc;
220  HRESULT hr;
221  unsigned int i, count;
222 
223  if (!data || !data_size || flags || !blob)
224  {
225  WARN("Invalid arguments: data %p, data_size %lu, flags %#x, blob %p\n", data, data_size, flags, blob);
226  return D3DERR_INVALIDCALL;
227  }
228 
229  if (part > D3D_BLOB_TEST_COMPILE_PERF
230  || (part < D3D_BLOB_TEST_ALTERNATE_SHADER && part > D3D_BLOB_XNA_SHADER))
231  {
232  WARN("Invalid D3D_BLOB_PART: part %s\n", debug_d3dcompiler_d3d_blob_part(part));
233  return D3DERR_INVALIDCALL;
234  }
235 
236  hr = dxbc_parse(data, data_size, &src_dxbc);
237  if (FAILED(hr))
238  {
239  WARN("Failed to parse blob part\n");
240  return hr;
241  }
242 
243  hr = dxbc_init(&dst_dxbc, 0);
244  if (FAILED(hr))
245  {
246  dxbc_destroy(&src_dxbc);
247  WARN("Failed to init dxbc\n");
248  return hr;
249  }
250 
251  for (i = 0; i < src_dxbc.count; ++i)
252  {
253  struct dxbc_section *section = &src_dxbc.sections[i];
254 
255  if (check_blob_part(section->tag, part))
256  {
257  hr = dxbc_add_section(&dst_dxbc, section->tag, section->data, section->data_size);
258  if (FAILED(hr))
259  {
260  dxbc_destroy(&src_dxbc);
261  dxbc_destroy(&dst_dxbc);
262  WARN("Failed to add section to dxbc\n");
263  return hr;
264  }
265  }
266  }
267 
268  count = dst_dxbc.count;
269 
270  switch(part)
271  {
275  case D3D_BLOB_DEBUG_INFO:
278  case D3D_BLOB_XNA_SHADER:
279  if (count != 1) count = 0;
280  break;
281 
283  if (count != 2) count = 0;
284  break;
285 
287  if (count != 3) count = 0;
288  break;
289 
290  default:
291  FIXME("Unhandled D3D_BLOB_PART %s.\n", debug_d3dcompiler_d3d_blob_part(part));
292  break;
293  }
294 
295  if (count == 0)
296  {
297  dxbc_destroy(&src_dxbc);
298  dxbc_destroy(&dst_dxbc);
299  WARN("Nothing to write into the blob (count = 0)\n");
300  return E_FAIL;
301  }
302 
303  /* some parts aren't full DXBCs, they contain only the data */
304  if (count == 1 && (part == D3D_BLOB_DEBUG_INFO || part == D3D_BLOB_LEGACY_SHADER || part == D3D_BLOB_XNA_PREPASS_SHADER
305  || part == D3D_BLOB_XNA_SHADER))
306  {
307  hr = D3DCreateBlob(dst_dxbc.sections[0].data_size, blob);
308  if (SUCCEEDED(hr))
309  {
310  memcpy(ID3D10Blob_GetBufferPointer(*blob), dst_dxbc.sections[0].data, dst_dxbc.sections[0].data_size);
311  }
312  else
313  {
314  WARN("Could not create blob\n");
315  }
316  }
317  else
318  {
319  hr = dxbc_write_blob(&dst_dxbc, blob);
320  if (FAILED(hr))
321  {
322  WARN("Failed to write blob part\n");
323  }
324  }
325 
326  dxbc_destroy(&src_dxbc);
327  dxbc_destroy(&dst_dxbc);
328 
329  return hr;
330 }
331 
333 {
334  BOOL add = TRUE;
335 
336  if (flags & D3DCOMPILER_STRIP_TEST_BLOBS) FIXME("Unhandled flag D3DCOMPILER_STRIP_TEST_BLOBS.\n");
337 
338  switch(tag)
339  {
340  case TAG_RDEF:
341  case TAG_STAT:
343  break;
344 
345  case TAG_SDBG:
347  break;
348 
349  default:
350  break;
351  }
352 
353  TRACE("%s tag %s\n", add ? "Add" : "Skip", debugstr_an((const char *)&tag, 4));
354 
355  return add;
356 }
357 
359 {
360  struct dxbc src_dxbc, dst_dxbc;
361  HRESULT hr;
362  unsigned int i;
363 
364  if (!blob)
365  {
366  WARN("NULL for blob specified\n");
367  return E_FAIL;
368  }
369 
370  if (!data || !data_size)
371  {
372  WARN("Invalid arguments: data %p, data_size %lu\n", data, data_size);
373  return D3DERR_INVALIDCALL;
374  }
375 
376  hr = dxbc_parse(data, data_size, &src_dxbc);
377  if (FAILED(hr))
378  {
379  WARN("Failed to parse blob part\n");
380  return hr;
381  }
382 
383  /* src_dxbc.count >= dst_dxbc.count */
384  hr = dxbc_init(&dst_dxbc, src_dxbc.count);
385  if (FAILED(hr))
386  {
387  dxbc_destroy(&src_dxbc);
388  WARN("Failed to init dxbc\n");
389  return hr;
390  }
391 
392  for (i = 0; i < src_dxbc.count; ++i)
393  {
394  struct dxbc_section *section = &src_dxbc.sections[i];
395 
396  if (check_blob_strip(section->tag, flags))
397  {
398  hr = dxbc_add_section(&dst_dxbc, section->tag, section->data, section->data_size);
399  if (FAILED(hr))
400  {
401  dxbc_destroy(&src_dxbc);
402  dxbc_destroy(&dst_dxbc);
403  WARN("Failed to add section to dxbc\n");
404  return hr;
405  }
406  }
407  }
408 
409  hr = dxbc_write_blob(&dst_dxbc, blob);
410  if (FAILED(hr))
411  {
412  WARN("Failed to write blob part\n");
413  }
414 
415  dxbc_destroy(&src_dxbc);
416  dxbc_destroy(&dst_dxbc);
417 
418  return hr;
419 }
420 
422 {
423  TRACE("data %p, data_size %lu, part %s, flags %#x, blob %p\n", data,
425 
427 }
428 
430 {
431  TRACE("data %p, data_size %lu, blob %p\n", data, data_size, blob);
432 
434 }
435 
437 {
438  TRACE("data %p, data_size %lu, blob %p\n", data, data_size, blob);
439 
441 }
442 
444 {
445  TRACE("data %p, data_size %lu, blob %p\n", data, data_size, blob);
446 
448 }
449 
451 {
452  TRACE("data %p, data_size %lu, blob %p\n", data, data_size, blob);
453 
455 }
456 
458 {
459  TRACE("data %p, data_size %lu, flags %#x, blob %p\n", data, data_size, flags, blob);
460 
462 }
463 
465 {
466  struct d3dcompiler_blob *object;
467  SIZE_T data_size;
468  DWORD read_size;
469  HANDLE file;
470  HRESULT hr;
471 
472  TRACE("filename %s, contents %p.\n", debugstr_w(filename), contents);
473 
475  if (file == INVALID_HANDLE_VALUE)
477 
478  data_size = GetFileSize(file, NULL);
479  if (data_size == INVALID_FILE_SIZE)
480  {
481  CloseHandle(file);
483  }
484 
485  if (!(object = heap_alloc_zero(sizeof(*object))))
486  {
487  CloseHandle(file);
488  return E_OUTOFMEMORY;
489  }
490 
491  if (FAILED(hr = d3dcompiler_blob_init(object, data_size)))
492  {
493  WARN("Failed to initialize blob, hr %#x.\n", hr);
494  CloseHandle(file);
495  heap_free(object);
496  return hr;
497  }
498 
499  if (!ReadFile(file, object->data, data_size, &read_size, NULL) || (read_size != data_size))
500  {
501  WARN("Failed to read file contents.\n");
502  CloseHandle(file);
503  heap_free(object->data);
504  heap_free(object);
505  return E_FAIL;
506  }
507  CloseHandle(file);
508  object->size = read_size;
509 
510  *contents = &object->ID3DBlob_iface;
511 
512  TRACE("Returning ID3DBlob %p.\n", *contents);
513 
514  return S_OK;
515 }
516 
518 {
519  FIXME("blob %p, filename %s, overwrite %d\n", blob, debugstr_w(filename), overwrite);
520 
521  return E_NOTIMPL;
522 }
int add
Definition: i386-dis.c:3122
const char * debug_d3dcompiler_d3d_blob_part(D3D_BLOB_PART part) DECLSPEC_HIDDEN
Definition: utils.c:106
#define TAG_ISGN
Definition: blob.c:46
#define REFIID
Definition: guiddef.h:118
#define TRUE
Definition: types.h:120
#define CloseHandle
Definition: compat.h:406
HRESULT dxbc_add_section(struct dxbc *dxbc, DWORD tag, const char *data, DWORD data_size) DECLSPEC_HIDDEN
Definition: utils.c:529
#define E_NOINTERFACE
Definition: winerror.h:2364
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
HRESULT dxbc_init(struct dxbc *dxbc, unsigned int size) DECLSPEC_HIDDEN
Definition: utils.c:557
D3D_BLOB_PART
Definition: d3dcompiler.h:85
HRESULT hr
Definition: shlfolder.c:183
#define TAG_XNAP
Definition: blob.c:54
Definition: image.c:133
static HRESULT d3dcompiler_get_blob_part(const void *data, SIZE_T data_size, D3D_BLOB_PART part, UINT flags, ID3DBlob **blob)
Definition: blob.c:217
REFIID riid
Definition: precomp.h:44
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define WARN(fmt,...)
Definition: debug.h:111
WINE_DEFAULT_DEBUG_CHANNEL(d3dcompiler)
static HRESULT d3dcompiler_strip_shader(const void *data, SIZE_T data_size, UINT flags, ID3DBlob **blob)
Definition: blob.c:358
static SIZE_T STDMETHODCALLTYPE d3dcompiler_blob_GetBufferSize(ID3DBlob *iface)
Definition: blob.c:97
#define INVALID_HANDLE_VALUE
Definition: compat.h:399
HRESULT WINAPI D3DGetInputSignatureBlob(const void *data, SIZE_T data_size, ID3DBlob **blob)
Definition: blob.c:429
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
Definition: ecma_167.h:138
#define INVALID_FILE_SIZE
Definition: winbase.h:529
Definition: parser.c:55
const char * filename
Definition: ioapi.h:135
#define E_FAIL
Definition: ddrawi.h:102
#define FILE_SHARE_READ
Definition: compat.h:125
static ULONG STDMETHODCALLTYPE d3dcompiler_blob_Release(ID3DBlob *iface)
Definition: blob.c:70
static struct d3dcompiler_blob * impl_from_ID3DBlob(ID3DBlob *iface)
Definition: blob.c:35
static BOOL check_blob_strip(DWORD tag, UINT flags)
Definition: blob.c:332
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
#define TAG_STAT
Definition: blob.c:53
LONG refcount
Definition: blob.c:29
#define debugstr_w
Definition: kernel32.h:32
#define FIXME(fmt,...)
Definition: debug.h:110
HRESULT WINAPI D3DGetInputAndOutputSignatureBlob(const void *data, SIZE_T data_size, ID3DBlob **blob)
Definition: blob.c:443
smooth NULL
Definition: ftsmooth.c:416
#define TAG_OSG5
HRESULT WINAPI D3DReadFileToBlob(const WCHAR *filename, ID3DBlob **contents)
Definition: blob.c:464
#define D3DERR_INVALIDCALL
Definition: blob.c:34
static HRESULT STDMETHODCALLTYPE d3dcompiler_blob_QueryInterface(ID3DBlob *iface, REFIID riid, void **object)
Definition: blob.c:42
ID3DBlob ID3DBlob_iface
Definition: blob.c:28
#define debugstr_guid
Definition: kernel32.h:35
#define OPEN_EXISTING
Definition: compat.h:434
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
static void *STDMETHODCALLTYPE d3dcompiler_blob_GetBufferPointer(ID3DBlob *iface)
Definition: blob.c:88
static HRESULT d3dcompiler_blob_init(struct d3dcompiler_blob *blob, SIZE_T data_size)
Definition: blob.c:117
struct dxbc_section * sections
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:403
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
void * data
Definition: blob.c:32
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define TAG_RDEF
Definition: blob.c:49
LONG HRESULT
Definition: typedefs.h:78
HRESULT dxbc_parse(const char *data, SIZE_T data_size, struct dxbc *dxbc) DECLSPEC_HIDDEN
Definition: utils.c:577
const GUID IID_IUnknown
#define WINAPI
Definition: msvc.h:6
const char file[]
Definition: icontest.c:11
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
unsigned long DWORD
Definition: ntddk_ex.h:95
#define TAG_Aon9
Definition: blob.c:44
DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
Definition: fileinfo.c:481
#define TAG_PCSG
Definition: blob.c:48
HRESULT WINAPI D3DStripShader(const void *data, SIZE_T data_size, UINT flags, ID3D10Blob **blob)
Definition: blob.c:457
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLbitfield flags
Definition: glext.h:7161
HRESULT dxbc_write_blob(struct dxbc *dxbc, ID3DBlob **blob) DECLSPEC_HIDDEN
Definition: utils.c:655
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:126
#define InterlockedDecrement
Definition: armddk.h:52
static __inline const char * debugstr_an(const char *s, int n)
Definition: compat.h:47
HRESULT WINAPI D3DGetDebugInfo(const void *data, SIZE_T data_size, ID3DBlob **blob)
Definition: blob.c:450
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define GENERIC_READ
Definition: compat.h:124
static const struct ID3D10BlobVtbl d3dcompiler_blob_vtbl
Definition: blob.c:106
HRESULT WINAPI D3DGetBlobPart(const void *data, SIZE_T data_size, D3D_BLOB_PART part, UINT flags, ID3DBlob **blob)
Definition: blob.c:421
#define TAG_SDBG
Definition: blob.c:50
void dxbc_destroy(struct dxbc *dxbc) DECLSPEC_HIDDEN
Definition: utils.c:648
#define ERR(fmt,...)
Definition: debug.h:109
ULONG_PTR SIZE_T
Definition: typedefs.h:79
#define S_OK
Definition: intsafe.h:59
#define InterlockedIncrement
Definition: armddk.h:53
#define E_NOTIMPL
Definition: ddrawi.h:99
unsigned int UINT
Definition: ndis.h:50
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
#define TAG_OSGN
Definition: blob.c:47
#define CreateFileW
Definition: compat.h:408
HRESULT WINAPI D3DWriteBlobToFile(ID3DBlob *blob, const WCHAR *filename, BOOL overwrite)
Definition: blob.c:517
SIZE_T size
Definition: blob.c:31
unsigned int ULONG
Definition: retypes.h:1
HRESULT WINAPI D3DGetOutputSignatureBlob(const void *data, SIZE_T data_size, ID3DBlob **blob)
Definition: blob.c:436
HRESULT WINAPI D3DCreateBlob(SIZE_T data_size, ID3DBlob **blob)
Definition: blob.c:133
BOOL WINAPI ReadFile(IN HANDLE hFile, IN LPVOID lpBuffer, IN DWORD nNumberOfBytesToRead, OUT LPDWORD lpNumberOfBytesRead OPTIONAL, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:123
static ULONG STDMETHODCALLTYPE d3dcompiler_blob_AddRef(ID3DBlob *iface)
Definition: blob.c:60
#define TAG_XNAS
Definition: blob.c:55
#define HeapFree(x, y, z)
Definition: compat.h:402
static BOOL check_blob_part(DWORD tag, D3D_BLOB_PART part)
Definition: blob.c:165
void * object
Definition: jmemsys.h:48
#define SUCCEEDED(hr)
Definition: intsafe.h:57
static BOOL heap_free(void *mem)
Definition: appwiz.h:75
Definition: fci.c:126