public bool WriteTransferEvent(ref EventDescriptor eventDescriptor, Guid relatedActivityId, params object[] eventPayload) { uint status = 0; if (IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { Guid activityId = GetActivityId(); unsafe { if ((eventPayload != null) && (eventPayload.Length != 0)) { int argCount = eventPayload.Length; if (argCount > etwMaxNumberArguments) { // //too many arguments to log // throw Fx.Exception.AsError(new ArgumentOutOfRangeException("eventPayload", SRCore.EtwMaxNumberArgumentsExceeded(etwMaxNumberArguments))); } uint totalEventSize = 0; int index; int stringIndex = 0; int[] stringPosition = new int[etwAPIMaxStringCount]; //used to keep the position of strings in the eventPayload parameter string[] dataString = new string[etwAPIMaxStringCount]; // string arrays from the eventPayload parameter UnsafeNativeMethods.EventData *userData = stackalloc UnsafeNativeMethods.EventData[argCount]; // allocation for the data descriptors UnsafeNativeMethods.EventData *userDataPtr = (UnsafeNativeMethods.EventData *)userData; byte *dataBuffer = stackalloc byte[basicTypeAllocationBufferSize * argCount]; // 16 byte for unboxing non-string argument byte *currentBuffer = dataBuffer; // // The loop below goes through all the arguments and fills in the data // descriptors. For strings save the location in the dataString array. // Caculates the total size of the event by adding the data descriptor // size value set in EncodeObjec method. // for (index = 0; index < eventPayload.Length; index++) { if (eventPayload[index] != null) { string isString; isString = EncodeObject(ref eventPayload[index], userDataPtr, currentBuffer); currentBuffer += basicTypeAllocationBufferSize; totalEventSize += userDataPtr->Size; userDataPtr++; if (isString != null) { if (stringIndex < etwAPIMaxStringCount) { dataString[stringIndex] = isString; stringPosition[stringIndex] = index; stringIndex++; } else { throw Fx.Exception.AsError(new ArgumentOutOfRangeException("eventPayload", SRCore.EtwAPIMaxStringCountExceeded(etwAPIMaxStringCount))); } } } } if (totalEventSize > traceEventMaximumSize) { errorCode = WriteEventErrorCode.EventTooBig; return(false); } fixed(char *v0 = dataString[0], v1 = dataString[1], v2 = dataString[2], v3 = dataString[3], v4 = dataString[4], v5 = dataString[5], v6 = dataString[6], v7 = dataString[7]) { userDataPtr = (UnsafeNativeMethods.EventData *)userData; if (dataString[0] != null) { userDataPtr[stringPosition[0]].DataPointer = (ulong)v0; } if (dataString[1] != null) { userDataPtr[stringPosition[1]].DataPointer = (ulong)v1; } if (dataString[2] != null) { userDataPtr[stringPosition[2]].DataPointer = (ulong)v2; } if (dataString[3] != null) { userDataPtr[stringPosition[3]].DataPointer = (ulong)v3; } if (dataString[4] != null) { userDataPtr[stringPosition[4]].DataPointer = (ulong)v4; } if (dataString[5] != null) { userDataPtr[stringPosition[5]].DataPointer = (ulong)v5; } if (dataString[6] != null) { userDataPtr[stringPosition[6]].DataPointer = (ulong)v6; } if (dataString[7] != null) { userDataPtr[stringPosition[7]].DataPointer = (ulong)v7; } status = UnsafeNativeMethods.EventWriteTransfer(this.traceRegistrationHandle, ref eventDescriptor, ref activityId, ref relatedActivityId, (uint)argCount, userData); } } else { status = UnsafeNativeMethods.EventWriteTransfer(this.traceRegistrationHandle, ref eventDescriptor, ref activityId, ref relatedActivityId, 0, null); } } } if (status != 0) { SetLastError((int)status); return(false); } return(true); }
static unsafe string EncodeObject(ref object data, UnsafeNativeMethods.EventData *dataDescriptor, byte *dataBuffer) { dataDescriptor->Reserved = 0; string sRet = data as string; if (sRet != null) { dataDescriptor->Size = (uint)((sRet.Length + 1) * 2); return(sRet); } if (data is IntPtr) { dataDescriptor->Size = (uint)sizeof(IntPtr); IntPtr *intptrPtr = (IntPtr *)dataBuffer; * intptrPtr = (IntPtr)data; dataDescriptor->DataPointer = (ulong)intptrPtr; } else if (data is int) { dataDescriptor->Size = (uint)sizeof(int); int *intptrPtr = (int *)dataBuffer; * intptrPtr = (int)data; dataDescriptor->DataPointer = (ulong)intptrPtr; } else if (data is long) { dataDescriptor->Size = (uint)sizeof(long); long *longptr = (long *)dataBuffer; * longptr = (long)data; dataDescriptor->DataPointer = (ulong)longptr; } else if (data is uint) { dataDescriptor->Size = (uint)sizeof(uint); uint *uintptr = (uint *)dataBuffer; * uintptr = (uint)data; dataDescriptor->DataPointer = (ulong)uintptr; } else if (data is UInt64) { dataDescriptor->Size = (uint)sizeof(ulong); UInt64 *ulongptr = (ulong *)dataBuffer; * ulongptr = (ulong)data; dataDescriptor->DataPointer = (ulong)ulongptr; } else if (data is char) { dataDescriptor->Size = (uint)sizeof(char); char *charptr = (char *)dataBuffer; * charptr = (char)data; dataDescriptor->DataPointer = (ulong)charptr; } else if (data is byte) { dataDescriptor->Size = (uint)sizeof(byte); byte *byteptr = (byte *)dataBuffer; * byteptr = (byte)data; dataDescriptor->DataPointer = (ulong)byteptr; } else if (data is short) { dataDescriptor->Size = (uint)sizeof(short); short *shortptr = (short *)dataBuffer; * shortptr = (short)data; dataDescriptor->DataPointer = (ulong)shortptr; } else if (data is sbyte) { dataDescriptor->Size = (uint)sizeof(sbyte); sbyte *sbyteptr = (sbyte *)dataBuffer; * sbyteptr = (sbyte)data; dataDescriptor->DataPointer = (ulong)sbyteptr; } else if (data is ushort) { dataDescriptor->Size = (uint)sizeof(ushort); ushort *ushortptr = (ushort *)dataBuffer; * ushortptr = (ushort)data; dataDescriptor->DataPointer = (ulong)ushortptr; } else if (data is float) { dataDescriptor->Size = (uint)sizeof(float); float *floatptr = (float *)dataBuffer; * floatptr = (float)data; dataDescriptor->DataPointer = (ulong)floatptr; } else if (data is double) { dataDescriptor->Size = (uint)sizeof(double); double *doubleptr = (double *)dataBuffer; * doubleptr = (double)data; dataDescriptor->DataPointer = (ulong)doubleptr; } else if (data is bool) { dataDescriptor->Size = (uint)sizeof(bool); bool *boolptr = (bool *)dataBuffer; * boolptr = (bool)data; dataDescriptor->DataPointer = (ulong)boolptr; } else if (data is Guid) { dataDescriptor->Size = (uint)sizeof(Guid); Guid *guidptr = (Guid *)dataBuffer; * guidptr = (Guid)data; dataDescriptor->DataPointer = (ulong)guidptr; } else if (data is decimal) { dataDescriptor->Size = (uint)sizeof(decimal); decimal *decimalptr = (decimal *)dataBuffer; * decimalptr = (decimal)data; dataDescriptor->DataPointer = (ulong)decimalptr; } else if (data is Boolean) { dataDescriptor->Size = (uint)sizeof(Boolean); Boolean *booleanptr = (Boolean *)dataBuffer; * booleanptr = (Boolean)data; dataDescriptor->DataPointer = (ulong)booleanptr; } else { // Everything else is a just a string sRet = data.ToString(); dataDescriptor->Size = (uint)((sRet.Length + 1) * 2); return(sRet); } return(null); }
public bool WriteEvent(ref EventDescriptor eventDescriptor, params object[] eventPayload) { uint status = 0; if (IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { int argCount = 0; Guid correlationId = GetActivityId(); SetActivityId(ref correlationId); unsafe { if ((eventPayload == null) || (eventPayload.Length == 0) || (eventPayload.Length == 1)) { string dataString = null; UnsafeNativeMethods.EventData userData; byte *dataBuffer = stackalloc byte[basicTypeAllocationBufferSize]; // Assume a max of 16 chars for non-string argument userData.Size = 0; if ((eventPayload != null) && (eventPayload.Length != 0)) { // // Figure out the type and fill the data descriptor // dataString = EncodeObject(ref eventPayload[0], &userData, dataBuffer); argCount = 1; } if (userData.Size > traceEventMaximumSize) { // // Maximum size of the event payload plus header is 64k // errorCode = WriteEventErrorCode.EventTooBig; return(false); } if (dataString != null) { fixed(char *pdata = dataString) { userData.DataPointer = (ulong)pdata; status = UnsafeNativeMethods.EventWrite(this.traceRegistrationHandle, ref eventDescriptor, (uint)argCount, &userData); } } else { if (argCount == 0) { status = UnsafeNativeMethods.EventWrite(this.traceRegistrationHandle, ref eventDescriptor, 0, null); } else { status = UnsafeNativeMethods.EventWrite(this.traceRegistrationHandle, ref eventDescriptor, (uint)argCount, &userData); } } } else { argCount = eventPayload.Length; if (argCount > etwMaxNumberArguments) { // //too many arguments to log // throw Fx.Exception.AsError(new ArgumentOutOfRangeException("eventPayload", SRCore.EtwMaxNumberArgumentsExceeded(etwMaxNumberArguments))); } uint totalEventSize = 0; int index; int stringIndex = 0; int[] stringPosition = new int[etwAPIMaxStringCount]; string[] dataString = new string[etwAPIMaxStringCount]; UnsafeNativeMethods.EventData *userData = stackalloc UnsafeNativeMethods.EventData[argCount]; UnsafeNativeMethods.EventData *userDataPtr = (UnsafeNativeMethods.EventData *)userData; byte *dataBuffer = stackalloc byte[basicTypeAllocationBufferSize * argCount]; // Assume 16 chars for non-string argument byte *currentBuffer = dataBuffer; // // The loop below goes through all the arguments and fills in the data // descriptors. For strings save the location in the dataString array. // Caculates the total size of the event by adding the data descriptor // size value set in EncodeObjec method. // for (index = 0; index < eventPayload.Length; index++) { if (eventPayload[index] != null) { string isString; isString = EncodeObject(ref eventPayload[index], userDataPtr, currentBuffer); currentBuffer += basicTypeAllocationBufferSize; totalEventSize += userDataPtr->Size; userDataPtr++; if (isString != null) { if (stringIndex < etwAPIMaxStringCount) { dataString[stringIndex] = isString; stringPosition[stringIndex] = index; stringIndex++; } else { throw Fx.Exception.AsError(new ArgumentOutOfRangeException("eventPayload", SRCore.EtwAPIMaxStringCountExceeded(etwAPIMaxStringCount))); } } } } if (totalEventSize > traceEventMaximumSize) { errorCode = WriteEventErrorCode.EventTooBig; return(false); } // // now fix any string arguments and set the pointer on the data descriptor // fixed(char *v0 = dataString[0], v1 = dataString[1], v2 = dataString[2], v3 = dataString[3], v4 = dataString[4], v5 = dataString[5], v6 = dataString[6], v7 = dataString[7]) { userDataPtr = (UnsafeNativeMethods.EventData *)userData; if (dataString[0] != null) { userDataPtr[stringPosition[0]].DataPointer = (ulong)v0; } if (dataString[1] != null) { userDataPtr[stringPosition[1]].DataPointer = (ulong)v1; } if (dataString[2] != null) { userDataPtr[stringPosition[2]].DataPointer = (ulong)v2; } if (dataString[3] != null) { userDataPtr[stringPosition[3]].DataPointer = (ulong)v3; } if (dataString[4] != null) { userDataPtr[stringPosition[4]].DataPointer = (ulong)v4; } if (dataString[5] != null) { userDataPtr[stringPosition[5]].DataPointer = (ulong)v5; } if (dataString[6] != null) { userDataPtr[stringPosition[6]].DataPointer = (ulong)v6; } if (dataString[7] != null) { userDataPtr[stringPosition[7]].DataPointer = (ulong)v7; } status = UnsafeNativeMethods.EventWrite(this.traceRegistrationHandle, ref eventDescriptor, (uint)argCount, userData); } } } } if (status != 0) { SetLastError((int)status); return(false); } return(true); }
public unsafe bool WriteTransferEvent(ref EventDescriptor eventDescriptor, Guid relatedActivityId, params object[] eventPayload) { uint num = 0; if (this.IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { Guid activityId = DiagnosticsEventProvider.GetActivityId(); if (eventPayload == null || (int)eventPayload.Length == 0) { num = UnsafeNativeMethods.EventWriteTransfer(this.traceRegistrationHandle, ref eventDescriptor, ref activityId, ref relatedActivityId, 0, 0); } else { int length = (int)eventPayload.Length; if (length > 32) { throw Fx.Exception.AsError(new ArgumentOutOfRangeException("eventPayload", SRCore.EtwMaxNumberArgumentsExceeded(32)), null); } uint size = 0; int num1 = 0; int[] numArray = new int[8]; string[] strArrays = new string[8]; UnsafeNativeMethods.EventData *eventDataPointer = stackalloc UnsafeNativeMethods.EventData[checked (length * sizeof(UnsafeNativeMethods.EventData))]; UnsafeNativeMethods.EventData *eventDataPointer1 = eventDataPointer; byte *numPointer = stackalloc byte[16 * length]; for (int i = 0; i < (int)eventPayload.Length; i++) { if (eventPayload[i] != null) { string str = DiagnosticsEventProvider.EncodeObject(ref eventPayload[i], eventDataPointer1, numPointer); numPointer = numPointer + 16; size = size + (*eventDataPointer1).Size; eventDataPointer1 = eventDataPointer1 + sizeof(UnsafeNativeMethods.EventData); if (str != null) { if (num1 >= 8) { throw Fx.Exception.AsError(new ArgumentOutOfRangeException("eventPayload", SRCore.EtwAPIMaxStringCountExceeded(8)), null); } strArrays[num1] = str; numArray[num1] = i; num1++; } } } if (size > 65482) { DiagnosticsEventProvider.errorCode = DiagnosticsEventProvider.WriteEventErrorCode.EventTooBig; return(false); } fixed(string str1 = strArrays[0]) { string *offsetToStringData = &str1; if (offsetToStringData != null) { offsetToStringData = offsetToStringData + RuntimeHelpers.OffsetToStringData; } char *chrPointer = (char *)offsetToStringData; fixed(string str2 = strArrays[1]) { string *strPointers = &str2; if (strPointers != null) { strPointers = strPointers + RuntimeHelpers.OffsetToStringData; } char *chrPointer1 = (char *)strPointers; fixed(string str3 = strArrays[2]) { string *offsetToStringData1 = &str3; if (offsetToStringData1 != null) { offsetToStringData1 = offsetToStringData1 + RuntimeHelpers.OffsetToStringData; } char *chrPointer2 = (char *)offsetToStringData1; fixed(string str4 = strArrays[3]) { string *strPointers1 = &str4; if (strPointers1 != null) { strPointers1 = strPointers1 + RuntimeHelpers.OffsetToStringData; } char *chrPointer3 = (char *)strPointers1; fixed(string str5 = strArrays[4]) { string *offsetToStringData2 = &str5; if (offsetToStringData2 != null) { offsetToStringData2 = offsetToStringData2 + RuntimeHelpers.OffsetToStringData; } char *chrPointer4 = (char *)offsetToStringData2; fixed(string str6 = strArrays[5]) { string *strPointers2 = &str6; if (strPointers2 != null) { strPointers2 = strPointers2 + RuntimeHelpers.OffsetToStringData; } char *chrPointer5 = (char *)strPointers2; fixed(string str7 = strArrays[6]) { string *offsetToStringData3 = &str7; if (offsetToStringData3 != null) { offsetToStringData3 = offsetToStringData3 + RuntimeHelpers.OffsetToStringData; } char *chrPointer6 = (char *)offsetToStringData3; fixed(string str8 = strArrays[7]) { string *strPointers3 = &str8; if (strPointers3 != null) { strPointers3 = strPointers3 + RuntimeHelpers.OffsetToStringData; } char *chrPointer7 = (char *)strPointers3; eventDataPointer1 = eventDataPointer; if (strArrays[0] != null) { (*(eventDataPointer1 + numArray[0] * sizeof(UnsafeNativeMethods.EventData))).DataPointer = (ulong)chrPointer; } if (strArrays[1] != null) { (*(eventDataPointer1 + numArray[1] * sizeof(UnsafeNativeMethods.EventData))).DataPointer = (ulong)chrPointer1; } if (strArrays[2] != null) { (*(eventDataPointer1 + numArray[2] * sizeof(UnsafeNativeMethods.EventData))).DataPointer = (ulong)chrPointer2; } if (strArrays[3] != null) { (*(eventDataPointer1 + numArray[3] * sizeof(UnsafeNativeMethods.EventData))).DataPointer = (ulong)chrPointer3; } if (strArrays[4] != null) { (*(eventDataPointer1 + numArray[4] * sizeof(UnsafeNativeMethods.EventData))).DataPointer = (ulong)chrPointer4; } if (strArrays[5] != null) { (*(eventDataPointer1 + numArray[5] * sizeof(UnsafeNativeMethods.EventData))).DataPointer = (ulong)chrPointer5; } if (strArrays[6] != null) { (*(eventDataPointer1 + numArray[6] * sizeof(UnsafeNativeMethods.EventData))).DataPointer = (ulong)chrPointer6; } if (strArrays[7] != null) { (*(eventDataPointer1 + numArray[7] * sizeof(UnsafeNativeMethods.EventData))).DataPointer = (ulong)chrPointer7; } num = UnsafeNativeMethods.EventWriteTransfer(this.traceRegistrationHandle, ref eventDescriptor, ref activityId, ref relatedActivityId, (uint)length, eventDataPointer); } } } } } } } } str2 = null; str3 = null; str4 = null; str5 = null; str6 = null; str7 = null; str8 = null; } } if (num == 0) { return(true); } DiagnosticsEventProvider.SetLastError((int)num); return(false); }
private static unsafe string EncodeObject(ref object data, UnsafeNativeMethods.EventData *dataDescriptor, byte *dataBuffer) { (*dataDescriptor).Reserved = 0; string str = data as string; if (str != null) { (*dataDescriptor).Size = (uint)((str.Length + 1) * 2); return(str); } if (data is IntPtr) { (*dataDescriptor).Size = sizeof(IntPtr); IntPtr *intPtrPointer = (IntPtr *)dataBuffer; * intPtrPointer = (IntPtr)data; (*dataDescriptor).DataPointer = (ulong)intPtrPointer; } else if (data is int) { (*dataDescriptor).Size = 4; int *numPointer = (int *)dataBuffer; * numPointer = (int)data; (*dataDescriptor).DataPointer = (ulong)numPointer; } else if (data is long) { (*dataDescriptor).Size = 8; long *numPointer1 = (long *)dataBuffer; * numPointer1 = (long)data; (*dataDescriptor).DataPointer = (ulong)numPointer1; } else if (data is uint) { (*dataDescriptor).Size = 4; uint *numPointer2 = (uint *)dataBuffer; * numPointer2 = (uint)data; (*dataDescriptor).DataPointer = (ulong)numPointer2; } else if (data is ulong) { (*dataDescriptor).Size = 8; ulong *numPointer3 = (ulong *)dataBuffer; * numPointer3 = (ulong)data; (*dataDescriptor).DataPointer = (ulong)numPointer3; } else if (data is char) { (*dataDescriptor).Size = 2; char *chrPointer = (char *)dataBuffer; * chrPointer = (char)data; (*dataDescriptor).DataPointer = (ulong)chrPointer; } else if (data is byte) { (*dataDescriptor).Size = 1; byte *numPointer4 = dataBuffer; * numPointer4 = (byte)data; (*dataDescriptor).DataPointer = (ulong)numPointer4; } else if (data is short) { (*dataDescriptor).Size = 2; short *numPointer5 = (short *)dataBuffer; * numPointer5 = (short)data; (*dataDescriptor).DataPointer = (ulong)numPointer5; } else if (data is sbyte) { (*dataDescriptor).Size = 1; sbyte *numPointer6 = (sbyte *)dataBuffer; * numPointer6 = (sbyte)data; (*dataDescriptor).DataPointer = (ulong)numPointer6; } else if (data is ushort) { (*dataDescriptor).Size = 2; ushort *numPointer7 = (ushort *)dataBuffer; * numPointer7 = (ushort)data; (*dataDescriptor).DataPointer = (ulong)numPointer7; } else if (data is float) { (*dataDescriptor).Size = 4; float *singlePointer = (float *)dataBuffer; * singlePointer = (float)data; (*dataDescriptor).DataPointer = (ulong)singlePointer; } else if (data is double) { (*dataDescriptor).Size = 8; double *numPointer8 = (double *)dataBuffer; * numPointer8 = (double)data; (*dataDescriptor).DataPointer = (ulong)numPointer8; } else if (data is bool) { (*dataDescriptor).Size = 1; bool *flagPointer = (bool *)dataBuffer; * flagPointer = (bool)data; (*dataDescriptor).DataPointer = (ulong)flagPointer; } else if (data is Guid) { (*dataDescriptor).Size = sizeof(Guid); Guid *guidPointer = (Guid *)dataBuffer; * guidPointer = (Guid)data; (*dataDescriptor).DataPointer = (ulong)guidPointer; } else if (!(data is decimal)) { if (!(data is bool)) { str = data.ToString(); (*dataDescriptor).Size = (uint)((str.Length + 1) * 2); return(str); } (*dataDescriptor).Size = 1; bool *flagPointer1 = (bool *)dataBuffer; * flagPointer1 = (bool)data; (*dataDescriptor).DataPointer = (ulong)flagPointer1; } else { (*dataDescriptor).Size = 16; decimal *numPointer9 = (decimal *)dataBuffer; * numPointer9 = (decimal)data; (*dataDescriptor).DataPointer = (ulong)numPointer9; } return(null); }
internal static extern unsafe uint EventWriteTransfer(long registrationHandle, ref System.Runtime.Diagnostics.EventDescriptor eventDescriptor, ref Guid activityId, ref Guid relatedActivityId, uint userDataCount, UnsafeNativeMethods.EventData *userData);
internal static extern unsafe uint EventWrite(long registrationHandle, ref System.Runtime.Diagnostics.EventDescriptor eventDescriptor, uint userDataCount, UnsafeNativeMethods.EventData *userData);
private static unsafe string EncodeObject(ref object data, UnsafeNativeMethods.EventData *dataDescriptor, byte *dataBuffer) { (*(dataDescriptor)).Reserved = 0; string str = data as string; if (str == null) { if (data as IntPtr == 0) { if (data as int == 0) { if (data as long == 0) { if (data as uint == 0) { if (data as ulong == 0) { if (data as char == 0) { if (data as byte == 0) { if (data as short == 0) { if (data as sbyte == 0) { if (data as ushort == 0) { if (data as float == 0) { if (data as double == 0) { if (!data as bool) { if (data as Guid == null) { if (data as decimal == null) { if (!data as bool) { str = data.ToString(); (*(dataDescriptor)).Size = (str.Length + 1) * 2; return(str); } else { (*(dataDescriptor)).Size = 1; *((bool *)dataBuffer) = (bool)data; (*(dataDescriptor)).DataPointer = (ulong)((bool *)dataBuffer); } } else { (*(dataDescriptor)).Size = 16; *((decimal *)dataBuffer) = (decimal)data; (*(dataDescriptor)).DataPointer = (ulong)((decimal *)dataBuffer); } } else { (*(dataDescriptor)).Size = sizeof(Guid); *((Guid *)dataBuffer) = (Guid)data; (*(dataDescriptor)).DataPointer = (ulong)((Guid *)dataBuffer); } } else { (*(dataDescriptor)).Size = 1; *((bool *)dataBuffer) = (bool)data; (*(dataDescriptor)).DataPointer = (ulong)((bool *)dataBuffer); } } else { (*(dataDescriptor)).Size = 8; *((double *)dataBuffer) = (double)data; (*(dataDescriptor)).DataPointer = (ulong)((double *)dataBuffer); } } else { (*(dataDescriptor)).Size = 4; *((float *)dataBuffer) = (float)data; (*(dataDescriptor)).DataPointer = (ulong)((float *)dataBuffer); } } else { (*(dataDescriptor)).Size = 2; *((ushort *)dataBuffer) = (ushort)data; (*(dataDescriptor)).DataPointer = (ulong)((ushort *)dataBuffer); } } else { (*(dataDescriptor)).Size = 1; *((sbyte *)dataBuffer) = (sbyte)data; (*(dataDescriptor)).DataPointer = (ulong)((sbyte *)dataBuffer); } } else { (*(dataDescriptor)).Size = 2; *((short *)dataBuffer) = (short)data; (*(dataDescriptor)).DataPointer = (ulong)((short *)dataBuffer); } } else { (*(dataDescriptor)).Size = 1; *(dataBuffer) = (byte)data; (*(dataDescriptor)).DataPointer = (ulong)dataBuffer; } } else { (*(dataDescriptor)).Size = 2; *((char *)dataBuffer) = (char)data; (*(dataDescriptor)).DataPointer = (ulong)((char *)dataBuffer); } } else { (*(dataDescriptor)).Size = 8; *((ulong *)dataBuffer) = (ulong)data; (*(dataDescriptor)).DataPointer = (ulong)((ulong *)dataBuffer); } } else { (*(dataDescriptor)).Size = 4; *((uint *)dataBuffer) = (uint)data; (*(dataDescriptor)).DataPointer = (ulong)((uint *)dataBuffer); } } else { (*(dataDescriptor)).Size = 8; *((long *)dataBuffer) = (long)data; (*(dataDescriptor)).DataPointer = (ulong)((long *)dataBuffer); } } else { (*(dataDescriptor)).Size = 4; *((int *)dataBuffer) = (int)data; (*(dataDescriptor)).DataPointer = (ulong)((int *)dataBuffer); } } else { (*(dataDescriptor)).Size = sizeof(IntPtr); *((IntPtr *)dataBuffer) = (IntPtr)data; (*(dataDescriptor)).DataPointer = (ulong)((IntPtr *)dataBuffer); } return(null); } else { (*(dataDescriptor)).Size = (str.Length + 1) * 2; return(str); } }
public unsafe bool WriteTransferEvent(ref EventDescriptor eventDescriptor, EventTraceActivity eventTraceActivity, Guid relatedActivityId, object[] eventPayload) { if (eventTraceActivity == null) { eventTraceActivity = EventTraceActivity.Empty; } uint num = 0; if (this.IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { if (eventPayload == null || (int)eventPayload.Length == 0) { num = UnsafeNativeMethods.EventWriteTransfer(this.traceRegistrationHandle, ref eventDescriptor, ref eventTraceActivity.ActivityId, ref relatedActivityId, 0, 0); } else { int length = (int)eventPayload.Length; if (length <= 32) { uint size = 0; int num1 = 0; int[] numArray = new int[8]; string[] strArrays = new string[8]; UnsafeNativeMethods.EventData *eventDataPointer = (UnsafeNativeMethods.EventData *)length * sizeof(UnsafeNativeMethods.EventData); UnsafeNativeMethods.EventData *eventDataPointer1 = eventDataPointer; byte *numPointer = (byte *)16 * length; byte *numPointer1 = numPointer; for (int i = 0; i < (int)eventPayload.Length; i++) { if (eventPayload[i] != null) { string str = DiagnosticsEventProvider.EncodeObject(ref eventPayload[i], eventDataPointer1, numPointer1); numPointer1 = numPointer1 + 16; size = size + (*(eventDataPointer1)).Size; eventDataPointer1 = (UnsafeNativeMethods.EventData *)(eventDataPointer1 + sizeof(UnsafeNativeMethods.EventData)); if (str != null) { if (num1 >= 8) { throw Fx.Exception.AsError(new ArgumentOutOfRangeException("eventPayload", InternalSR.EtwAPIMaxStringCountExceeded(8))); } else { strArrays[num1] = str; numArray[num1] = i; num1++; } } } } if (size <= 0xffca) { fixed(string str1 = strArrays[0]) { string *strPointers = &str1; char * offsetToStringData = (char *)(&str1); if (&str1 != null) { offsetToStringData = (char *)(strPointers + RuntimeHelpers.OffsetToStringData); } char *chrPointer = offsetToStringData; fixed(string str2 = strArrays[1]) { string *strPointers1 = &str2; char * offsetToStringData1 = (char *)(&str2); if (&str2 != null) { offsetToStringData1 = (char *)(strPointers1 + RuntimeHelpers.OffsetToStringData); } char *chrPointer1 = offsetToStringData1; fixed(string str3 = strArrays[2]) { string *strPointers2 = &str3; char * offsetToStringData2 = (char *)(&str3); if (&str3 != null) { offsetToStringData2 = (char *)(strPointers2 + RuntimeHelpers.OffsetToStringData); } char *chrPointer2 = offsetToStringData2; fixed(string str4 = strArrays[3]) { string *strPointers3 = &str4; char * offsetToStringData3 = (char *)(&str4); if (&str4 != null) { offsetToStringData3 = (char *)(strPointers3 + RuntimeHelpers.OffsetToStringData); } char *chrPointer3 = offsetToStringData3; fixed(string str5 = strArrays[4]) { string *strPointers4 = &str5; char * offsetToStringData4 = (char *)(&str5); if (&str5 != null) { offsetToStringData4 = (char *)(strPointers4 + RuntimeHelpers.OffsetToStringData); } char *chrPointer4 = offsetToStringData4; fixed(string str6 = strArrays[5]) { string *strPointers5 = &str6; char * offsetToStringData5 = (char *)(&str6); if (&str6 != null) { offsetToStringData5 = (char *)(strPointers5 + RuntimeHelpers.OffsetToStringData); } char *chrPointer5 = offsetToStringData5; fixed(string str7 = strArrays[6]) { string *strPointers6 = &str7; char * offsetToStringData6 = (char *)(&str7); if (&str7 != null) { offsetToStringData6 = (char *)(strPointers6 + RuntimeHelpers.OffsetToStringData); } char *chrPointer6 = offsetToStringData6; fixed(string str8 = strArrays[7]) { string *strPointers7 = &str8; char * offsetToStringData7 = (char *)(&str8); if (&str8 != null) { offsetToStringData7 = (char *)(strPointers7 + RuntimeHelpers.OffsetToStringData); } char *chrPointer7 = offsetToStringData7; eventDataPointer1 = eventDataPointer; if (strArrays[0] != null) { (eventDataPointer1 + numArray[0] * sizeof(UnsafeNativeMethods.EventData)).DataPointer = (ulong)chrPointer; } if (strArrays[1] != null) { (eventDataPointer1 + numArray[1] * sizeof(UnsafeNativeMethods.EventData)).DataPointer = (ulong)chrPointer1; } if (strArrays[2] != null) { (eventDataPointer1 + numArray[2] * sizeof(UnsafeNativeMethods.EventData)).DataPointer = (ulong)chrPointer2; } if (strArrays[3] != null) { (eventDataPointer1 + numArray[3] * sizeof(UnsafeNativeMethods.EventData)).DataPointer = (ulong)chrPointer3; } if (strArrays[4] != null) { (eventDataPointer1 + numArray[4] * sizeof(UnsafeNativeMethods.EventData)).DataPointer = (ulong)chrPointer4; } if (strArrays[5] != null) { (eventDataPointer1 + numArray[5] * sizeof(UnsafeNativeMethods.EventData)).DataPointer = (ulong)chrPointer5; } if (strArrays[6] != null) { (eventDataPointer1 + numArray[6] * sizeof(UnsafeNativeMethods.EventData)).DataPointer = (ulong)chrPointer6; } if (strArrays[7] != null) { (eventDataPointer1 + numArray[7] * sizeof(UnsafeNativeMethods.EventData)).DataPointer = (ulong)chrPointer7; } num = UnsafeNativeMethods.EventWriteTransfer(this.traceRegistrationHandle, ref eventDescriptor, ref eventTraceActivity.ActivityId, ref relatedActivityId, length, eventDataPointer); } } } } } } } } } else { DiagnosticsEventProvider.errorCode = DiagnosticsEventProvider.WriteEventErrorCode.EventTooBig; return(false); } } else { throw Fx.Exception.AsError(new ArgumentOutOfRangeException("eventPayload", InternalSR.EtwMaxNumberArgumentsExceeded(32))); } } } if (num == 0) { return(true); } else { DiagnosticsEventProvider.SetLastError(num); return(false); } }
internal static extern unsafe uint EventWrite([In] long registrationHandle, [In] ref System.Diagnostics.Eventing.EventDescriptor eventDescriptor, [In] uint userDataCount, [In] UnsafeNativeMethods.EventData *userData);