429 lines
16 KiB
C
429 lines
16 KiB
C
/*++
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
perf.h
|
|
|
|
Abstract:
|
|
|
|
This module contains the macro definition of all performance hooks.
|
|
|
|
Author:
|
|
|
|
Stephen Hsiao (shsiao) 01-Jan-2000
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifndef _PERF_H
|
|
#define _PERF_H
|
|
|
|
#include <wmistr.h>
|
|
#include <ntwmi.h>
|
|
#include <ntperf.h>
|
|
|
|
extern PERFINFO_GROUPMASK *PPerfGlobalGroupMask;
|
|
extern const PERFINFO_HOOK_HANDLE PerfNullHookHandle;
|
|
#define PERF_NULL_HOOK_HANDLE (PerfNullHookHandle)
|
|
|
|
typedef enum _PERFINFO_START_LOG_LOCATION {
|
|
PERFINFO_START_LOG_AT_BOOT,
|
|
PERFINFO_START_LOG_POST_BOOT,
|
|
PERFINFO_START_LOG_FROM_GLOBAL_LOGGER
|
|
} PERFINFO_START_LOG_LOCATION, *PPERFINFO_START_LOG_LOCATION;
|
|
|
|
typedef struct _PERFINFO_ENTRY_TABLE {
|
|
PVOID *Table;
|
|
LONG NumberOfEntries;
|
|
} PERFINFO_ENTRY_TABLE, *PPERFINFO_ENTRY_TABLE;
|
|
|
|
NTSTATUS
|
|
PerfInfoStartLog (
|
|
PERFINFO_GROUPMASK *pGroupMask,
|
|
PERFINFO_START_LOG_LOCATION StartLogLocation
|
|
);
|
|
|
|
NTSTATUS
|
|
PerfInfoStopLog (
|
|
VOID
|
|
);
|
|
|
|
NTSTATUS
|
|
PerfInfoLogFileName(
|
|
PVOID FileObject,
|
|
PUNICODE_STRING SourceString
|
|
);
|
|
|
|
ULONG
|
|
PerfInfoCalcHashValue(
|
|
PVOID Key,
|
|
ULONG Len
|
|
);
|
|
|
|
BOOLEAN
|
|
PerfInfoAddToFileHash(
|
|
PPERFINFO_ENTRY_TABLE HashTable,
|
|
PVOID ObjectPointer
|
|
);
|
|
|
|
VOID
|
|
ObPerfHandleTableWalk (
|
|
PEPROCESS Process,
|
|
PPERFINFO_ENTRY_TABLE HashTable
|
|
);
|
|
|
|
VOID
|
|
FASTCALL
|
|
PerfProfileInterrupt(
|
|
IN KPROFILE_SOURCE Source,
|
|
IN PVOID InstructionPointer
|
|
);
|
|
|
|
VOID
|
|
PerfInfoFlushProfileCache(
|
|
VOID
|
|
);
|
|
|
|
#define PERFINFO_IS_ANY_GROUP_ON() (PPerfGlobalGroupMask != NULL)
|
|
|
|
#define PERFINFO_IS_GROUP_ON(_Group) PerfIsGroupOnInGroupMask(_Group, PPerfGlobalGroupMask)
|
|
|
|
#define PERF_FINISH_HOOK(_HookHandle) WmiReleaseKernelBuffer((_HookHandle).WmiBufferHeader);
|
|
|
|
NTSTATUS
|
|
PerfInfoReserveBytes(
|
|
PPERFINFO_HOOK_HANDLE Hook,
|
|
USHORT HookId,
|
|
ULONG BytesToReserve
|
|
);
|
|
|
|
NTSTATUS
|
|
PerfInfoLogBytes(
|
|
USHORT HookId,
|
|
PVOID Data,
|
|
ULONG NumBytes
|
|
);
|
|
|
|
NTSTATUS
|
|
PerfInfoLogBytesAndUnicodeString(
|
|
USHORT HookId,
|
|
PVOID SourceData,
|
|
ULONG SourceByteCount,
|
|
PUNICODE_STRING String
|
|
);
|
|
|
|
//
|
|
// Macros for TimeStamps
|
|
//
|
|
#ifdef NTPERF
|
|
#if defined(_X86_)
|
|
__inline
|
|
LONGLONG
|
|
PerfGetCycleCount(
|
|
)
|
|
{
|
|
__asm{
|
|
RDTSC
|
|
}
|
|
}
|
|
#elif defined(_AMD64_)
|
|
#define PerfGetCycleCount() ReadTimeStampCounter()
|
|
#elif defined(_IA64_)
|
|
#define PerfGetCycleCount() __getReg(CV_IA64_ApITC)
|
|
#else
|
|
#error "perf: a target architecture must be defined."
|
|
#endif
|
|
|
|
#define PerfTimeStamp(TS) TS.QuadPart = PerfGetCycleCount();
|
|
#else
|
|
#define PerfTimeStamp(TS) TS.QuadPart = (*WmiGetCpuClock)();
|
|
#endif //NTPERF
|
|
|
|
//
|
|
// Macros used in \nt\base\ntos\io\iomgr\parse.c
|
|
//
|
|
#define PERFINFO_LOG_FILE_CREATE(FileObject, CompleteName) \
|
|
if (PERFINFO_IS_GROUP_ON(PERF_FILENAME_ALL)){ \
|
|
PerfInfoLogFileName(FileObject, CompleteName); \
|
|
}
|
|
|
|
// Macros used in \nt\base\ntos\mm\creasect.c
|
|
//
|
|
#define PERFINFO_SECTION_CREATE(ControlArea) \
|
|
if (PERFINFO_IS_GROUP_ON(PERF_FILENAME_ALL)){ \
|
|
PerfInfoLogFileName(ControlArea->FilePointer, \
|
|
&(ControlArea)->FilePointer->FileName); \
|
|
}
|
|
|
|
//
|
|
// Macros used in \nt\base\ntos\ps\psquery.c
|
|
//
|
|
|
|
#define PERFINFO_CONVERT_TO_GUI_THREAD(EThread) \
|
|
if (PERFINFO_IS_GROUP_ON(PERF_MEMORY)) { \
|
|
PERFINFO_THREAD_INFORMATION _ThreadInfo; \
|
|
_ThreadInfo.ProcessId = HandleToUlong((EThread)->Cid.UniqueProcess); \
|
|
_ThreadInfo.ThreadId = HandleToUlong((EThread)->Cid.UniqueThread); \
|
|
_ThreadInfo.StackBase = (EThread)->Tcb.StackBase; \
|
|
_ThreadInfo.StackLimit = (EThread)->Tcb.StackLimit; \
|
|
_ThreadInfo.UserStackBase = 0; \
|
|
_ThreadInfo.UserStackLimit = 0; \
|
|
_ThreadInfo.StartAddr = 0; \
|
|
_ThreadInfo.Win32StartAddr = 0; \
|
|
_ThreadInfo.WaitMode = -1; \
|
|
PerfInfoLogBytes( \
|
|
PERFINFO_LOG_TYPE_CONVERTTOGUITHREAD, \
|
|
&_ThreadInfo, \
|
|
sizeof(_ThreadInfo) \
|
|
); \
|
|
}
|
|
|
|
//
|
|
// Macros used in \NT\PRIVATE\NTOS\ps\psdelete.c
|
|
//
|
|
|
|
#define PERFINFO_PROCESS_DELETE(EProcess) \
|
|
WmiTraceProcess(EProcess, FALSE);
|
|
|
|
#define PERFINFO_THREAD_DELETE(EThread) \
|
|
WmiTraceThread(EThread, NULL, FALSE);
|
|
//
|
|
// Macros used in \NT\PRIVATE\NTOS\ps\create.c
|
|
//
|
|
|
|
#define PERFINFO_PROCESS_CREATE(EProcess) \
|
|
WmiTraceProcess(EProcess, TRUE);
|
|
|
|
#define PERFINFO_THREAD_CREATE(EThread, ITeb) \
|
|
WmiTraceThread(EThread, ITeb, TRUE); \
|
|
|
|
//
|
|
// ntos\ke\ia64\clock.c Sampled Profile stuff for IA64. The x86 version is in
|
|
// assembly.
|
|
//
|
|
#if defined(_IA64_)
|
|
#define PERFINFO_PROFILE(_frame, _source) \
|
|
if (PERFINFO_IS_GROUP_ON(PERF_PROFILE)) { \
|
|
PerfProfileInterrupt(_source, (PVOID)_frame->StIIP); \
|
|
}
|
|
#endif
|
|
|
|
#ifdef NTPERF
|
|
|
|
extern PERFINFO_GROUPMASK StartAtBootGroupMask;
|
|
extern ULONG PerfInfo_InitialStackWalk_Threshold_ms;
|
|
extern VOID * BBTBuffer;
|
|
extern ULONG PerfInfoLoggingToPerfMem;
|
|
#define PerfBufHdr() ((PPERFINFO_TRACEBUF_HEADER) BBTBuffer)
|
|
|
|
#define PERFINFO_IS_PERFMEM_ALLOCATED() (PerfBufHdr() != NULL)
|
|
|
|
#define PERFINFO_IS_LOGGING_TO_PERFMEM() (PerfInfoLoggingToPerfMem != 0)
|
|
|
|
#define PERFINFO_SET_LOGGING_TO_PERFMEM(Flag) PerfInfoLoggingToPerfMem = (Flag);
|
|
|
|
#define PerfQueryBufferSizeBytes() (PAGE_SIZE * (PerfBufHdr()->PagesReserved))
|
|
|
|
NTSTATUS
|
|
PerfInfoStartPerfMemLog(
|
|
);
|
|
|
|
NTSTATUS
|
|
PerfInfoStopPerfMemLog(
|
|
);
|
|
|
|
PVOID
|
|
FASTCALL
|
|
PerfInfoReserveBytesFromPerfMem(
|
|
ULONG BytesToReserve
|
|
);
|
|
|
|
NTSTATUS
|
|
PerfInfoSetPerformanceTraceInformation (
|
|
IN PVOID SystemInformation,
|
|
IN ULONG SystemInformationLength
|
|
);
|
|
|
|
NTSTATUS
|
|
PerfInfoQueryPerformanceTraceInformation (
|
|
IN PVOID SystemInformation,
|
|
IN ULONG SystemInformationLength,
|
|
OUT PULONG ReturnLength
|
|
);
|
|
|
|
VOID
|
|
PerfInfoSetProcessorSpeed(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// Macros used in \nt\base\ntos\mm\
|
|
//
|
|
|
|
#define PERFINFO_MMINIT_START() \
|
|
PerfInfoSetProcessorSpeed(); \
|
|
if (PerfIsAnyGroupOnInGroupMask(&StartAtBootGroupMask)) { \
|
|
PerfInfoStartLog(&StartAtBootGroupMask, PERFINFO_START_LOG_AT_BOOT); \
|
|
PerfBufHdr()->GetStack_CSwitchDelta = \
|
|
1000 * \
|
|
PerfInfo_InitialStackWalk_Threshold_ms * \
|
|
PerfBufHdr()->CalcPerfFrequency; \
|
|
\
|
|
PerfBufHdr()->GetStack_DrvDelayDelta = \
|
|
PerfBufHdr()->GetStack_CSwitchDelta; \
|
|
}
|
|
|
|
#else
|
|
|
|
#define PERFINFO_MMINIT_START()
|
|
|
|
#endif // NTPERF
|
|
|
|
#ifndef NTPERF_PRIVATE
|
|
#define PERFINFO_ADD_OBJECT_TO_ALLOCATED_TYPE_LIST(CreatorInfo, ObjectType)
|
|
#define PERFINFO_ADDPOOLPAGE(CheckType, PoolIndex, Addr, PoolDesc)
|
|
#define PERFINFO_ADDTOWS(PageFrame, Address, Pid)
|
|
#define PERFINFO_BIGFOOT_REPLACEMENT_CLAIMS(WorkingSetList, WsInfo)
|
|
#define PERFINFO_BIGFOOT_REPLACEMENT_FAULTS(WorkingSetList, WsInfo)
|
|
#define PERFINFO_BIGPOOLALLOC(Type, PTag, NumBytes, Addr)
|
|
#define PERFINFO_CLEAR_OBJECT(CurrentState, Object)
|
|
#define PERFINFO_DECLARE_OB_ENUMERATE_ALLOCATED_OBJECTS_BY_TYPE()
|
|
#define PERFINFO_DECLARE_OBJECT(Object)
|
|
#define PERFINFO_DECREFCNT(PageFrame, Flag, Type)
|
|
#define PERFINFO_DEFINE_OB_ENUMERATE_ALLOCATED_OBJECTS_BY_TYPE()
|
|
#define PERFINFO_DELETE_STACK(PointerPte, NumberOfPtes)
|
|
#define PERFINFO_DETACH_PROCESS(KThread, KProcess)
|
|
#define PERFINFO_DO_PAGEFAULT_CLUSTERING() 1
|
|
#define PERFINFO_DRIVER_INTENTIONAL_DELAY()
|
|
#define PERFINFO_DRIVER_STACKTRACE()
|
|
#define PERFINFO_EXALLOCATEPOOLWITHTAG_DECL()
|
|
#define PERFINFO_EXFREEPOOLWITHTAG_DECL()
|
|
#define PERFINFO_FAULT_NOTIFICATION(Address, TrapInfo)
|
|
#define PERFINFO_FREEPOOL(Addr)
|
|
#define PERFINFO_FREEPOOLPAGE(CheckType, PoolIndex, Addr, PoolDesc)
|
|
#define PERFINFO_GET_PAGE_INFO(PointerPte)
|
|
#define PERFINFO_GET_PAGE_INFO_REPLACEMENT(PointerPte)
|
|
#define PERFINFO_GET_PAGE_INFO_WITH_DECL(PointerPte)
|
|
#define PERFINFO_GROW_STACK(EThread)
|
|
#define PERFINFO_HIBER_ADJUST_PAGECOUNT_FOR_BBTBUFFER(pPageCount)
|
|
#define PERFINFO_HIBER_DUMP_PERF_BUFFER()
|
|
#define PERFINFO_HIBER_HANDLE_BBTBUFFER_RANGE(HiberContext)
|
|
#define PERFINFO_HIBER_PAUSE_LOGGING()
|
|
#define PERFINFO_HIBER_REINIT_TRACE()
|
|
#define PERFINFO_HIBER_START_LOGGING()
|
|
#define PERFINFO_HIVECELL_REFERENCE_FLAT(Hive, pcell, Cell)
|
|
#define PERFINFO_HIVECELL_REFERENCE_PAGED(Hive, pcell, Cell, Type, Map)
|
|
#define PERFINFO_IMAGE_LOAD(LdrDataTableEntry)
|
|
#define PERFINFO_IMAGE_UNLOAD(Address)
|
|
#define PERFINFO_INIT_KTHREAD(KThread)
|
|
#define PERFINFO_INIT_TRACEFLAGS(OptnString, SpecificOptn)
|
|
#define PERFINFO_INITIALIZE_OBJECT_ALLOCATED_TYPE_LIST_HEAD(NewObjectType)
|
|
#define PERFINFO_INSERT_FRONT_STANDBY(Page)
|
|
#define PERFINFO_INSERTINLIST(Page, ListHead)
|
|
#define PERFINFO_INSWAP_PROCESS(OutProcess)
|
|
#define PERFINFO_LOG_MARK(PMARK)
|
|
#define PERFINFO_LOG_MARK_SPRINTF(PMARK, VARIABLE)
|
|
#define PERFINFO_LOG_WS_REMOVAL(Type, WsInfo)
|
|
#define PERFINFO_LOG_WS_REPLACEMENT(WsInfo)
|
|
#define PERFINFO_MOD_PAGE_WRITER3()
|
|
#define PERFINFO_MUNG_FILE_OBJECT_TYPE_INITIALIZER(init)
|
|
#define PERFINFO_PAGE_INFO_DECL()
|
|
#define PERFINFO_PAGE_INFO_REPLACEMENT_DECL()
|
|
#define PERFINFO_POOL_ALLOC_COMMON(Type, PTag, NumBytes)
|
|
#define PERFINFO_POOLALLOC(Type, PTag, NumBytes)
|
|
#define PERFINFO_POOLALLOC_ADDR(Addr)
|
|
#define PERFINFO_POOLALLOC_EARLYEXIT()
|
|
#define PERFINFO_POWER_BATTERY_LIFE_INFO(_RemainingCapacity, _Rate)
|
|
#define PERFINFO_POWER_IDLE_STATE_CHANGE(_PState, _Direction)
|
|
#define PERFINFO_PRIVATE_COPY_ON_WRITE(CopyFrom, PAGE_SIZE)
|
|
#define PERFINFO_PRIVATE_PAGE_DEMAND_ZERO(VirtualAddress)
|
|
#define PERFINFO_REG_DELETE_KEY(KeyControlBlock)
|
|
#define PERFINFO_REG_DELETE_VALUE(KeyControlBlock, ValueName)
|
|
#define PERFINFO_REG_DUMP_CACHE()
|
|
#define PERFINFO_REG_ENUM_KEY(KeyControlBlock, Index)
|
|
#define PERFINFO_REG_ENUM_VALUE(KeyControlBlock, Index)
|
|
#define PERFINFO_REG_KCB_CREATE(kcb)
|
|
#define PERFINFO_REG_NOTIFY(NotifiedKCB, ModifiedKCB)
|
|
#define PERFINFO_REG_PARSE(kcb, RemainingName)
|
|
#define PERFINFO_REG_QUERY_KEY(KeyControlBlock)
|
|
#define PERFINFO_REG_QUERY_MULTIVALUE(KeyControlBlock, CurrentName)
|
|
#define PERFINFO_REG_QUERY_VALUE(KeyControlBlock, ValueName)
|
|
#define PERFINFO_REG_SET_VALUE_DECL()
|
|
#define PERFINFO_REG_SET_VALUE(KeyControlBlock)
|
|
#define PERFINFO_REG_SET_VALUE_DONE(ValueName)
|
|
#define PERFINFO_REG_SET_VALUE_EXIST()
|
|
#define PERFINFO_REG_SET_VALUE_NEW()
|
|
#define PERFINFO_REGPARSE(kcb, RemainingName)
|
|
#define PERFINFO_REGPARSE_END(status)
|
|
#define PERFINFO_REMOVE_OBJECT_FROM_ALLOCATED_TYPE_LIST(CreatorInfo, ObjectHeader)
|
|
#define PERFINFO_SECTION_CREATE1(File)
|
|
#define PERFINFO_SEGMENT_DELETE(FileName)
|
|
#define PERFINFO_SHUTDOWN_LOG_LAST_MEMORY_SNAPSHOT()
|
|
#define PERFINFO_SHUTDOWN_DUMP_PERF_BUFFER()
|
|
#define PERFINFO_SIGNAL_OBJECT(CurrentState, Object)
|
|
#define PERFINFO_SOFTFAULT(PageFrame, Address, Type)
|
|
#define PERFINFO_STACKWALK_THRESHHOLD_CM_DECL
|
|
#define PERFINFO_STACKWALK_THRESHHOLD_DECL
|
|
#define PERFINFO_UNLINKFREEPAGE(Index, Location)
|
|
#define PERFINFO_UNLINKPAGE(Index, Location)
|
|
#define PERFINFO_UNMUNG_FILE_OBJECT_TYPE_INITIALIZER(init)
|
|
#define PERFINFO_UNWAIT_OBJECT(Object, Status)
|
|
#define PERFINFO_UNWAIT_OBJECTS(Object, CountIn, WaitType, WaitStatus)
|
|
#define PERFINFO_WAIT_ON_OBJECT(Object)
|
|
#define PERFINFO_WAIT_ON_OBJECTS(Object, CountIn, WaitType)
|
|
#define PERFINFO_WAITLOGGED_DECL
|
|
#define PERFINFO_WSMANAGE_ACTUALTRIM(Trim)
|
|
#define PERFINFO_WSMANAGE_CHECK()
|
|
#define PERFINFO_WSMANAGE_DECL()
|
|
#define PERFINFO_WSMANAGE_DUMPENTRIES()
|
|
#define PERFINFO_WSMANAGE_DUMPENTRIES_CLAIMS()
|
|
#define PERFINFO_WSMANAGE_DUMPENTRIES_FAULTS()
|
|
#define PERFINFO_WSMANAGE_DUMPWS(VmSupport, SampledAgeCounts)
|
|
#define PERFINFO_WSMANAGE_FINALACTION(TrimAction)
|
|
#define PERFINFO_WSMANAGE_LOGINFO_CLAIMS(TrimAction)
|
|
#define PERFINFO_WSMANAGE_LOGINFO_FAULTS(TrimAction)
|
|
#define PERFINFO_WSMANAGE_STARTLOG()
|
|
#define PERFINFO_WSMANAGE_STARTLOG_CLAIMS()
|
|
#define PERFINFO_WSMANAGE_STARTLOG_FAULTS()
|
|
#define PERFINFO_WSMANAGE_TOTRIM(Trim)
|
|
#define PERFINFO_WSMANAGE_TRIMACTION(TrimAction)
|
|
#define PERFINFO_WSMANAGE_TRIMEND_CLAIMS(Criteria)
|
|
#define PERFINFO_WSMANAGE_TRIMEND_FAULTS(Criteria)
|
|
#define PERFINFO_WSMANAGE_TRIMWS(Process, SessionSpace, VmSupport)
|
|
#define PERFINFO_WSMANAGE_TRIMWS_CLAIMINFO(VmSupport)
|
|
#define PERFINFO_WSMANAGE_TRIMWS_CLAIMINFO(VmSupport)
|
|
#define PERFINFO_WSMANAGE_WAITFORWRITER_CLAIMS()
|
|
#define PERFINFO_WSMANAGE_WAITFORWRITER_FAULTS()
|
|
#define PERFINFO_WSMANAGE_WILLTRIM(ReductionGoal, FreeGoal)
|
|
#define PERFINFO_WSMANAGE_WILLTRIM_CLAIMS(Criteria)
|
|
#define PERFINFO_WSMANAGE_WILLTRIM_FAULTS(Criteria)
|
|
#define PERF_BRANCH_TRACING_OFF_KD()
|
|
#define PERF_BRANCH_TRACING_ON_KD()
|
|
#define PERF_PF_MODLOAD_DECL()
|
|
#define PERF_PF_MODLOAD_SAVE()
|
|
#define PERF_PF_MODLOAD_RESTORE()
|
|
#define PERF_PF_SANITIZE_CONTEXT(Context)
|
|
#define PERF_BRANCH_TRACING_BREAKPOINT(ExceptionRecord, TrapFrame)
|
|
#define PERF_ASSERT_TRACING_OFF()
|
|
#define PERF_IS_BRANCH_TRACING_ON()
|
|
#define PERFINFO_LOG_PREFETCH_BEGIN_TRACE(ScenarioId, ScenarioType, Process)
|
|
#define PERFINFO_LOG_PREFETCH_END_TRACE(ScenarioId, ScenarioType, Process, Status)
|
|
#define PERFINFO_LOG_PREFETCH_SECTIONS(PrefetchHeader, PrefetchType, PagesToPrefetch)
|
|
#define PERFINFO_LOG_PREFETCH_SECTIONS_END(PrefetchHeader, Status, PagesRequested)
|
|
#define PERFINFO_LOG_PREFETCH_METADATA(PrefetchHeader)
|
|
#define PERFINFO_LOG_PREFETCH_METADATA_END(PrefetchHeader, Status)
|
|
#define PERFINFO_LOG_PREFETCH_SCENARIO(PrefetchHeader, ScenarioId, ScenarioType)
|
|
#define PERFINFO_LOG_PREFETCH_SCENARIO_END(PrefetchHeader, Status)
|
|
#define PERFINFO_LOG_PREFETCH_REQUEST(RequestId, NumLists, RequestLists)
|
|
#define PERFINFO_LOG_PREFETCH_READLIST(RequestId, ReadList)
|
|
#define PERFINFO_LOG_PREFETCH_READ(FileObject, Offset, ByteCount)
|
|
|
|
#else
|
|
#include "..\perf\perfinfokrn.h"
|
|
#endif // !NTPERF_PRIVATE
|
|
|
|
#endif // PERF_H
|