예제 #1
0
        protected bool WriteEvent(ref EventDescriptor eventDescriptor, int dataCount, IntPtr data)
        {
            uint status = 0;

            unsafe
            {
                if (s_preWin7)
                {
                    status = UnsafeNativeMethods.EventWrite(
                        m_regHandle,
                        ref eventDescriptor,
                        (uint)dataCount,
                        (void *)data);
                }
                else
                {
                    Guid activityId = GetActivityId();

                    status = UnsafeNativeMethods.EventWriteTransfer(
                        m_regHandle,
                        ref eventDescriptor,
                        (activityId == Guid.Empty) ? null : &activityId,
                        null,
                        (uint)dataCount,
                        (void *)data);
                }
            }

            if (status != 0)
            {
                SetLastError((int)status);
                return(false);
            }
            return(true);
        }
예제 #2
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);
        }
예제 #3
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);
        }