예제 #1
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);
        }
예제 #2
0
        static unsafe string EncodeObject(ref object data, UnsafeNativeMethods.EventData *dataDescriptor, byte *dataBuffer)
        {
            dataDescriptor->Reserved = 0;

            string sRet = data as string;

            if (sRet != null)
            {
                dataDescriptor->Size = (uint)((sRet.Length + 1) * 2);
                return(sRet);
            }

            if (data is IntPtr)
            {
                dataDescriptor->Size = (uint)sizeof(IntPtr);
                IntPtr *intptrPtr = (IntPtr *)dataBuffer;
                *       intptrPtr = (IntPtr)data;
                dataDescriptor->DataPointer = (ulong)intptrPtr;
            }
            else if (data is int)
            {
                dataDescriptor->Size = (uint)sizeof(int);
                int *intptrPtr = (int *)dataBuffer;
                *    intptrPtr = (int)data;
                dataDescriptor->DataPointer = (ulong)intptrPtr;
            }
            else if (data is long)
            {
                dataDescriptor->Size = (uint)sizeof(long);
                long *longptr = (long *)dataBuffer;
                *     longptr = (long)data;
                dataDescriptor->DataPointer = (ulong)longptr;
            }
            else if (data is uint)
            {
                dataDescriptor->Size = (uint)sizeof(uint);
                uint *uintptr = (uint *)dataBuffer;
                *     uintptr = (uint)data;
                dataDescriptor->DataPointer = (ulong)uintptr;
            }
            else if (data is UInt64)
            {
                dataDescriptor->Size = (uint)sizeof(ulong);
                UInt64 *ulongptr = (ulong *)dataBuffer;
                *       ulongptr = (ulong)data;
                dataDescriptor->DataPointer = (ulong)ulongptr;
            }
            else if (data is char)
            {
                dataDescriptor->Size = (uint)sizeof(char);
                char *charptr = (char *)dataBuffer;
                *     charptr = (char)data;
                dataDescriptor->DataPointer = (ulong)charptr;
            }
            else if (data is byte)
            {
                dataDescriptor->Size = (uint)sizeof(byte);
                byte *byteptr = (byte *)dataBuffer;
                *     byteptr = (byte)data;
                dataDescriptor->DataPointer = (ulong)byteptr;
            }
            else if (data is short)
            {
                dataDescriptor->Size = (uint)sizeof(short);
                short *shortptr = (short *)dataBuffer;
                *      shortptr = (short)data;
                dataDescriptor->DataPointer = (ulong)shortptr;
            }
            else if (data is sbyte)
            {
                dataDescriptor->Size = (uint)sizeof(sbyte);
                sbyte *sbyteptr = (sbyte *)dataBuffer;
                *      sbyteptr = (sbyte)data;
                dataDescriptor->DataPointer = (ulong)sbyteptr;
            }
            else if (data is ushort)
            {
                dataDescriptor->Size = (uint)sizeof(ushort);
                ushort *ushortptr = (ushort *)dataBuffer;
                *       ushortptr = (ushort)data;
                dataDescriptor->DataPointer = (ulong)ushortptr;
            }
            else if (data is float)
            {
                dataDescriptor->Size = (uint)sizeof(float);
                float *floatptr = (float *)dataBuffer;
                *      floatptr = (float)data;
                dataDescriptor->DataPointer = (ulong)floatptr;
            }
            else if (data is double)
            {
                dataDescriptor->Size = (uint)sizeof(double);
                double *doubleptr = (double *)dataBuffer;
                *       doubleptr = (double)data;
                dataDescriptor->DataPointer = (ulong)doubleptr;
            }
            else if (data is bool)
            {
                dataDescriptor->Size = (uint)sizeof(bool);
                bool *boolptr = (bool *)dataBuffer;
                *     boolptr = (bool)data;
                dataDescriptor->DataPointer = (ulong)boolptr;
            }
            else if (data is Guid)
            {
                dataDescriptor->Size = (uint)sizeof(Guid);
                Guid *guidptr = (Guid *)dataBuffer;
                *     guidptr = (Guid)data;
                dataDescriptor->DataPointer = (ulong)guidptr;
            }
            else if (data is decimal)
            {
                dataDescriptor->Size = (uint)sizeof(decimal);
                decimal *decimalptr = (decimal *)dataBuffer;
                *        decimalptr = (decimal)data;
                dataDescriptor->DataPointer = (ulong)decimalptr;
            }
            else if (data is Boolean)
            {
                dataDescriptor->Size = (uint)sizeof(Boolean);
                Boolean *booleanptr = (Boolean *)dataBuffer;
                *        booleanptr = (Boolean)data;
                dataDescriptor->DataPointer = (ulong)booleanptr;
            }
            else
            {
                // Everything else is a just a string
                sRet = data.ToString();
                dataDescriptor->Size = (uint)((sRet.Length + 1) * 2);
                return(sRet);
            }

            return(null);
        }
