diff options
Diffstat (limited to 'src/dutil/buffutil.cpp')
-rw-r--r-- | src/dutil/buffutil.cpp | 59 |
1 files changed, 57 insertions, 2 deletions
diff --git a/src/dutil/buffutil.cpp b/src/dutil/buffutil.cpp index e78db24f..a70aaa81 100644 --- a/src/dutil/buffutil.cpp +++ b/src/dutil/buffutil.cpp | |||
@@ -51,11 +51,11 @@ LExit: | |||
51 | } | 51 | } |
52 | 52 | ||
53 | extern "C" HRESULT BuffReadNumber64( | 53 | extern "C" HRESULT BuffReadNumber64( |
54 | __in_bcount(cbBuffer) const BYTE* pbBuffer, | 54 | __in_bcount(cbBuffer) const BYTE * pbBuffer, |
55 | __in SIZE_T cbBuffer, | 55 | __in SIZE_T cbBuffer, |
56 | __inout SIZE_T* piBuffer, | 56 | __inout SIZE_T* piBuffer, |
57 | __out DWORD64* pdw64 | 57 | __out DWORD64* pdw64 |
58 | ) | 58 | ) |
59 | { | 59 | { |
60 | Assert(pbBuffer); | 60 | Assert(pbBuffer); |
61 | Assert(piBuffer); | 61 | Assert(piBuffer); |
@@ -82,6 +82,38 @@ LExit: | |||
82 | return hr; | 82 | return hr; |
83 | } | 83 | } |
84 | 84 | ||
85 | extern "C" HRESULT BuffReadPointer( | ||
86 | __in_bcount(cbBuffer) const BYTE * pbBuffer, | ||
87 | __in SIZE_T cbBuffer, | ||
88 | __inout SIZE_T* piBuffer, | ||
89 | __out DWORD_PTR* pdw64 | ||
90 | ) | ||
91 | { | ||
92 | Assert(pbBuffer); | ||
93 | Assert(piBuffer); | ||
94 | Assert(pdw64); | ||
95 | |||
96 | HRESULT hr = S_OK; | ||
97 | SIZE_T cbAvailable = 0; | ||
98 | |||
99 | // get availiable data size | ||
100 | hr = ::SIZETSub(cbBuffer, *piBuffer, &cbAvailable); | ||
101 | ExitOnRootFailure(hr, "Failed to calculate available data size."); | ||
102 | |||
103 | // verify buffer size | ||
104 | if (sizeof(DWORD_PTR) > cbAvailable) | ||
105 | { | ||
106 | hr = E_INVALIDARG; | ||
107 | ExitOnRootFailure(hr, "Buffer too small."); | ||
108 | } | ||
109 | |||
110 | *pdw64 = *(const DWORD_PTR*)(pbBuffer + *piBuffer); | ||
111 | *piBuffer += sizeof(DWORD_PTR); | ||
112 | |||
113 | LExit: | ||
114 | return hr; | ||
115 | } | ||
116 | |||
85 | extern "C" HRESULT BuffReadString( | 117 | extern "C" HRESULT BuffReadString( |
86 | __in_bcount(cbBuffer) const BYTE* pbBuffer, | 118 | __in_bcount(cbBuffer) const BYTE* pbBuffer, |
87 | __in SIZE_T cbBuffer, | 119 | __in SIZE_T cbBuffer, |
@@ -300,6 +332,29 @@ LExit: | |||
300 | return hr; | 332 | return hr; |
301 | } | 333 | } |
302 | 334 | ||
335 | extern "C" HRESULT BuffWritePointer( | ||
336 | __deref_out_bcount(*piBuffer) BYTE** ppbBuffer, | ||
337 | __inout SIZE_T* piBuffer, | ||
338 | __in DWORD_PTR dw | ||
339 | ) | ||
340 | { | ||
341 | Assert(ppbBuffer); | ||
342 | Assert(piBuffer); | ||
343 | |||
344 | HRESULT hr = S_OK; | ||
345 | |||
346 | // make sure we have a buffer with sufficient space | ||
347 | hr = EnsureBufferSize(ppbBuffer, *piBuffer + sizeof(DWORD_PTR)); | ||
348 | ExitOnFailure(hr, "Failed to ensure buffer size."); | ||
349 | |||
350 | // copy data to buffer | ||
351 | *(DWORD_PTR*)(*ppbBuffer + *piBuffer) = dw; | ||
352 | *piBuffer += sizeof(DWORD_PTR); | ||
353 | |||
354 | LExit: | ||
355 | return hr; | ||
356 | } | ||
357 | |||
303 | extern "C" HRESULT BuffWriteString( | 358 | extern "C" HRESULT BuffWriteString( |
304 | __deref_out_bcount(*piBuffer) BYTE** ppbBuffer, | 359 | __deref_out_bcount(*piBuffer) BYTE** ppbBuffer, |
305 | __inout SIZE_T* piBuffer, | 360 | __inout SIZE_T* piBuffer, |