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
);
52 if (BytesWritten
< BufferSize
)
55 Buffer
[BufferSize
-1] = '\0';
60 HRESULT
SafeCopyString(OUT LPSTR Dst
, IN DWORD DstSize
, IN LPCSTR Src
)
62 HRESULT hr
= ERROR_SUCCESS
;
64 if (Dst
== NULL
|| DstSize
== 0 || Src
== NULL
)
65 return DDERR_INVALIDPARAMS
;
67 while (*Src
!= '\0' && DstSize
> 0)
82 HRESULT
SafeAppendString(IN OUT LPSTR Dst
, IN DWORD DstSize
, IN LPCSTR Src
)
84 size_t CurrentDstLength
;
86 if (Dst
== NULL
|| DstSize
== 0)
87 return DDERR_INVALIDPARAMS
;
89 CurrentDstLength
= strlen(Dst
);
91 return SafeCopyString(Dst
+ CurrentDstLength
, DstSize
- CurrentDstLength
, Src
);
94 HRESULT
AlignedAlloc(IN OUT LPVOID
*ppObject
, IN SIZE_T dwSize
)
96 ULONG_PTR AddressOffset
;
97 ULONG AlignedMask
= MEM_ALIGNMENT
- 1;
99 ULONG_PTR
*AlignedOffsetPtr
;
102 return DDERR_INVALIDPARAMS
;
110 dwSize
+= MEM_ALIGNMENT
;
112 AlignedPtr
= (CHAR
*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwSize
);
115 return DDERR_OUTOFMEMORY
;
117 AddressOffset
= MEM_ALIGNMENT
- ((ULONG_PTR
)AlignedPtr
& AlignedMask
);
119 AlignedPtr
+= AddressOffset
;
121 AlignedOffsetPtr
= (ULONG_PTR
*)(AlignedPtr
- sizeof(ULONG
));
122 *AlignedOffsetPtr
= AddressOffset
;
124 *ppObject
= (ULONG_PTR
*)AlignedPtr
;
129 VOID
AlignedFree(IN OUT LPVOID pObject
)
131 CHAR
*NonAlignedPtr
= pObject
;
132 ULONG_PTR
*AlignedPtr
= pObject
;
137 NonAlignedPtr
-= *(AlignedPtr
- 1);
139 HeapFree(GetProcessHeap(), 0, NonAlignedPtr
);