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); }
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); }
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 = GetActivityId(); if ((eventPayload != null) && (eventPayload.Length != 0)) { int length = eventPayload.Length; if (length > 0x20) { throw Fx.Exception.AsError(new ArgumentOutOfRangeException("eventPayload", SRCore.EtwMaxNumberArgumentsExceeded(0x20))); } uint num3 = 0; int index = 0; int[] numArray = new int[8]; string[] strArray = new string[8]; System.Runtime.Interop.UnsafeNativeMethods.EventData *userData = (System.Runtime.Interop.UnsafeNativeMethods.EventData *) stackalloc byte[(((IntPtr)length) * sizeof(System.Runtime.Interop.UnsafeNativeMethods.EventData))]; System.Runtime.Interop.UnsafeNativeMethods.EventData *dataDescriptor = userData; byte *dataBuffer = stackalloc byte[(IntPtr)(0x10 * length)]; for (int i = 0; i < eventPayload.Length; i++) { if (eventPayload[i] != null) { string str = EncodeObject(ref eventPayload[i], dataDescriptor, dataBuffer); dataBuffer += 0x10; num3 += dataDescriptor->Size; dataDescriptor++; if (str != null) { if (index >= 8) { throw Fx.Exception.AsError(new ArgumentOutOfRangeException("eventPayload", SRCore.EtwAPIMaxStringCountExceeded(8))); } strArray[index] = str; numArray[index] = i; index++; } } } if (num3 > 0xffca) { errorCode = WriteEventErrorCode.EventTooBig; return(false); } fixed(char *str2 = ((char *)strArray[0])) { char *chPtr = str2; fixed(char *str3 = ((char *)strArray[1])) { char *chPtr2 = str3; fixed(char *str4 = ((char *)strArray[2])) { char *chPtr3 = str4; fixed(char *str5 = ((char *)strArray[3])) { char *chPtr4 = str5; fixed(char *str6 = ((char *)strArray[4])) { char *chPtr5 = str6; fixed(char *str7 = ((char *)strArray[5])) { char *chPtr6 = str7; fixed(char *str8 = ((char *)strArray[6])) { char *chPtr7 = str8; fixed(char *str9 = ((char *)strArray[7])) { char *chPtr8 = str9; dataDescriptor = userData; if (strArray[0] != null) { dataDescriptor[numArray[0]].DataPointer = (ulong)chPtr; } if (strArray[1] != null) { dataDescriptor[numArray[1]].DataPointer = (ulong)chPtr2; } if (strArray[2] != null) { dataDescriptor[numArray[2]].DataPointer = (ulong)chPtr3; } if (strArray[3] != null) { dataDescriptor[numArray[3]].DataPointer = (ulong)chPtr4; } if (strArray[4] != null) { dataDescriptor[numArray[4]].DataPointer = (ulong)chPtr5; } if (strArray[5] != null) { dataDescriptor[numArray[5]].DataPointer = (ulong)chPtr6; } if (strArray[6] != null) { dataDescriptor[numArray[6]].DataPointer = (ulong)chPtr7; } if (strArray[7] != null) { dataDescriptor[numArray[7]].DataPointer = (ulong)chPtr8; } num = System.Runtime.Interop.UnsafeNativeMethods.EventWriteTransfer(this.traceRegistrationHandle, ref eventDescriptor, ref activityId, ref relatedActivityId, (uint)length, userData); } } } } } } } } str4 = null; str5 = null; str6 = null; str7 = null; str8 = null; str9 = null; } else { num = System.Runtime.Interop.UnsafeNativeMethods.EventWriteTransfer(this.traceRegistrationHandle, ref eventDescriptor, ref activityId, ref relatedActivityId, 0, null); } } if (num != 0) { SetLastError((int)num); return(false); } return(true); }