예제 #1
0
        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);
        }
예제 #4
0
        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);
        }
예제 #7
0
        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;
            }
        }
예제 #9
0
        //
        // 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;
            }
        }
예제 #10
0
        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);
        }
예제 #13
0
        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);
        }
예제 #14
0
        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);
        }
예제 #15
0
        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;
 }
예제 #17
0
        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;
        }
예제 #18
0
        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;
        }
예제 #20
0
        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);
        }
예제 #21
0
        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;
        }
예제 #22
0
        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; 
        }
예제 #23
0
 //
 // 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;
 }
예제 #26
0
        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;
        }
예제 #27
0
        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;
        }
예제 #29
0
        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);
        }
예제 #30
0
        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;
 }
예제 #33
0
        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);
        }
        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 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;
 }