Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Header Name:
tracker.h
Abstract:
Verifier call history tracker.
Author:
Silviu Calinoiu (SilviuC) Jul-11-2002
Revision History:
--*/
#include "pch.h"
#include "verifier.h"
#include "support.h"
#include "tracker.h"
PAVRF_TRACKER AVrfCreateTracker ( ULONG Size ) { PAVRF_TRACKER Tracker;
//
// Do not accept bogus sizes.
//
if (Size <= 1) { ASSERT (Size > 1); return NULL; }
//
// We allocate `Size - 1' tracker entries because we have already
// an entry in the main tracker structure.
//
Tracker = AVrfpAllocate (sizeof(*Tracker) + (Size - 1) * sizeof(AVRF_TRACKER_ENTRY));
if (Tracker == NULL) { return NULL; }
//
// We set the size. No other initialization is required since AVrfpAllocate zeroes
// the memory just allocated.
//
Tracker->Size = Size;
return Tracker; }
VOID AVrfDestroyTracker ( PAVRF_TRACKER Tracker ) { //
// Safety checks.
//
if (Tracker == NULL) { return; } AVrfpFree (Tracker); }
VOID AVrfLogInTracker ( PAVRF_TRACKER Tracker, USHORT EntryType, PVOID EntryParam1, PVOID EntryParam2, PVOID EntryParam3, PVOID EntryParam4, PVOID ReturnAddress ) { ULONG Index; USHORT Count;
//
// Safety checks.
//
if (Tracker == NULL) { return; }
//
// Get the index for the tracker entry that will be filled.
//
Index = (ULONG)InterlockedIncrement ((PLONG)(&(Tracker->Index))); Index %= Tracker->Size;
//
// If a null return address is passed then we need to
// walk the stack and get a full stack trace.
//
Tracker->Entry[Index].Type = EntryType; Tracker->Entry[Index].Info[0] = EntryParam1; Tracker->Entry[Index].Info[1] = EntryParam2; Tracker->Entry[Index].Info[2] = EntryParam3; Tracker->Entry[Index].Info[3] = EntryParam4;
Count = RtlCaptureStackBackTrace (2, MAX_TRACE_DEPTH, Tracker->Entry[Index].Trace, NULL);
if (Count == 0) { Tracker->Entry[Index].TraceDepth = 1; Tracker->Entry[Index].Trace[0] = ReturnAddress; } else {
Tracker->Entry[Index].TraceDepth = Count; } }
|