30 #if ! defined(UNDER_CE) && ( ! defined(_DEBUG) || ! defined(_MSC_VER))
31 static void __cdecl IsValidFailHandler(
int nSig);
34 static ptrdiff_t
inline Diff(
const void* pEnd,
const void* pStart) noexcept
37 ptrdiff_t i = ((
const BYTE*)pEnd - (
const BYTE*)pStart);
42 static bool inline IsValidApp(
const void* pData) noexcept
48 if (((UINT_PTR)pData) < 16 * 1024)
56 static bool GRAYCALL IsValid(
const void* pData,
size_t nSize = 1,
bool bWriteAccess =
false) noexcept;
57 static inline
bool IsCorrupt(const
void* pData,
size_t nSize = 1,
bool bWriteAccess = false) noexcept
63 return !IsValid(pData, nSize, bWriteAccess);
65 static inline bool IsZeros(
const void* pData,
size_t nSize) noexcept
68 if (!IsValidApp(pData))
70 for (
size_t i = 0; i < nSize; i++)
72 if (((
const BYTE*)pData)[i] != 0)
78 static inline COMPARE_t Compare(
const void* p1,
const void* p2,
size_t nSizeBlock) noexcept
82 return ::memcmp(p1, p2, nSizeBlock);
88 const BYTE* pB1 = (
const BYTE*)p1;
89 const BYTE* pB2 = (
const BYTE*)p2;
91 for (
size_t i = 0; i < nSizeBlock; i++)
93 nDiff |= pB1[i] ^ pB2[i];
98 static size_t GRAYCALL CompareIndex(
const void* p1,
const void* p2,
size_t nSizeBlock);
100 static inline void Zero(
void* pData,
size_t nSizeBlock) noexcept
105 ::ZeroMemory(pData, nSizeBlock);
107 ::memset(pData, 0, nSizeBlock);
110 static inline void ZeroSecure(
void* pData,
size_t nSizeBlock) noexcept
119 static inline void Xor(BYTE* pDst,
const BYTE* pSrc,
size_t nBlockSize) noexcept
122 for (
size_t i = 0; i < nBlockSize; i++)
126 static inline void Xor2(BYTE* pDst,
const BYTE* pSrc1,
const BYTE* pSrc2,
size_t nBlockSize) noexcept
128 for (
size_t i = 0; i < nBlockSize; i++)
129 pDst[i] = pSrc1[i] ^ pSrc2[i];
132 static inline void Copy(
void* pDst,
const void* pSrc,
size_t nSizeBlock) noexcept
137 ::memcpy(pDst, pSrc, nSizeBlock);
139 static inline void CopyOverlap(
void* pDst,
const void* pSrc,
size_t nSizeBlock) noexcept
144 ::memmove(pDst, pSrc, nSizeBlock);
146 static inline void ReverseBytes(
void* pDst,
size_t nSizeBlock) noexcept
148 register BYTE* pSrcB = (BYTE*)pDst;
149 register BYTE* pDstB = (BYTE*)pDst + nSizeBlock - 1;
156 static inline void CopyReverse(
void* pDst,
const void* pSrc,
size_t nSizeBlock) noexcept
161 ReverseBytes(pDst, nSizeBlock);
165 register BYTE* pDstB = (BYTE*)pDst + nSizeBlock - 1;
166 register const BYTE* pSrcB = (
const BYTE*)pSrc;
174 static inline void Fill(
void* pDst,
size_t nSize, BYTE bVal) noexcept
177 for (
size_t j = 0; j < nSize; j++)
179 ((BYTE*)pDst)[j] = bVal;
182 static inline void CopyRepeat(
void* pDst,
size_t nDstSize,
const void* pSrc,
size_t nSrcSize) noexcept
185 for (
size_t i = 0; i < nDstSize;)
187 for (
size_t j = 0; j < nSrcSize && i < nDstSize; j++, i++)
189 ((BYTE*)pDst)[i] = ((
const BYTE*)pSrc)[j];
194 static inline void CopyHtoN(BYTE* pDst,
const void* pSrc,
size_t nSizeBlock) noexcept
197 #ifdef USE_LITTLE_ENDIAN
203 static inline void CopyNtoH(
void* pDst,
const BYTE* pSrc,
size_t nSizeBlock) noexcept
206 #ifdef USE_LITTLE_ENDIAN
213 static inline void Swap(
void* pvMem1,
void* pvMem2,
size_t nBlockSize) noexcept
222 if (pvMem1 == pvMem2)
224 BYTE* pMem1 = (BYTE*)pvMem1;
225 BYTE* pMem2 = (BYTE*)pvMem2;
226 for (; nBlockSize--; pMem1++, pMem2++)
234 static size_t GRAYCALL ReadFromString(BYTE* pDst,
size_t iLenBytesMax,
const char* pszSrc);
241 static StrLen_t GRAYCALL GetHexDigest(OUT
char* pszHexString,
const BYTE* pData,
size_t nSizeData);
242 static HRESULT GRAYCALL SetHexDigest(
const char* pszHexString, OUT BYTE* pData,
size_t nSizeData);
247 template <UINT32 _SIGVALID = 0xCA11AB1E>
255 static const UINT32 k_VALID = _SIGVALID;
256 static const UINT32 k_INVALID = 0xDEADBEA7;
261 : m_nSignature(_SIGVALID)
269 ASSERT(isValidSignature());
270 m_nSignature = k_INVALID;
276 if (m_nSignature != _SIGVALID)
282 template<
size_t TYPE_SIZE>
304 operator const BYTE* ()
const noexcept
328 , m_pData(
const_cast<void*
>(pData))
332 : m_nSize(block.m_nSize)
333 , m_pData(block.m_pData)
338 : m_nSize((pBlock ==
nullptr) ? 0 : pBlock->m_nSize)
339 , m_pData((pBlock ==
nullptr) ?
nullptr : pBlock->m_pData)
357 return (BYTE*)m_pData;
362 return (
char*)m_pData;
365 operator const BYTE* ()
const noexcept
368 return get_DataBytes();
375 return m_pData !=
nullptr;
392 return IsValidIndex(
cMem::Diff(p, get_Data()));
397 return IsValidIndex2(
cMem::Diff(p, get_Data()));
408 return m_nSize == nSize && !::memcmp(m_pData, pData, nSize);
413 if (pData ==
nullptr)
415 return IsEqualData(pData->m_pData, pData->m_nSize);
420 return IsEqualData(
data.m_pData,
data.m_nSize);
425 #define IsEqualLiteral(x) IsEqualData( STRLIT2(x))
430 ASSERT(IsValidIndex(nOffset));
431 return get_DataBytes() + nOffset;
436 return get_DataBytes() + m_nSize;
471 static COMPARE_t GRAYCALL Compare(
const void* pData1,
size_t iLen1,
const void* pData2,
size_t iLen2);
480 template <
class TYPE>
490 template <
typename TYPE>
494 #ifdef USE_LITTLE_ENDIAN
496 return ReverseType(nVal);
501 template <
typename TYPE>
506 #ifdef USE_LITTLE_ENDIAN
508 return ReverseType(nVal);
514 template <
typename TYPE>
518 #ifdef USE_LITTLE_ENDIAN
522 return ReverseType(nVal);
525 template <
typename TYPE>
529 #ifdef USE_LITTLE_ENDIAN
533 return ReverseType(nVal);
537 template <
typename TYPE>
545 return *((
const UNALIGNED
TYPE*) pData);
547 return *((
const TYPE*)pData);
550 template <
typename TYPE>
558 * ((UNALIGNED
TYPE*) pData) = nVal;
560 * ((
TYPE*)pData) = nVal;
564 template <
typename TYPE>
568 return LEtoH(GetUnaligned<TYPE>(pData));
570 template <
typename TYPE>
574 return SetUnaligned(pData, HtoLE(nVal));
576 template <
typename TYPE>
581 return NtoH(GetUnaligned<TYPE>(pData));
583 template <
typename TYPE>
588 return SetUnaligned(pData, HtoN(nVal));
591 static inline DWORD
GetNVal3(
const BYTE* p) noexcept
595 return ((DWORD)p[0]) << 16 | ((DWORD)p[1]) << 8 | p[2];
597 static inline void SetNVal3(BYTE* p, DWORD nVal) noexcept
601 p[0] = (BYTE)((nVal >> 16) & 0xFF);
602 p[1] = (BYTE)((nVal >> 8) & 0xFF);
603 p[2] = (BYTE)((nVal) & 0xFF);
608 inline WORD cMemT::ReverseType<WORD>(WORD nVal) noexcept
612 return (WORD)((nVal >> 8) | (nVal << 8));
615 inline UINT32 cMemT::ReverseType<UINT32>(UINT32 nVal) noexcept
619 nVal = (nVal >> 16) | (nVal << 16);
620 return ((nVal & 0xff00ff00UL) >> 8) | ((nVal & 0x00ff00ffUL) << 8);
625 inline UINT64 cMemT::ReverseType<UINT64>(UINT64 nVal) noexcept
628 nVal = (nVal >> 32) | (nVal << 32);
629 nVal = ((nVal & 0xff00ff00ff00ff00ULL) >> 8) | ((nVal & 0x00ff00ff00ff00ffULL) << 8);
630 return ((nVal & 0xffff0000ffff0000ULL) >> 16) | ((nVal & 0x0000ffff0000ffffULL) << 16);
633 #ifndef USE_LONG_AS_INT64
635 inline ULONG cMemT::ReverseType<ULONG>(ULONG nVal) noexcept
639 return ReverseType<UINT32>(nVal);
645 inline UINT32 cMemT::GetNtoH<UINT32>(
const void* pData)
647 const BYTE* p = (
const BYTE*)pData;
648 return ((UINT32)p[0] << 24)
649 | ((UINT32)p[1] << 16)
650 | ((UINT32)p[2] << 8)
654 inline void cMemT::SetHtoN<UINT32>(
void* pData, UINT32 nVal)
656 BYTE* p = (BYTE*)pData;
657 p[0] = (BYTE)(nVal >> 24);
658 p[1] = (BYTE)(nVal >> 16);
659 p[2] = (BYTE)(nVal >> 8);
664 inline UINT64 cMemT::GetNtoH<UINT64>(
const void* pData)
666 const BYTE* p = (
const BYTE*)pData;
667 return ((UINT64)p[0] << 56)
668 | ((UINT64)p[1] << 48)
669 | ((UINT64)p[2] << 40)
670 | ((UINT64)p[3] << 32)
671 | ((UINT64)p[4] << 24)
672 | ((UINT64)p[5] << 16)
673 | ((UINT64)p[6] << 8)
677 inline void cMemT::SetHtoN<UINT64>(
void* pData, UINT64 nVal)
679 BYTE* p = (BYTE*)pData;
680 p[0] = (BYTE)(nVal >> 56);
681 p[1] = (BYTE)(nVal >> 48);
682 p[2] = (BYTE)(nVal >> 40);
683 p[3] = (BYTE)(nVal >> 32);
684 p[4] = (BYTE)(nVal >> 24);
685 p[5] = (BYTE)(nVal >> 16);
686 p[6] = (BYTE)(nVal >> 8);
#define GRAYCORE_LINK
Definition: GrayCore.h:47
#define GRAYCALL
declare calling convention for static functions so everyone knows the arg passing scheme....
Definition: GrayCore.h:36
#define IS_INDEX_GOOD(i, q)
cast the (likely) int to unsigned to check for negatives.
Definition: Index.h:35
Using X files without the sources and the makefile How to use you just create a debug directory e the sample3 directory must contain Sample3 Final Sample3 exe Sample3 Final Debug Sample3 Final Gfx OpenGL bmp Sample3 Final Gfx tiny_skin bmp Sample3 Final Gfx tiny_4anim x The source files have the DevCpp project file plus the makefile The demos use standard FreeGlut functions Technical without warranty Neither Paul Coppens nor GameDev net make any or either express or with respect to the their or fitness for a specific purpose neither Paul Coppens nor GameDev net shall have any liability to you or any other person or entity with respect to any or damage caused or alleged to have been caused directly or indirectly by the programs provided by Paul Coppens and GameDev net This but is not limited interruption of loss of data
Definition: Readme.txt:39
#define TYPE
Definition: StrT.cpp:38
#define DECLSPEC_NOVTABLE
Definition: SysTypes.h:322
UINT32 uintptr_t
Definition: SysTypes.h:449
#define VOLATILE
Definition: SysTypes.h:429
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
#define ASSERT(exp)
Definition: cDebugAssert.h:87
#define UNITTEST_FRIEND(n)
Define this in the class body to be unit tested. Allow the unit test to access private/protected stuf...
Definition: cUnitTestDecl.h:17
bool IsEqualData(const cMemBlock *pData) const noexcept
Definition: cMem.h:410
BYTE * get_DataBytes() const noexcept
Definition: cMem.h:354
bool IsEqualData(const void *pData, size_t nSize) const noexcept
Definition: cMem.h:405
cMemBlock(const cMemBlock &block) noexcept
Definition: cMem.h:331
bool isValidPtr() const noexcept
Definition: cMem.h:371
bool IsValidIndex(size_t i) const noexcept
Definition: cMem.h:377
void put_Size(size_t nSize) noexcept
Definition: cMem.h:445
char * get_DataA() const noexcept
Definition: cMem.h:359
void * m_pData
Definition: cMem.h:318
bool IsZeros() const noexcept
Definition: cMem.h:400
void SetEmptyBlock() noexcept
Definition: cMem.h:456
size_t get_DataSize() const noexcept
Definition: cMem.h:344
BYTE * GetOffset(size_t nOffset) const
Definition: cMem.h:427
bool IsValidIndex2(size_t i) const noexcept
Definition: cMem.h:382
bool IsValidPtr2(const void *p) const noexcept
Definition: cMem.h:394
void * get_Data() const noexcept
Definition: cMem.h:349
StrLen_t ConvertToString(char *pszDst, StrLen_t iDstSizeMax) const
Definition: cMem.h:466
void put_DataPtr(void *pStart) noexcept
Definition: cMem.h:439
void SetBlock(void *pData, size_t nSize) noexcept
Definition: cMem.h:451
cMemBlock(const cMemBlock *pBlock) noexcept
Definition: cMem.h:337
size_t m_nSize
size_t of m_pData in bytes. May be determined at runtime.
Definition: cMem.h:317
bool IsEqualData(const cMemBlock &data) const noexcept
Definition: cMem.h:417
const void * get_DataEnd() const noexcept
Definition: cMem.h:433
void InitZeros() noexcept
Definition: cMem.h:462
bool IsValidPtr(const void *p) const noexcept
Definition: cMem.h:389
cMemBlock(const void *pData, size_t nSize) noexcept
Definition: cMem.h:326
cMemBlock() noexcept
Definition: cMem.h:321
bool isValidSignature() const noexcept
Definition: cMem.h:272
~cMemSignature()
Definition: cMem.h:265
cMemSignature() noexcept
Definition: cMem.h:260
size_t get_DataLength() const noexcept
Definition: cMem.h:295
static const size_t k_Size
All hashes of this type are this size (bytes).
Definition: cMem.h:289
BYTE m_Data[TYPE_SIZE]
All objects of this type are this size.
Definition: cMem.h:292
const BYTE * get_DataBytes() const noexcept
Definition: cMem.h:300
static const size_t k_SizeHexDigest
hold a string with the hex digest of this. (chars).
Definition: cMem.h:290
< The main namespace for all Core functions.
Definition: GrayCore.cpp:14
int COMPARE_t
result of compare. 0=same, 1=a>b, -1=a<b
Definition: cValT.h:17
int StrLen_t
the length of a string in chars (bytes for UTF8, wchar_t for UNICODE). or offset in characters....
Definition: StrConst.h:32
static TYPE GetNtoH(const void *pData) noexcept
Definition: cMem.h:577
static TYPE NtoH(TYPE nVal) noexcept
Definition: cMem.h:502
static void SetNVal3(BYTE *p, DWORD nVal) noexcept
Definition: cMem.h:597
static TYPE GetUnaligned(const void *pData) noexcept
Definition: cMem.h:538
static TYPE GetLEtoH(const void *pData) noexcept
Definition: cMem.h:565
static void SetUnaligned(void *pData, TYPE nVal) noexcept
Definition: cMem.h:551
static TYPE LEtoH(TYPE nVal) noexcept
Definition: cMem.h:526
static void SetHtoN(void *pData, TYPE nVal) noexcept
Definition: cMem.h:584
static TYPE ReverseType(TYPE nVal) noexcept
Definition: cMem.h:481
static void SetHtoLE(void *pData, TYPE nVal) noexcept
Definition: cMem.h:571
static TYPE HtoN(TYPE nVal) noexcept
Definition: cMem.h:491
static DWORD GetNVal3(const BYTE *p) noexcept
Definition: cMem.h:591
static TYPE HtoLE(TYPE nVal) noexcept
Definition: cMem.h:515
static void CopyHtoN(BYTE *pDst, const void *pSrc, size_t nSizeBlock) noexcept
Definition: cMem.h:194
static void CopyNtoH(void *pDst, const BYTE *pSrc, size_t nSizeBlock) noexcept
Definition: cMem.h:203
static COMPARE_t CompareSecure(const void *p1, const void *p2, size_t nSizeBlock) noexcept
Definition: cMem.h:85
static void Copy(void *pDst, const void *pSrc, size_t nSizeBlock) noexcept
Definition: cMem.h:132
static void ReverseBytes(void *pDst, size_t nSizeBlock) noexcept
Definition: cMem.h:146
static void Zero(void *pData, size_t nSizeBlock) noexcept
Definition: cMem.h:100
static bool IsZeros(const void *pData, size_t nSize) noexcept
Definition: cMem.h:65
static StrLen_t GetHexDigestSize(size_t nSize) noexcept
Definition: cMem.h:236
static bool IsValidApp(const void *pData) noexcept
Definition: cMem.h:42
static void ZeroSecure(void *pData, size_t nSizeBlock) noexcept
Definition: cMem.h:110
static void CopyReverse(void *pDst, const void *pSrc, size_t nSizeBlock) noexcept
Definition: cMem.h:156
static void Xor(BYTE *pDst, const BYTE *pSrc, size_t nBlockSize) noexcept
Definition: cMem.h:119
static StrLen_t __stdcall ConvertToString(char *pszDst, StrLen_t iSizeDstMax, const BYTE *pSrc, size_t iLenSrc)
Definition: cMem.cpp:154
static void CopyRepeat(void *pDst, size_t nDstSize, const void *pSrc, size_t nSrcSize) noexcept
Definition: cMem.h:182
static volatile uintptr_t sm_bDontOptimizeOut0
used to trick the optimizer. Always 0.
Definition: cMem.h:27
static volatile uintptr_t sm_bDontOptimizeOutX
used to trick the optimizer. Unknown value.
Definition: cMem.h:28
static ptrdiff_t Diff(const void *pEnd, const void *pStart) noexcept
Definition: cMem.h:34
static void CopyOverlap(void *pDst, const void *pSrc, size_t nSizeBlock) noexcept
Definition: cMem.h:139
static COMPARE_t Compare(const void *p1, const void *p2, size_t nSizeBlock) noexcept
Definition: cMem.h:78
static void Xor2(BYTE *pDst, const BYTE *pSrc1, const BYTE *pSrc2, size_t nBlockSize) noexcept
Definition: cMem.h:126
static void Swap(void *pvMem1, void *pvMem2, size_t nBlockSize) noexcept
Definition: cMem.h:213
static void Fill(void *pDst, size_t nSize, BYTE bVal) noexcept
Definition: cMem.h:174
static void Swap(TYPE &a, TYPE &b) noexcept
Definition: cValT.h:34