569 lines
10 KiB
C
569 lines
10 KiB
C
/*++
|
||
|
||
Copyright (c) 2000-2000 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
flatbuf.c
|
||
|
||
Abstract:
|
||
|
||
Domain Name System (DNS) Library
|
||
|
||
Flat buffer sizing routines.
|
||
|
||
Author:
|
||
|
||
Jim Gilroy (jamesg) December 22, 2000
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
|
||
#include "local.h"
|
||
|
||
|
||
|
||
//
|
||
// Flat buffer routines -- argument versions
|
||
//
|
||
// These versions have the actual code so that we can
|
||
// easily use this stuff with existing code that has
|
||
// independent pCurrent and BytesLeft variables.
|
||
//
|
||
// FLATBUF structure versions just call these inline.
|
||
//
|
||
|
||
PBYTE
|
||
FlatBuf_Arg_Reserve(
|
||
IN OUT PBYTE * ppCurrent,
|
||
IN OUT PINT pBytesLeft,
|
||
IN DWORD Size,
|
||
IN DWORD Alignment
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Reserve space in a flat buffer -- properly aligned.
|
||
|
||
Arguments:
|
||
|
||
ppCurrent -- address of buffer current pointer
|
||
updated with buf pointer after reservation
|
||
|
||
pBytesLeft -- address of buf bytes left
|
||
updated with bytes left after reservation
|
||
|
||
Size -- size required
|
||
|
||
Alignment -- alignment (size in bytes) required
|
||
|
||
Return Value:
|
||
|
||
Ptr to aligned spot in buffer reserved for write.
|
||
NULL on error.
|
||
|
||
--*/
|
||
{
|
||
register PBYTE pb = *ppCurrent;
|
||
register INT bytesLeft = *pBytesLeft;
|
||
register PBYTE pstart;
|
||
register PBYTE palign;
|
||
|
||
//
|
||
// align pointer
|
||
//
|
||
|
||
pstart = pb;
|
||
|
||
if ( Alignment )
|
||
{
|
||
Alignment--;
|
||
pb = (PBYTE) ( (UINT_PTR)(pb + Alignment) & ~(UINT_PTR)Alignment );
|
||
}
|
||
palign = pb;
|
||
|
||
//
|
||
// reserve space
|
||
//
|
||
|
||
pb += Size;
|
||
|
||
bytesLeft -= (INT) (pb - pstart);
|
||
|
||
*pBytesLeft = bytesLeft;
|
||
*ppCurrent = pb;
|
||
|
||
//
|
||
// indicate space adequate\not
|
||
//
|
||
|
||
if ( bytesLeft < 0 )
|
||
{
|
||
palign = NULL;
|
||
}
|
||
return palign;
|
||
}
|
||
|
||
|
||
|
||
PBYTE
|
||
FlatBuf_Arg_WriteString(
|
||
IN OUT PBYTE * ppCurrent,
|
||
IN OUT PINT pBytesLeft,
|
||
IN PSTR pString,
|
||
IN BOOL fUnicode
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Write string to flat buffer.
|
||
|
||
Arguments:
|
||
|
||
ppCurrent -- address of buffer current pointer
|
||
updated with buf pointer after reservation
|
||
|
||
pBytesLeft -- address of buf bytes left
|
||
updated with bytes left after reservation
|
||
|
||
pString -- ptr to string to write
|
||
|
||
fUnicode -- TRUE for unicode string
|
||
|
||
Return Value:
|
||
|
||
Ptr to location string was written in buffer.
|
||
NULL on error.
|
||
|
||
--*/
|
||
{
|
||
register PBYTE pwrite;
|
||
register DWORD length;
|
||
register DWORD align;
|
||
|
||
//
|
||
// determine length
|
||
//
|
||
|
||
if ( fUnicode )
|
||
{
|
||
length = (wcslen( (PWSTR)pString ) + 1) * sizeof(WCHAR);
|
||
align = sizeof(WCHAR);
|
||
}
|
||
else
|
||
{
|
||
length = strlen( pString ) + 1;
|
||
align = 0;
|
||
}
|
||
|
||
//
|
||
// reserve space and copy string
|
||
//
|
||
|
||
pwrite = FlatBuf_Arg_Reserve(
|
||
ppCurrent,
|
||
pBytesLeft,
|
||
length,
|
||
align );
|
||
|
||
if ( pwrite )
|
||
{
|
||
RtlCopyMemory(
|
||
pwrite,
|
||
pString,
|
||
length );
|
||
}
|
||
|
||
return pwrite;
|
||
}
|
||
|
||
|
||
|
||
PBYTE
|
||
FlatBuf_Arg_CopyMemory(
|
||
IN OUT PBYTE * ppCurrent,
|
||
IN OUT PINT pBytesLeft,
|
||
IN PVOID pMemory,
|
||
IN DWORD Length,
|
||
IN DWORD Alignment
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Write memory to flat buffer.
|
||
|
||
Arguments:
|
||
|
||
ppCurrent -- address of buffer current pointer
|
||
updated with buf pointer after reservation
|
||
|
||
pBytesLeft -- address of buf bytes left
|
||
updated with bytes left after reservation
|
||
|
||
pMemory -- memory to copy
|
||
|
||
Length -- length to copy
|
||
|
||
Alignment -- alignment (size in bytes) required
|
||
|
||
Return Value:
|
||
|
||
Ptr to location string was written in buffer.
|
||
NULL on error.
|
||
|
||
--*/
|
||
{
|
||
register PBYTE pwrite;
|
||
|
||
//
|
||
// reserve space and copy memory
|
||
//
|
||
|
||
pwrite = FlatBuf_Arg_Reserve(
|
||
ppCurrent,
|
||
pBytesLeft,
|
||
Length,
|
||
Alignment );
|
||
|
||
if ( pwrite )
|
||
{
|
||
RtlCopyMemory(
|
||
pwrite,
|
||
pMemory,
|
||
Length );
|
||
}
|
||
|
||
return pwrite;
|
||
}
|
||
|
||
|
||
#if 0
|
||
//
|
||
// Flatbuf inline functions -- defined in dnslib.h
|
||
//
|
||
|
||
__inline
|
||
PBYTE
|
||
FlatBuf_Arg_ReserveAlignPointer(
|
||
IN OUT PBYTE * ppCurrent,
|
||
IN OUT PINT pBytesLeft,
|
||
IN DWORD Size
|
||
)
|
||
{
|
||
return FlatBuf_Arg_Reserve(
|
||
ppCurrent,
|
||
pBytesLeft,
|
||
Size,
|
||
sizeof(PVOID) );
|
||
}
|
||
|
||
__inline
|
||
PBYTE
|
||
FlatBuf_Arg_ReserveAlignQword(
|
||
IN OUT PBYTE * ppCurrent,
|
||
IN OUT PINT pBytesLeft,
|
||
IN DWORD Size
|
||
)
|
||
{
|
||
return FlatBuf_Arg_Reserve(
|
||
ppCurrent,
|
||
pBytesLeft,
|
||
Size,
|
||
sizeof(QWORD) );
|
||
}
|
||
|
||
__inline
|
||
PBYTE
|
||
FlatBuf_Arg_ReserveAlignDword(
|
||
IN OUT PBYTE * ppCurrent,
|
||
IN OUT PINT pBytesLeft,
|
||
IN DWORD Size
|
||
)
|
||
{
|
||
return FlatBuf_Arg_Reserve(
|
||
ppCurrent,
|
||
pBytesLeft,
|
||
Size,
|
||
sizeof(DWORD) );
|
||
}
|
||
|
||
__inline
|
||
PBYTE
|
||
FlatBuf_Arg_ReserveAlignWord(
|
||
IN OUT PBYTE * ppCurrent,
|
||
IN OUT PINT pBytesLeft,
|
||
IN DWORD Size
|
||
)
|
||
{
|
||
return FlatBuf_Arg_Reserve(
|
||
ppCurrent,
|
||
pBytesLeft,
|
||
Size,
|
||
sizeof(WORD) );
|
||
}
|
||
|
||
|
||
__inline
|
||
PBYTE
|
||
FlatBuf_Arg_ReserveAlignByte(
|
||
IN OUT PBYTE * ppCurrent,
|
||
IN OUT PINT pBytesLeft,
|
||
IN DWORD Size
|
||
)
|
||
{
|
||
return FlatBuf_Arg_Reserve(
|
||
ppCurrent,
|
||
pBytesLeft,
|
||
Size,
|
||
0 );
|
||
}
|
||
|
||
|
||
|
||
PBYTE
|
||
__inline
|
||
FlatBuf_Arg_WriteString_A(
|
||
IN OUT PBYTE * ppCurrent,
|
||
IN OUT PINT pBytesLeft,
|
||
IN PSTR pString
|
||
)
|
||
{
|
||
return FlatBuf_Arg_WriteString(
|
||
ppCurrent,
|
||
pBytesLeft,
|
||
pString,
|
||
FALSE // not unicode
|
||
);
|
||
}
|
||
|
||
|
||
PBYTE
|
||
__inline
|
||
FlatBuf_Arg_WriteString_W(
|
||
IN OUT PBYTE * ppCurrent,
|
||
IN OUT PINT pBytesLeft,
|
||
IN PWSTR pString
|
||
)
|
||
{
|
||
return FlatBuf_Arg_WriteString(
|
||
ppCurrent,
|
||
pBytesLeft,
|
||
(PSTR) pString,
|
||
TRUE // unicode
|
||
);
|
||
}
|
||
#endif
|
||
|
||
|
||
|
||
//
|
||
// Flat buffer routines -- structure versions
|
||
//
|
||
|
||
VOID
|
||
FlatBuf_Init(
|
||
IN OUT PFLATBUF pFlatBuf,
|
||
IN PBYTE pBuffer,
|
||
IN INT Size
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Init a FLATBUF struct with given buffer and size.
|
||
|
||
Note, ok to init to zero for size determination.
|
||
|
||
Arguments:
|
||
|
||
pFlatBuf -- ptr to FLATBUF to init
|
||
|
||
pBuffer -- buffer ptr
|
||
|
||
Size -- size required
|
||
|
||
Return Value:
|
||
|
||
None
|
||
|
||
--*/
|
||
{
|
||
pFlatBuf->pBuffer = pBuffer;
|
||
pFlatBuf->pCurrent = pBuffer;
|
||
pFlatBuf->pEnd = pBuffer + Size;
|
||
pFlatBuf->Size = Size;
|
||
pFlatBuf->BytesLeft = Size;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
#if 0
|
||
//
|
||
// Flatbuf inline functions -- defined in dnslib.h
|
||
//
|
||
|
||
__inline
|
||
PBYTE
|
||
FlatBuf_Reserve(
|
||
IN OUT PFLATBUF pBuf,
|
||
IN DWORD Size,
|
||
IN DWORD Alignment
|
||
)
|
||
{
|
||
return FlatBuf_Arg_Reserve(
|
||
& pBuf->pCurrent,
|
||
& pBuf->BytesLeft,
|
||
Size,
|
||
Alignment );
|
||
}
|
||
|
||
__inline
|
||
PBYTE
|
||
FlatBuf_ReserveAlignPointer(
|
||
IN OUT PFLATBUF pBuf,
|
||
IN DWORD Size
|
||
)
|
||
{
|
||
return FlatBuf_Arg_Reserve(
|
||
& pBuf->pCurrent,
|
||
& pBuf->BytesLeft,
|
||
Size,
|
||
sizeof(PVOID) );
|
||
}
|
||
|
||
__inline
|
||
PBYTE
|
||
FlatBuf_ReserveAlignQword(
|
||
IN OUT PFLATBUF pBuf,
|
||
IN DWORD Size
|
||
)
|
||
{
|
||
return FlatBuf_Arg_Reserve(
|
||
& pBuf->pCurrent,
|
||
& pBuf->BytesLeft,
|
||
Size,
|
||
sizeof(QWORD) );
|
||
}
|
||
|
||
__inline
|
||
PBYTE
|
||
FlatBuf_ReserveAlignDword(
|
||
IN OUT PFLATBUF pBuf,
|
||
IN DWORD Size
|
||
)
|
||
{
|
||
return FlatBuf_Arg_Reserve(
|
||
& pBuf->pCurrent,
|
||
& pBuf->BytesLeft,
|
||
Size,
|
||
sizeof(DWORD) );
|
||
}
|
||
|
||
__inline
|
||
PBYTE
|
||
FlatBuf_ReserveAlignWord(
|
||
IN OUT PFLATBUF pBuf,
|
||
IN DWORD Size
|
||
)
|
||
{
|
||
return FlatBuf_Arg_Reserve(
|
||
& pBuf->pCurrent,
|
||
& pBuf->BytesLeft,
|
||
Size,
|
||
sizeof(WORD) );
|
||
}
|
||
|
||
__inline
|
||
PBYTE
|
||
FlatBuf_ReserveAlignByte(
|
||
IN OUT PFLATBUF pBuf,
|
||
IN DWORD Size
|
||
)
|
||
{
|
||
return FlatBuf_Arg_Reserve(
|
||
& pBuf->pCurrent,
|
||
& pBuf->BytesLeft,
|
||
Size,
|
||
0 );
|
||
}
|
||
|
||
|
||
PBYTE
|
||
__inline
|
||
FlatBuf_WriteString(
|
||
IN OUT PFLATBUF pBuf,
|
||
IN PSTR pString,
|
||
IN BOOL fUnicode
|
||
)
|
||
{
|
||
return FlatBuf_Arg_WriteString(
|
||
& pBuf->pCurrent,
|
||
& pBuf->BytesLeft,
|
||
pString,
|
||
fUnicode
|
||
);
|
||
}
|
||
|
||
|
||
PBYTE
|
||
__inline
|
||
FlatBuf_WriteString_A(
|
||
IN OUT PFLATBUF pBuf,
|
||
IN PSTR pString
|
||
)
|
||
{
|
||
return FlatBuf_Arg_WriteString(
|
||
& pBuf->pCurrent,
|
||
& pBuf->BytesLeft,
|
||
pString,
|
||
FALSE // not unicode
|
||
);
|
||
}
|
||
|
||
|
||
PBYTE
|
||
__inline
|
||
FlatBuf_WriteString_W(
|
||
IN OUT PFLATBUF pBuf,
|
||
IN PWSTR pString
|
||
)
|
||
{
|
||
return FlatBuf_Arg_WriteString(
|
||
& pBuf->pCurrent,
|
||
& pBuf->BytesLeft,
|
||
(PSTR) pString,
|
||
TRUE // unicode
|
||
);
|
||
}
|
||
|
||
|
||
PBYTE
|
||
__inline
|
||
FlatBuf_CopyMemory(
|
||
IN OUT PFLATBUF pBuf,
|
||
IN PVOID pMemory,
|
||
IN DWORD Length,
|
||
IN DWORD Alignment
|
||
)
|
||
{
|
||
return FlatBuf_Arg_CopyMemory(
|
||
& pBuf->pCurrent,
|
||
& pBuf->BytesLeft,
|
||
pMemory,
|
||
Length,
|
||
Alignment );
|
||
}
|
||
#endif
|
||
|
||
//
|
||
// End flatbuf.c
|
||
//
|
||
|