windows-nt/Source/XPSP1/NT/base/ntos/inc/perf.h
2020-09-26 16:20:57 +08:00

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