예제 #3
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);
        }
예제 #4
0
        public unsafe bool WriteTransferEvent(ref EventDescriptor eventDescriptor, Guid relatedActivityId, params object[] eventPayload)
        {
            uint num = 0;

            if (this.IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords))
            {
                Guid activityId = DiagnosticsEventProvider.GetActivityId();
                if (eventPayload == null || (int)eventPayload.Length == 0)
                {
                    num = UnsafeNativeMethods.EventWriteTransfer(this.traceRegistrationHandle, ref eventDescriptor, ref activityId, ref relatedActivityId, 0, 0);
                }
                else
                {
                    int length = (int)eventPayload.Length;
                    if (length > 32)
                    {
                        throw Fx.Exception.AsError(new ArgumentOutOfRangeException("eventPayload", SRCore.EtwMaxNumberArgumentsExceeded(32)), null);
                    }
                    uint     size      = 0;
                    int      num1      = 0;
                    int[]    numArray  = new int[8];
                    string[] strArrays = new string[8];
                    UnsafeNativeMethods.EventData *eventDataPointer  = stackalloc UnsafeNativeMethods.EventData[checked (length * sizeof(UnsafeNativeMethods.EventData))];
                    UnsafeNativeMethods.EventData *eventDataPointer1 = eventDataPointer;
                    byte *numPointer = stackalloc byte[16 * length];
                    for (int i = 0; i < (int)eventPayload.Length; i++)
                    {
                        if (eventPayload[i] != null)
                        {
                            string str = DiagnosticsEventProvider.EncodeObject(ref eventPayload[i], eventDataPointer1, numPointer);
                            numPointer        = numPointer + 16;
                            size              = size + (*eventDataPointer1).Size;
                            eventDataPointer1 = eventDataPointer1 + sizeof(UnsafeNativeMethods.EventData);
                            if (str != null)
                            {
                                if (num1 >= 8)
                                {
                                    throw Fx.Exception.AsError(new ArgumentOutOfRangeException("eventPayload", SRCore.EtwAPIMaxStringCountExceeded(8)), null);
                                }
                                strArrays[num1] = str;
                                numArray[num1]  = i;
                                num1++;
                            }
                        }
                    }
                    if (size > 65482)
                    {
                        DiagnosticsEventProvider.errorCode = DiagnosticsEventProvider.WriteEventErrorCode.EventTooBig;
                        return(false);
                    }

                    fixed(string str1 = strArrays[0])
                    {
                        string *offsetToStringData = &str1;

                        if (offsetToStringData != null)
                        {
                            offsetToStringData = offsetToStringData + RuntimeHelpers.OffsetToStringData;
                        }
                        char *chrPointer = (char *)offsetToStringData;

                        fixed(string str2 = strArrays[1])
                        {
                            string *strPointers = &str2;

                            if (strPointers != null)
                            {
                                strPointers = strPointers + RuntimeHelpers.OffsetToStringData;
                            }
                            char *chrPointer1 = (char *)strPointers;

                            fixed(string str3 = strArrays[2])
                            {
                                string *offsetToStringData1 = &str3;

                                if (offsetToStringData1 != null)
                                {
                                    offsetToStringData1 = offsetToStringData1 + RuntimeHelpers.OffsetToStringData;
                                }
                                char *chrPointer2 = (char *)offsetToStringData1;

                                fixed(string str4 = strArrays[3])
                                {
                                    string *strPointers1 = &str4;

                                    if (strPointers1 != null)
                                    {
                                        strPointers1 = strPointers1 + RuntimeHelpers.OffsetToStringData;
                                    }
                                    char *chrPointer3 = (char *)strPointers1;

                                    fixed(string str5 = strArrays[4])
                                    {
                                        string *offsetToStringData2 = &str5;

                                        if (offsetToStringData2 != null)
                                        {
                                            offsetToStringData2 = offsetToStringData2 + RuntimeHelpers.OffsetToStringData;
                                        }
                                        char *chrPointer4 = (char *)offsetToStringData2;

                                        fixed(string str6 = strArrays[5])
                                        {
                                            string *strPointers2 = &str6;

                                            if (strPointers2 != null)
                                            {
                                                strPointers2 = strPointers2 + RuntimeHelpers.OffsetToStringData;
                                            }
                                            char *chrPointer5 = (char *)strPointers2;

                                            fixed(string str7 = strArrays[6])
                                            {
                                                string *offsetToStringData3 = &str7;

                                                if (offsetToStringData3 != null)
                                                {
                                                    offsetToStringData3 = offsetToStringData3 + RuntimeHelpers.OffsetToStringData;
                                                }
                                                char *chrPointer6 = (char *)offsetToStringData3;

                                                fixed(string str8 = strArrays[7])
                                                {
                                                    string *strPointers3 = &str8;

                                                    if (strPointers3 != null)
                                                    {
                                                        strPointers3 = strPointers3 + RuntimeHelpers.OffsetToStringData;
                                                    }
                                                    char *chrPointer7 = (char *)strPointers3;

                                                    eventDataPointer1 = eventDataPointer;
                                                    if (strArrays[0] != null)
                                                    {
                                                        (*(eventDataPointer1 + numArray[0] * sizeof(UnsafeNativeMethods.EventData))).DataPointer = (ulong)chrPointer;
                                                    }
                                                    if (strArrays[1] != null)
                                                    {
                                                        (*(eventDataPointer1 + numArray[1] * sizeof(UnsafeNativeMethods.EventData))).DataPointer = (ulong)chrPointer1;
                                                    }
                                                    if (strArrays[2] != null)
                                                    {
                                                        (*(eventDataPointer1 + numArray[2] * sizeof(UnsafeNativeMethods.EventData))).DataPointer = (ulong)chrPointer2;
                                                    }
                                                    if (strArrays[3] != null)
                                                    {
                                                        (*(eventDataPointer1 + numArray[3] * sizeof(UnsafeNativeMethods.EventData))).DataPointer = (ulong)chrPointer3;
                                                    }
                                                    if (strArrays[4] != null)
                                                    {
                                                        (*(eventDataPointer1 + numArray[4] * sizeof(UnsafeNativeMethods.EventData))).DataPointer = (ulong)chrPointer4;
                                                    }
                                                    if (strArrays[5] != null)
                                                    {
                                                        (*(eventDataPointer1 + numArray[5] * sizeof(UnsafeNativeMethods.EventData))).DataPointer = (ulong)chrPointer5;
                                                    }
                                                    if (strArrays[6] != null)
                                                    {
                                                        (*(eventDataPointer1 + numArray[6] * sizeof(UnsafeNativeMethods.EventData))).DataPointer = (ulong)chrPointer6;
                                                    }
                                                    if (strArrays[7] != null)
                                                    {
                                                        (*(eventDataPointer1 + numArray[7] * sizeof(UnsafeNativeMethods.EventData))).DataPointer = (ulong)chrPointer7;
                                                    }
                                                    num = UnsafeNativeMethods.EventWriteTransfer(this.traceRegistrationHandle, ref eventDescriptor, ref activityId, ref relatedActivityId, (uint)length, eventDataPointer);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                    str2 = null;
                    str3 = null;
                    str4 = null;
                    str5 = null;
                    str6 = null;
                    str7 = null;
                    str8 = null;
                }
            }
            if (num == 0)
            {
                return(true);
            }
            DiagnosticsEventProvider.SetLastError((int)num);
            return(false);
        }
예제 #5
0
        private static unsafe string EncodeObject(ref object data, UnsafeNativeMethods.EventData *dataDescriptor, byte *dataBuffer)
        {
            (*dataDescriptor).Reserved = 0;
            string str = data as string;

            if (str != null)
            {
                (*dataDescriptor).Size = (uint)((str.Length + 1) * 2);
                return(str);
            }
            if (data is IntPtr)
            {
                (*dataDescriptor).Size = sizeof(IntPtr);
                IntPtr *intPtrPointer = (IntPtr *)dataBuffer;
                *       intPtrPointer = (IntPtr)data;
                (*dataDescriptor).DataPointer = (ulong)intPtrPointer;
            }
            else if (data is int)
            {
                (*dataDescriptor).Size = 4;
                int *numPointer = (int *)dataBuffer;
                *    numPointer = (int)data;
                (*dataDescriptor).DataPointer = (ulong)numPointer;
            }
            else if (data is long)
            {
                (*dataDescriptor).Size = 8;
                long *numPointer1 = (long *)dataBuffer;
                *     numPointer1 = (long)data;
                (*dataDescriptor).DataPointer = (ulong)numPointer1;
            }
            else if (data is uint)
            {
                (*dataDescriptor).Size = 4;
                uint *numPointer2 = (uint *)dataBuffer;
                *     numPointer2 = (uint)data;
                (*dataDescriptor).DataPointer = (ulong)numPointer2;
            }
            else if (data is ulong)
            {
                (*dataDescriptor).Size = 8;
                ulong *numPointer3 = (ulong *)dataBuffer;
                *      numPointer3 = (ulong)data;
                (*dataDescriptor).DataPointer = (ulong)numPointer3;
            }
            else if (data is char)
            {
                (*dataDescriptor).Size = 2;
                char *chrPointer = (char *)dataBuffer;
                *     chrPointer = (char)data;
                (*dataDescriptor).DataPointer = (ulong)chrPointer;
            }
            else if (data is byte)
            {
                (*dataDescriptor).Size = 1;
                byte *numPointer4 = dataBuffer;
                *     numPointer4 = (byte)data;
                (*dataDescriptor).DataPointer = (ulong)numPointer4;
            }
            else if (data is short)
            {
                (*dataDescriptor).Size = 2;
                short *numPointer5 = (short *)dataBuffer;
                *      numPointer5 = (short)data;
                (*dataDescriptor).DataPointer = (ulong)numPointer5;
            }
            else if (data is sbyte)
            {
                (*dataDescriptor).Size = 1;
                sbyte *numPointer6 = (sbyte *)dataBuffer;
                *      numPointer6 = (sbyte)data;
                (*dataDescriptor).DataPointer = (ulong)numPointer6;
            }
            else if (data is ushort)
            {
                (*dataDescriptor).Size = 2;
                ushort *numPointer7 = (ushort *)dataBuffer;
                *       numPointer7 = (ushort)data;
                (*dataDescriptor).DataPointer = (ulong)numPointer7;
            }
            else if (data is float)
            {
                (*dataDescriptor).Size = 4;
                float *singlePointer = (float *)dataBuffer;
                *      singlePointer = (float)data;
                (*dataDescriptor).DataPointer = (ulong)singlePointer;
            }
            else if (data is double)
            {
                (*dataDescriptor).Size = 8;
                double *numPointer8 = (double *)dataBuffer;
                *       numPointer8 = (double)data;
                (*dataDescriptor).DataPointer = (ulong)numPointer8;
            }
            else if (data is bool)
            {
                (*dataDescriptor).Size = 1;
                bool *flagPointer = (bool *)dataBuffer;
                *     flagPointer = (bool)data;
                (*dataDescriptor).DataPointer = (ulong)flagPointer;
            }
            else if (data is Guid)
            {
                (*dataDescriptor).Size = sizeof(Guid);
                Guid *guidPointer = (Guid *)dataBuffer;
                *     guidPointer = (Guid)data;
                (*dataDescriptor).DataPointer = (ulong)guidPointer;
            }
            else if (!(data is decimal))
            {
                if (!(data is bool))
                {
                    str = data.ToString();
                    (*dataDescriptor).Size = (uint)((str.Length + 1) * 2);
                    return(str);
                }
                (*dataDescriptor).Size = 1;
                bool *flagPointer1 = (bool *)dataBuffer;
                *     flagPointer1 = (bool)data;
                (*dataDescriptor).DataPointer = (ulong)flagPointer1;
            }
            else
            {
                (*dataDescriptor).Size = 16;
                decimal *numPointer9 = (decimal *)dataBuffer;
                *        numPointer9 = (decimal)data;
                (*dataDescriptor).DataPointer = (ulong)numPointer9;
            }
            return(null);
        }
예제 #6
0
 internal static extern unsafe uint EventWriteTransfer(long registrationHandle, ref System.Runtime.Diagnostics.EventDescriptor eventDescriptor, ref Guid activityId, ref Guid relatedActivityId, uint userDataCount, UnsafeNativeMethods.EventData *userData);
예제 #7
0
 internal static extern unsafe uint EventWrite(long registrationHandle, ref System.Runtime.Diagnostics.EventDescriptor eventDescriptor, uint userDataCount, UnsafeNativeMethods.EventData *userData);
        private static unsafe string EncodeObject(ref object data, UnsafeNativeMethods.EventData *dataDescriptor, byte *dataBuffer)
        {
            (*(dataDescriptor)).Reserved = 0;
            string str = data as string;

            if (str == null)
            {
                if (data as IntPtr == 0)
                {
                    if (data as int == 0)
                    {
                        if (data as long == 0)
                        {
                            if (data as uint == 0)
                            {
                                if (data as ulong == 0)
                                {
                                    if (data as char == 0)
                                    {
                                        if (data as byte == 0)
                                        {
                                            if (data as short == 0)
                                            {
                                                if (data as sbyte == 0)
                                                {
                                                    if (data as ushort == 0)
                                                    {
                                                        if (data as float == 0)
                                                        {
                                                            if (data as double == 0)
                                                            {
                                                                if (!data as bool)
                                                                {
                                                                    if (data as Guid == null)
                                                                    {
                                                                        if (data as decimal == null)
                                                                        {
                                                                            if (!data as bool)
                                                                            {
                                                                                str = data.ToString();
                                                                                (*(dataDescriptor)).Size = (str.Length + 1) * 2;
                                                                                return(str);
                                                                            }
                                                                            else
                                                                            {
                                                                                (*(dataDescriptor)).Size        = 1;
                                                                                *((bool *)dataBuffer)           = (bool)data;
                                                                                (*(dataDescriptor)).DataPointer = (ulong)((bool *)dataBuffer);
                                                                            }
                                                                        }
                                                                        else
                                                                        {
                                                                            (*(dataDescriptor)).Size        = 16;
                                                                            *((decimal *)dataBuffer)        = (decimal)data;
                                                                            (*(dataDescriptor)).DataPointer = (ulong)((decimal *)dataBuffer);
                                                                        }
                                                                    }
                                                                    else
                                                                    {
                                                                        (*(dataDescriptor)).Size        = sizeof(Guid);
                                                                        *((Guid *)dataBuffer)           = (Guid)data;
                                                                        (*(dataDescriptor)).DataPointer = (ulong)((Guid *)dataBuffer);
                                                                    }
                                                                }
                                                                else
                                                                {
                                                                    (*(dataDescriptor)).Size        = 1;
                                                                    *((bool *)dataBuffer)           = (bool)data;
                                                                    (*(dataDescriptor)).DataPointer = (ulong)((bool *)dataBuffer);
                                                                }
                                                            }
                                                            else
                                                            {
                                                                (*(dataDescriptor)).Size        = 8;
                                                                *((double *)dataBuffer)         = (double)data;
                                                                (*(dataDescriptor)).DataPointer = (ulong)((double *)dataBuffer);
                                                            }
                                                        }
                                                        else
                                                        {
                                                            (*(dataDescriptor)).Size        = 4;
                                                            *((float *)dataBuffer)          = (float)data;
                                                            (*(dataDescriptor)).DataPointer = (ulong)((float *)dataBuffer);
                                                        }
                                                    }
                                                    else
                                                    {
                                                        (*(dataDescriptor)).Size        = 2;
                                                        *((ushort *)dataBuffer)         = (ushort)data;
                                                        (*(dataDescriptor)).DataPointer = (ulong)((ushort *)dataBuffer);
                                                    }
                                                }
                                                else
                                                {
                                                    (*(dataDescriptor)).Size        = 1;
                                                    *((sbyte *)dataBuffer)          = (sbyte)data;
                                                    (*(dataDescriptor)).DataPointer = (ulong)((sbyte *)dataBuffer);
                                                }
                                            }
                                            else
                                            {
                                                (*(dataDescriptor)).Size        = 2;
                                                *((short *)dataBuffer)          = (short)data;
                                                (*(dataDescriptor)).DataPointer = (ulong)((short *)dataBuffer);
                                            }
                                        }
                                        else
                                        {
                                            (*(dataDescriptor)).Size        = 1;
                                            *(dataBuffer)                   = (byte)data;
                                            (*(dataDescriptor)).DataPointer = (ulong)dataBuffer;
                                        }
                                    }
                                    else
                                    {
                                        (*(dataDescriptor)).Size        = 2;
                                        *((char *)dataBuffer)           = (char)data;
                                        (*(dataDescriptor)).DataPointer = (ulong)((char *)dataBuffer);
                                    }
                                }
                                else
                                {
                                    (*(dataDescriptor)).Size        = 8;
                                    *((ulong *)dataBuffer)          = (ulong)data;
                                    (*(dataDescriptor)).DataPointer = (ulong)((ulong *)dataBuffer);
                                }
                            }
                            else
                            {
                                (*(dataDescriptor)).Size        = 4;
                                *((uint *)dataBuffer)           = (uint)data;
                                (*(dataDescriptor)).DataPointer = (ulong)((uint *)dataBuffer);
                            }
                        }
                        else
                        {
                            (*(dataDescriptor)).Size        = 8;
                            *((long *)dataBuffer)           = (long)data;
                            (*(dataDescriptor)).DataPointer = (ulong)((long *)dataBuffer);
                        }
                    }
                    else
                    {
                        (*(dataDescriptor)).Size        = 4;
                        *((int *)dataBuffer)            = (int)data;
                        (*(dataDescriptor)).DataPointer = (ulong)((int *)dataBuffer);
                    }
                }
                else
                {
                    (*(dataDescriptor)).Size        = sizeof(IntPtr);
                    *((IntPtr *)dataBuffer)         = (IntPtr)data;
                    (*(dataDescriptor)).DataPointer = (ulong)((IntPtr *)dataBuffer);
                }
                return(null);
            }
            else
            {
                (*(dataDescriptor)).Size = (str.Length + 1) * 2;
                return(str);
            }
        }
        public unsafe bool WriteTransferEvent(ref EventDescriptor eventDescriptor, EventTraceActivity eventTraceActivity, Guid relatedActivityId, object[] eventPayload)
        {
            if (eventTraceActivity == null)
            {
                eventTraceActivity = EventTraceActivity.Empty;
            }
            uint num = 0;

            if (this.IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords))
            {
                if (eventPayload == null || (int)eventPayload.Length == 0)
                {
                    num = UnsafeNativeMethods.EventWriteTransfer(this.traceRegistrationHandle, ref eventDescriptor, ref eventTraceActivity.ActivityId, ref relatedActivityId, 0, 0);
                }
                else
                {
                    int length = (int)eventPayload.Length;
                    if (length <= 32)
                    {
                        uint     size      = 0;
                        int      num1      = 0;
                        int[]    numArray  = new int[8];
                        string[] strArrays = new string[8];
                        UnsafeNativeMethods.EventData *eventDataPointer  = (UnsafeNativeMethods.EventData *)length * sizeof(UnsafeNativeMethods.EventData);
                        UnsafeNativeMethods.EventData *eventDataPointer1 = eventDataPointer;
                        byte *numPointer  = (byte *)16 * length;
                        byte *numPointer1 = numPointer;
                        for (int i = 0; i < (int)eventPayload.Length; i++)
                        {
                            if (eventPayload[i] != null)
                            {
                                string str = DiagnosticsEventProvider.EncodeObject(ref eventPayload[i], eventDataPointer1, numPointer1);
                                numPointer1       = numPointer1 + 16;
                                size              = size + (*(eventDataPointer1)).Size;
                                eventDataPointer1 = (UnsafeNativeMethods.EventData *)(eventDataPointer1 + sizeof(UnsafeNativeMethods.EventData));
                                if (str != null)
                                {
                                    if (num1 >= 8)
                                    {
                                        throw Fx.Exception.AsError(new ArgumentOutOfRangeException("eventPayload", InternalSR.EtwAPIMaxStringCountExceeded(8)));
                                    }
                                    else
                                    {
                                        strArrays[num1] = str;
                                        numArray[num1]  = i;
                                        num1++;
                                    }
                                }
                            }
                        }
                        if (size <= 0xffca)
                        {
                            fixed(string str1 = strArrays[0])
                            {
                                string *strPointers        = &str1;
                                char *  offsetToStringData = (char *)(&str1);

                                if (&str1 != null)
                                {
                                    offsetToStringData = (char *)(strPointers + RuntimeHelpers.OffsetToStringData);
                                }
                                char *chrPointer = offsetToStringData;

                                fixed(string str2 = strArrays[1])
                                {
                                    string *strPointers1        = &str2;
                                    char *  offsetToStringData1 = (char *)(&str2);

                                    if (&str2 != null)
                                    {
                                        offsetToStringData1 = (char *)(strPointers1 + RuntimeHelpers.OffsetToStringData);
                                    }
                                    char *chrPointer1 = offsetToStringData1;

                                    fixed(string str3 = strArrays[2])
                                    {
                                        string *strPointers2        = &str3;
                                        char *  offsetToStringData2 = (char *)(&str3);

                                        if (&str3 != null)
                                        {
                                            offsetToStringData2 = (char *)(strPointers2 + RuntimeHelpers.OffsetToStringData);
                                        }
                                        char *chrPointer2 = offsetToStringData2;

                                        fixed(string str4 = strArrays[3])
                                        {
                                            string *strPointers3        = &str4;
                                            char *  offsetToStringData3 = (char *)(&str4);

                                            if (&str4 != null)
                                            {
                                                offsetToStringData3 = (char *)(strPointers3 + RuntimeHelpers.OffsetToStringData);
                                            }
                                            char *chrPointer3 = offsetToStringData3;

                                            fixed(string str5 = strArrays[4])
                                            {
                                                string *strPointers4        = &str5;
                                                char *  offsetToStringData4 = (char *)(&str5);

                                                if (&str5 != null)
                                                {
                                                    offsetToStringData4 = (char *)(strPointers4 + RuntimeHelpers.OffsetToStringData);
                                                }
                                                char *chrPointer4 = offsetToStringData4;

                                                fixed(string str6 = strArrays[5])
                                                {
                                                    string *strPointers5        = &str6;
                                                    char *  offsetToStringData5 = (char *)(&str6);

                                                    if (&str6 != null)
                                                    {
                                                        offsetToStringData5 = (char *)(strPointers5 + RuntimeHelpers.OffsetToStringData);
                                                    }
                                                    char *chrPointer5 = offsetToStringData5;

                                                    fixed(string str7 = strArrays[6])
                                                    {
                                                        string *strPointers6        = &str7;
                                                        char *  offsetToStringData6 = (char *)(&str7);

                                                        if (&str7 != null)
                                                        {
                                                            offsetToStringData6 = (char *)(strPointers6 + RuntimeHelpers.OffsetToStringData);
                                                        }
                                                        char *chrPointer6 = offsetToStringData6;

                                                        fixed(string str8 = strArrays[7])
                                                        {
                                                            string *strPointers7        = &str8;
                                                            char *  offsetToStringData7 = (char *)(&str8);

                                                            if (&str8 != null)
                                                            {
                                                                offsetToStringData7 = (char *)(strPointers7 + RuntimeHelpers.OffsetToStringData);
                                                            }
                                                            char *chrPointer7 = offsetToStringData7;

                                                            eventDataPointer1 = eventDataPointer;
                                                            if (strArrays[0] != null)
                                                            {
                                                                (eventDataPointer1 + numArray[0] * sizeof(UnsafeNativeMethods.EventData)).DataPointer = (ulong)chrPointer;
                                                            }
                                                            if (strArrays[1] != null)
                                                            {
                                                                (eventDataPointer1 + numArray[1] * sizeof(UnsafeNativeMethods.EventData)).DataPointer = (ulong)chrPointer1;
                                                            }
                                                            if (strArrays[2] != null)
                                                            {
                                                                (eventDataPointer1 + numArray[2] * sizeof(UnsafeNativeMethods.EventData)).DataPointer = (ulong)chrPointer2;
                                                            }
                                                            if (strArrays[3] != null)
                                                            {
                                                                (eventDataPointer1 + numArray[3] * sizeof(UnsafeNativeMethods.EventData)).DataPointer = (ulong)chrPointer3;
                                                            }
                                                            if (strArrays[4] != null)
                                                            {
                                                                (eventDataPointer1 + numArray[4] * sizeof(UnsafeNativeMethods.EventData)).DataPointer = (ulong)chrPointer4;
                                                            }
                                                            if (strArrays[5] != null)
                                                            {
                                                                (eventDataPointer1 + numArray[5] * sizeof(UnsafeNativeMethods.EventData)).DataPointer = (ulong)chrPointer5;
                                                            }
                                                            if (strArrays[6] != null)
                                                            {
                                                                (eventDataPointer1 + numArray[6] * sizeof(UnsafeNativeMethods.EventData)).DataPointer = (ulong)chrPointer6;
                                                            }
                                                            if (strArrays[7] != null)
                                                            {
                                                                (eventDataPointer1 + numArray[7] * sizeof(UnsafeNativeMethods.EventData)).DataPointer = (ulong)chrPointer7;
                                                            }
                                                            num = UnsafeNativeMethods.EventWriteTransfer(this.traceRegistrationHandle, ref eventDescriptor, ref eventTraceActivity.ActivityId, ref relatedActivityId, length, eventDataPointer);
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            DiagnosticsEventProvider.errorCode = DiagnosticsEventProvider.WriteEventErrorCode.EventTooBig;
                            return(false);
                        }
                    }
                    else
                    {
                        throw Fx.Exception.AsError(new ArgumentOutOfRangeException("eventPayload", InternalSR.EtwMaxNumberArgumentsExceeded(32)));
                    }
                }
            }
            if (num == 0)
            {
                return(true);
            }
            else
            {
                DiagnosticsEventProvider.SetLastError(num);
                return(false);
            }
        }
예제 #10
0
 internal static extern unsafe uint EventWrite([In] long registrationHandle, [In] ref System.Diagnostics.Eventing.EventDescriptor eventDescriptor, [In] uint userDataCount, [In] UnsafeNativeMethods.EventData *userData);