[
	uuid(14a8831c-bc82-11d2-8a64-0008c7457e5d),
	version(1.0),
	pointer_default(unique)
]
interface ExtendedError
{

	typedef struct tagEEAString
	{
		short nLength;
		[size_is(nLength)] byte *pString;
	} EEAString;

	typedef struct tagEEUString
	{
		short nLength;
		[size_is(nLength)] unsigned short *pString;
	} EEUString;

	typedef struct tagBinaryEEInfo
	{
		short nSize;
		[size_is(nSize)] unsigned char *pBlob;
	} BinaryEEInfo;

	typedef enum tagExtendedErrorParamTypesInternal
	{
		eeptiAnsiString = 1,
		eeptiUnicodeString,
		eeptiLongVal,
		eeptiShortVal,
		eeptiPointerVal,
                eeptiNone,
		eeptiBinary
	} ExtendedErrorParamTypesInternal;


	typedef struct tagParam
	{
		ExtendedErrorParamTypesInternal Type;
		[switch_type(short),switch_is(Type)] union {
			[case(1)] EEAString AnsiString;
			[case(2)] EEUString UnicodeString;
			[case(3)] long LVal;
			[case(4)] short IVal;
			[case(5)] __int64 PVal;
			[case(6)] ;
			[case(7)] BinaryEEInfo Blob;
			};
	} ExtendedErrorParam;


	typedef enum tagEEComputerNamePresent
	{
		eecnpPresent = 1,
		eecnpNotPresent
	} EEComputerNamePresent;

	typedef struct tagEEComputerName
	{
		EEComputerNamePresent Type;
		[switch_type(short),switch_is(Type)] union {
			[case(1)] EEUString Name;
			[case(2)] ;
			};
	} EEComputerName;

	typedef struct tagExtendedErrorInfo
	{
		struct tagExtendedErrorInfo * Next;
		EEComputerName ComputerName;
		unsigned long ProcessID;
		__int64 TimeStamp;
		unsigned long GeneratingComponent;
		unsigned long Status;
		unsigned short DetectionLocation;
		unsigned short Flags;
		short    nLen;
		[size_is(nLen)] ExtendedErrorParam Params[];
	} ExtendedErrorInfo;

	typedef ExtendedErrorInfo *ExtendedErrorInfoPtr;

} // End of interface ExtendedError