public bool WriteMessageEvent(string eventMessage, byte eventLevel, long eventKeywords) { int status = 0; if (eventMessage == null) { throw Fx.Exception.AsError(new ArgumentNullException("eventMessage")); } if (IsEnabled(eventLevel, eventKeywords)) { if (eventMessage.Length > traceEventMaximumStringSize) { errorCode = WriteEventErrorCode.EventTooBig; return(false); } unsafe { fixed(char *pdata = eventMessage) { status = (int)UnsafeNativeMethods.EventWriteString(this.traceRegistrationHandle, eventLevel, eventKeywords, pdata); } if (status != 0) { SetLastError(status); return(false); } } } return(true); }
public unsafe bool WriteMessageEvent(string eventMessage, byte eventLevel, long eventKeywords) { int error = 0; if (eventMessage == null) { throw Fx.Exception.AsError(new ArgumentNullException("eventMessage")); } if (this.IsEnabled(eventLevel, eventKeywords)) { if (eventMessage.Length > 0x7fd4) { errorCode = WriteEventErrorCode.EventTooBig; return(false); } fixed(char *str = ((char *)eventMessage)) { char *message = str; error = (int)System.Runtime.Interop.UnsafeNativeMethods.EventWriteString(this.traceRegistrationHandle, eventLevel, eventKeywords, message); } if (error != 0) { SetLastError(error); return(false); } } return(true); }
public unsafe bool WriteEvent(ref EventDescriptorInternal eventDescriptor, string data) { uint num = 0; if (data == null) { throw new ArgumentNullException("dataString"); } if (this.IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { EventData data2; if (data.Length > 0x7fd4) { s_returnCode = WriteEventErrorCode.EventTooBig; return(false); } data2.Size = (uint)((data.Length + 1) * 2); data2.Reserved = 0; fixed(char *str = ((char *)data)) { char *chPtr = str; data2.Ptr = (ulong)chPtr; num = this.EventWrite(ref eventDescriptor, 1, &data2); } } if (num != 0) { SetLastError((int)num); return(false); } return(true); }
public unsafe bool WriteMessageEvent(string eventMessage, byte eventLevel, long eventKeywords) { int error = 0; if (eventMessage == null) { throw new ArgumentNullException("eventMessage"); } if (this.IsEnabled(eventLevel, eventKeywords)) { if (eventMessage.Length > 0x7fd4) { t_returnCode = WriteEventErrorCode.EventTooBig; return(false); } /* TODO: REVIEW: * fixed (char* str = ((char*) eventMessage)) * { * char* message = str; * error = (int) Microsoft.Win32.UnsafeNativeMethods.EventWriteString(this.m_regHandle, eventLevel, eventKeywords, message); * } */ if (error != 0) { SetLastError(error); return(false); } } return(true); }
public unsafe bool WriteMessageEvent(string eventMessage, byte eventLevel, long eventKeywords) { int error = 0; if (eventMessage == null) { throw new ArgumentNullException("eventMessage"); } if (this.IsEnabled(eventLevel, eventKeywords)) { if (eventMessage.Length > 0x7fd4) { s_returnCode = WriteEventErrorCode.EventTooBig; return(false); } fixed(char *str = ((char *)eventMessage)) { char *message = str; error = (int)this.EventWriteString(eventLevel, eventKeywords, message); } if (error != 0) { SetLastError(error); return(false); } } return(true); }
public unsafe bool WriteEvent(ref EventDescriptor eventDescriptor, string data) { uint num = 0; data = data ?? string.Empty; if (this.IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { System.Runtime.Interop.UnsafeNativeMethods.EventData data2; if (data.Length > 0x7fd4) { errorCode = WriteEventErrorCode.EventTooBig; return(false); } SetActivityId(ref GetActivityId()); data2.Size = (uint)((data.Length + 1) * 2); data2.Reserved = 0; fixed(char *str = ((char *)data)) { char *chPtr = str; data2.DataPointer = (ulong)chPtr; num = System.Runtime.Interop.UnsafeNativeMethods.EventWrite(this.traceRegistrationHandle, ref eventDescriptor, 1, &data2); } } if (num != 0) { SetLastError((int)num); return(false); } return(true); }
public bool WriteEvent(ref EventDescriptor eventDescriptor, string data) { uint status = 0; if (data == null) { throw new ArgumentNullException("dataString"); } if (IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { if (data.Length > s_traceEventMaximumStringSize) { t_returnCode = WriteEventErrorCode.EventTooBig; return(false); } EventData userData; userData.Size = (uint)((data.Length + 1) * 2); userData.Reserved = 0; unsafe { fixed(char *pdata = data) { Guid activityId = GetActivityId(); userData.DataPointer = (ulong)pdata; if (s_preWin7) { status = UnsafeNativeMethods.EventWrite(m_regHandle, ref eventDescriptor, 1, &userData); } else { status = UnsafeNativeMethods.EventWriteTransfer(m_regHandle, ref eventDescriptor, (activityId == Guid.Empty) ? null : &activityId, null, 1, &userData); } } } } if (status != 0) { SetLastError((int)status); return(false); } return(true); }
private static void SetLastError(int error) { switch (error) { case 8: s_returnCode = WriteEventErrorCode.NoFreeBuffers; break; case 0xea: case 0x216: s_returnCode = WriteEventErrorCode.EventTooBig; break; } }
// // Helper function to set the last error on the thread // static void SetLastError(int error) { switch (error) { case UnsafeNativeMethods.ERROR_ARITHMETIC_OVERFLOW: case UnsafeNativeMethods.ERROR_MORE_DATA: errorCode = WriteEventErrorCode.EventTooBig; break; case UnsafeNativeMethods.ERROR_NOT_ENOUGH_MEMORY: errorCode = WriteEventErrorCode.NoFreeBuffers; break; } }
public unsafe bool WriteEvent(ref System.Diagnostics.Eventing.EventDescriptor eventDescriptor, string data) { uint num = 0; if (data == null) { throw new ArgumentNullException("dataString"); } if (this.IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { EventData data2; if (data.Length > 0x7fd4) { t_returnCode = WriteEventErrorCode.EventTooBig; return(false); } data2.Size = (uint)((data.Length + 1) * 2); data2.Reserved = 0; /* TODO: REVIEW: * fixed (char* str = ((char*) data)) * { * char* chPtr = str; * Guid activityId = GetActivityId(); * data2.DataPointer = (ulong) chPtr; * if (s_preWin7) * { * num = Microsoft.Win32.UnsafeNativeMethods.EventWrite(this.m_regHandle, ref eventDescriptor, 1, (void*) &data2); * } * else * { * num = Microsoft.Win32.UnsafeNativeMethods.EventWriteTransfer(this.m_regHandle, ref eventDescriptor, (activityId == Guid.Empty) ? null : &activityId, null, 1, (void*) &data2); * } * } */ } if (num != 0) { SetLastError((int)num); return(false); } return(true); }
public bool WriteEvent(ref EventDescriptor eventDescriptor, EventTraceActivity eventTraceActivity, string data) { uint status = 0; //check all strings for null data = (data ?? string.Empty); if (IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { if (data.Length > traceEventMaximumStringSize) { errorCode = WriteEventErrorCode.EventTooBig; return(false); } if (eventTraceActivity != null) { SetActivityId(ref eventTraceActivity.ActivityId); } UnsafeNativeMethods.EventData userData; userData.Size = (uint)((data.Length + 1) * 2); userData.Reserved = 0; unsafe { fixed(char *pdata = data) { userData.DataPointer = (ulong)pdata; status = UnsafeNativeMethods.EventWrite(this.traceRegistrationHandle, ref eventDescriptor, 1, &userData); } } } if (status != 0) { SetLastError((int)status); return(false); } return(true); }
public unsafe bool WriteTransferEvent(ref EventDescriptorInternal 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 new ArgumentOutOfRangeException("eventPayload", SRETW.GetString("ArgumentOutOfRange_MaxArgExceeded", new object[] { 0x20 })); } uint num3 = 0; int index = 0; int[] numArray = new int[8]; string[] strArray = new string[8]; EventData *userData = (EventData *)stackalloc byte[(((IntPtr)length) * sizeof(EventData))]; 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 new ArgumentOutOfRangeException("eventPayload", SRETW.GetString("ArgumentOutOfRange_MaxStringsExceeded", new object[] { 8 })); } strArray[index] = str; numArray[index] = i; index++; } } } if (num3 > 0xffca) { s_returnCode = 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]].Ptr = (ulong)chPtr; } if (strArray[1] != null) { dataDescriptor[numArray[1]].Ptr = (ulong)chPtr2; } if (strArray[2] != null) { dataDescriptor[numArray[2]].Ptr = (ulong)chPtr3; } if (strArray[3] != null) { dataDescriptor[numArray[3]].Ptr = (ulong)chPtr4; } if (strArray[4] != null) { dataDescriptor[numArray[4]].Ptr = (ulong)chPtr5; } if (strArray[5] != null) { dataDescriptor[numArray[5]].Ptr = (ulong)chPtr6; } if (strArray[6] != null) { dataDescriptor[numArray[6]].Ptr = (ulong)chPtr7; } if (strArray[7] != null) { dataDescriptor[numArray[7]].Ptr = (ulong)chPtr8; } num = this.EventWriteTransfer(ref eventDescriptor, ref activityId, ref relatedActivityId, (uint)length, userData); } } } } } } } } str4 = null; str5 = null; str6 = null; str7 = null; str8 = null; str9 = null; } else { num = this.EventWriteTransfer(ref eventDescriptor, ref activityId, ref relatedActivityId, 0, null); } } if (num != 0) { SetLastError((int)num); return(false); } return(true); }
public unsafe bool WriteTransferEvent(ref System.Diagnostics.Eventing.EventDescriptor eventDescriptor, Guid relatedActivityId, params object[] eventPayload) { uint num = 0; if (this.IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { Guid activityId = GetActivityId(); int length = 0; EventData dataDescriptor; if ((eventPayload != null) && (eventPayload.Length != 0)) { length = eventPayload.Length; if (length > 0x20) { throw new ArgumentOutOfRangeException("eventPayload", "ArgumentOutOfRange_MaxArgExceeded"); } uint num3 = 0; int index = 0; int[] numArray = new int[8]; string[] strArray = new string[8]; EventData dataPtr2 = new EventData(); dataDescriptor = dataPtr2; byte *dataBuffer = stackalloc byte[(0x10 * length)]; for (int i = 0; i < eventPayload.Length; i++) { string str = EncodeObject(ref eventPayload[i], dataDescriptor, dataBuffer); dataBuffer += 0x10; num3 += dataDescriptor.Size; dataDescriptor.DataPointer++; if (str != null) { if (index >= 8) { throw new ArgumentOutOfRangeException("eventPayload", System.SR.GetString("ArgumentOutOfRange_MaxStringsExceeded", new object[] { 8 })); } strArray[index] = str; numArray[index] = i; index++; } } if (num3 > 0xffca) { t_returnCode = WriteEventErrorCode.EventTooBig; return(false); } /* TODO: Review * 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 = dataPtr2; * 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; * } * } * } * } * } * } * } * } * } */ } string str4 = null; string str5 = null; string str6 = null; string str7 = null; string str8 = null; string str9 = null; if ((relatedActivityId == Guid.Empty) && s_preWin7) { num = Microsoft.Win32.UnsafeNativeMethods.EventWrite(this.m_regHandle, ref eventDescriptor, (uint)length, (void *)IntPtr.Zero); } else { num = Microsoft.Win32.UnsafeNativeMethods.EventWriteTransfer(this.m_regHandle, ref eventDescriptor, (activityId == Guid.Empty) ? null : &activityId, ((relatedActivityId == Guid.Empty) && !s_preWin7) ? null : &relatedActivityId, (uint)length, (void *)IntPtr.Zero); } } if (num != 0) { SetLastError((int)num); return(false); } return(true); }
public bool WriteTransferEvent(ref EventDescriptor eventDescriptor, Guid relatedActivityId, params object[] eventPayload) { uint status = 0; if (IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { Guid activityId = GetActivityId(); unsafe { int argCount = 0; EventData *userDataPtr = null; if ((eventPayload != null) && (eventPayload.Length != 0)) { argCount = eventPayload.Length; if (argCount > s_etwMaxMumberArguments) { // //too many arguments to log // throw new ArgumentOutOfRangeException("eventPayload", SR.GetString(SR.ArgumentOutOfRange_MaxArgExceeded, s_etwMaxMumberArguments)); } uint totalEventSize = 0; int index; int stringIndex = 0; int[] stringPosition = new int[s_etwAPIMaxStringCount]; //used to keep the position of strings in the eventPayload parameter string[] dataString = new string[s_etwAPIMaxStringCount]; // string arrays from the eventPayload parameter EventData *userData = stackalloc EventData[argCount]; // allocation for the data descriptors userDataPtr = (EventData *)userData; byte *dataBuffer = stackalloc byte[s_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++) { string isString; isString = EncodeObject(ref eventPayload[index], userDataPtr, currentBuffer); currentBuffer += s_basicTypeAllocationBufferSize; totalEventSize += userDataPtr->Size; userDataPtr++; if (isString != null) { if (stringIndex < s_etwAPIMaxStringCount) { dataString[stringIndex] = isString; stringPosition[stringIndex] = index; stringIndex++; } else { throw new ArgumentOutOfRangeException("eventPayload", SR.GetString(SR.ArgumentOutOfRange_MaxStringsExceeded, s_etwAPIMaxStringCount)); } } } if (totalEventSize > s_traceEventMaximumSize) { t_returnCode = 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 = (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; } } } if (relatedActivityId == Guid.Empty && s_preWin7) { // If relatedActivityId is Guid.Empty, this is not a real transfer: just call EventWrite(). // For pre-Win7 platforms we cannot set the activityId from CorrelationManager // because we cannot set relatedActivityId to null (Win7 bug 116784) status = UnsafeNativeMethods.EventWrite(m_regHandle, ref eventDescriptor, (uint)argCount, userDataPtr); } else { status = UnsafeNativeMethods.EventWriteTransfer(m_regHandle, ref eventDescriptor, (activityId == Guid.Empty) ? null : &activityId, (relatedActivityId == Guid.Empty && !s_preWin7)? null : &relatedActivityId, (uint)argCount, userDataPtr); } } } if (status != 0) { SetLastError((int)status); return(false); } return(true); }
public unsafe bool WriteEvent(ref System.Diagnostics.Eventing.EventDescriptor eventDescriptor, string data) { uint num = 0; if (data == null) { throw new ArgumentNullException("dataString"); } if (this.IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { EventData data2; if (data.Length > 0x7fd4) { t_returnCode = WriteEventErrorCode.EventTooBig; return false; } data2.Size = (uint) ((data.Length + 1) * 2); data2.Reserved = 0; /* TODO: REVIEW: fixed (char* str = ((char*) data)) { char* chPtr = str; Guid activityId = GetActivityId(); data2.DataPointer = (ulong) chPtr; if (s_preWin7) { num = Microsoft.Win32.UnsafeNativeMethods.EventWrite(this.m_regHandle, ref eventDescriptor, 1, (void*) &data2); } else { num = Microsoft.Win32.UnsafeNativeMethods.EventWriteTransfer(this.m_regHandle, ref eventDescriptor, (activityId == Guid.Empty) ? null : &activityId, null, 1, (void*) &data2); } } */ } if (num != 0) { SetLastError((int) num); return false; } return true; }
public unsafe bool WriteEvent(ref EventDescriptor eventDescriptor, string data) { uint num = 0; data = data ?? string.Empty; if (this.IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { System.Runtime.Interop.UnsafeNativeMethods.EventData data2; if (data.Length > 0x7fd4) { errorCode = WriteEventErrorCode.EventTooBig; return false; } SetActivityId(ref GetActivityId()); data2.Size = (uint) ((data.Length + 1) * 2); data2.Reserved = 0; fixed (char* str = ((char*) data)) { char* chPtr = str; data2.DataPointer = (ulong) chPtr; num = System.Runtime.Interop.UnsafeNativeMethods.EventWrite(this.traceRegistrationHandle, ref eventDescriptor, 1, &data2); } } if (num != 0) { SetLastError((int) num); return false; } return true; }
internal unsafe bool WriteEvent(ref EventDescriptor eventDescriptor, Guid* activityID, Guid* childActivityID, params object[] eventPayload) { int status = 0; if (IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { int argCount = 0; unsafe { argCount = eventPayload.Length; if (argCount > s_etwMaxNumberArguments) { s_returnCode = WriteEventErrorCode.TooManyArgs; return false; } uint totalEventSize = 0; int index; int refObjIndex = 0; List<int> refObjPosition = new List<int>(s_etwAPIMaxRefObjCount); List<object> dataRefObj = new List<object>(s_etwAPIMaxRefObjCount); EventData* userData = stackalloc EventData[2 * argCount]; EventData* userDataPtr = (EventData*)userData; byte* dataBuffer = stackalloc byte[s_basicTypeAllocationBufferSize * 2 * 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. // Calculates the total size of the event by adding the data descriptor // size value set in EncodeObject method. // bool hasNonStringRefArgs = false; for (index = 0; index < eventPayload.Length; index++) { if (eventPayload[index] != null) { object supportedRefObj; supportedRefObj = EncodeObject(ref eventPayload[index], ref userDataPtr, ref currentBuffer, ref totalEventSize); if (supportedRefObj != null) { // EncodeObject advanced userDataPtr to the next empty slot int idx = (int)(userDataPtr - userData - 1); if (!(supportedRefObj is string)) { if (eventPayload.Length + idx + 1 - index > s_etwMaxNumberArguments) { s_returnCode = WriteEventErrorCode.TooManyArgs; return false; } hasNonStringRefArgs = true; } dataRefObj.Add(supportedRefObj); refObjPosition.Add(idx); refObjIndex++; } } else { s_returnCode = WriteEventErrorCode.NullInput; return false; } } // update argCount based on actual number of arguments written to 'userData' argCount = (int)(userDataPtr - userData); if (totalEventSize > s_traceEventMaximumSize) { s_returnCode = WriteEventErrorCode.EventTooBig; return false; } // the optimized path (using "fixed" instead of allocating pinned GCHandles if (!hasNonStringRefArgs && (refObjIndex < s_etwAPIMaxRefObjCount)) { // Fast path: at most 8 string arguments // ensure we have at least s_etwAPIMaxStringCount in dataString, so that // the "fixed" statement below works while (refObjIndex < s_etwAPIMaxRefObjCount) { dataRefObj.Add(null); ++refObjIndex; } // // now fix any string arguments and set the pointer on the data descriptor // fixed (char* v0 = (string)dataRefObj[0], v1 = (string)dataRefObj[1], v2 = (string)dataRefObj[2], v3 = (string)dataRefObj[3], v4 = (string)dataRefObj[4], v5 = (string)dataRefObj[5], v6 = (string)dataRefObj[6], v7 = (string)dataRefObj[7]) { userDataPtr = (EventData*)userData; if (dataRefObj[0] != null) { userDataPtr[refObjPosition[0]].Ptr = (ulong)v0; } if (dataRefObj[1] != null) { userDataPtr[refObjPosition[1]].Ptr = (ulong)v1; } if (dataRefObj[2] != null) { userDataPtr[refObjPosition[2]].Ptr = (ulong)v2; } if (dataRefObj[3] != null) { userDataPtr[refObjPosition[3]].Ptr = (ulong)v3; } if (dataRefObj[4] != null) { userDataPtr[refObjPosition[4]].Ptr = (ulong)v4; } if (dataRefObj[5] != null) { userDataPtr[refObjPosition[5]].Ptr = (ulong)v5; } if (dataRefObj[6] != null) { userDataPtr[refObjPosition[6]].Ptr = (ulong)v6; } if (dataRefObj[7] != null) { userDataPtr[refObjPosition[7]].Ptr = (ulong)v7; } status = UnsafeNativeMethods.ManifestEtw.EventWriteTransferWrapper(m_regHandle, ref eventDescriptor, activityID, childActivityID, argCount, userData); } } else { // Slow path: use pinned handles userDataPtr = (EventData*)userData; GCHandle[] rgGCHandle = new GCHandle[refObjIndex]; for (int i = 0; i < refObjIndex; ++i) { // below we still use "fixed" to avoid taking dependency on the offset of the first field // in the object (the way we would need to if we used GCHandle.AddrOfPinnedObject) rgGCHandle[i] = GCHandle.Alloc(dataRefObj[i], GCHandleType.Pinned); if (dataRefObj[i] is string) { fixed (char* p = (string)dataRefObj[i]) userDataPtr[refObjPosition[i]].Ptr = (ulong)p; } else { fixed (byte* p = (byte[])dataRefObj[i]) userDataPtr[refObjPosition[i]].Ptr = (ulong)p; } } status = UnsafeNativeMethods.ManifestEtw.EventWriteTransferWrapper(m_regHandle, ref eventDescriptor, activityID, childActivityID, argCount, userData); for (int i = 0; i < refObjIndex; ++i) { rgGCHandle[i].Free(); } } } } if (status != 0) { SetLastError((int)status); return false; } return true; }
public bool WriteTransferEvent(ref EventDescriptor eventDescriptor, Guid relatedActivityId, params object[] eventPayload) { uint status = 0; if (IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { Guid activityId = GetActivityId(); unsafe { int argCount = 0; EventData* userDataPtr = null; if ((eventPayload != null) && (eventPayload.Length != 0)) { argCount = eventPayload.Length; if (argCount > s_etwMaxMumberArguments) { // //too many arguments to log // throw new ArgumentOutOfRangeException("eventPayload", SR.GetString(SR.ArgumentOutOfRange_MaxArgExceeded, s_etwMaxMumberArguments)); } uint totalEventSize = 0; int index; int stringIndex = 0; int[] stringPosition = new int[s_etwAPIMaxStringCount]; //used to keep the position of strings in the eventPayload parameter string[] dataString = new string[s_etwAPIMaxStringCount]; // string arrays from the eventPayload parameter EventData* userData = stackalloc EventData[argCount]; // allocation for the data descriptors userDataPtr = (EventData*)userData; byte* dataBuffer = stackalloc byte[s_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++) { string isString; isString = EncodeObject(ref eventPayload[index], userDataPtr, currentBuffer); currentBuffer += s_basicTypeAllocationBufferSize; totalEventSize += userDataPtr->Size; userDataPtr++; if (isString != null) { if (stringIndex < s_etwAPIMaxStringCount) { dataString[stringIndex] = isString; stringPosition[stringIndex] = index; stringIndex++; } else { throw new ArgumentOutOfRangeException("eventPayload", SR.GetString(SR.ArgumentOutOfRange_MaxStringsExceeded, s_etwAPIMaxStringCount)); } } } if (totalEventSize > s_traceEventMaximumSize) { t_returnCode = 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 = (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; } } } if (relatedActivityId == Guid.Empty && s_preWin7) { // If relatedActivityId is Guid.Empty, this is not a real transfer: just call EventWrite(). // For pre-Win7 platforms we cannot set the activityId from CorrelationManager // because we cannot set relatedActivityId to null (Win7 bug 116784) status = UnsafeNativeMethods.EventWrite (m_regHandle, ref eventDescriptor, (uint)argCount, userDataPtr); } else { status = UnsafeNativeMethods.EventWriteTransfer (m_regHandle, ref eventDescriptor, (activityId == Guid.Empty) ? null : &activityId, (relatedActivityId == Guid.Empty && !s_preWin7)? null : &relatedActivityId, (uint)argCount, userDataPtr); } } } if (status != 0) { SetLastError((int)status); return false; } return true; }
public bool WriteMessageEvent(EventTraceActivity eventTraceActivity, string eventMessage, byte eventLevel, long eventKeywords) { int status = 0; if (eventMessage == null) { throw Fx.Exception.AsError(new ArgumentNullException("eventMessage")); } if (eventTraceActivity != null) { SetActivityId(ref eventTraceActivity.ActivityId); } if (IsEnabled(eventLevel, eventKeywords)) { if (eventMessage.Length > traceEventMaximumStringSize) { errorCode = WriteEventErrorCode.EventTooBig; return false; } unsafe { fixed (char* pdata = eventMessage) { status = (int)UnsafeNativeMethods.EventWriteString(this.traceRegistrationHandle, eventLevel, eventKeywords, pdata); } if (status != 0) { SetLastError(status); return false; } } } return true; }
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 System.Diagnostics.Eventing.EventDescriptor eventDescriptor, Guid relatedActivityId, params object[] eventPayload) { uint num = 0; if (this.IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { Guid activityId = GetActivityId(); int length = 0; EventData dataDescriptor; if ((eventPayload != null) && (eventPayload.Length != 0)) { length = eventPayload.Length; if (length > 0x20) { throw new ArgumentOutOfRangeException("eventPayload", "ArgumentOutOfRange_MaxArgExceeded"); } uint num3 = 0; int index = 0; int[] numArray = new int[8]; string[] strArray = new string[8]; EventData dataPtr2 = new EventData(); dataDescriptor = dataPtr2; byte* dataBuffer = stackalloc byte[(0x10 * length)]; for (int i = 0; i < eventPayload.Length; i++) { string str = EncodeObject(ref eventPayload[i], dataDescriptor, dataBuffer); dataBuffer += 0x10; num3 += dataDescriptor.Size; dataDescriptor.DataPointer++; if (str != null) { if (index >= 8) { throw new ArgumentOutOfRangeException("eventPayload", System.SR.GetString("ArgumentOutOfRange_MaxStringsExceeded", new object[] { 8 })); } strArray[index] = str; numArray[index] = i; index++; } } if (num3 > 0xffca) { t_returnCode = WriteEventErrorCode.EventTooBig; return false; } /* TODO: Review 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 = dataPtr2; 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; } } } } } } } } } */ } string str4 = null; string str5 = null; string str6 = null; string str7 = null; string str8 = null; string str9 = null; if ((relatedActivityId == Guid.Empty) && s_preWin7) { num = Microsoft.Win32.UnsafeNativeMethods.EventWrite(this.m_regHandle, ref eventDescriptor, (uint) length, (void*) IntPtr.Zero); } else { num = Microsoft.Win32.UnsafeNativeMethods.EventWriteTransfer(this.m_regHandle, ref eventDescriptor, (activityId == Guid.Empty) ? null : &activityId, ((relatedActivityId == Guid.Empty) && !s_preWin7) ? null : &relatedActivityId, (uint) length, (void*) IntPtr.Zero); } } if (num != 0) { SetLastError((int) num); return false; } return true; }
public bool WriteEvent(ref EventDescriptorInternal eventDescriptor, string data) { uint status = 0; if (data == null) { throw new ArgumentNullException("dataString"); } if (IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { if (data.Length > s_traceEventMaximumStringSize) { s_returnCode = WriteEventErrorCode.EventTooBig; return false; } EventData userData; userData.Size = (uint)((data.Length + 1) * 2); userData.Reserved = 0; unsafe { fixed (char* pdata = data) { userData.Ptr = (ulong)pdata; status = EventWrite(ref eventDescriptor, 1, &userData); } } } if (status != 0) { SetLastError((int)status); return false; } return true; }
// // Helper function to set the last error on the thread // private static void SetLastError(int error) { switch (error) { case ManifestEtw.ERROR_ARITHMETIC_OVERFLOW: case ManifestEtw.ERROR_MORE_DATA: s_returnCode = WriteEventErrorCode.EventTooBig; break; case ManifestEtw.ERROR_NOT_ENOUGH_MEMORY: s_returnCode = WriteEventErrorCode.NoFreeBuffers; break; } }
public unsafe bool WriteEvent(ref EventDescriptor eventDescriptor, params object[] eventPayload) { uint num = 0; if (this.IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { int length = 0; SetActivityId(ref GetActivityId()); if (((eventPayload == null) || (eventPayload.Length == 0)) || (eventPayload.Length == 1)) { System.Runtime.Interop.UnsafeNativeMethods.EventData data; string str = null; byte * dataBuffer = stackalloc byte[0x10]; data.Size = 0; if ((eventPayload != null) && (eventPayload.Length != 0)) { str = EncodeObject(ref eventPayload[0], &data, dataBuffer); length = 1; } if (data.Size > 0xffca) { errorCode = WriteEventErrorCode.EventTooBig; return(false); } if (str != null) { fixed(char *str3 = ((char *)str)) { char *chPtr = str3; data.DataPointer = (ulong)chPtr; num = System.Runtime.Interop.UnsafeNativeMethods.EventWrite(this.traceRegistrationHandle, ref eventDescriptor, (uint)length, &data); } } else if (length == 0) { num = System.Runtime.Interop.UnsafeNativeMethods.EventWrite(this.traceRegistrationHandle, ref eventDescriptor, 0, null); } else { num = System.Runtime.Interop.UnsafeNativeMethods.EventWrite(this.traceRegistrationHandle, ref eventDescriptor, (uint)length, &data); } } else { 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 *numPtr3 = stackalloc byte[(IntPtr)(0x10 * length)]; for (int i = 0; i < eventPayload.Length; i++) { if (eventPayload[i] != null) { string str2 = EncodeObject(ref eventPayload[i], dataDescriptor, numPtr3); numPtr3 += 0x10; num3 += dataDescriptor->Size; dataDescriptor++; if (str2 != null) { if (index >= 8) { throw Fx.Exception.AsError(new ArgumentOutOfRangeException("eventPayload", SRCore.EtwAPIMaxStringCountExceeded(8))); } strArray[index] = str2; numArray[index] = i; index++; } } } if (num3 > 0xffca) { errorCode = WriteEventErrorCode.EventTooBig; return(false); } fixed(char *str4 = ((char *)strArray[0])) { char *chPtr2 = str4; fixed(char *str5 = ((char *)strArray[1])) { char *chPtr3 = str5; fixed(char *str6 = ((char *)strArray[2])) { char *chPtr4 = str6; fixed(char *str7 = ((char *)strArray[3])) { char *chPtr5 = str7; fixed(char *str8 = ((char *)strArray[4])) { char *chPtr6 = str8; fixed(char *str9 = ((char *)strArray[5])) { char *chPtr7 = str9; fixed(char *str10 = ((char *)strArray[6])) { char *chPtr8 = str10; fixed(char *str11 = ((char *)strArray[7])) { char *chPtr9 = str11; dataDescriptor = userData; if (strArray[0] != null) { dataDescriptor[numArray[0]].DataPointer = (ulong)chPtr2; } if (strArray[1] != null) { dataDescriptor[numArray[1]].DataPointer = (ulong)chPtr3; } if (strArray[2] != null) { dataDescriptor[numArray[2]].DataPointer = (ulong)chPtr4; } if (strArray[3] != null) { dataDescriptor[numArray[3]].DataPointer = (ulong)chPtr5; } if (strArray[4] != null) { dataDescriptor[numArray[4]].DataPointer = (ulong)chPtr6; } if (strArray[5] != null) { dataDescriptor[numArray[5]].DataPointer = (ulong)chPtr7; } if (strArray[6] != null) { dataDescriptor[numArray[6]].DataPointer = (ulong)chPtr8; } if (strArray[7] != null) { dataDescriptor[numArray[7]].DataPointer = (ulong)chPtr9; } num = System.Runtime.Interop.UnsafeNativeMethods.EventWrite(this.traceRegistrationHandle, ref eventDescriptor, (uint)length, userData); } } } } } } } } str6 = null; str7 = null; str8 = null; str9 = null; str10 = null; str11 = null; } } if (num != 0) { SetLastError((int)num); return(false); } return(true); }
public unsafe bool WriteMessageEvent(string eventMessage, byte eventLevel, long eventKeywords) { int error = 0; if (eventMessage == null) { throw Fx.Exception.AsError(new ArgumentNullException("eventMessage")); } if (this.IsEnabled(eventLevel, eventKeywords)) { if (eventMessage.Length > 0x7fd4) { errorCode = WriteEventErrorCode.EventTooBig; return false; } fixed (char* str = ((char*) eventMessage)) { char* message = str; error = (int) System.Runtime.Interop.UnsafeNativeMethods.EventWriteString(this.traceRegistrationHandle, eventLevel, eventKeywords, message); } if (error != 0) { SetLastError(error); return false; } } return true; }
public bool WriteMessageEvent(string eventMessage, byte eventLevel, long eventKeywords) { int status = 0; if (eventMessage == null) { throw new ArgumentNullException("eventMessage"); } if (IsEnabled(eventLevel, eventKeywords)) { if (eventMessage.Length > s_traceEventMaximumStringSize) { t_returnCode = WriteEventErrorCode.EventTooBig; return false; } unsafe { fixed (char* pdata = eventMessage) { status = (int)UnsafeNativeMethods.EventWriteString(m_regHandle, eventLevel, eventKeywords, pdata); } if (status != 0) { SetLastError(status); return false; } } } return true; }
public bool WriteEvent(ref EventDescriptor eventDescriptor, string data) { uint status = 0; if (data == null) { throw new ArgumentNullException("dataString"); } if (IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { if (data.Length > s_traceEventMaximumStringSize) { t_returnCode = WriteEventErrorCode.EventTooBig; return false; } EventData userData; userData.Size = (uint)((data.Length +1)* 2); userData.Reserved = 0; unsafe { fixed (char* pdata = data) { Guid activityId = GetActivityId(); userData.DataPointer = (ulong)pdata; if (s_preWin7) { status = UnsafeNativeMethods.EventWrite(m_regHandle, ref eventDescriptor, 1, &userData); } else { status = UnsafeNativeMethods.EventWriteTransfer(m_regHandle, ref eventDescriptor, (activityId == Guid.Empty) ? null : &activityId, null, 1, &userData); } } } } if (status != 0) { SetLastError((int)status); return false; } return true; }
public bool WriteEvent(ref EventDescriptor eventDescriptor, EventTraceActivity eventTraceActivity, string data) { uint status = 0; //check all strings for null data = (data ?? string.Empty); if (IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { if (data.Length > traceEventMaximumStringSize) { errorCode = WriteEventErrorCode.EventTooBig; return false; } if (eventTraceActivity != null) { SetActivityId(ref eventTraceActivity.ActivityId); } UnsafeNativeMethods.EventData userData; userData.Size = (uint)((data.Length + 1) * 2); userData.Reserved = 0; unsafe { fixed (char* pdata = data) { userData.DataPointer = (ulong)pdata; status = UnsafeNativeMethods.EventWrite(this.traceRegistrationHandle, ref eventDescriptor, 1, &userData); } } } if (status != 0) { SetLastError((int)status); return false; } return true; }
internal unsafe bool WriteEvent(ref EventDescriptor eventDescriptor, Guid *childActivityID, params object[] eventPayload) { int status = 0; if (IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { int argCount = 0; unsafe { argCount = eventPayload.Length; if (argCount > s_etwMaxMumberArguments) { s_returnCode = WriteEventErrorCode.TooManyArgs; return(false); } uint totalEventSize = 0; int index; int stringIndex = 0; List <int> stringPosition = new List <int>(s_etwAPIMaxStringCount); List <string> dataString = new List <string>(s_etwAPIMaxStringCount); EventData * userData = stackalloc EventData[argCount]; EventData * userDataPtr = (EventData *)userData; byte * dataBuffer = stackalloc byte[s_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. // Calculates the total size of the event by adding the data descriptor // size value set in EncodeObject method. // for (index = 0; index < eventPayload.Length; index++) { if (eventPayload[index] != null) { string isString; isString = EncodeObject(ref eventPayload[index], userDataPtr, currentBuffer); currentBuffer += s_basicTypeAllocationBufferSize; totalEventSize += userDataPtr->Size; userDataPtr++; if (isString != null) { dataString.Add(isString); stringPosition.Add(index); stringIndex++; } } else { s_returnCode = WriteEventErrorCode.NullInput; return(false); } } if (totalEventSize > s_traceEventMaximumSize) { s_returnCode = WriteEventErrorCode.EventTooBig; return(false); } if (stringIndex < s_etwAPIMaxStringCount) { // Fast path: at most 8 string arguments // ensure we have at least s_etwAPIMaxStringCount in dataString, so that // the "fixed" statement below works while (stringIndex < s_etwAPIMaxStringCount) { dataString.Add(null); ++stringIndex; } // // 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 = (EventData *)userData; if (dataString[0] != null) { userDataPtr[stringPosition[0]].Ptr = (ulong)v0; } if (dataString[1] != null) { userDataPtr[stringPosition[1]].Ptr = (ulong)v1; } if (dataString[2] != null) { userDataPtr[stringPosition[2]].Ptr = (ulong)v2; } if (dataString[3] != null) { userDataPtr[stringPosition[3]].Ptr = (ulong)v3; } if (dataString[4] != null) { userDataPtr[stringPosition[4]].Ptr = (ulong)v4; } if (dataString[5] != null) { userDataPtr[stringPosition[5]].Ptr = (ulong)v5; } if (dataString[6] != null) { userDataPtr[stringPosition[6]].Ptr = (ulong)v6; } if (dataString[7] != null) { userDataPtr[stringPosition[7]].Ptr = (ulong)v7; } if (childActivityID == null) { status = UnsafeNativeMethods.ManifestEtw.EventWrite(m_regHandle, ref eventDescriptor, argCount, userData); } else { status = UnsafeNativeMethods.ManifestEtw.EventWriteTransfer(m_regHandle, ref eventDescriptor, null, childActivityID, argCount, userData); } } } else { // Slow path: use pinned handles userDataPtr = (EventData *)userData; GCHandle[] rgGCHandle = new GCHandle[stringIndex]; for (int i = 0; i < stringIndex; ++i) { rgGCHandle[i] = GCHandle.Alloc(dataString[i], GCHandleType.Pinned); fixed(char *p = dataString[i]) userDataPtr[stringPosition[i]].Ptr = (ulong)p; } if (childActivityID == null) { status = UnsafeNativeMethods.ManifestEtw.EventWrite(m_regHandle, ref eventDescriptor, argCount, userData); } else { status = UnsafeNativeMethods.ManifestEtw.EventWriteTransfer(m_regHandle, ref eventDescriptor, null, childActivityID, argCount, userData); } for (int i = 0; i < stringIndex; ++i) { rgGCHandle[i].Free(); } } } } if (status != 0) { SetLastError((int)status); return(false); } return(true); }
public unsafe bool WriteMessageEvent(string eventMessage, byte eventLevel, long eventKeywords) { int error = 0; if (eventMessage == null) { throw new ArgumentNullException("eventMessage"); } if (this.IsEnabled(eventLevel, eventKeywords)) { if (eventMessage.Length > 0x7fd4) { t_returnCode = WriteEventErrorCode.EventTooBig; return false; } /* TODO: REVIEW: fixed (char* str = ((char*) eventMessage)) { char* message = str; error = (int) Microsoft.Win32.UnsafeNativeMethods.EventWriteString(this.m_regHandle, eventLevel, eventKeywords, message); } */ if (error != 0) { SetLastError(error); return false; } } return true; }
internal unsafe bool WriteEvent(ref EventDescriptor eventDescriptor, Guid* childActivityID, params object[] eventPayload) { int status = 0; if (IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { int argCount = 0; unsafe { argCount = eventPayload.Length; if (argCount > s_etwMaxMumberArguments) { s_returnCode = WriteEventErrorCode.TooManyArgs; return false; } uint totalEventSize = 0; int index; int stringIndex = 0; List<int> stringPosition = new List<int>(s_etwAPIMaxStringCount); List<string> dataString = new List<string>(s_etwAPIMaxStringCount); EventData* userData = stackalloc EventData[argCount]; EventData* userDataPtr = (EventData*)userData; byte* dataBuffer = stackalloc byte[s_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. // Calculates the total size of the event by adding the data descriptor // size value set in EncodeObject method. // for (index = 0; index < eventPayload.Length; index++) { if (eventPayload[index] != null) { string isString; isString = EncodeObject(ref eventPayload[index], userDataPtr, currentBuffer); currentBuffer += s_basicTypeAllocationBufferSize; totalEventSize += userDataPtr->Size; userDataPtr++; if (isString != null) { dataString.Add(isString); stringPosition.Add(index); stringIndex++; } } else { s_returnCode = WriteEventErrorCode.NullInput; return false; } } if (totalEventSize > s_traceEventMaximumSize) { s_returnCode = WriteEventErrorCode.EventTooBig; return false; } if (stringIndex < s_etwAPIMaxStringCount) { // Fast path: at most 8 string arguments // ensure we have at least s_etwAPIMaxStringCount in dataString, so that // the "fixed" statement below works while (stringIndex < s_etwAPIMaxStringCount) { dataString.Add(null); ++stringIndex; } // // 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 = (EventData*)userData; if (dataString[0] != null) { userDataPtr[stringPosition[0]].Ptr = (ulong)v0; } if (dataString[1] != null) { userDataPtr[stringPosition[1]].Ptr = (ulong)v1; } if (dataString[2] != null) { userDataPtr[stringPosition[2]].Ptr = (ulong)v2; } if (dataString[3] != null) { userDataPtr[stringPosition[3]].Ptr = (ulong)v3; } if (dataString[4] != null) { userDataPtr[stringPosition[4]].Ptr = (ulong)v4; } if (dataString[5] != null) { userDataPtr[stringPosition[5]].Ptr = (ulong)v5; } if (dataString[6] != null) { userDataPtr[stringPosition[6]].Ptr = (ulong)v6; } if (dataString[7] != null) { userDataPtr[stringPosition[7]].Ptr = (ulong)v7; } if (childActivityID == null) status = UnsafeNativeMethods.ManifestEtw.EventWrite(m_regHandle, ref eventDescriptor, argCount, userData); else status = UnsafeNativeMethods.ManifestEtw.EventWriteTransfer(m_regHandle, ref eventDescriptor, null, childActivityID, argCount, userData); } } else { // Slow path: use pinned handles userDataPtr = (EventData*)userData; GCHandle[] rgGCHandle = new GCHandle[stringIndex]; for (int i = 0; i < stringIndex; ++i) { rgGCHandle[i] = GCHandle.Alloc(dataString[i], GCHandleType.Pinned); fixed (char* p = dataString[i]) userDataPtr[stringPosition[i]].Ptr = (ulong)p; } if (childActivityID == null) status = UnsafeNativeMethods.ManifestEtw.EventWrite(m_regHandle, ref eventDescriptor, argCount, userData); else status = UnsafeNativeMethods.ManifestEtw.EventWriteTransfer(m_regHandle, ref eventDescriptor, null, childActivityID, argCount, userData); for (int i = 0; i < stringIndex; ++i) { rgGCHandle[i].Free(); } } } } if (status != 0) { SetLastError((int)status); return false; } return true; }
public unsafe bool WriteEvent(ref EventDescriptor eventDescriptor, params object[] eventPayload) { uint num = 0; if (this.IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { int length = 0; SetActivityId(ref GetActivityId()); if (((eventPayload == null) || (eventPayload.Length == 0)) || (eventPayload.Length == 1)) { System.Runtime.Interop.UnsafeNativeMethods.EventData data; string str = null; byte* dataBuffer = stackalloc byte[0x10]; data.Size = 0; if ((eventPayload != null) && (eventPayload.Length != 0)) { str = EncodeObject(ref eventPayload[0], &data, dataBuffer); length = 1; } if (data.Size > 0xffca) { errorCode = WriteEventErrorCode.EventTooBig; return false; } if (str != null) { fixed (char* str3 = ((char*) str)) { char* chPtr = str3; data.DataPointer = (ulong) chPtr; num = System.Runtime.Interop.UnsafeNativeMethods.EventWrite(this.traceRegistrationHandle, ref eventDescriptor, (uint) length, &data); } } else if (length == 0) { num = System.Runtime.Interop.UnsafeNativeMethods.EventWrite(this.traceRegistrationHandle, ref eventDescriptor, 0, null); } else { num = System.Runtime.Interop.UnsafeNativeMethods.EventWrite(this.traceRegistrationHandle, ref eventDescriptor, (uint) length, &data); } } else { 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* numPtr3 = stackalloc byte[(IntPtr) (0x10 * length)]; for (int i = 0; i < eventPayload.Length; i++) { if (eventPayload[i] != null) { string str2 = EncodeObject(ref eventPayload[i], dataDescriptor, numPtr3); numPtr3 += 0x10; num3 += dataDescriptor->Size; dataDescriptor++; if (str2 != null) { if (index >= 8) { throw Fx.Exception.AsError(new ArgumentOutOfRangeException("eventPayload", SRCore.EtwAPIMaxStringCountExceeded(8))); } strArray[index] = str2; numArray[index] = i; index++; } } } if (num3 > 0xffca) { errorCode = WriteEventErrorCode.EventTooBig; return false; } fixed (char* str4 = ((char*) strArray[0])) { char* chPtr2 = str4; fixed (char* str5 = ((char*) strArray[1])) { char* chPtr3 = str5; fixed (char* str6 = ((char*) strArray[2])) { char* chPtr4 = str6; fixed (char* str7 = ((char*) strArray[3])) { char* chPtr5 = str7; fixed (char* str8 = ((char*) strArray[4])) { char* chPtr6 = str8; fixed (char* str9 = ((char*) strArray[5])) { char* chPtr7 = str9; fixed (char* str10 = ((char*) strArray[6])) { char* chPtr8 = str10; fixed (char* str11 = ((char*) strArray[7])) { char* chPtr9 = str11; dataDescriptor = userData; if (strArray[0] != null) { dataDescriptor[numArray[0]].DataPointer = (ulong) chPtr2; } if (strArray[1] != null) { dataDescriptor[numArray[1]].DataPointer = (ulong) chPtr3; } if (strArray[2] != null) { dataDescriptor[numArray[2]].DataPointer = (ulong) chPtr4; } if (strArray[3] != null) { dataDescriptor[numArray[3]].DataPointer = (ulong) chPtr5; } if (strArray[4] != null) { dataDescriptor[numArray[4]].DataPointer = (ulong) chPtr6; } if (strArray[5] != null) { dataDescriptor[numArray[5]].DataPointer = (ulong) chPtr7; } if (strArray[6] != null) { dataDescriptor[numArray[6]].DataPointer = (ulong) chPtr8; } if (strArray[7] != null) { dataDescriptor[numArray[7]].DataPointer = (ulong) chPtr9; } num = System.Runtime.Interop.UnsafeNativeMethods.EventWrite(this.traceRegistrationHandle, ref eventDescriptor, (uint) length, userData); } } } } } } } } str6 = null; str7 = null; str8 = null; str9 = null; str10 = null; str11 = null; } } if (num != 0) { SetLastError((int) num); return false; } return true; }
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 WriteEvent(ref EventDescriptorInternal eventDescriptor, string data) { uint num = 0; if (data == null) { throw new ArgumentNullException("dataString"); } if (this.IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { EventData data2; if (data.Length > 0x7fd4) { s_returnCode = WriteEventErrorCode.EventTooBig; return false; } data2.Size = (uint) ((data.Length + 1) * 2); data2.Reserved = 0; fixed (char* str = ((char*) data)) { char* chPtr = str; data2.Ptr = (ulong) chPtr; num = this.EventWrite(ref eventDescriptor, 1, &data2); } } if (num != 0) { SetLastError((int) num); return false; } return true; }
public bool WriteEvent(ref EventDescriptor eventDescriptor, EventTraceActivity eventTraceActivity, params object[] eventPayload) { uint status = 0; if (IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { int argCount = 0; if (eventTraceActivity != null) { SetActivityId(ref eventTraceActivity.ActivityId); } 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", InternalSR.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", InternalSR.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 WriteMessageEvent(string eventMessage, byte eventLevel, long eventKeywords) { int error = 0; if (eventMessage == null) { throw new ArgumentNullException("eventMessage"); } if (this.IsEnabled(eventLevel, eventKeywords)) { if (eventMessage.Length > 0x7fd4) { s_returnCode = WriteEventErrorCode.EventTooBig; return false; } fixed (char* str = ((char*) eventMessage)) { char* message = str; error = (int) this.EventWriteString(eventLevel, eventKeywords, message); } if (error != 0) { SetLastError(error); return false; } } return true; }
public bool WriteTransferEvent(ref EventDescriptor eventDescriptor, EventTraceActivity eventTraceActivity, Guid relatedActivityId, params object[] eventPayload) { // ActivityId is required when writing transfer event if (eventTraceActivity == null) { Fx.Assert(false, "eventTraceActivity should not be null for WriteTransferEvent"); eventTraceActivity = EventTraceActivity.Empty; } uint status = 0; if (IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords)) { 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", InternalSR.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", InternalSR.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 eventTraceActivity.ActivityId, ref relatedActivityId, (uint)argCount, userData); } } else { status = UnsafeNativeMethods.EventWriteTransfer(this.traceRegistrationHandle, ref eventDescriptor, ref eventTraceActivity.ActivityId, ref relatedActivityId, 0, null); } } } if (status != 0) { SetLastError((int)status); return false; } return true; }
public unsafe bool WriteTransferEvent(ref EventDescriptorInternal 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 new ArgumentOutOfRangeException("eventPayload", SRETW.GetString("ArgumentOutOfRange_MaxArgExceeded", new object[] { 0x20 })); } uint num3 = 0; int index = 0; int[] numArray = new int[8]; string[] strArray = new string[8]; EventData* userData = (EventData*) stackalloc byte[(((IntPtr) length) * sizeof(EventData))]; 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 new ArgumentOutOfRangeException("eventPayload", SRETW.GetString("ArgumentOutOfRange_MaxStringsExceeded", new object[] { 8 })); } strArray[index] = str; numArray[index] = i; index++; } } } if (num3 > 0xffca) { s_returnCode = 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]].Ptr = (ulong) chPtr; } if (strArray[1] != null) { dataDescriptor[numArray[1]].Ptr = (ulong) chPtr2; } if (strArray[2] != null) { dataDescriptor[numArray[2]].Ptr = (ulong) chPtr3; } if (strArray[3] != null) { dataDescriptor[numArray[3]].Ptr = (ulong) chPtr4; } if (strArray[4] != null) { dataDescriptor[numArray[4]].Ptr = (ulong) chPtr5; } if (strArray[5] != null) { dataDescriptor[numArray[5]].Ptr = (ulong) chPtr6; } if (strArray[6] != null) { dataDescriptor[numArray[6]].Ptr = (ulong) chPtr7; } if (strArray[7] != null) { dataDescriptor[numArray[7]].Ptr = (ulong) chPtr8; } num = this.EventWriteTransfer(ref eventDescriptor, ref activityId, ref relatedActivityId, (uint) length, userData); } } } } } } } } str4 = null; str5 = null; str6 = null; str7 = null; str8 = null; str9 = null; } else { num = this.EventWriteTransfer(ref eventDescriptor, ref activityId, ref relatedActivityId, 0, null); } } if (num != 0) { SetLastError((int) num); return false; } return true; }