/*++ 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 #include #include 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