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.

1219 lines
29 KiB

  1. /*++
  2. Copyright (c) 1995 Microsoft Corporation
  3. Module Name:
  4. cpdata.h
  5. Abstract:
  6. cp data internal data structures
  7. Author:
  8. 08-Apr-1998 mraghu
  9. Revision History:
  10. --*/
  11. #ifndef __CPDATA__
  12. #define __CPDATA__
  13. #include <stdlib.h>
  14. #include <stdio.h>
  15. #include <nt.h>
  16. #pragma warning (disable:4306)
  17. #include <ntrtl.h>
  18. #include <nturtl.h>
  19. #pragma warning (default:4306)
  20. #include <windows.h>
  21. #include <shellapi.h>
  22. #include <wmistr.h>
  23. #include <wtypes.h>
  24. #pragma warning (disable:4201)
  25. #include <wmistr.h>
  26. #include <objbase.h>
  27. #include <initguid.h>
  28. #include <wmium.h>
  29. #include <ntwmi.h>
  30. #include <wmiumkm.h>
  31. #include <wmiguid.h>
  32. #include <evntrace.h>
  33. #include <strsafe.h>
  34. #pragma warning (default:4201)
  35. // For TDI address decoding
  36. #include <ipexport.h>
  37. #include <tdi.h>
  38. #include "list.h"
  39. #include "workload.h"
  40. #define MAX_FILE_TABLE_SIZE 64 // Must match ntos\wmi\callout.c
  41. #define MAX_TRANS_LEVEL 32
  42. #ifndef IsEqualGUID
  43. #define IsEqualGUID(guid1, guid2) \
  44. (!memcmp((guid1), (guid2), sizeof(GUID)))
  45. #endif
  46. #define THREAD_HASH_TABLESIZE 29
  47. #define URL_HASH_TABLESIZE 32
  48. #define MAXSTR 1024
  49. #define CHECK_HR(hr) if( ERROR_SUCCESS != hr ){ goto cleanup; }
  50. #define EVENT_TRACE_TYPE_FILEIO_NAME 0x00
  51. #define EVENT_TRACE_TYPE_FIELIO_CREATE 0x20
  52. #define EVENT_TRACE_TYPE_SPL_SPOOLJOB EVENT_TRACE_TYPE_START
  53. #define EVENT_TRACE_TYPE_SPL_PRINTJOB EVENT_TRACE_TYPE_DEQUEUE
  54. #define EVENT_TRACE_TYPE_SPL_DELETEJOB EVENT_TRACE_TYPE_END
  55. #define EVENT_TRACE_TYPE_SPL_TRACKTHREAD EVENT_TRACE_TYPE_CHECKPOINT
  56. #define EVENT_TRACE_TYPE_SPL_ENDTRACKTHREAD 0x0A
  57. #define EVENT_TRACE_TYPE_SPL_JOBRENDERED 0x0B
  58. #define EVENT_TRACE_TYPE_SPL_PAUSE 0x0C
  59. #define EVENT_TRACE_TYPE_SPL_RESUME 0x0D
  60. #define EVENT_TRACE_TYPE_UL_START EVENT_TRACE_TYPE_START
  61. #define EVENT_TRACE_TYPE_UL_PARSE 0x0A
  62. #define EVENT_TRACE_TYPE_UL_DELIVER 0x0B
  63. #define EVENT_TRACE_TYPE_UL_RECVRESP 0x0C
  64. #define EVENT_TRACE_TYPE_UL_RECVBODY 0x0D
  65. #define EVENT_TRACE_TYPE_UL_CACHEDEND 0x0E
  66. #define EVENT_TRACE_TYPE_UL_CACHEANDSEND 0x0F
  67. #define EVENT_TRACE_TYPE_UL_FASTRESP 0x10
  68. #define EVENT_TRACE_TYPE_UL_FASTSEND 0x11
  69. #define EVENT_TRACE_TYPE_UL_ZEROSEND 0x12
  70. #define EVENT_TRACE_TYPE_UL_SENDERROR 0x13
  71. #define EVENT_TRACE_TYPE_UL_END EVENT_TRACE_TYPE_END
  72. #define EVENT_TRACE_TYPE_W3CORE_START EVENT_TRACE_TYPE_START
  73. #define EVENT_TRACE_TYPE_W3CORE_FILEREQ 0x0A
  74. #define EVENT_TRACE_TYPE_W3CORE_CGIREQ 0x0B
  75. #define EVENT_TRACE_TYPE_W3CORE_ISAPIREQ 0x0C
  76. #define EVENT_TRACE_TYPE_W3CORE_OOPREQ 0x0D
  77. #define EVENT_TRACE_TYPE_W3CORE_SENDBODY 0x10
  78. #define EVENT_TRACE_TYPE_W3CORE_SENDRESP 0x11
  79. #define EVENT_TRACE_TYPE_W3CORE_SENDENTITY 0x12
  80. #define EVENT_TRACE_TYPE_W3CORE_SENDFILTER 0x13
  81. #define EVENT_TRACE_TYPE_W3CORE_ERRSEND 0x14
  82. #define EVENT_TRACE_TYPE_W3CORE_ERRSENDENT 0x15
  83. #define EVENT_TRACE_TYPE_W3CORE_ERRSENDCTX 0x16
  84. #define EVENT_TRACE_TYPE_W3CORE_ERRVECSEND 0x17
  85. #define EVENT_TRACE_TYPE_W3CORE_VECTORSEND 0x18
  86. #define EVENT_TRACE_TYPE_W3CORE_END EVENT_TRACE_TYPE_END
  87. #define EVENT_TRACE_TYPE_W3FILTER_START EVENT_TRACE_TYPE_START
  88. #define EVENT_TRACE_TYPE_W3FILTER_END EVENT_TRACE_TYPE_END
  89. #define EVENT_TRACE_TYPE_W3CGI_START EVENT_TRACE_TYPE_START
  90. #define EVENT_TRACE_TYPE_W3CGI_END EVENT_TRACE_TYPE_END
  91. #define EVENT_TRACE_TYPE_W3ISAPI_START EVENT_TRACE_TYPE_START
  92. #define EVENT_TRACE_TYPE_W3ISAPI_SENDHDR 0x0A
  93. #define EVENT_TRACE_TYPE_W3ISAPI_SENDHDREX 0x0B
  94. #define EVENT_TRACE_TYPE_W3ISAPI_VECTORSEND 0x0C
  95. #define EVENT_TRACE_TYPE_W3ISAPI_ERRORSEND 0x0D
  96. #define EVENT_TRACE_TYPE_W3ISAPI_SSFSEND 0x0E
  97. #define EVENT_TRACE_TYPE_W3ISAPI_SSDERROR 0x0F
  98. #define EVENT_TRACE_TYPE_W3ISAPI_END EVENT_TRACE_TYPE_END
  99. #define EVENT_TRACE_TYPE_IISSTRMFILTER_START EVENT_TRACE_TYPE_START
  100. #define EVENT_TRACE_TYPE_IISSTRMFILTER_END EVENT_TRACE_TYPE_END
  101. #define EVENT_TRACE_TYPE_IISSSLHANDLESHAKE_START EVENT_TRACE_TYPE_START
  102. #define EVENT_TRACE_TYPE_IISSSLHANDLESHAKE_END EVENT_TRACE_TYPE_END
  103. #define EVENT_TRACE_TYPE_IISASP_START EVENT_TRACE_TYPE_START
  104. #define EVENT_TRACE_TYPE_IISASP_END EVENT_TRACE_TYPE_END
  105. #define ISAPI_EXTENTION_ASP 0
  106. #define ISAPI_EXTENTION_ASP_NET 1
  107. #define ISAPI_EXTENTION_CUSTOM 2
  108. #define MAX_ADDRESS_LENGTH \
  109. sizeof("[ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff%4294967295]:65535")
  110. typedef struct _TRACE_CONTEXT_BLOCK {
  111. PEVENT_TRACE_PROPERTIES LoggerInfo;
  112. ULONG LogFileCount;
  113. ULONG LoggerCount;
  114. LPWSTR LogFileName[MAXLOGGERS];
  115. LPWSTR LoggerName[MAXLOGGERS];
  116. LPCSTR PdhFileName; // ANSI ??
  117. LPWSTR ProcFileName;
  118. LPWSTR DumpFileName;
  119. LPWSTR MofFileName;
  120. LPWSTR XSLDocName;
  121. LPWSTR DefMofFileName;
  122. LPWSTR MergeFileName;
  123. LPWSTR SummaryFileName;
  124. LPWSTR CompFileName;
  125. HANDLE hEvent;
  126. FILE* hDumpFile;
  127. ULONGLONG StartTime; // If Sequential, start, End Times to window.
  128. ULONGLONG EndTime; //
  129. ULONG Flags;
  130. BOOLEAN LoggerStartedHere;
  131. void (*StatusFunction)(int, double);
  132. HANDLE hThreadVector;
  133. TRACEHANDLE HandleArray[MAXLOGGERS];
  134. PVOID pUserContext;
  135. } TRACE_CONTEXT_BLOCK, *PTRACE_CONTEXT_BLOCK;
  136. typedef struct _HPF_FILE_RECORD
  137. {
  138. LIST_ENTRY Entry;
  139. ULONG RecordID;
  140. ULONG IrpFlags;
  141. ULONG DiskNumber;
  142. ULONG BytesCount;
  143. ULONGLONG ByteOffset;
  144. PVOID fDO;
  145. } HPF_FILE_RECORD, *PHPF_FILE_RECORD;
  146. typedef struct _HPF_RECORD
  147. {
  148. LIST_ENTRY Entry;
  149. ULONG RecordID;
  150. ULONG lProgramCounter;
  151. ULONG lFaultAddress;
  152. PVOID fDO;
  153. LONG lByteCount;
  154. LONGLONG lByteOffset;
  155. LIST_ENTRY HPFReadListHead;
  156. } HPF_RECORD, *PHPF_RECORD;
  157. typedef struct _TDISK_RECORD
  158. {
  159. LIST_ENTRY Entry;
  160. ULONG DiskNumber;
  161. LPWSTR DiskName;
  162. ULONG ReadCount;
  163. ULONG WriteCount;
  164. ULONG ReadSize;
  165. ULONG WriteSize;
  166. ULONG HPF;
  167. ULONG HPFSize;
  168. LIST_ENTRY FileListHead;
  169. LIST_ENTRY ProcessListHead;
  170. } TDISK_RECORD, *PTDISK_RECORD;
  171. typedef struct _FILE_RECORD
  172. {
  173. LIST_ENTRY Entry;
  174. LIST_ENTRY ProtoProcessListHead; // List of Processes touching this file.
  175. PWCHAR Drive;
  176. PWCHAR FileName;
  177. ULONG DiskNumber;
  178. ULONG ReadCount;
  179. ULONG HPF;
  180. ULONG WriteCount;
  181. ULONG ReadSize;
  182. ULONG WriteSize;
  183. ULONG HPFSize;
  184. } FILE_RECORD, *PFILE_RECORD;
  185. typedef struct _FILE_OBJECT
  186. {
  187. PVOID fDO;
  188. PFILE_RECORD fileRec;
  189. ULONG ThreadId;
  190. ULONG DiskNumber;
  191. ULONGLONG LastByteOffset;
  192. LIST_ENTRY ProtoFileRecordListHead;
  193. }FILE_OBJECT, *PFILE_OBJECT;
  194. typedef struct _PROTO_FILE_RECORD
  195. {
  196. LIST_ENTRY Entry;
  197. BOOLEAN ReadFlag;
  198. ULONG DiskNumber;
  199. ULONG IoSize;
  200. } PROTO_FILE_RECORD, *PPROTO_FILE_RECORD;
  201. typedef struct _TRANS_RECORD
  202. {
  203. LIST_ENTRY Entry;
  204. LIST_ENTRY SubTransListHead;
  205. LPGUID pGuid;
  206. BOOL bStarted;
  207. ULONG UCpu;
  208. ULONG KCpu;
  209. ULONG DeltaReadIO;
  210. ULONG DeltaWriteIO;
  211. ULONG RefCount;
  212. ULONG RefCount1;
  213. } TRANS_RECORD, *PTRANS_RECORD;
  214. typedef struct _PROCESS_RECORD
  215. {
  216. LIST_ENTRY Entry;
  217. LIST_ENTRY ThreadListHead;
  218. LIST_ENTRY DiskListHead;
  219. LIST_ENTRY FileListHead; // All the Files this process touched.
  220. LIST_ENTRY ModuleListHead; // All the modules this process loaded.
  221. LIST_ENTRY HPFListHead;
  222. PWCHAR UserName;
  223. PWCHAR ImageName;
  224. ULONG PID;
  225. ULONG DeadFlag;
  226. ULONG ReadIO;
  227. ULONG WriteIO;
  228. ULONG SendCount;
  229. ULONG RecvCount;
  230. ULONG SendSize;
  231. ULONG RecvSize;
  232. ULONG HPF;
  233. ULONG HPFSize;
  234. ULONG SPF;
  235. ULONG PrivateWSet;
  236. ULONG GlobalWSet;
  237. ULONG ReadIOSize;
  238. ULONG WriteIOSize;
  239. ULONG lDataFaultHF;
  240. ULONG lDataFaultTF;
  241. ULONG lDataFaultDZF;
  242. ULONG lDataFaultCOW;
  243. ULONG lCodeFaultHF;
  244. ULONG lCodeFaultTF;
  245. ULONG lCodeFaultDZF;
  246. ULONG lCodeFaultCOW;
  247. ULONGLONG ResponseTime;
  248. ULONGLONG TxnStartTime;
  249. ULONGLONG TxnEndTime;
  250. } PROCESS_RECORD, *PPROCESS_RECORD;
  251. typedef struct _THREAD_RECORD
  252. {
  253. LIST_ENTRY Entry;
  254. LIST_ENTRY DiskListHead;
  255. LIST_ENTRY TransListHead; // transactions list
  256. LIST_ENTRY HPFReadListHead;
  257. LIST_ENTRY HPFWriteListHead;
  258. WCHAR strSortKey[MAXSTR];
  259. ULONG TID;
  260. PPROCESS_RECORD pProcess;
  261. BOOLEAN fOrphan;
  262. ULONG DeadFlag;
  263. ULONG ProcessorID;
  264. ULONG ClassNumber; // Class to which this thread is assigned.
  265. ULONG ReadIO;
  266. ULONG WriteIO;
  267. ULONG SendCount;
  268. ULONG RecvCount;
  269. ULONG SendSize;
  270. ULONG RecvSize;
  271. ULONG HPF;
  272. ULONG SPF;
  273. ULONG ReadIOSize;
  274. ULONG WriteIOSize;
  275. ULONG HPFSize;
  276. ULONGLONG TimeStart;
  277. ULONGLONG TimeEnd;
  278. ULONG KCPUStart;
  279. ULONG KCPUEnd;
  280. ULONG UCPUStart;
  281. ULONG UCPUEnd;
  282. // The Following fields are used in getting the Delta
  283. // CPU, I/O to charge on a transaction basis.
  284. // The Current Transaction being executed by this thread is
  285. // given by pMofInfo and when the trans is completed the Delta CPU, I/O
  286. // are charged to that transaction.
  287. ULONG DeltaReadIO;
  288. ULONG DeltaWriteIO;
  289. ULONG DeltaSend;
  290. ULONG DeltaRecv;
  291. ULONG RefCount;
  292. ULONG JobId; // Keeps track of the Current Job this thread is working on
  293. PVOID pMofData; // Keep Track of the Current transaction Guid
  294. ULONG KCPU_Trans;
  295. ULONG UCPU_Trans;
  296. ULONG KCPU_NoTrans;
  297. ULONG UCPU_NoTrans;
  298. ULONG KCPU_PrevTrans;
  299. ULONG UCPU_PrevTrans;
  300. LONG TransLevel;
  301. ULONG KCPU_PrevEvent;
  302. ULONG UCPU_PrevEvent;
  303. ULONGLONG Time_PrevEvent;
  304. PTRANS_RECORD TransStack[MAX_TRANS_LEVEL];
  305. // for IIS event
  306. ULONGLONG IisReqId;
  307. }THREAD_RECORD, *PTHREAD_RECORD;
  308. typedef struct _MODULE_RECORD MODULE_RECORD, *PMODULE_RECORD;
  309. struct _MODULE_RECORD
  310. {
  311. LIST_ENTRY Entry;
  312. PPROCESS_RECORD pProcess;
  313. ULONG lBaseAddress;
  314. ULONG lModuleSize;
  315. ULONG lDataFaultHF;
  316. ULONG lDataFaultTF;
  317. ULONG lDataFaultDZF;
  318. ULONG lDataFaultCOW;
  319. ULONG lCodeFaultHF;
  320. ULONG lCodeFaultTF;
  321. ULONG lCodeFaultDZF;
  322. ULONG lCodeFaultCOW;
  323. WCHAR * strModuleName;
  324. PMODULE_RECORD pGlobalPtr;
  325. };
  326. typedef struct _SYSTEM_RECORD {
  327. ULONGLONG StartTime;
  328. ULONGLONG EndTime;
  329. ULONGLONG LastEventTime;
  330. ULONGLONG IISStartTime;
  331. ULONGLONG IISEndTime;
  332. FILE* TempPrintFile;
  333. FILE* TempIisFile;
  334. BOOLEAN fNoEndTime;
  335. ULONG CurrentThread0;
  336. ULONG ElapseTime;
  337. ULONG TimerResolution;
  338. ULONG NumberOfEvents;
  339. ULONG NumberOfProcessors;
  340. ULONG CpuSpeed;
  341. ULONG MemorySize;
  342. PWCHAR ComputerName;
  343. ULONG NumberOfWorkloads;
  344. ULONG BuildNumber;
  345. PFILE_OBJECT *FileTable;
  346. PLIST_ENTRY ThreadHashList;
  347. LIST_ENTRY ProcessListHead;
  348. LIST_ENTRY GlobalThreadListHead;
  349. LIST_ENTRY GlobalDiskListHead;
  350. LIST_ENTRY HotFileListHead;
  351. LIST_ENTRY WorkloadListHead;
  352. LIST_ENTRY InstanceListHead;
  353. LIST_ENTRY EventListHead;
  354. LIST_ENTRY GlobalModuleListHead; // Global module list.
  355. LIST_ENTRY ProcessFileListHead;
  356. LIST_ENTRY PrintJobListHead;
  357. LIST_ENTRY HttpReqListHead;
  358. LIST_ENTRY PendingHttpReqListHead;
  359. PLIST_ENTRY URLHashList;
  360. LIST_ENTRY ClientListHead;
  361. LIST_ENTRY SiteListHead;
  362. LIST_ENTRY LogicalDriveHead;
  363. // memory recyling list
  364. // For Trans and Job, we will recycle the allocated structures.
  365. // URLs do not nned to be recycled because they are allocated together
  366. // at the report time and freed all at the same time. However, we'll
  367. // just keep them just in case.
  368. LIST_ENTRY FreePrintJobListHead;
  369. LIST_ENTRY FreeHttpReqListHead;
  370. LIST_ENTRY FreeTransListHead;
  371. LIST_ENTRY FreeURLListHead;
  372. HANDLE hLoggerUpEvent;
  373. } SYSTEM_RECORD, *PSYSTEM_RECORD;
  374. typedef struct _PROCESS_FILE_RECORD {
  375. LIST_ENTRY Entry;
  376. ULONGLONG StartTime;
  377. ULONGLONG EndTime;
  378. LPWSTR FileName;
  379. LPWSTR TraceName;
  380. } PROCESS_FILE_RECORD, *PPROCESS_FILE_RECORD;
  381. typedef struct _PROTO_PROCESS_RECORD
  382. {
  383. LIST_ENTRY Entry;
  384. PPROCESS_RECORD ProcessRecord;
  385. ULONG ReadCount;
  386. ULONG WriteCount;
  387. ULONG HPF;
  388. ULONG ReadSize;
  389. ULONG WriteSize;
  390. ULONG HPFSize;
  391. } PROTO_PROCESS_RECORD, *PPROTO_PROCESS_RECORD;
  392. typedef struct _LOGICAL_DRIVE_RECORD
  393. {
  394. LIST_ENTRY Entry;
  395. ULONGLONG StartOffset;
  396. ULONGLONG PartitionSize;
  397. ULONG DiskNumber;
  398. ULONG Size;
  399. ULONG DriveType;
  400. PWCHAR DriveLetterString;
  401. } LOGICAL_DRIVE_RECORD, *PLOGICAL_DRIVE_RECORD;
  402. //
  403. // MOF_INFO structure maintains the global information for the GUID.
  404. // For each GUID, the event layouts are maintained by Version, Level and Type.
  405. //
  406. typedef struct _MOF_INFO {
  407. LIST_ENTRY Entry;
  408. LIST_ENTRY DataListHead;
  409. LPWSTR strDescription; // Class Name
  410. LPWSTR strSortField;
  411. ULONG EventCount;
  412. GUID Guid;
  413. LIST_ENTRY VersionHeader;
  414. BOOL bKernelEvent;
  415. } MOF_INFO, *PMOF_INFO;
  416. //
  417. // MOF_VERSION structure ic created one per Version, Level Type combination.
  418. //
  419. typedef struct _MOF_VERSION {
  420. LIST_ENTRY Entry;
  421. LIST_ENTRY ItemHeader; // Maintains the list of ITEM_DESC for this type.
  422. LPWSTR strType;
  423. SHORT Version;
  424. SHORT TypeIndex;
  425. CHAR Level;
  426. ULONG EventCountByType; // Count of Events by this type for this Guid
  427. } MOF_VERSION, *PMOF_VERSION;
  428. typedef struct _MOF_DATA {
  429. LIST_ENTRY Entry;
  430. PWCHAR strSortKey;
  431. ULONG CompleteCount;
  432. LONG InProgressCount;
  433. LONGLONG AverageResponseTime;
  434. LONGLONG TotalResponseTime;
  435. ULONGLONG PrevClockTime;
  436. ULONG MmTf;
  437. ULONG MmDzf;
  438. ULONG MmCow;
  439. ULONG MmGpf;
  440. ULONG UserCPU;
  441. ULONG KernelCPU;
  442. ULONG EventCount;
  443. ULONG ReadCount;
  444. ULONG WriteCount;
  445. ULONG SendCount;
  446. ULONG RecvCount;
  447. LONG MinKCpu;
  448. LONG MaxKCpu;
  449. LONG MinUCpu;
  450. LONG MaxUCpu;
  451. } MOF_DATA, *PMOF_DATA;
  452. // A Job record is one that passses through several threads to complete.
  453. // Jobs are identified by a Job Id, usually created during the Start
  454. // event and recorded as an additional field in the mof data.
  455. // Since there can be any number of jobs in the system over the data
  456. // collection interval, we will flush the completed jobs to a temp file
  457. // and reread it back at the end to print a report.
  458. // Note: Job_record needs to be Guid based. (ie., per type of transaction).
  459. // Currently it is not.
  460. //
  461. #define MAX_THREADS 10 // Upto threads can be working on a Job.
  462. typedef struct _THREAD_DATA {
  463. ULONG ThreadId;
  464. ULONG PrevKCPUTime;
  465. ULONG PrevUCPUTime;
  466. ULONG PrevReadIO;
  467. ULONG PrevWriteIO;
  468. ULONG KCPUTime;
  469. ULONG UCPUTime;
  470. ULONG ReadIO;
  471. ULONG WriteIO;
  472. ULONG Reserved;
  473. } THREAD_DATA, *PTHREAD_DATA;
  474. typedef struct _PRINT_JOB_RECORD {
  475. LIST_ENTRY Entry;
  476. ULONG JobId;
  477. ULONG KCPUTime;
  478. ULONG UCPUTime;
  479. ULONG ReadIO;
  480. ULONG WriteIO;
  481. ULONG DataType;
  482. ULONG JobSize;
  483. ULONG Pages;
  484. ULONG PagesPerSide;
  485. ULONG ICMMethod;
  486. ULONG GdiJobSize;
  487. ULONGLONG StartTime;
  488. ULONGLONG EndTime;
  489. ULONGLONG ResponseTime;
  490. ULONGLONG PauseTime;
  491. ULONGLONG PauseStartTime;
  492. ULONGLONG PrintJobTime;
  493. SHORT FilesOpened;
  494. SHORT Color;
  495. SHORT XRes;
  496. SHORT YRes;
  497. SHORT Quality;
  498. SHORT Copies;
  499. SHORT TTOption;
  500. ULONG NumberOfThreads; // Total Number of Threads worked on this Job
  501. THREAD_DATA ThreadData[MAX_THREADS];
  502. } PRINT_JOB_RECORD, *PPRINT_JOB_RECORD;
  503. // URL records for IIS events
  504. typedef struct _URL_RECORD {
  505. LIST_ENTRY Entry;
  506. ULONG SiteId;
  507. ULONG KCPUTime;
  508. ULONG UCPUTime;
  509. ULONG ReadIO;
  510. ULONG WriteIO;
  511. ULONG Hits;
  512. ULONG Requests;
  513. ULONG UrlType;
  514. ULONG BytesSent;
  515. ULONGLONG TotalResponseTime;
  516. PCHAR URL;
  517. } URL_RECORD, *PURL_RECORD;
  518. // Site records for IIS events
  519. typedef struct _SITE_RECORD {
  520. LIST_ENTRY Entry;
  521. ULONG SiteId;
  522. ULONG KCPUTime;
  523. ULONG UCPUTime;
  524. ULONG ReadIO;
  525. ULONG WriteIO;
  526. ULONG Hits;
  527. ULONG Requests;
  528. ULONG BytesSent;
  529. ULONGLONG TotalResponseTime;
  530. ULONG FileRequests;
  531. ULONG CGIRequests;
  532. ULONG ISAPIRequests;
  533. ULONG OOPRequests;
  534. ULONG ASPRequests;
  535. } SITE_RECORD, *PSITE_RECORD;
  536. // Client records for IIS events
  537. typedef struct _CLIENT_RECORD {
  538. LIST_ENTRY Entry;
  539. ULONG Hits;
  540. ULONG Requests;
  541. ULONG BytesSent;
  542. ULONGLONG TotalResponseTime;
  543. USHORT IpAddrType;
  544. ULONG IpAddrV4;
  545. USHORT IpAddrV6[8];
  546. } CLIENT_RECORD, *PCLIENT_RECORD;
  547. // This is IIS Request Record for IIS events
  548. typedef struct _HTTP_REQUEST_RECORD {
  549. LIST_ENTRY Entry;
  550. ULONGLONG RequestId;
  551. ULONGLONG ConId;
  552. ULONG SiteId;
  553. ULONG BytesSent;
  554. ULONG KCPUTime;
  555. ULONG UCPUTime;
  556. ULONG ULCPUTime;
  557. ULONG W3CPUTime;
  558. ULONG W3FltrCPUTime;
  559. ULONG ISAPICPUTime;
  560. ULONG ASPCPUTime;
  561. ULONG CGICPUTime;
  562. ULONG ReadIO;
  563. ULONG WriteIO;
  564. ULONGLONG ULStartTime;
  565. ULONGLONG ULEndTime;
  566. ULONGLONG ULResponseTime;
  567. ULONGLONG ULParseTime;
  568. ULONGLONG ULDeliverTime;
  569. ULONGLONG ULReceiveTime;
  570. SHORT ULReceiveType;
  571. SHORT ULEndType;
  572. ULONGLONG W3StartTime;
  573. ULONGLONG W3EndTime;
  574. ULONGLONG W3FilterResponseTime;
  575. ULONGLONG W3FilterStartTime;
  576. ULONGLONG W3FilterEndTime;
  577. ULONG W3FilterVisits;
  578. SHORT W3ProcessType;
  579. SHORT W3EndType;
  580. ULONGLONG FileReqTime;
  581. ULONGLONG CGIStartTime;
  582. ULONGLONG CGIEndTime;
  583. ULONGLONG ISAPIStartTime;
  584. ULONGLONG ISAPIEndTime;
  585. SHORT ISAPIEndType;
  586. ULONGLONG ASPStartTime;
  587. ULONGLONG ASPEndTime;
  588. ULONGLONG SSLResponseTime;
  589. ULONGLONG StrmFltrResponseTime;
  590. USHORT HttpStatus;
  591. USHORT IsapiExt;
  592. ULONG NumberOfThreads; // Total Number of Threads worked on this reqeust
  593. ULONG CurrentThreadIndex;
  594. THREAD_DATA ThreadData[MAX_THREADS];
  595. USHORT IpAddrType;
  596. ULONG IpAddrV4;
  597. USHORT IpAddrV6[8];
  598. PCHAR URL;
  599. PURL_RECORD URLRecord;
  600. PCLIENT_RECORD ClientRecord;
  601. } HTTP_REQUEST_RECORD, *PHTTP_REQUEST_RECORD;
  602. typedef struct _IIS_REPORT_RECORD {
  603. ULONG TotalRequests;
  604. ULONG CachedResponses;
  605. ULONGLONG TotalCachedResponseTime;
  606. ULONGLONG TotalNonCachedResponseTime;
  607. ULONG W3FileRequests;
  608. ULONG W3CGIRequests;
  609. ULONG W3ISAPIRequests;
  610. ULONG W3ASPRequests;
  611. ULONG W3OOPRequests;
  612. ULONG W3FilterRequests;
  613. ULONG W3Error;
  614. ULONGLONG TotalW3FilterResponseTime;
  615. ULONG TotalW3FilterCPUTime;
  616. ULONG TotalFileULOnlyCPUTime;
  617. ULONG TotalFileW3OnlyCPUTime;
  618. ULONG TotalFileW3FilterCPUTime;
  619. ULONGLONG TotalFileResponseTime;
  620. ULONGLONG TotalFileULOnlyResponseTime;
  621. ULONGLONG TotalFileW3OnlyResponseTime;
  622. ULONGLONG TotalFileW3FilterResponseTime;
  623. ULONG TotalCGIOnlyCPUTime;
  624. ULONG TotalCGIULOnlyCPUTime;
  625. ULONG TotalCGIW3OnlyCPUTime;
  626. ULONG TotalCGIW3FilterCPUTime;
  627. ULONGLONG TotalCGIResponseTime;
  628. ULONGLONG TotalCGIOnlyResponseTime;
  629. ULONGLONG TotalCGIULOnlyResponseTime;
  630. ULONGLONG TotalCGIW3OnlyResponseTime;
  631. ULONGLONG TotalCGIW3FilterResponseTime;
  632. ULONG TotalASPOnlyCPUTime;
  633. ULONG TotalASPULOnlyCPUTime;
  634. ULONG TotalASPW3OnlyCPUTime;
  635. ULONG TotalASPISAPIOnlyCPUTime;
  636. ULONG TotalASPW3FilterCPUTime;
  637. ULONGLONG TotalISAPIResponseTime;
  638. ULONGLONG TotalASPResponseTime;
  639. ULONGLONG TotalASPOnlyResponseTime;
  640. ULONGLONG TotalASPULOnlyResponseTime;
  641. ULONGLONG TotalASPW3OnlyResponseTime;
  642. ULONGLONG TotalASPISAPIOnlyResponseTime;
  643. ULONGLONG TotalASPW3FilterResponseTime;
  644. ULONG TotalErrorULOnlyCPUTime;
  645. ULONG TotalErrorW3OnlyCPUTime;
  646. ULONG TotalErrorW3FilterCPUTime;
  647. ULONG TotalErrorCGIOnlyCPUTime;
  648. ULONG TotalErrorISAPIOnlyCPUTime;
  649. ULONG TotalErrorASPOnlyCPUTime;
  650. ULONGLONG TotalErrorResponseTime;
  651. ULONGLONG TotalErrorULOnlyResponseTime;
  652. ULONGLONG TotalErrorW3OnlyResponseTime;
  653. ULONGLONG TotalErrorW3FilterResponseTime;
  654. ULONGLONG TotalOOPResponseTime;
  655. ULONG TotalCPUTime;
  656. ULONG CachedCPUTime;
  657. ULONG NonCachedCPUTime;
  658. ULONG FileCPUTime;
  659. ULONG CGICPUTime;
  660. ULONG ISAPICPUTime;
  661. ULONG ASPCPUTime;
  662. ULONG ErrorCPUTime;
  663. ULONG OOPCPUTime;
  664. } IIS_REPORT_RECORD, *PIIS_REPORT_RECORD;
  665. //
  666. // Global that holds everything about the current session
  667. //
  668. extern SYSTEM_RECORD CurrentSystem;
  669. extern BOOLEAN fDSOnly;
  670. extern ULONGLONG DSStartTime;
  671. extern ULONGLONG DSEndTime;
  672. extern RTL_CRITICAL_SECTION TLCritSect;
  673. #define EnterTracelibCritSection() RtlEnterCriticalSection(&TLCritSect)
  674. #define LeaveTracelibCritSection() RtlLeaveCriticalSection(&TLCritSect)
  675. //
  676. // Initialization Routines.
  677. //
  678. VOID
  679. InitDiskRecord(
  680. PTDISK_RECORD pDisk,
  681. ULONG DiskNumber
  682. );
  683. VOID
  684. InitMofData(
  685. PMOF_DATA pMofData
  686. );
  687. VOID
  688. InitThreadRecord(
  689. PTHREAD_RECORD pThread
  690. );
  691. VOID
  692. InitProcessRecord(
  693. PPROCESS_RECORD pProcess
  694. );
  695. VOID
  696. InitFileRecord(
  697. PFILE_RECORD pFile
  698. );
  699. //
  700. // Add, Delete and Find routines
  701. PTRANS_RECORD
  702. CreateTransRecord();
  703. BOOLEAN
  704. AddModuleRecord(
  705. PMODULE_RECORD * pModule,
  706. ULONG lBaseAddress,
  707. ULONG lModuleSize,
  708. WCHAR * strModuleName
  709. );
  710. BOOLEAN
  711. AddHPFFileRecord(
  712. PHPF_FILE_RECORD * ppHPFFileRecord,
  713. ULONG RecordID,
  714. ULONG IrpFlags,
  715. ULONG DiskNumber,
  716. ULONGLONG ByteOffset,
  717. ULONG BytesCount,
  718. PVOID fDO
  719. );
  720. BOOLEAN
  721. AddHPFRecord(
  722. PHPF_RECORD * ppHPFRRecord,
  723. ULONG lFaultAddress,
  724. PVOID fDO,
  725. LONG ByteCount,
  726. LONGLONG ByteOffset
  727. );
  728. void
  729. DeleteHPFRecord(
  730. PHPF_RECORD pHPFRecord
  731. );
  732. BOOLEAN
  733. AddProcess(
  734. ULONG ProcessId,
  735. PPROCESS_RECORD *Process
  736. );
  737. BOOLEAN
  738. DeleteTrans(
  739. PTRANS_RECORD Trans
  740. );
  741. BOOLEAN
  742. DeleteTransList(
  743. PLIST_ENTRY Head,
  744. ULONG level
  745. );
  746. PTRANS_RECORD
  747. FindTransByList(
  748. PLIST_ENTRY Head,
  749. LPGUID pGuid,
  750. ULONG level
  751. );
  752. PMOF_DATA
  753. FindMofData(
  754. PMOF_INFO pMofInfo,
  755. PWCHAR strSortKey
  756. );
  757. BOOLEAN
  758. DeleteProcess(
  759. PPROCESS_RECORD Process
  760. );
  761. BOOLEAN
  762. AddThread(
  763. ULONG ThreadId,
  764. PEVENT_TRACE pEvent,
  765. PTHREAD_RECORD * Thread
  766. );
  767. BOOLEAN
  768. DeleteThread(
  769. PTHREAD_RECORD Thread
  770. );
  771. BOOLEAN
  772. AddFile(
  773. WCHAR* fileName,
  774. PFILE_RECORD *ReturnedFile,
  775. PLOGICAL_DRIVE_RECORD pLogDrive
  776. );
  777. BOOLEAN
  778. DeleteFileRecord(
  779. PFILE_RECORD fileRec
  780. );
  781. BOOLEAN
  782. DeleteFileObject(
  783. PFILE_OBJECT fileObj
  784. );
  785. PLOGICAL_DRIVE_RECORD
  786. FindLogicalDrive(
  787. ULONGLONG AccessedOffset,
  788. ULONG DiskNumber
  789. );
  790. VOID
  791. AddLogicalDrive(
  792. ULONGLONG StartOffset,
  793. ULONGLONG PartitionSize,
  794. ULONG DiskNumber,
  795. ULONG Size,
  796. ULONG DriveType,
  797. PWCHAR DriveLetterString
  798. );
  799. PPROCESS_RECORD
  800. FindProcessById(
  801. ULONG Id,
  802. BOOLEAN CheckAlive
  803. );
  804. PTDISK_RECORD
  805. FindLocalDiskById(
  806. PLIST_ENTRY Head,
  807. ULONG DiskNumber
  808. );
  809. PTDISK_RECORD
  810. FindProcessDiskById(
  811. PPROCESS_RECORD pProcess,
  812. ULONG DiskNumber
  813. );
  814. PFILE_RECORD
  815. FindFileInProcess(
  816. PPROCESS_RECORD pProcess,
  817. WCHAR* Name
  818. );
  819. PPROTO_PROCESS_RECORD
  820. FindProtoProcessRecord(
  821. PFILE_RECORD pFile,
  822. PPROCESS_RECORD pProcess
  823. );
  824. PFILE_RECORD
  825. FindFileRecordByName(
  826. WCHAR* Name,
  827. PLOGICAL_DRIVE_RECORD pLogDrive
  828. );
  829. PTHREAD_RECORD
  830. FindGlobalThreadById(
  831. ULONG ThreadId,
  832. PEVENT_TRACE pEvent
  833. );
  834. PTDISK_RECORD
  835. FindGlobalDiskById(
  836. ULONG Id
  837. );
  838. PPROCESS_RECORD
  839. FindDiskProcessById(
  840. PTDISK_RECORD Disk,
  841. ULONG Id
  842. );
  843. ULONGLONG CalculateProcessLifeTime(PPROCESS_RECORD pProcess);
  844. ULONG CalculateProcessKCPU(PPROCESS_RECORD pProcess);
  845. ULONG CalculateProcessUCPU(PPROCESS_RECORD pProcess);
  846. VOID
  847. Cleanup();
  848. BOOLEAN
  849. AddDisk(
  850. ULONG DiskNumber,
  851. PTDISK_RECORD *ReturnedDisk
  852. );
  853. BOOLEAN
  854. DeleteDisk(
  855. PTDISK_RECORD Disk
  856. );
  857. ULONG
  858. DeletePrintJobRecord(
  859. PPRINT_JOB_RECORD pJob,
  860. ULONG bSave
  861. );
  862. PPRINT_JOB_RECORD
  863. AddPrintJobRecord(
  864. ULONG JobId
  865. );
  866. PPRINT_JOB_RECORD
  867. FindPrintJobRecord(
  868. ULONG JobId
  869. );
  870. ULONG
  871. DeleteHttpReqRecord(
  872. PHTTP_REQUEST_RECORD pReq,
  873. ULONG bSave
  874. );
  875. PHTTP_REQUEST_RECORD
  876. AddHttpReqRecord(
  877. ULONGLONG RequestId,
  878. USHORT IpAddrType,
  879. ULONG IpAddrV4,
  880. USHORT *IpAddrV6
  881. );
  882. PHTTP_REQUEST_RECORD
  883. FindHttpReqRecord(
  884. ULONGLONG RequestId
  885. );
  886. PHTTP_REQUEST_RECORD
  887. FindHttpReqRecordByConId(
  888. ULONGLONG ConId,
  889. PHTTP_REQUEST_RECORD pPrevReq
  890. );
  891. PHTTP_REQUEST_RECORD
  892. FindPendingHttpReqRecord(
  893. ULONGLONG RequestId
  894. );
  895. PURL_RECORD
  896. AddUrlRecord(
  897. PUCHAR URL
  898. );
  899. PURL_RECORD
  900. FindUrlRecord(
  901. PUCHAR URL
  902. );
  903. PURL_RECORD
  904. FindOrAddUrlRecord(
  905. PUCHAR URL
  906. );
  907. PURL_RECORD
  908. GetHeadUrlRecord(
  909. ULONG index
  910. );
  911. ULONG
  912. DeleteUrlRecord(
  913. PURL_RECORD pUrl
  914. );
  915. PCLIENT_RECORD
  916. AddClientRecord(
  917. USHORT IpAddrType,
  918. ULONG IpAddrV4,
  919. USHORT *IpAddrV6
  920. );
  921. PCLIENT_RECORD
  922. FindClientRecord(
  923. USHORT IpAddrType,
  924. ULONG IpAddrV4,
  925. USHORT *IpAddrV6
  926. );
  927. PCLIENT_RECORD
  928. FindOrAddClientRecord(
  929. USHORT IpAddrType,
  930. ULONG IpAddrV4,
  931. USHORT *IpAddrV6
  932. );
  933. PCLIENT_RECORD
  934. GetHeadClientRecord();
  935. ULONG
  936. DeleteClientRecord(
  937. PCLIENT_RECORD pClient
  938. );
  939. PSITE_RECORD
  940. AddSiteRecord(
  941. ULONG SiteId
  942. );
  943. PSITE_RECORD
  944. FindSiteRecord(
  945. ULONG SiteId
  946. );
  947. PSITE_RECORD
  948. FindOrAddSiteRecord(
  949. ULONG SiteId
  950. );
  951. PSITE_RECORD
  952. GetHeadSiteRecord();
  953. ULONG
  954. DeleteSiteRecord(
  955. PSITE_RECORD pSite
  956. );
  957. int EtwRelogEtl(
  958. PTRACE_CONTEXT_BLOCK TraceContext,
  959. PULONG pMergedEventsLost
  960. );
  961. //
  962. // Trace Event Callbacks
  963. //
  964. VOID
  965. ShutdownThreads(); // Shuts down the running threads before finishing
  966. VOID
  967. ShutdownProcesses(); // Shuts down the running processes before finishing
  968. ULONG
  969. GetMofData(
  970. PEVENT_TRACE pEvent,
  971. WCHAR *strName,
  972. PVOID ReturnValue,
  973. ULONG ReturnLength
  974. );
  975. VOID GeneralEventCallback(PEVENT_TRACE pEvent);
  976. VOID DeclareKernelEvents();
  977. VOID
  978. ProcessCallback(
  979. PEVENT_TRACE pEvent
  980. );
  981. VOID
  982. PsStartCallback(
  983. PEVENT_TRACE pEvent
  984. );
  985. VOID
  986. PsEndCallback(
  987. PEVENT_TRACE pEvent
  988. );
  989. VOID
  990. ThreadCallback(
  991. PEVENT_TRACE pEvent
  992. );
  993. VOID
  994. ThStartCallback(
  995. PEVENT_TRACE pEvent
  996. );
  997. VOID
  998. ThEndCallback(
  999. PEVENT_TRACE pEvent
  1000. );
  1001. VOID
  1002. DiskIoCallback(
  1003. PEVENT_TRACE pEvent,
  1004. PTHREAD_RECORD pThread
  1005. );
  1006. VOID
  1007. IoReadCallback(
  1008. PEVENT_TRACE pEvent,
  1009. PTHREAD_RECORD pThread
  1010. );
  1011. VOID
  1012. IoWriteCallback(
  1013. PEVENT_TRACE pEvent,
  1014. PTHREAD_RECORD pThread
  1015. );
  1016. VOID
  1017. HotFileCallback(
  1018. PEVENT_TRACE pEvent
  1019. );
  1020. VOID
  1021. LogDriveCallback(
  1022. PEVENT_TRACE pEvent
  1023. );
  1024. VOID
  1025. LogHeaderCallback(
  1026. PEVENT_TRACE pEvent
  1027. );
  1028. VOID
  1029. EventCallback(
  1030. PEVENT_TRACE pEvent,
  1031. PTHREAD_RECORD pThread
  1032. );
  1033. VOID AddEvent(
  1034. IN PFILE_OBJECT fileObject,
  1035. IN ULONG DiskNumber,
  1036. IN ULONG IoSize,
  1037. IN BOOLEAN ReadFlag);
  1038. PFILE_OBJECT FindFileInTable (
  1039. IN PVOID fDO
  1040. );
  1041. //VOID
  1042. //ProcessPdh(
  1043. // IN LPCSTR LogFileName,
  1044. // IN ULONGLONG StartTime,
  1045. // IN ULONGLONG EndTime
  1046. // );
  1047. //
  1048. // Workload Classification Routines
  1049. //
  1050. VOID
  1051. Classify();
  1052. VOID
  1053. InitClass();
  1054. VOID
  1055. AssignClass(
  1056. IN PPROCESS_RECORD pProcess,
  1057. IN PTHREAD_RECORD pThread
  1058. );
  1059. PMOF_INFO
  1060. GetMofInfoHead(
  1061. LPCGUID pGuid
  1062. );
  1063. void
  1064. WriteSummary();
  1065. #define IsNotEmpty( string ) ((BOOL)( (NULL != string) && ( L'\0' != string[0]) ))
  1066. #endif // __CPDATA__