/*++ Copyright (c) 1995 Microsoft Corporation Module Name: cpdata.h Abstract: cp data internal data structures Author: 08-Apr-1998 mraghu Revision History: --*/ #ifndef __CPDATA__ #define __CPDATA__ #include #include #include #pragma warning (disable:4306) #include #include #pragma warning (default:4306) #include #include #include #include #pragma warning (disable:4201) #include #include #include #include #include #include #include #include #include #pragma warning (default:4201) // For TDI address decoding #include #include #include "list.h" #include "workload.h" #define MAX_FILE_TABLE_SIZE 64 // Must match ntos\wmi\callout.c #define MAX_TRANS_LEVEL 32 #ifndef IsEqualGUID #define IsEqualGUID(guid1, guid2) \ (!memcmp((guid1), (guid2), sizeof(GUID))) #endif #define THREAD_HASH_TABLESIZE 29 #define URL_HASH_TABLESIZE 32 #define MAXSTR 1024 #define CHECK_HR(hr) if( ERROR_SUCCESS != hr ){ goto cleanup; } #define EVENT_TRACE_TYPE_FILEIO_NAME 0x00 #define EVENT_TRACE_TYPE_FIELIO_CREATE 0x20 #define EVENT_TRACE_TYPE_SPL_SPOOLJOB EVENT_TRACE_TYPE_START #define EVENT_TRACE_TYPE_SPL_PRINTJOB EVENT_TRACE_TYPE_DEQUEUE #define EVENT_TRACE_TYPE_SPL_DELETEJOB EVENT_TRACE_TYPE_END #define EVENT_TRACE_TYPE_SPL_TRACKTHREAD EVENT_TRACE_TYPE_CHECKPOINT #define EVENT_TRACE_TYPE_SPL_ENDTRACKTHREAD 0x0A #define EVENT_TRACE_TYPE_SPL_JOBRENDERED 0x0B #define EVENT_TRACE_TYPE_SPL_PAUSE 0x0C #define EVENT_TRACE_TYPE_SPL_RESUME 0x0D #define EVENT_TRACE_TYPE_UL_START EVENT_TRACE_TYPE_START #define EVENT_TRACE_TYPE_UL_PARSE 0x0A #define EVENT_TRACE_TYPE_UL_DELIVER 0x0B #define EVENT_TRACE_TYPE_UL_RECVRESP 0x0C #define EVENT_TRACE_TYPE_UL_RECVBODY 0x0D #define EVENT_TRACE_TYPE_UL_CACHEDEND 0x0E #define EVENT_TRACE_TYPE_UL_CACHEANDSEND 0x0F #define EVENT_TRACE_TYPE_UL_FASTRESP 0x10 #define EVENT_TRACE_TYPE_UL_FASTSEND 0x11 #define EVENT_TRACE_TYPE_UL_ZEROSEND 0x12 #define EVENT_TRACE_TYPE_UL_SENDERROR 0x13 #define EVENT_TRACE_TYPE_UL_END EVENT_TRACE_TYPE_END #define EVENT_TRACE_TYPE_W3CORE_START EVENT_TRACE_TYPE_START #define EVENT_TRACE_TYPE_W3CORE_FILEREQ 0x0A #define EVENT_TRACE_TYPE_W3CORE_CGIREQ 0x0B #define EVENT_TRACE_TYPE_W3CORE_ISAPIREQ 0x0C #define EVENT_TRACE_TYPE_W3CORE_OOPREQ 0x0D #define EVENT_TRACE_TYPE_W3CORE_SENDBODY 0x10 #define EVENT_TRACE_TYPE_W3CORE_SENDRESP 0x11 #define EVENT_TRACE_TYPE_W3CORE_SENDENTITY 0x12 #define EVENT_TRACE_TYPE_W3CORE_SENDFILTER 0x13 #define EVENT_TRACE_TYPE_W3CORE_ERRSEND 0x14 #define EVENT_TRACE_TYPE_W3CORE_ERRSENDENT 0x15 #define EVENT_TRACE_TYPE_W3CORE_ERRSENDCTX 0x16 #define EVENT_TRACE_TYPE_W3CORE_ERRVECSEND 0x17 #define EVENT_TRACE_TYPE_W3CORE_VECTORSEND 0x18 #define EVENT_TRACE_TYPE_W3CORE_END EVENT_TRACE_TYPE_END #define EVENT_TRACE_TYPE_W3FILTER_START EVENT_TRACE_TYPE_START #define EVENT_TRACE_TYPE_W3FILTER_END EVENT_TRACE_TYPE_END #define EVENT_TRACE_TYPE_W3CGI_START EVENT_TRACE_TYPE_START #define EVENT_TRACE_TYPE_W3CGI_END EVENT_TRACE_TYPE_END #define EVENT_TRACE_TYPE_W3ISAPI_START EVENT_TRACE_TYPE_START #define EVENT_TRACE_TYPE_W3ISAPI_SENDHDR 0x0A #define EVENT_TRACE_TYPE_W3ISAPI_SENDHDREX 0x0B #define EVENT_TRACE_TYPE_W3ISAPI_VECTORSEND 0x0C #define EVENT_TRACE_TYPE_W3ISAPI_ERRORSEND 0x0D #define EVENT_TRACE_TYPE_W3ISAPI_SSFSEND 0x0E #define EVENT_TRACE_TYPE_W3ISAPI_SSDERROR 0x0F #define EVENT_TRACE_TYPE_W3ISAPI_END EVENT_TRACE_TYPE_END #define EVENT_TRACE_TYPE_IISSTRMFILTER_START EVENT_TRACE_TYPE_START #define EVENT_TRACE_TYPE_IISSTRMFILTER_END EVENT_TRACE_TYPE_END #define EVENT_TRACE_TYPE_IISSSLHANDLESHAKE_START EVENT_TRACE_TYPE_START #define EVENT_TRACE_TYPE_IISSSLHANDLESHAKE_END EVENT_TRACE_TYPE_END #define EVENT_TRACE_TYPE_IISASP_START EVENT_TRACE_TYPE_START #define EVENT_TRACE_TYPE_IISASP_END EVENT_TRACE_TYPE_END #define ISAPI_EXTENTION_ASP 0 #define ISAPI_EXTENTION_ASP_NET 1 #define ISAPI_EXTENTION_CUSTOM 2 #define MAX_ADDRESS_LENGTH \ sizeof("[ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff%4294967295]:65535") typedef struct _TRACE_CONTEXT_BLOCK { PEVENT_TRACE_PROPERTIES LoggerInfo; ULONG LogFileCount; ULONG LoggerCount; LPWSTR LogFileName[MAXLOGGERS]; LPWSTR LoggerName[MAXLOGGERS]; LPCSTR PdhFileName; // ANSI ?? LPWSTR ProcFileName; LPWSTR DumpFileName; LPWSTR MofFileName; LPWSTR XSLDocName; LPWSTR DefMofFileName; LPWSTR MergeFileName; LPWSTR SummaryFileName; LPWSTR CompFileName; HANDLE hEvent; FILE* hDumpFile; ULONGLONG StartTime; // If Sequential, start, End Times to window. ULONGLONG EndTime; // ULONG Flags; BOOLEAN LoggerStartedHere; void (*StatusFunction)(int, double); HANDLE hThreadVector; TRACEHANDLE HandleArray[MAXLOGGERS]; PVOID pUserContext; } TRACE_CONTEXT_BLOCK, *PTRACE_CONTEXT_BLOCK; typedef struct _HPF_FILE_RECORD { LIST_ENTRY Entry; ULONG RecordID; ULONG IrpFlags; ULONG DiskNumber; ULONG BytesCount; ULONGLONG ByteOffset; PVOID fDO; } HPF_FILE_RECORD, *PHPF_FILE_RECORD; typedef struct _HPF_RECORD { LIST_ENTRY Entry; ULONG RecordID; ULONG lProgramCounter; ULONG lFaultAddress; PVOID fDO; LONG lByteCount; LONGLONG lByteOffset; LIST_ENTRY HPFReadListHead; } HPF_RECORD, *PHPF_RECORD; typedef struct _TDISK_RECORD { LIST_ENTRY Entry; ULONG DiskNumber; LPWSTR DiskName; ULONG ReadCount; ULONG WriteCount; ULONG ReadSize; ULONG WriteSize; ULONG HPF; ULONG HPFSize; LIST_ENTRY FileListHead; LIST_ENTRY ProcessListHead; } TDISK_RECORD, *PTDISK_RECORD; typedef struct _FILE_RECORD { LIST_ENTRY Entry; LIST_ENTRY ProtoProcessListHead; // List of Processes touching this file. PWCHAR Drive; PWCHAR FileName; ULONG DiskNumber; ULONG ReadCount; ULONG HPF; ULONG WriteCount; ULONG ReadSize; ULONG WriteSize; ULONG HPFSize; } FILE_RECORD, *PFILE_RECORD; typedef struct _FILE_OBJECT { PVOID fDO; PFILE_RECORD fileRec; ULONG ThreadId; ULONG DiskNumber; ULONGLONG LastByteOffset; LIST_ENTRY ProtoFileRecordListHead; }FILE_OBJECT, *PFILE_OBJECT; typedef struct _PROTO_FILE_RECORD { LIST_ENTRY Entry; BOOLEAN ReadFlag; ULONG DiskNumber; ULONG IoSize; } PROTO_FILE_RECORD, *PPROTO_FILE_RECORD; typedef struct _TRANS_RECORD { LIST_ENTRY Entry; LIST_ENTRY SubTransListHead; LPGUID pGuid; BOOL bStarted; ULONG UCpu; ULONG KCpu; ULONG DeltaReadIO; ULONG DeltaWriteIO; ULONG RefCount; ULONG RefCount1; } TRANS_RECORD, *PTRANS_RECORD; typedef struct _PROCESS_RECORD { LIST_ENTRY Entry; LIST_ENTRY ThreadListHead; LIST_ENTRY DiskListHead; LIST_ENTRY FileListHead; // All the Files this process touched. LIST_ENTRY ModuleListHead; // All the modules this process loaded. LIST_ENTRY HPFListHead; PWCHAR UserName; PWCHAR ImageName; ULONG PID; ULONG DeadFlag; ULONG ReadIO; ULONG WriteIO; ULONG SendCount; ULONG RecvCount; ULONG SendSize; ULONG RecvSize; ULONG HPF; ULONG HPFSize; ULONG SPF; ULONG PrivateWSet; ULONG GlobalWSet; ULONG ReadIOSize; ULONG WriteIOSize; ULONG lDataFaultHF; ULONG lDataFaultTF; ULONG lDataFaultDZF; ULONG lDataFaultCOW; ULONG lCodeFaultHF; ULONG lCodeFaultTF; ULONG lCodeFaultDZF; ULONG lCodeFaultCOW; ULONGLONG ResponseTime; ULONGLONG TxnStartTime; ULONGLONG TxnEndTime; } PROCESS_RECORD, *PPROCESS_RECORD; typedef struct _THREAD_RECORD { LIST_ENTRY Entry; LIST_ENTRY DiskListHead; LIST_ENTRY TransListHead; // transactions list LIST_ENTRY HPFReadListHead; LIST_ENTRY HPFWriteListHead; WCHAR strSortKey[MAXSTR]; ULONG TID; PPROCESS_RECORD pProcess; BOOLEAN fOrphan; ULONG DeadFlag; ULONG ProcessorID; ULONG ClassNumber; // Class to which this thread is assigned. ULONG ReadIO; ULONG WriteIO; ULONG SendCount; ULONG RecvCount; ULONG SendSize; ULONG RecvSize; ULONG HPF; ULONG SPF; ULONG ReadIOSize; ULONG WriteIOSize; ULONG HPFSize; ULONGLONG TimeStart; ULONGLONG TimeEnd; ULONG KCPUStart; ULONG KCPUEnd; ULONG UCPUStart; ULONG UCPUEnd; // The Following fields are used in getting the Delta // CPU, I/O to charge on a transaction basis. // The Current Transaction being executed by this thread is // given by pMofInfo and when the trans is completed the Delta CPU, I/O // are charged to that transaction. ULONG DeltaReadIO; ULONG DeltaWriteIO; ULONG DeltaSend; ULONG DeltaRecv; ULONG RefCount; ULONG JobId; // Keeps track of the Current Job this thread is working on PVOID pMofData; // Keep Track of the Current transaction Guid ULONG KCPU_Trans; ULONG UCPU_Trans; ULONG KCPU_NoTrans; ULONG UCPU_NoTrans; ULONG KCPU_PrevTrans; ULONG UCPU_PrevTrans; LONG TransLevel; ULONG KCPU_PrevEvent; ULONG UCPU_PrevEvent; ULONGLONG Time_PrevEvent; PTRANS_RECORD TransStack[MAX_TRANS_LEVEL]; // for IIS event ULONGLONG IisReqId; }THREAD_RECORD, *PTHREAD_RECORD; typedef struct _MODULE_RECORD MODULE_RECORD, *PMODULE_RECORD; struct _MODULE_RECORD { LIST_ENTRY Entry; PPROCESS_RECORD pProcess; ULONG lBaseAddress; ULONG lModuleSize; ULONG lDataFaultHF; ULONG lDataFaultTF; ULONG lDataFaultDZF; ULONG lDataFaultCOW; ULONG lCodeFaultHF; ULONG lCodeFaultTF; ULONG lCodeFaultDZF; ULONG lCodeFaultCOW; WCHAR * strModuleName; PMODULE_RECORD pGlobalPtr; }; typedef struct _SYSTEM_RECORD { ULONGLONG StartTime; ULONGLONG EndTime; ULONGLONG LastEventTime; ULONGLONG IISStartTime; ULONGLONG IISEndTime; FILE* TempPrintFile; FILE* TempIisFile; BOOLEAN fNoEndTime; ULONG CurrentThread0; ULONG ElapseTime; ULONG TimerResolution; ULONG NumberOfEvents; ULONG NumberOfProcessors; ULONG CpuSpeed; ULONG MemorySize; PWCHAR ComputerName; ULONG NumberOfWorkloads; ULONG BuildNumber; PFILE_OBJECT *FileTable; PLIST_ENTRY ThreadHashList; LIST_ENTRY ProcessListHead; LIST_ENTRY GlobalThreadListHead; LIST_ENTRY GlobalDiskListHead; LIST_ENTRY HotFileListHead; LIST_ENTRY WorkloadListHead; LIST_ENTRY InstanceListHead; LIST_ENTRY EventListHead; LIST_ENTRY GlobalModuleListHead; // Global module list. LIST_ENTRY ProcessFileListHead; LIST_ENTRY PrintJobListHead; LIST_ENTRY HttpReqListHead; LIST_ENTRY PendingHttpReqListHead; PLIST_ENTRY URLHashList; LIST_ENTRY ClientListHead; LIST_ENTRY SiteListHead; LIST_ENTRY LogicalDriveHead; // memory recyling list // For Trans and Job, we will recycle the allocated structures. // URLs do not nned to be recycled because they are allocated together // at the report time and freed all at the same time. However, we'll // just keep them just in case. LIST_ENTRY FreePrintJobListHead; LIST_ENTRY FreeHttpReqListHead; LIST_ENTRY FreeTransListHead; LIST_ENTRY FreeURLListHead; HANDLE hLoggerUpEvent; } SYSTEM_RECORD, *PSYSTEM_RECORD; typedef struct _PROCESS_FILE_RECORD { LIST_ENTRY Entry; ULONGLONG StartTime; ULONGLONG EndTime; LPWSTR FileName; LPWSTR TraceName; } PROCESS_FILE_RECORD, *PPROCESS_FILE_RECORD; typedef struct _PROTO_PROCESS_RECORD { LIST_ENTRY Entry; PPROCESS_RECORD ProcessRecord; ULONG ReadCount; ULONG WriteCount; ULONG HPF; ULONG ReadSize; ULONG WriteSize; ULONG HPFSize; } PROTO_PROCESS_RECORD, *PPROTO_PROCESS_RECORD; typedef struct _LOGICAL_DRIVE_RECORD { LIST_ENTRY Entry; ULONGLONG StartOffset; ULONGLONG PartitionSize; ULONG DiskNumber; ULONG Size; ULONG DriveType; PWCHAR DriveLetterString; } LOGICAL_DRIVE_RECORD, *PLOGICAL_DRIVE_RECORD; // // MOF_INFO structure maintains the global information for the GUID. // For each GUID, the event layouts are maintained by Version, Level and Type. // typedef struct _MOF_INFO { LIST_ENTRY Entry; LIST_ENTRY DataListHead; LPWSTR strDescription; // Class Name LPWSTR strSortField; ULONG EventCount; GUID Guid; LIST_ENTRY VersionHeader; BOOL bKernelEvent; } MOF_INFO, *PMOF_INFO; // // MOF_VERSION structure ic created one per Version, Level Type combination. // typedef struct _MOF_VERSION { LIST_ENTRY Entry; LIST_ENTRY ItemHeader; // Maintains the list of ITEM_DESC for this type. LPWSTR strType; SHORT Version; SHORT TypeIndex; CHAR Level; ULONG EventCountByType; // Count of Events by this type for this Guid } MOF_VERSION, *PMOF_VERSION; typedef struct _MOF_DATA { LIST_ENTRY Entry; PWCHAR strSortKey; ULONG CompleteCount; LONG InProgressCount; LONGLONG AverageResponseTime; LONGLONG TotalResponseTime; ULONGLONG PrevClockTime; ULONG MmTf; ULONG MmDzf; ULONG MmCow; ULONG MmGpf; ULONG UserCPU; ULONG KernelCPU; ULONG EventCount; ULONG ReadCount; ULONG WriteCount; ULONG SendCount; ULONG RecvCount; LONG MinKCpu; LONG MaxKCpu; LONG MinUCpu; LONG MaxUCpu; } MOF_DATA, *PMOF_DATA; // A Job record is one that passses through several threads to complete. // Jobs are identified by a Job Id, usually created during the Start // event and recorded as an additional field in the mof data. // Since there can be any number of jobs in the system over the data // collection interval, we will flush the completed jobs to a temp file // and reread it back at the end to print a report. // Note: Job_record needs to be Guid based. (ie., per type of transaction). // Currently it is not. // #define MAX_THREADS 10 // Upto threads can be working on a Job. typedef struct _THREAD_DATA { ULONG ThreadId; ULONG PrevKCPUTime; ULONG PrevUCPUTime; ULONG PrevReadIO; ULONG PrevWriteIO; ULONG KCPUTime; ULONG UCPUTime; ULONG ReadIO; ULONG WriteIO; ULONG Reserved; } THREAD_DATA, *PTHREAD_DATA; typedef struct _PRINT_JOB_RECORD { LIST_ENTRY Entry; ULONG JobId; ULONG KCPUTime; ULONG UCPUTime; ULONG ReadIO; ULONG WriteIO; ULONG DataType; ULONG JobSize; ULONG Pages; ULONG PagesPerSide; ULONG ICMMethod; ULONG GdiJobSize; ULONGLONG StartTime; ULONGLONG EndTime; ULONGLONG ResponseTime; ULONGLONG PauseTime; ULONGLONG PauseStartTime; ULONGLONG PrintJobTime; SHORT FilesOpened; SHORT Color; SHORT XRes; SHORT YRes; SHORT Quality; SHORT Copies; SHORT TTOption; ULONG NumberOfThreads; // Total Number of Threads worked on this Job THREAD_DATA ThreadData[MAX_THREADS]; } PRINT_JOB_RECORD, *PPRINT_JOB_RECORD; // URL records for IIS events typedef struct _URL_RECORD { LIST_ENTRY Entry; ULONG SiteId; ULONG KCPUTime; ULONG UCPUTime; ULONG ReadIO; ULONG WriteIO; ULONG Hits; ULONG Requests; ULONG UrlType; ULONG BytesSent; ULONGLONG TotalResponseTime; PCHAR URL; } URL_RECORD, *PURL_RECORD; // Site records for IIS events typedef struct _SITE_RECORD { LIST_ENTRY Entry; ULONG SiteId; ULONG KCPUTime; ULONG UCPUTime; ULONG ReadIO; ULONG WriteIO; ULONG Hits; ULONG Requests; ULONG BytesSent; ULONGLONG TotalResponseTime; ULONG FileRequests; ULONG CGIRequests; ULONG ISAPIRequests; ULONG OOPRequests; ULONG ASPRequests; } SITE_RECORD, *PSITE_RECORD; // Client records for IIS events typedef struct _CLIENT_RECORD { LIST_ENTRY Entry; ULONG Hits; ULONG Requests; ULONG BytesSent; ULONGLONG TotalResponseTime; USHORT IpAddrType; ULONG IpAddrV4; USHORT IpAddrV6[8]; } CLIENT_RECORD, *PCLIENT_RECORD; // This is IIS Request Record for IIS events typedef struct _HTTP_REQUEST_RECORD { LIST_ENTRY Entry; ULONGLONG RequestId; ULONGLONG ConId; ULONG SiteId; ULONG BytesSent; ULONG KCPUTime; ULONG UCPUTime; ULONG ULCPUTime; ULONG W3CPUTime; ULONG W3FltrCPUTime; ULONG ISAPICPUTime; ULONG ASPCPUTime; ULONG CGICPUTime; ULONG ReadIO; ULONG WriteIO; ULONGLONG ULStartTime; ULONGLONG ULEndTime; ULONGLONG ULResponseTime; ULONGLONG ULParseTime; ULONGLONG ULDeliverTime; ULONGLONG ULReceiveTime; SHORT ULReceiveType; SHORT ULEndType; ULONGLONG W3StartTime; ULONGLONG W3EndTime; ULONGLONG W3FilterResponseTime; ULONGLONG W3FilterStartTime; ULONGLONG W3FilterEndTime; ULONG W3FilterVisits; SHORT W3ProcessType; SHORT W3EndType; ULONGLONG FileReqTime; ULONGLONG CGIStartTime; ULONGLONG CGIEndTime; ULONGLONG ISAPIStartTime; ULONGLONG ISAPIEndTime; SHORT ISAPIEndType; ULONGLONG ASPStartTime; ULONGLONG ASPEndTime; ULONGLONG SSLResponseTime; ULONGLONG StrmFltrResponseTime; USHORT HttpStatus; USHORT IsapiExt; ULONG NumberOfThreads; // Total Number of Threads worked on this reqeust ULONG CurrentThreadIndex; THREAD_DATA ThreadData[MAX_THREADS]; USHORT IpAddrType; ULONG IpAddrV4; USHORT IpAddrV6[8]; PCHAR URL; PURL_RECORD URLRecord; PCLIENT_RECORD ClientRecord; } HTTP_REQUEST_RECORD, *PHTTP_REQUEST_RECORD; typedef struct _IIS_REPORT_RECORD { ULONG TotalRequests; ULONG CachedResponses; ULONGLONG TotalCachedResponseTime; ULONGLONG TotalNonCachedResponseTime; ULONG W3FileRequests; ULONG W3CGIRequests; ULONG W3ISAPIRequests; ULONG W3ASPRequests; ULONG W3OOPRequests; ULONG W3FilterRequests; ULONG W3Error; ULONGLONG TotalW3FilterResponseTime; ULONG TotalW3FilterCPUTime; ULONG TotalFileULOnlyCPUTime; ULONG TotalFileW3OnlyCPUTime; ULONG TotalFileW3FilterCPUTime; ULONGLONG TotalFileResponseTime; ULONGLONG TotalFileULOnlyResponseTime; ULONGLONG TotalFileW3OnlyResponseTime; ULONGLONG TotalFileW3FilterResponseTime; ULONG TotalCGIOnlyCPUTime; ULONG TotalCGIULOnlyCPUTime; ULONG TotalCGIW3OnlyCPUTime; ULONG TotalCGIW3FilterCPUTime; ULONGLONG TotalCGIResponseTime; ULONGLONG TotalCGIOnlyResponseTime; ULONGLONG TotalCGIULOnlyResponseTime; ULONGLONG TotalCGIW3OnlyResponseTime; ULONGLONG TotalCGIW3FilterResponseTime; ULONG TotalASPOnlyCPUTime; ULONG TotalASPULOnlyCPUTime; ULONG TotalASPW3OnlyCPUTime; ULONG TotalASPISAPIOnlyCPUTime; ULONG TotalASPW3FilterCPUTime; ULONGLONG TotalISAPIResponseTime; ULONGLONG TotalASPResponseTime; ULONGLONG TotalASPOnlyResponseTime; ULONGLONG TotalASPULOnlyResponseTime; ULONGLONG TotalASPW3OnlyResponseTime; ULONGLONG TotalASPISAPIOnlyResponseTime; ULONGLONG TotalASPW3FilterResponseTime; ULONG TotalErrorULOnlyCPUTime; ULONG TotalErrorW3OnlyCPUTime; ULONG TotalErrorW3FilterCPUTime; ULONG TotalErrorCGIOnlyCPUTime; ULONG TotalErrorISAPIOnlyCPUTime; ULONG TotalErrorASPOnlyCPUTime; ULONGLONG TotalErrorResponseTime; ULONGLONG TotalErrorULOnlyResponseTime; ULONGLONG TotalErrorW3OnlyResponseTime; ULONGLONG TotalErrorW3FilterResponseTime; ULONGLONG TotalOOPResponseTime; ULONG TotalCPUTime; ULONG CachedCPUTime; ULONG NonCachedCPUTime; ULONG FileCPUTime; ULONG CGICPUTime; ULONG ISAPICPUTime; ULONG ASPCPUTime; ULONG ErrorCPUTime; ULONG OOPCPUTime; } IIS_REPORT_RECORD, *PIIS_REPORT_RECORD; // // Global that holds everything about the current session // extern SYSTEM_RECORD CurrentSystem; extern BOOLEAN fDSOnly; extern ULONGLONG DSStartTime; extern ULONGLONG DSEndTime; extern RTL_CRITICAL_SECTION TLCritSect; #define EnterTracelibCritSection() RtlEnterCriticalSection(&TLCritSect) #define LeaveTracelibCritSection() RtlLeaveCriticalSection(&TLCritSect) // // Initialization Routines. // VOID InitDiskRecord( PTDISK_RECORD pDisk, ULONG DiskNumber ); VOID InitMofData( PMOF_DATA pMofData ); VOID InitThreadRecord( PTHREAD_RECORD pThread ); VOID InitProcessRecord( PPROCESS_RECORD pProcess ); VOID InitFileRecord( PFILE_RECORD pFile ); // // Add, Delete and Find routines PTRANS_RECORD CreateTransRecord(); BOOLEAN AddModuleRecord( PMODULE_RECORD * pModule, ULONG lBaseAddress, ULONG lModuleSize, WCHAR * strModuleName ); BOOLEAN AddHPFFileRecord( PHPF_FILE_RECORD * ppHPFFileRecord, ULONG RecordID, ULONG IrpFlags, ULONG DiskNumber, ULONGLONG ByteOffset, ULONG BytesCount, PVOID fDO ); BOOLEAN AddHPFRecord( PHPF_RECORD * ppHPFRRecord, ULONG lFaultAddress, PVOID fDO, LONG ByteCount, LONGLONG ByteOffset ); void DeleteHPFRecord( PHPF_RECORD pHPFRecord ); BOOLEAN AddProcess( ULONG ProcessId, PPROCESS_RECORD *Process ); BOOLEAN DeleteTrans( PTRANS_RECORD Trans ); BOOLEAN DeleteTransList( PLIST_ENTRY Head, ULONG level ); PTRANS_RECORD FindTransByList( PLIST_ENTRY Head, LPGUID pGuid, ULONG level ); PMOF_DATA FindMofData( PMOF_INFO pMofInfo, PWCHAR strSortKey ); BOOLEAN DeleteProcess( PPROCESS_RECORD Process ); BOOLEAN AddThread( ULONG ThreadId, PEVENT_TRACE pEvent, PTHREAD_RECORD * Thread ); BOOLEAN DeleteThread( PTHREAD_RECORD Thread ); BOOLEAN AddFile( WCHAR* fileName, PFILE_RECORD *ReturnedFile, PLOGICAL_DRIVE_RECORD pLogDrive ); BOOLEAN DeleteFileRecord( PFILE_RECORD fileRec ); BOOLEAN DeleteFileObject( PFILE_OBJECT fileObj ); PLOGICAL_DRIVE_RECORD FindLogicalDrive( ULONGLONG AccessedOffset, ULONG DiskNumber ); VOID AddLogicalDrive( ULONGLONG StartOffset, ULONGLONG PartitionSize, ULONG DiskNumber, ULONG Size, ULONG DriveType, PWCHAR DriveLetterString ); PPROCESS_RECORD FindProcessById( ULONG Id, BOOLEAN CheckAlive ); PTDISK_RECORD FindLocalDiskById( PLIST_ENTRY Head, ULONG DiskNumber ); PTDISK_RECORD FindProcessDiskById( PPROCESS_RECORD pProcess, ULONG DiskNumber ); PFILE_RECORD FindFileInProcess( PPROCESS_RECORD pProcess, WCHAR* Name ); PPROTO_PROCESS_RECORD FindProtoProcessRecord( PFILE_RECORD pFile, PPROCESS_RECORD pProcess ); PFILE_RECORD FindFileRecordByName( WCHAR* Name, PLOGICAL_DRIVE_RECORD pLogDrive ); PTHREAD_RECORD FindGlobalThreadById( ULONG ThreadId, PEVENT_TRACE pEvent ); PTDISK_RECORD FindGlobalDiskById( ULONG Id ); PPROCESS_RECORD FindDiskProcessById( PTDISK_RECORD Disk, ULONG Id ); ULONGLONG CalculateProcessLifeTime(PPROCESS_RECORD pProcess); ULONG CalculateProcessKCPU(PPROCESS_RECORD pProcess); ULONG CalculateProcessUCPU(PPROCESS_RECORD pProcess); VOID Cleanup(); BOOLEAN AddDisk( ULONG DiskNumber, PTDISK_RECORD *ReturnedDisk ); BOOLEAN DeleteDisk( PTDISK_RECORD Disk ); ULONG DeletePrintJobRecord( PPRINT_JOB_RECORD pJob, ULONG bSave ); PPRINT_JOB_RECORD AddPrintJobRecord( ULONG JobId ); PPRINT_JOB_RECORD FindPrintJobRecord( ULONG JobId ); ULONG DeleteHttpReqRecord( PHTTP_REQUEST_RECORD pReq, ULONG bSave ); PHTTP_REQUEST_RECORD AddHttpReqRecord( ULONGLONG RequestId, USHORT IpAddrType, ULONG IpAddrV4, USHORT *IpAddrV6 ); PHTTP_REQUEST_RECORD FindHttpReqRecord( ULONGLONG RequestId ); PHTTP_REQUEST_RECORD FindHttpReqRecordByConId( ULONGLONG ConId, PHTTP_REQUEST_RECORD pPrevReq ); PHTTP_REQUEST_RECORD FindPendingHttpReqRecord( ULONGLONG RequestId ); PURL_RECORD AddUrlRecord( PUCHAR URL ); PURL_RECORD FindUrlRecord( PUCHAR URL ); PURL_RECORD FindOrAddUrlRecord( PUCHAR URL ); PURL_RECORD GetHeadUrlRecord( ULONG index ); ULONG DeleteUrlRecord( PURL_RECORD pUrl ); PCLIENT_RECORD AddClientRecord( USHORT IpAddrType, ULONG IpAddrV4, USHORT *IpAddrV6 ); PCLIENT_RECORD FindClientRecord( USHORT IpAddrType, ULONG IpAddrV4, USHORT *IpAddrV6 ); PCLIENT_RECORD FindOrAddClientRecord( USHORT IpAddrType, ULONG IpAddrV4, USHORT *IpAddrV6 ); PCLIENT_RECORD GetHeadClientRecord(); ULONG DeleteClientRecord( PCLIENT_RECORD pClient ); PSITE_RECORD AddSiteRecord( ULONG SiteId ); PSITE_RECORD FindSiteRecord( ULONG SiteId ); PSITE_RECORD FindOrAddSiteRecord( ULONG SiteId ); PSITE_RECORD GetHeadSiteRecord(); ULONG DeleteSiteRecord( PSITE_RECORD pSite ); int EtwRelogEtl( PTRACE_CONTEXT_BLOCK TraceContext, PULONG pMergedEventsLost ); // // Trace Event Callbacks // VOID ShutdownThreads(); // Shuts down the running threads before finishing VOID ShutdownProcesses(); // Shuts down the running processes before finishing ULONG GetMofData( PEVENT_TRACE pEvent, WCHAR *strName, PVOID ReturnValue, ULONG ReturnLength ); VOID GeneralEventCallback(PEVENT_TRACE pEvent); VOID DeclareKernelEvents(); VOID ProcessCallback( PEVENT_TRACE pEvent ); VOID PsStartCallback( PEVENT_TRACE pEvent ); VOID PsEndCallback( PEVENT_TRACE pEvent ); VOID ThreadCallback( PEVENT_TRACE pEvent ); VOID ThStartCallback( PEVENT_TRACE pEvent ); VOID ThEndCallback( PEVENT_TRACE pEvent ); VOID DiskIoCallback( PEVENT_TRACE pEvent, PTHREAD_RECORD pThread ); VOID IoReadCallback( PEVENT_TRACE pEvent, PTHREAD_RECORD pThread ); VOID IoWriteCallback( PEVENT_TRACE pEvent, PTHREAD_RECORD pThread ); VOID HotFileCallback( PEVENT_TRACE pEvent ); VOID LogDriveCallback( PEVENT_TRACE pEvent ); VOID LogHeaderCallback( PEVENT_TRACE pEvent ); VOID EventCallback( PEVENT_TRACE pEvent, PTHREAD_RECORD pThread ); VOID AddEvent( IN PFILE_OBJECT fileObject, IN ULONG DiskNumber, IN ULONG IoSize, IN BOOLEAN ReadFlag); PFILE_OBJECT FindFileInTable ( IN PVOID fDO ); //VOID //ProcessPdh( // IN LPCSTR LogFileName, // IN ULONGLONG StartTime, // IN ULONGLONG EndTime // ); // // Workload Classification Routines // VOID Classify(); VOID InitClass(); VOID AssignClass( IN PPROCESS_RECORD pProcess, IN PTHREAD_RECORD pThread ); PMOF_INFO GetMofInfoHead( LPCGUID pGuid ); void WriteSummary(); #define IsNotEmpty( string ) ((BOOL)( (NULL != string) && ( L'\0' != string[0]) )) #endif // __CPDATA__