- Implement ProtocolResetComplete
[reactos.git] / dll / directx / d3d9 / d3d9_helpers.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS ReactX
4 * FILE: dll/directx/d3d9/d3d9_helpers.c
5 * PURPOSE: d3d9.dll helper functions
6 * PROGRAMERS: Gregor Brunmar <gregor (dot) brunmar (at) home (dot) se>
7 */
8
9 #include <d3d9.h>
10 #include "d3d9_helpers.h"
11 #include <stdio.h>
12 #include <ddraw.h>
13 #include <debug.h>
14
15 #define MEM_ALIGNMENT 0x20
16
17 static LPCSTR D3D9_DebugRegPath = "Software\\Microsoft\\Direct3D";
18
19 BOOL ReadRegistryValue(IN DWORD ValueType, IN LPCSTR ValueName, OUT LPBYTE DataBuffer, IN OUT LPDWORD DataBufferSize)
20 {
21 HKEY hKey;
22 DWORD Type;
23 LONG Ret;
24
25 if (ERROR_SUCCESS != RegOpenKeyExA(HKEY_LOCAL_MACHINE, D3D9_DebugRegPath, 0, KEY_QUERY_VALUE, &hKey))
26 return FALSE;
27
28 Ret = RegQueryValueExA(hKey, ValueName, 0, &Type, DataBuffer, DataBufferSize);
29
30 RegCloseKey(hKey);
31
32 if (ERROR_SUCCESS != Ret)
33 return FALSE;
34
35 if (Type != ValueType)
36 return FALSE;
37
38 return TRUE;
39 }
40
41 HRESULT AlignedAlloc(IN OUT LPVOID *ppObject, IN SIZE_T dwSize)
42 {
43 ULONG AddressOffset;
44 ULONG AlignedMask = MEM_ALIGNMENT - 1;
45 CHAR *AlignedPtr;
46 ULONG_PTR *AlignedOffsetPtr;
47
48 if (ppObject == 0)
49 return DDERR_INVALIDPARAMS;
50
51 if (dwSize == 0)
52 {
53 *ppObject = NULL;
54 return S_OK;
55 }
56
57 dwSize += MEM_ALIGNMENT;
58
59 AlignedPtr = (CHAR *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize);
60
61 if (AlignedPtr == 0)
62 return DDERR_OUTOFMEMORY;
63
64 AddressOffset = MEM_ALIGNMENT - ((ULONG)AlignedPtr & AlignedMask);
65
66 AlignedPtr += AddressOffset;
67
68 AlignedOffsetPtr = (ULONG_PTR *)(AlignedPtr - sizeof(ULONG));
69 *AlignedOffsetPtr = AddressOffset;
70
71 *ppObject = (ULONG_PTR *)AlignedPtr;
72
73 return S_OK;
74 }
75
76 VOID AlignedFree(IN OUT LPVOID pObject)
77 {
78 CHAR *NonAlignedPtr = pObject;
79 ULONG_PTR *AlignedPtr = pObject;
80
81 if (pObject == 0)
82 return;
83
84 NonAlignedPtr -= *(AlignedPtr - 1);
85
86 HeapFree(GetProcessHeap(), 0, NonAlignedPtr);
87 }