Custom Buffer-Manipulation Routines
Here’s my rewrite of the Custom Buffer-Manipulation Routines by Piotr Mintus.
Optimized for and works on 32-bit and 64-bit environments.
//**********************************************************************
// File: buffer.h
//
// Custom Buffer-Manipulation Routines
//
// By RaMMicHaeL, 12.10.2009
//**********************************************************************
#ifndef _BUFFER_H_
#define _BUFFER_H_
#ifdef FillMemory
#undef FillMemory
#endif
#ifdef ZeroMemory
#undef ZeroMemory
#endif
#ifdef CopyMemory
#undef CopyMemory
#endif
#ifdef MoveMemory
#undef MoveMemory
#endif
__forceinline
void FillMemory(PVOID Destination, SIZE_T Length, BYTE Fill)
{
SIZE_T *sizet_p;
unsigned char *uchar_p;
SIZE_T sizet_fill;
SIZE_T count;
sizet_p = (SIZE_T *)Destination;
count = Length/sizeof(SIZE_T);
if(count)
{
sizet_fill = Fill;
sizet_fill |= sizet_fill << 8;
sizet_fill |= sizet_fill << 16;
#ifdef _WIN64
sizet_fill |= sizet_fill << 32;
#endif
do
*(sizet_p++) = sizet_fill;
while(--count);
}
uchar_p = (unsigned char *)sizet_p;
count = Length & (sizeof(SIZE_T)-1);
if(count)
{
do
*(uchar_p++) = Fill;
while(--count);
}
}
#define ZeroMemory(Destination, Length) FillMemory(Destination, Length, 0)
__forceinline
void CopyMemory(PVOID Destination, const VOID *Source, SIZE_T Length)
{
SIZE_T *sizet_p_dest, *sizet_p_src;
unsigned char *uchar_p_dest, *uchar_p_src;
SIZE_T count;
sizet_p_dest = (SIZE_T *)Destination;
sizet_p_src = (SIZE_T *)Source;
count = Length/sizeof(SIZE_T);
if(count)
{
do
*(sizet_p_dest++) = *(sizet_p_src++);
while(--count);
}
uchar_p_dest = (unsigned char *)sizet_p_dest;
uchar_p_src = (unsigned char *)sizet_p_src;
count = Length & (sizeof(SIZE_T)-1);
if(count)
{
do
*(uchar_p_dest++) = *(uchar_p_src++);
while(--count);
}
}
__forceinline
void MoveMemory(PVOID Destination, const VOID *Source, SIZE_T Length)
{
SIZE_T *sizet_p_dest, *sizet_p_src;
unsigned char *uchar_p_dest, *uchar_p_src;
SIZE_T count;
if(Destination > Source)
{
// Copy in reverse
uchar_p_dest = (unsigned char *)Destination+Length;
uchar_p_src = (unsigned char *)Source+Length;
count = Length & (sizeof(SIZE_T)-1);
if(count)
{
do
*(--uchar_p_dest) = *(--uchar_p_src);
while(--count);
}
sizet_p_dest = (SIZE_T *)uchar_p_dest;
sizet_p_src = (SIZE_T *)uchar_p_src;
count = Length/sizeof(SIZE_T);
if(count)
{
do
*(--sizet_p_dest) = *(--sizet_p_src);
while(--count);
}
}
else
CopyMemory(Destination, Source, Length);
}
#endif // _BUFFER_H_
Posted in Programming by Michael (Ramen Software) on October 12th, 2009.