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>
10 #include "d3d9_helpers.h"
15 #define MEM_ALIGNMENT 0x20
17 static LPCSTR D3D9_DebugRegPath
= "Software\\Microsoft\\Direct3D";
19 BOOL
ReadRegistryValue(IN DWORD ValueType
, IN LPCSTR ValueName
, OUT LPBYTE DataBuffer
, IN OUT LPDWORD DataBufferSize
)
25 if (ERROR_SUCCESS
!= RegOpenKeyExA(HKEY_LOCAL_MACHINE
, D3D9_DebugRegPath
, 0, KEY_QUERY_VALUE
, &hKey
))
28 Ret
= RegQueryValueExA(hKey
, ValueName
, 0, &Type
, DataBuffer
, DataBufferSize
);
32 if (ERROR_SUCCESS
!= Ret
)
35 if (Type
!= ValueType
)
41 HRESULT
SafeFormatString(OUT LPSTR Buffer
, IN DWORD BufferSize
, IN LPCSTR FormatString
, ... )
47 return DDERR_INVALIDPARAMS
;
49 va_start(vargs
, FormatString
);
50 BytesWritten
= _vsnprintf(Buffer
, BufferSize
-1, FormatString
, vargs
);
53 if (BytesWritten
< BufferSize
)
56 Buffer
[BufferSize
-1] = '\0';
61 HRESULT
SafeCopyString(OUT LPSTR Dst
, IN DWORD DstSize
, IN LPCSTR Src
)
63 HRESULT hr
= ERROR_SUCCESS
;
65 if (Dst
== NULL
|| DstSize
== 0 || Src
== NULL
)
66 return DDERR_INVALIDPARAMS
;
68 while (*Src
!= '\0' && DstSize
> 0)
83 HRESULT
SafeAppendString(IN OUT LPSTR Dst
, IN DWORD DstSize
, IN LPCSTR Src
)
85 size_t CurrentDstLength
;
87 if (Dst
== NULL
|| DstSize
== 0)
88 return DDERR_INVALIDPARAMS
;
90 CurrentDstLength
= strlen(Dst
);
92 return SafeCopyString(Dst
+ CurrentDstLength
, DstSize
- CurrentDstLength
, Src
);
95 HRESULT
AlignedAlloc(IN OUT LPVOID
*ppObject
, IN SIZE_T dwSize
)
97 ULONG_PTR AddressOffset
;
98 ULONG AlignedMask
= MEM_ALIGNMENT
- 1;
100 ULONG_PTR
*AlignedOffsetPtr
;
103 return DDERR_INVALIDPARAMS
;
111 dwSize
+= MEM_ALIGNMENT
;
113 AlignedPtr
= (CHAR
*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwSize
);
116 return DDERR_OUTOFMEMORY
;
118 AddressOffset
= MEM_ALIGNMENT
- ((ULONG_PTR
)AlignedPtr
& AlignedMask
);
120 AlignedPtr
+= AddressOffset
;
122 AlignedOffsetPtr
= (ULONG_PTR
*)(AlignedPtr
- sizeof(ULONG
));
123 *AlignedOffsetPtr
= AddressOffset
;
125 *ppObject
= (ULONG_PTR
*)AlignedPtr
;
130 VOID
AlignedFree(IN OUT LPVOID pObject
)
132 CHAR
*NonAlignedPtr
= pObject
;
133 ULONG_PTR
*AlignedPtr
= pObject
;
138 NonAlignedPtr
-= *(AlignedPtr
- 1);
140 HeapFree(GetProcessHeap(), 0, NonAlignedPtr
);