142 lines
5.2 KiB
C++
142 lines
5.2 KiB
C++
|
//--------------------------------------------------------------------
|
||
|
// Copyright (C)1998 Microsoft Corporation, All Rights Reserved.
|
||
|
//
|
||
|
// byteswap.cpp
|
||
|
//
|
||
|
// Routines to byteswap SCEP and bFTP headers from the wire format
|
||
|
// (which is Big-Endian) to Little-Endian (Intel) format.
|
||
|
//
|
||
|
// Author:
|
||
|
//
|
||
|
// Edward Reus (EdwardR) 02-26-98 Initial coding.
|
||
|
//
|
||
|
//--------------------------------------------------------------------
|
||
|
|
||
|
#include "precomp.h"
|
||
|
|
||
|
//--------------------------------------------------------------------
|
||
|
// ByteSwapCommandHeader()
|
||
|
//
|
||
|
// A command header is a 28 byte sub-header embedded in some of the
|
||
|
// SCEP headers.
|
||
|
//--------------------------------------------------------------------
|
||
|
void ByteSwapCommandHeader( COMMAND_HEADER *pCommandHeader )
|
||
|
{
|
||
|
pCommandHeader->Length4 = ByteSwapLong(pCommandHeader->Length4);
|
||
|
pCommandHeader->DestPid = ByteSwapShort(pCommandHeader->DestPid);
|
||
|
pCommandHeader->SrcPid = ByteSwapShort(pCommandHeader->SrcPid);
|
||
|
pCommandHeader->CommandId = ByteSwapShort(pCommandHeader->CommandId);
|
||
|
}
|
||
|
|
||
|
//--------------------------------------------------------------------
|
||
|
// ByteSwapReqHeaderShortNonFrag()
|
||
|
//
|
||
|
// Short non-fragmented SCEP request header.
|
||
|
//--------------------------------------------------------------------
|
||
|
void ByteSwapReqHeaderShortNonFrag( SCEP_REQ_HEADER_SHORT *pReqHeaderShort )
|
||
|
{
|
||
|
pReqHeaderShort->Length3 = ByteSwapShort(pReqHeaderShort->Length3);
|
||
|
|
||
|
if (pReqHeaderShort->Length3 >= COMMAND_HEADER_SIZE)
|
||
|
{
|
||
|
ByteSwapCommandHeader( (COMMAND_HEADER*)pReqHeaderShort->CommandHeader );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//--------------------------------------------------------------------
|
||
|
// ByteSwapReqHeaderLongNonFrag()
|
||
|
//
|
||
|
// Long non-fragmented SCEP request header.
|
||
|
//--------------------------------------------------------------------
|
||
|
void ByteSwapReqHeaderLongNonFrag( SCEP_REQ_HEADER_LONG *pReqHeaderLong )
|
||
|
{
|
||
|
pReqHeaderLong->Length2 = ByteSwapShort(pReqHeaderLong->Length2);
|
||
|
pReqHeaderLong->Length3 = ByteSwapShort(pReqHeaderLong->Length3);
|
||
|
|
||
|
if (pReqHeaderLong->Length3 >= COMMAND_HEADER_SIZE)
|
||
|
{
|
||
|
ByteSwapCommandHeader( (COMMAND_HEADER*)pReqHeaderLong->CommandHeader );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//--------------------------------------------------------------------
|
||
|
// ByteSwapReqHeaderShortFrag()
|
||
|
//
|
||
|
// Short fragmented SCEP request header. SCEP PDUs can be fragmented.
|
||
|
//
|
||
|
// Note: In practice a short fragmented PDU will probably never
|
||
|
// show up, but its part of the spec...
|
||
|
//--------------------------------------------------------------------
|
||
|
void ByteSwapReqHeaderShortFrag(
|
||
|
SCEP_REQ_HEADER_SHORT_FRAG *pReqHeaderShortFrag )
|
||
|
{
|
||
|
pReqHeaderShortFrag->Length3 = ByteSwapShort(pReqHeaderShortFrag->Length3);
|
||
|
pReqHeaderShortFrag->SequenceNo = ByteSwapLong(pReqHeaderShortFrag->SequenceNo);
|
||
|
pReqHeaderShortFrag->RestNo = ByteSwapLong(pReqHeaderShortFrag->RestNo);
|
||
|
|
||
|
if ( (pReqHeaderShortFrag->Length3 >= COMMAND_HEADER_SIZE)
|
||
|
&& (pReqHeaderShortFrag->DFlag == DFLAG_FIRST_FRAGMENT) )
|
||
|
{
|
||
|
ByteSwapCommandHeader( (COMMAND_HEADER*)pReqHeaderShortFrag->CommandHeader );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//--------------------------------------------------------------------
|
||
|
// ByteSwapReqHeaderLongFrag()
|
||
|
//
|
||
|
// Long fragmented SCEP request header.
|
||
|
//--------------------------------------------------------------------
|
||
|
void ByteSwapReqHeaderLongFrag( SCEP_REQ_HEADER_LONG_FRAG *pReqHeaderLongFrag )
|
||
|
{
|
||
|
pReqHeaderLongFrag->Length2 = ByteSwapShort(pReqHeaderLongFrag->Length2);
|
||
|
pReqHeaderLongFrag->Length3 = ByteSwapShort(pReqHeaderLongFrag->Length3);
|
||
|
pReqHeaderLongFrag->SequenceNo = ByteSwapLong(pReqHeaderLongFrag->SequenceNo);
|
||
|
pReqHeaderLongFrag->RestNo = ByteSwapLong(pReqHeaderLongFrag->RestNo);
|
||
|
|
||
|
if ( (pReqHeaderLongFrag->Length3 >= COMMAND_HEADER_SIZE)
|
||
|
&& (pReqHeaderLongFrag->DFlag == DFLAG_FIRST_FRAGMENT) )
|
||
|
{
|
||
|
ByteSwapCommandHeader( (COMMAND_HEADER*)pReqHeaderLongFrag->CommandHeader );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//--------------------------------------------------------------------
|
||
|
// ByteSwapReqHeaderShort()
|
||
|
//
|
||
|
//--------------------------------------------------------------------
|
||
|
void ByteSwapReqHeaderShort( SCEP_REQ_HEADER_SHORT *pReqHeaderShort )
|
||
|
{
|
||
|
if ( (pReqHeaderShort->DFlag == DFLAG_SINGLE_PDU)
|
||
|
|| (pReqHeaderShort->DFlag == DFLAG_INTERRUPT)
|
||
|
|| (pReqHeaderShort->DFlag == DFLAG_CONNECT_REJECT) )
|
||
|
{
|
||
|
ByteSwapReqHeaderShortNonFrag( pReqHeaderShort );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ByteSwapReqHeaderShortFrag(
|
||
|
(SCEP_REQ_HEADER_SHORT_FRAG*)pReqHeaderShort );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//--------------------------------------------------------------------
|
||
|
// ByteSwapReqHeaderLong()
|
||
|
//
|
||
|
//--------------------------------------------------------------------
|
||
|
void ByteSwapReqHeaderLong( SCEP_REQ_HEADER_LONG *pReqHeaderLong )
|
||
|
{
|
||
|
if ( (pReqHeaderLong->DFlag == DFLAG_SINGLE_PDU)
|
||
|
|| (pReqHeaderLong->DFlag == DFLAG_INTERRUPT)
|
||
|
|| (pReqHeaderLong->DFlag == DFLAG_CONNECT_REJECT) )
|
||
|
{
|
||
|
ByteSwapReqHeaderLongNonFrag( pReqHeaderLong );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ByteSwapReqHeaderLongFrag(
|
||
|
(SCEP_REQ_HEADER_LONG_FRAG*)pReqHeaderLong );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|