Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

150 lines
3.2 KiB

//=============================================================================
//
// MODULE: ASN1Unit.cxx
//
// Description:
//
// Implementation of ASN.1 "unit" parsing logic
//
// Modification History
//
// Mark Pustilnik Date: 06/08/02 - created
//
//=============================================================================
#include "ASN1Parser.hxx"
//
// Parses the unit through calling into the derived class' GetValue() method
// then uses Display() to show it in Netmon
//
DWORD
ASN1ParserUnit::Parse(
IN OUT ASN1FRAME * Frame
)
{
DWORD dw;
ASN1VALUE Value;
ASN1FRAME FrameIn = *Frame;
dw = VerifyAndSkipHeader( Frame );
if ( dw != ERROR_SUCCESS )
{
goto Cleanup;
}
dw = GetValue(
Frame,
&Value
);
if ( dw != ERROR_SUCCESS )
{
goto Cleanup;
}
//
// If a summary property is present, display it now
// and indent the display for value property
//
if ( m_hPropertySummary != NULL )
{
dw = Display(
Frame,
&Value,
m_hPropertySummary,
0
);
if ( dw != ERROR_SUCCESS )
{
goto Cleanup;
}
Frame->Level += 1;
}
//
// If an object has a valid property value handle, it is displayable
// Otherwise, it should have a value collector class
//
if ( m_hPropertyValue != NULL )
{
dw = Display(
Frame,
&Value,
m_hPropertyValue,
m_IFlags
);
}
//
// Octet values might come out with a subparser attached, in which case
// this subparser should be invoked right now
//
if ( dw == ERROR_SUCCESS &&
Value.ut == utOctetString &&
Value.SubParser != NULL )
{
ASN1FRAME FrameHere;
FrameHere.Address = Value.Address;
FrameHere.hFrame = Frame->hFrame;
FrameHere.Level = Frame->Level + 1;
dw = Value.SubParser->Parse( &FrameHere );
}
if ( m_hPropertySummary != NULL )
{
Frame->Level -= 1;
}
if ( dw != ERROR_SUCCESS )
{
goto Cleanup;
}
//
// See if the value of this unit modifies the parsing done to some other
// unit, and if so, inform the modifyee of the modifier value
//
if ( QueryModifyee() != NULL )
{
dw = QueryModifyee()->SetModifier( &Value );
if ( dw != ERROR_SUCCESS )
{
goto Cleanup;
}
}
Cleanup:
if ( QueryValueCollector() != NULL &&
( dw == ERROR_SUCCESS ||
( dw == ERROR_INVALID_USER_BUFFER && IsOptional())))
{
DWORD dw2;
dw2 = QueryValueCollector()->CollectValue(( dw == ERROR_SUCCESS ) ? &Value : NULL );
if ( dw == ERROR_SUCCESS &&
dw2 != ERROR_SUCCESS )
{
dw = dw2;
}
}
if ( dw != ERROR_SUCCESS )
{
*Frame = FrameIn;
}
return dw;
}