Sync with trunk r63343.
[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 SafeFormatString(OUT LPSTR Buffer, IN DWORD BufferSize, IN LPCSTR FormatString, ... )
42 {
43 DWORD BytesWritten;
44 va_list vargs;
45
46 if (BufferSize == 0)
47 return DDERR_INVALIDPARAMS;
48
49 va_start(vargs, FormatString);
50 BytesWritten = _vsnprintf(Buffer, BufferSize-1, FormatString, vargs);
51
52 if (BytesWritten < BufferSize)
53 return DDERR_GENERIC;
54
55 Buffer[BufferSize-1] = '\0';
56
57 return ERROR_SUCCESS;
58 }
59
60 HRESULT SafeCopyString(OUT LPSTR Dst, IN DWORD DstSize, IN LPCSTR Src)
61 {
62 HRESULT hr = ERROR_SUCCESS;
63
64 if (Dst == NULL || DstSize == 0 || Src == NULL)
65 return DDERR_INVALIDPARAMS;
66
67 while (*Src != '\0' && DstSize > 0)
68 {
69 *Dst++ = *Src++;
70 --DstSize;
71 }
72
73 if (DstSize == 0)
74 {
75 --Dst;
76 hr = DDERR_GENERIC;
77 }
78
79 return hr;
80 }
81
82 HRESULT SafeAppendString(IN OUT LPSTR Dst, IN DWORD DstSize, IN LPCSTR Src)
83 {
84 size_t CurrentDstLength;
85
86 if (Dst == NULL || DstSize == 0)
87 return DDERR_INVALIDPARAMS;
88
89 CurrentDstLength = strlen(Dst);
90
91 return SafeCopyString(Dst + CurrentDstLength, DstSize - CurrentDstLength, Src);
92 }
93
94 HRESULT AlignedAlloc(IN OUT LPVOID *ppObject, IN SIZE_T dwSize)
95 {
96 ULONG_PTR AddressOffset;
97 ULONG AlignedMask = MEM_ALIGNMENT - 1;
98 CHAR *AlignedPtr;
99 ULONG_PTR *AlignedOffsetPtr;
100
101 if (ppObject == 0)
102 return DDERR_INVALIDPARAMS;
103
104 if (dwSize == 0)
105 {
106 *ppObject = NULL;
107 return S_OK;
108 }
109
110 dwSize += MEM_ALIGNMENT;
111
112 AlignedPtr = (CHAR *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize);
113
114 if (AlignedPtr == 0)
115 return DDERR_OUTOFMEMORY;
116
117 AddressOffset = MEM_ALIGNMENT - ((ULONG_PTR)AlignedPtr & AlignedMask);
118
119 AlignedPtr += AddressOffset;
120
121 AlignedOffsetPtr = (ULONG_PTR *)(AlignedPtr - sizeof(ULONG));
122 *AlignedOffsetPtr = AddressOffset;
123
124 *ppObject = (ULONG_PTR *)AlignedPtr;
125
126 return S_OK;
127 }
128
129 VOID AlignedFree(IN OUT LPVOID pObject)
130 {
131 CHAR *NonAlignedPtr = pObject;
132 ULONG_PTR *AlignedPtr = pObject;
133
134 if (pObject == 0)
135 return;
136
137 NonAlignedPtr -= *(AlignedPtr - 1);
138
139 HeapFree(GetProcessHeap(), 0, NonAlignedPtr);
140 }