From 0ae3b1e7b5c0beff0fcfb82728c5bf9f25aee250 Mon Sep 17 00:00:00 2001 From: Bob Arnson Date: Sun, 29 Nov 2020 18:57:55 -0500 Subject: More size_t-ification. --- src/dutil/buffutil.cpp | 59 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 2 deletions(-) (limited to 'src/dutil/buffutil.cpp') 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: } extern "C" HRESULT BuffReadNumber64( - __in_bcount(cbBuffer) const BYTE* pbBuffer, + __in_bcount(cbBuffer) const BYTE * pbBuffer, __in SIZE_T cbBuffer, __inout SIZE_T* piBuffer, __out DWORD64* pdw64 - ) +) { Assert(pbBuffer); Assert(piBuffer); @@ -82,6 +82,38 @@ LExit: return hr; } +extern "C" HRESULT BuffReadPointer( + __in_bcount(cbBuffer) const BYTE * pbBuffer, + __in SIZE_T cbBuffer, + __inout SIZE_T* piBuffer, + __out DWORD_PTR* pdw64 +) +{ + Assert(pbBuffer); + Assert(piBuffer); + Assert(pdw64); + + HRESULT hr = S_OK; + SIZE_T cbAvailable = 0; + + // get availiable data size + hr = ::SIZETSub(cbBuffer, *piBuffer, &cbAvailable); + ExitOnRootFailure(hr, "Failed to calculate available data size."); + + // verify buffer size + if (sizeof(DWORD_PTR) > cbAvailable) + { + hr = E_INVALIDARG; + ExitOnRootFailure(hr, "Buffer too small."); + } + + *pdw64 = *(const DWORD_PTR*)(pbBuffer + *piBuffer); + *piBuffer += sizeof(DWORD_PTR); + +LExit: + return hr; +} + extern "C" HRESULT BuffReadString( __in_bcount(cbBuffer) const BYTE* pbBuffer, __in SIZE_T cbBuffer, @@ -300,6 +332,29 @@ LExit: return hr; } +extern "C" HRESULT BuffWritePointer( + __deref_out_bcount(*piBuffer) BYTE** ppbBuffer, + __inout SIZE_T* piBuffer, + __in DWORD_PTR dw +) +{ + Assert(ppbBuffer); + Assert(piBuffer); + + HRESULT hr = S_OK; + + // make sure we have a buffer with sufficient space + hr = EnsureBufferSize(ppbBuffer, *piBuffer + sizeof(DWORD_PTR)); + ExitOnFailure(hr, "Failed to ensure buffer size."); + + // copy data to buffer + *(DWORD_PTR*)(*ppbBuffer + *piBuffer) = dw; + *piBuffer += sizeof(DWORD_PTR); + +LExit: + return hr; +} + extern "C" HRESULT BuffWriteString( __deref_out_bcount(*piBuffer) BYTE** ppbBuffer, __inout SIZE_T* piBuffer, -- cgit v1.2.3-55-g6feb