|
|
//=============================================================================
//
// MODULE: ASN1HAddress.cxx
//
// Description:
//
// Implementation of host address parsing logic
//
// Modification History
//
// Mark Pustilnik Date: 06/16/02 - created
//
//=============================================================================
#include "ASN1Parser.hxx"
char g_UnknownAddressType[] = "Unknown address type";
char * g_AddressTypes[] = { "Unspecified", "Local", "IPv4", "IMPLINK", "PUP", "CHAOS", "NS", "NBS", "ECMA", "DATAKIT", "CCITT", "SNA", "DECnet", "DLI", "LAT", "HYLINK", "AppleTalk", "BSC", "DSS", "OSI", "NetBIOS", "X25", g_UnknownAddressType, g_UnknownAddressType, "IPv6", };
DWORD ASN1ParserHostAddress::DisplayCollectedValues( IN ASN1FRAME * Frame, IN ULONG Length, IN ULPBYTE Address ) { DWORD dw; ASN1VALUE * AddrType; ASN1VALUE * AddrValue; ASN1VALUE Value; char * AddrTypeString = NULL;
if ( QueryCollectedCount() != 2 ) { dw = ERROR_INTERNAL_ERROR; goto Cleanup; }
//
// Create a new value to be displayed, of the format Type: Value
// Type: Value
//
AddrType = QueryCollectedValue( 0 ); AddrValue = QueryCollectedValue( 1 );
if ( AddrType->ut != utInteger ) { dw = ERROR_INTERNAL_ERROR; goto Cleanup; }
if ( AddrValue->ut != utGeneralString && AddrValue->ut != utOctetString ) { dw = ERROR_INTERNAL_ERROR; goto Cleanup; }
//
// Create an address display value that looks like
// NetBIOS: HRUNDEL
// or
// IPv4: 192.15.98.126
//
if ( AddrType->dw <= ARRAY_COUNT( g_AddressTypes )) { AddrTypeString = g_AddressTypes[AddrType->dw]; } else { AddrTypeString = g_UnknownAddressType; }
ULONG l = strlen( AddrTypeString );
Value.ut = utGeneralString; Value.string.l = l + strlen(": ") + AddrValue->string.l; Value.string.s = new BYTE[Value.string.l];
if ( Value.string.s == NULL ) { dw = ERROR_NOT_ENOUGH_MEMORY; goto Cleanup; }
Value.Allocated = TRUE;
RtlCopyMemory( Value.string.s, AddrTypeString, l );
Value.string.s[l++] = ':'; Value.string.s[l++] = ' ';
RtlCopyMemory( &Value.string.s[l], AddrValue->string.s, AddrValue->string.l );
dw = Display( Frame, &Value, PROP( HostAddresses_HostAddress ), 0 );
if ( dw != ERROR_SUCCESS ) { goto Cleanup; }
Cleanup:
return dw; }
|