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.

540 lines
24 KiB

  1. /*****************************************************************************/
  2. // dbgtool.c
  3. //
  4. // Dump or reset the RDP performance counters
  5. //
  6. // Copyright (C) 1998-2000 Microsoft Corporation
  7. /*****************************************************************************/
  8. #include <nt.h>
  9. #include <ntrtl.h>
  10. #include <nturtl.h>
  11. #include <ntddkbd.h>
  12. #include <ntddmou.h>
  13. #include <windows.h>
  14. #include <winbase.h>
  15. #include <winerror.h>
  16. #include <winstaw.h>
  17. #include <icadd.h>
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <time.h>
  21. #include <utilsub.h>
  22. #include <nprcount.h>
  23. #include "dbgtool.h"
  24. WCHAR CurDir[ 256 ];
  25. WCHAR WinStation[MAX_IDS_LEN+1];
  26. WCHAR TraceOption[MAX_OPTION];
  27. int bTraceOption = FALSE;
  28. int fDebugger = FALSE;
  29. int fTimestamp = FALSE;
  30. int fHelp = FALSE;
  31. int fSystem = FALSE;
  32. int fAll = FALSE;
  33. int fPerf = FALSE;
  34. int fZero = FALSE;
  35. ULONG TraceClass = 0;
  36. ULONG TraceEnable = 0;
  37. ULONG LogonId;
  38. WINSTATIONINFORMATION WinInfo;
  39. TOKMAP ptm[] = {
  40. {L" ", TMFLAG_OPTIONAL, TMFORM_STRING, MAX_IDS_LEN, WinStation},
  41. {L"/c", TMFLAG_OPTIONAL, TMFORM_LONGHEX, sizeof(ULONG), &TraceClass},
  42. {L"/e", TMFLAG_OPTIONAL, TMFORM_LONGHEX, sizeof(ULONG), &TraceEnable},
  43. {L"/d", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(int), &fDebugger},
  44. {L"/t", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(int), &fTimestamp},
  45. {L"/o", TMFLAG_OPTIONAL, TMFORM_STRING, MAX_OPTION, TraceOption},
  46. {L"/system", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(int), &fSystem},
  47. {L"/all", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(int), &fAll},
  48. {L"/?", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fHelp},
  49. {L"/perf", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fPerf},
  50. {L"/zero", TMFLAG_OPTIONAL, TMFORM_BOOLEAN, sizeof(USHORT), &fZero},
  51. {0, 0, 0, 0, 0}
  52. };
  53. void SetSystemTrace( PICA_TRACE );
  54. void SetStackTrace( PICA_TRACE );
  55. void GetTSPerfCounters( ULONG LogonId, WINSTATIONINFORMATION *pInfo);
  56. void ZeroTSPerfCounters( ULONG LogonId );
  57. void ShowPerfCounters( void );
  58. /*******************************************************************************
  59. *
  60. * main
  61. *
  62. ******************************************************************************/
  63. int _cdecl main(INT argc, CHAR **argv)
  64. {
  65. WCHAR *CmdLine;
  66. WCHAR **argvW;
  67. ULONG rc;
  68. int i;
  69. ICA_TRACE Trace;
  70. /*
  71. * We can't use argv[] because its always ANSI, regardless of UNICODE
  72. */
  73. CmdLine = GetCommandLine();
  74. /*
  75. * Massage the new command line to look like an argv[] type
  76. * because ParseCommandLine() depends on this format
  77. */
  78. argvW = (WCHAR **)malloc( sizeof(WCHAR *) * (argc+1) );
  79. if(argvW == NULL) {
  80. fwprintf(stderr, ERROR_MEMORY);
  81. return(1);
  82. }
  83. argvW[0] = wcstok(CmdLine, L" ");
  84. for(i=1; i < argc; i++){
  85. argvW[i] = wcstok(0, L" ");
  86. }
  87. argvW[argc] = NULL;
  88. /*
  89. * parse the cmd line without parsing the program name (argc-1, argv+1)
  90. */
  91. rc = ParseCommandLine(argc-1, argvW+1, ptm, 0);
  92. /*
  93. * Check for error from ParseCommandLine
  94. */
  95. if ( fHelp || (rc && !(rc & PARSE_FLAG_NO_PARMS)) ) {
  96. if ( !fHelp ) {
  97. fwprintf(stderr, ERROR_PARAMS);
  98. fwprintf(stderr, USAGE);
  99. return(1);
  100. } else {
  101. wprintf(USAGE);
  102. return(0);
  103. }
  104. }
  105. if ( fAll ) {
  106. TraceClass = 0xffffffff;
  107. TraceEnable = 0xffffffff;
  108. }
  109. /*
  110. * Get current directory
  111. */
  112. (VOID) GetCurrentDirectory( 256, CurDir );
  113. /*
  114. * Get the LogonId
  115. */
  116. if ( ptm[0].tmFlag & TMFLAG_PRESENT ) {
  117. if ( iswdigit( WinStation[0] ) ) {
  118. LogonId = (ULONG) wcstol( WinStation, NULL, 10 );
  119. } else {
  120. if ( !LogonIdFromWinStationName( SERVERNAME_CURRENT, WinStation, &LogonId ) ) {
  121. wprintf( ERROR_SESSION, WinStation );
  122. return(-1);
  123. }
  124. }
  125. if ( fSystem )
  126. wsprintf( Trace.TraceFile, L"%s\\winframe.log", CurDir );
  127. else
  128. wsprintf( Trace.TraceFile, L"%s\\%s.log", CurDir, WinStation );
  129. } else {
  130. LogonId = GetCurrentLogonId();
  131. if ( fSystem )
  132. wsprintf( Trace.TraceFile, L"%s\\winframe.log", CurDir );
  133. else
  134. wsprintf( Trace.TraceFile, L"%s\\%u.log", CurDir, LogonId );
  135. }
  136. /************************************************************************/
  137. /* TShare Performance Counters additions! */
  138. /************************************************************************/
  139. if (fZero)
  140. {
  141. ZeroTSPerfCounters(LogonId);
  142. goto EXIT_POINT;
  143. }
  144. if (fPerf)
  145. {
  146. GetTSPerfCounters(LogonId, &WinInfo);
  147. ShowPerfCounters();
  148. goto EXIT_POINT;
  149. }
  150. /*
  151. * Build trace structure
  152. */
  153. Trace.fDebugger = fDebugger ? TRUE : FALSE;
  154. Trace.fTimestamp = fTimestamp ? FALSE : TRUE;
  155. Trace.TraceClass = TraceClass;
  156. Trace.TraceEnable = TraceEnable;
  157. if ( TraceClass == 0 || TraceEnable == 0 )
  158. Trace.TraceFile[0] = '\0';
  159. /*
  160. * Fill in the trace option if any
  161. */
  162. bTraceOption = ptm[5].tmFlag & TMFLAG_PRESENT;
  163. if ( bTraceOption )
  164. memcpy(Trace.TraceOption, TraceOption, sizeof(TraceOption));
  165. else
  166. memset(Trace.TraceOption, 0, sizeof(TraceOption));
  167. /*
  168. * Set trace information
  169. */
  170. if ( fSystem )
  171. SetSystemTrace( &Trace );
  172. else
  173. SetStackTrace( &Trace );
  174. EXIT_POINT:
  175. return(0);
  176. }
  177. void
  178. SetSystemTrace( PICA_TRACE pTrace )
  179. {
  180. /*
  181. * Set trace information
  182. */
  183. if ( !WinStationSetInformation( SERVERNAME_CURRENT,
  184. LogonId,
  185. WinStationSystemTrace,
  186. pTrace,
  187. sizeof(ICA_TRACE) ) ) {
  188. wprintf(ERROR_SET_TRACE, GetLastError());
  189. return;
  190. }
  191. if ( pTrace->TraceClass == 0 || pTrace->TraceEnable == 0 ) {
  192. wprintf( TRACE_DIS_LOG );
  193. } else {
  194. wprintf( TRACE_EN_LOG );
  195. wprintf( L"- %08x %08x [%s] %s\n", pTrace->TraceClass, pTrace->TraceEnable,
  196. pTrace->TraceFile, fDebugger ? DEBUGGER : L"" );
  197. }
  198. }
  199. void
  200. SetStackTrace( PICA_TRACE pTrace )
  201. {
  202. WINSTATIONINFOCLASS InfoClass;
  203. ULONG InfoSize;
  204. /*
  205. * Check for console
  206. */
  207. if ( LogonId == 0 ) {
  208. wprintf( TRACE_UNSUPP );
  209. return;
  210. }
  211. /*
  212. * Set trace information
  213. */
  214. if ( !WinStationSetInformation( SERVERNAME_CURRENT,
  215. LogonId,
  216. WinStationTrace,
  217. pTrace,
  218. sizeof(ICA_TRACE))) {
  219. wprintf(ERROR_SET_TRACE, GetLastError());
  220. return;
  221. }
  222. if ( pTrace->TraceClass == 0 || pTrace->TraceEnable == 0 ) {
  223. wprintf( TRACE_DISABLED, LogonId );
  224. } else {
  225. wprintf( TRACE_ENABLED, LogonId );
  226. wprintf( L"- %08x %08x [%s] %s\n", pTrace->TraceClass, pTrace->TraceEnable,
  227. pTrace->TraceFile, fDebugger ? DEBUGGER : L"" );
  228. }
  229. }
  230. void
  231. GetTSPerfCounters( ULONG LogonId, WINSTATIONINFORMATION *pInfo)
  232. {
  233. ULONG retLength = 0;
  234. if (!WinStationQueryInformation( SERVERNAME_CURRENT,
  235. LogonId,
  236. WinStationInformation,
  237. pInfo,
  238. sizeof(WinInfo),
  239. &retLength))
  240. {
  241. wprintf(ERROR_GET_PERF, GetLastError());
  242. return;
  243. }
  244. }
  245. void
  246. ShowPerfCounters( void )
  247. {
  248. #define OUTPUT WinInfo.Status.Output
  249. #define INPUT WinInfo.Status.Input
  250. #define OUT_COUNTER WinInfo.Status.Output.Specific.Reserved
  251. #define IN_COUNTER WinInfo.Status.Input.Specific.Reserved
  252. #define CACHE WinInfo.Status.Cache.Specific.IcaCacheStats.ThinWireCache
  253. /************************************************************************/
  254. /* */
  255. /* NOTE that the apparently arcane tabbing means this stuff can be */
  256. /* loaded straight into excel! Don't change it without good reason!! */
  257. /* */
  258. /************************************************************************/
  259. wprintf(L"Output frames \t\t\t\t\t%u\n", OUTPUT.WdFrames);
  260. wprintf(L"Output bytes \t\t\t\t\t%u\n", OUTPUT.WdBytes);
  261. wprintf(L"Network layer packets sent\t\t\t\t\t%u\n", IN_COUNTER[IN_PKT_TOTAL_SENT]);
  262. wprintf(L"Largest packet sent\t\t\t\t\t%u\n", IN_COUNTER[IN_MAX_PKT_SIZE]);
  263. wprintf(L"Packet size histogram:\n");
  264. wprintf(L"\t0 - 200 bytes\t\t\t\t%u\n", IN_COUNTER[IN_PKT_BYTE_SPREAD1]);
  265. wprintf(L"\t201 - 400 bytes\t\t\t\t%u\n", IN_COUNTER[IN_PKT_BYTE_SPREAD2]);
  266. wprintf(L"\t401 - 600 bytes\t\t\t\t%u\n", IN_COUNTER[IN_PKT_BYTE_SPREAD3]);
  267. wprintf(L"\t601 - 800 bytes\t\t\t\t%u\n", IN_COUNTER[IN_PKT_BYTE_SPREAD4]);
  268. wprintf(L"\t801 - 1000 bytes\t\t\t\t%u\n", IN_COUNTER[IN_PKT_BYTE_SPREAD5]);
  269. wprintf(L"\t1001 - 1200 bytes\t\t\t\t%u\n", IN_COUNTER[IN_PKT_BYTE_SPREAD6]);
  270. wprintf(L"\t1201 - 1400 bytes\t\t\t\t%u\n", IN_COUNTER[IN_PKT_BYTE_SPREAD7]);
  271. wprintf(L"\t1401 - 1600 bytes\t\t\t\t%u\n", IN_COUNTER[IN_PKT_BYTE_SPREAD8]);
  272. wprintf(L"\t1601 - 2000 bytes\t\t\t\t%u\n", IN_COUNTER[IN_PKT_BYTE_SPREAD9]);
  273. wprintf(L"\t2001 - 4000 bytes\t\t\t\t%u\n", IN_COUNTER[IN_PKT_BYTE_SPREAD10]);
  274. wprintf(L"\t4001 - 6000 bytes\t\t\t\t%u\n", IN_COUNTER[IN_PKT_BYTE_SPREAD11]);
  275. wprintf(L"\t6001 - 8000 bytes\t\t\t\t%u\n", IN_COUNTER[IN_PKT_BYTE_SPREAD12]);
  276. wprintf(L"\t> 8000 bytes\t\t\t\t%u\n", IN_COUNTER[IN_PKT_BYTE_SPREAD13]);
  277. wprintf(L"\nSCHEDULING\n");
  278. wprintf(L"\tSmall payload size\t\t\t\t%u\n", IN_COUNTER[IN_SCH_SMALL_PAYLOAD ]);
  279. wprintf(L"\tLarge payload size\t\t\t\t%u\n", IN_COUNTER[IN_SCH_LARGE_PAYLOAD ]);
  280. wprintf(L"\ttotal available \t\t\t\t%u\n", IN_COUNTER[IN_SCH_OUT_ALL ]);
  281. wprintf(L"\t must-send \t\t\t\t%u\n", IN_COUNTER[IN_SCH_MUSTSEND ]);
  282. wprintf(L"\t output data pop \t\t\t\t%u\n", IN_COUNTER[IN_SCH_OUTPUT ]);
  283. wprintf(L"\t heap limit hit \t\t\t\t%u\n", IN_COUNTER[IN_SCH_OE_NUMBER ]);
  284. wprintf(L"\t new cursor pop \t\t\t\t%u\n", IN_COUNTER[IN_SCH_NEW_CURSOR ]);
  285. wprintf(L"\t wake-up pop! \t\t\t\t%u\n", IN_COUNTER[IN_SCH_ASLEEP ]);
  286. wprintf(L"\t do nothing! \t\t\t\t%u\n\n", IN_COUNTER[IN_SCH_DO_NOTHING ]);
  287. wprintf(L"\nORDER PDU DETAILS\n");
  288. wprintf(L"\ttotal update orders sent \t\t\t\t%u\n", IN_COUNTER[IN_SND_TOTAL_ORDER ]);
  289. wprintf(L"\tupdate order bytes sent \t\t\t\t%u\n", IN_COUNTER[IN_SND_ORDER_BYTES ]);
  290. wprintf(L"\tOutBuf alloc failures \t\t\t\t%u\n", IN_COUNTER[IN_SND_NO_BUFFER ]);
  291. wprintf(L"\nSDA PDU DETAILS\n");
  292. wprintf(L"\tcalls to SDG_SendSDA \t\t\t\t%u\n", IN_COUNTER[IN_SND_SDA_ALL ]);
  293. wprintf(L"\tSDA region area sent \t\t\t\t%u\n", IN_COUNTER[IN_SND_SDA_AREA ]);
  294. wprintf(L"\tnumber of SDA packets \t\t\t\t%u\n", IN_COUNTER[IN_SND_SDA_PDUS ]);
  295. wprintf(L"\nDrvBitBlt\n");
  296. wprintf(L"\tCalls \t\t\t\t%u\n", OUT_COUNTER[OUT_BITBLT_ALL ]);
  297. wprintf(L"\tFailed for no-offscr flag \t\t\t\t%u\n", OUT_COUNTER[OUT_BITBLT_NOOFFSCR]);
  298. wprintf(L"\tSent as SDA \t\t\t\t%u\n", OUT_COUNTER[OUT_BITBLT_SDA ]);
  299. wprintf(L"\t\tUnencodable ROP4\t\t\t%u\n", OUT_COUNTER[OUT_BITBLT_SDA_ROP4]);
  300. wprintf(L"\t\t\tSDA pixels\t\t\t%u\n", IN_COUNTER[IN_SDA_BITBLT_ROP4_AREA]);
  301. wprintf(L"\t\tUnsupported order\t\t\t%u\n", OUT_COUNTER[OUT_BITBLT_SDA_UNSUPPORTED]);
  302. wprintf(L"\t\t\tUnsupp scrscr ROP SDA pixels\t\t%u\n", IN_COUNTER[IN_SDA_SCRSCR_FAILROP_AREA]);
  303. wprintf(L"\t\tUnsupported ROP3\t\t\t%u\n", OUT_COUNTER[OUT_BITBLT_SDA_NOROP3]);
  304. wprintf(L"\t\t\tSDA pixels\t\t\t%u\n", IN_COUNTER[IN_SDA_BITBLT_NOROP3_AREA]);
  305. wprintf(L"\t\tComplex clipping\t\t\t%u\n", OUT_COUNTER[OUT_BITBLT_SDA_COMPLEXCLIP]);
  306. wprintf(L"\t\t\tSDA pixels\t\t\t%u\n", IN_COUNTER[IN_SDA_BITBLT_COMPLEXCLIP_AREA]);
  307. wprintf(L"\t\tMemblt Uncacheable\t\t\t%u\n", OUT_COUNTER[OUT_BITBLT_SDA_MBUNCACHEABLE]);
  308. wprintf(L"\t\tUnqueued color table\t\t\t%u\n", OUT_COUNTER[OUT_BITBLT_SDA_NOCOLORTABLE]);
  309. wprintf(L"\t\tFailed heap alloc\t\t\t%u\n", OUT_COUNTER[OUT_BITBLT_SDA_HEAPALLOCFAILED]);
  310. wprintf(L"\t\tFailed ScrBlt encoding (complex clip)\t\t\t%u\n", OUT_COUNTER[OUT_BITBLT_SDA_SBCOMPLEXCLIP]);
  311. wprintf(L"\t\tComplex brush on Mem3Blt\t\t\t%u\n", OUT_COUNTER[OUT_BITBLT_SDA_M3BCOMPLEXBRUSH]);
  312. wprintf(L"\t\tWindows layering\t\t\t%u\n", OUT_COUNTER[OUT_BITBLT_SDA_WINDOWSAYERING]);
  313. wprintf(L"\n\tMem(3)Blts\n");
  314. wprintf(L"\t\tMemBlt orders\t\t\t%u\n", OUT_COUNTER[OUT_MEMBLT_ORDER]);
  315. wprintf(L"\t\tMemBlt bytes \t\t\t%u\n", IN_COUNTER[IN_MEMBLT_BYTES]);
  316. wprintf(L"\t\tMemBlt SDA pixels\t\t\t%u\n", IN_COUNTER[IN_SDA_MEMBLT_AREA]);
  317. wprintf(L"\t\tMem3Blt orders\t\t\t%u\n", OUT_COUNTER[OUT_MEM3BLT_ORDER]);
  318. wprintf(L"\t\tMem3Blt bytes \t\t\t%u\n", IN_COUNTER[IN_MEM3BLT_BYTES]);
  319. wprintf(L"\t\tMem3Blt SDA pixels\t\t\t%u\n", IN_COUNTER[IN_SDA_MEM3BLT_AREA]);
  320. wprintf(L"\t\tCacheColorTable orders\t\t\t\t%u\n", OUT_COUNTER[OUT_CACHECOLORTABLE]);
  321. wprintf(L"\t\tCacheColorTable bytes\t\t\t\t%u\n", OUT_COUNTER[OUT_CACHECOLORTABLE_BYTES]);
  322. wprintf(L"\t\tCacheBitmap orders\t\t\t\t%u\n", OUT_COUNTER[OUT_CACHEBITMAP]);
  323. wprintf(L"\t\tCacheBitmap bytes\t\t\t\t%u\n", OUT_COUNTER[OUT_CACHEBITMAP_BYTES]);
  324. wprintf(L"\tDstBlts\n");
  325. wprintf(L"\t\tDstBlt orders\t\t\t%u\n", OUT_COUNTER[OUT_DSTBLT_ORDER]);
  326. wprintf(L"\t\tDstBlt bytes\t\t\t%u\n", IN_COUNTER[IN_DSTBLT_BYTES]);
  327. wprintf(L"\t\tMultiDstBlts\t\t\t%u\n", OUT_COUNTER[OUT_MULTI_DSTBLT_ORDER]);
  328. wprintf(L"\t\tMultiDstBlt bytes\t\t\t%u\n", IN_COUNTER[IN_MULTI_DSTBLT_BYTES]);
  329. wprintf(L"\t\tDstBlt SDA pixels\t\t\t%u\n", IN_COUNTER[IN_SDA_DSTBLT_AREA]);
  330. wprintf(L"\tPatBlts\n");
  331. wprintf(L"\t\tPatBlt orders\t\t\t%u\n", OUT_COUNTER[OUT_PATBLT_ORDER]);
  332. wprintf(L"\t\tPatBlt bytes\t\t\t%u\n", IN_COUNTER[IN_PATBLT_BYTES]);
  333. wprintf(L"\t\tMultiPatBlts\t\t\t%u\n", OUT_COUNTER[OUT_MULTI_PATBLT_ORDER]);
  334. wprintf(L"\t\tMultiPatBlt bytes\t\t\t%u\n", IN_COUNTER[IN_MULTI_PATBLT_BYTES]);
  335. wprintf(L"\t\tPatBlt SDA pixels\t\t\t%u\n", IN_COUNTER[IN_SDA_PATBLT_AREA]);
  336. wprintf(L"\tOpaqueRects\n");
  337. wprintf(L"\t\tOpaqueRect orders\t\t\t%u\n", OUT_COUNTER[OUT_OPAQUERECT_ORDER]);
  338. wprintf(L"\t\tOpaqueRect bytes\t\t\t%u\n", IN_COUNTER[IN_OPAQUERECT_BYTES]);
  339. wprintf(L"\t\tMultiOpaqueRects\t\t\t%u\n", OUT_COUNTER[OUT_MULTI_OPAQUERECT_ORDER]);
  340. wprintf(L"\t\tMultiOpaqueRect bytes\t\t\t%u\n", IN_COUNTER[IN_MULTI_OPAQUERECT_BYTES]);
  341. wprintf(L"\t\tOpaqueRect SDA pixels\t\t\t%u\n", IN_COUNTER[IN_SDA_OPAQUERECT_AREA]);
  342. wprintf(L"\tScrBlts\n");
  343. wprintf(L"\t\tScrBlt orders\t\t\t%u\n", OUT_COUNTER[OUT_SCRBLT_ORDER]);
  344. wprintf(L"\t\tScrBlt bytes\t\t\t%u\n", IN_COUNTER[IN_SCRBLT_BYTES]);
  345. wprintf(L"\t\tMultiScrBlts\t\t\t%u\n", OUT_COUNTER[OUT_MULTI_SCRBLT_ORDER]);
  346. wprintf(L"\t\tMultiScrBlt bytes\t\t\t%u\n", IN_COUNTER[IN_MULTI_SCRBLT_BYTES]);
  347. wprintf(L"\t\tScrBlt SDA pixels\t\t\t%u\n", IN_COUNTER[IN_SDA_SCRBLT_AREA]);
  348. wprintf(L"\nDrvCreateDeviceBitmap\n");
  349. wprintf(L"\tCalls \t\t\t\t%u\n", OUT_COUNTER[OUT_OFFSCREEN_BITMAP_ALL]);
  350. wprintf(L"\tSent as Create Offscr PDUs\t\t\t%u\n", OUT_COUNTER[OUT_OFFSCREEN_BITMAP_ORDER]);
  351. wprintf(L"\tCreate Offscr bytes\t\t\t%u\n", OUT_COUNTER[OUT_OFFSCREEN_BITMAP_ORDER_BYTES]);
  352. wprintf(L"\nSwitch Offscreen Surface PDUs sent\t\t\t%u\n", OUT_COUNTER[OUT_SWITCHSURFACE]);
  353. wprintf(L"\nSwitch Offscreen Surface bytes\t\t\t%u\n", OUT_COUNTER[OUT_SWITCHSURFACE_BYTES]);
  354. wprintf(L"\nDrvStretchBlt\n");
  355. wprintf(L"\tCalls \t\t\t\t%u\n", OUT_COUNTER[OUT_STRTCHBLT_ALL ]);
  356. wprintf(L"\tSent as SDA \t\t\t\t%u\n", OUT_COUNTER[OUT_STRTCHBLT_SDA ]);
  357. wprintf(L"\t\tMask specified \t\t\t%u\n", OUT_COUNTER[OUT_STRTCHBLT_SDA_MASK]);
  358. wprintf(L"\t\tComplex clipping\t\t\t%u\n", OUT_COUNTER[OUT_STRTCHBLT_SDA_COMPLEXCLIP]);
  359. wprintf(L"\tHandled as BitBlt \t\t\t\t%u\n", OUT_COUNTER[OUT_STRTCHBLT_BITBLT ]);
  360. wprintf(L"\nDrvCopyBits\n");
  361. wprintf(L"\tCalls \t\t\t\t%u\n", OUT_COUNTER[OUT_COPYBITS_ALL ]);
  362. wprintf(L"\nDrvTextOut\n");
  363. wprintf(L"\tCalls \t\t\t\t%u\n", OUT_COUNTER[OUT_TEXTOUT_ALL ]);
  364. wprintf(L"\tSent as SDA \t\t\t\t%u\n", OUT_COUNTER[OUT_TEXTOUT_SDA ]);
  365. wprintf(L"\t\tExtra rects\t\t\t%u\n", OUT_COUNTER[OUT_TEXTOUT_SDA_EXTRARECTS]);
  366. wprintf(L"\t\tNo string\t\t\t%u\n", OUT_COUNTER[OUT_TEXTOUT_SDA_NOSTRING]);
  367. wprintf(L"\t\tComplex clipping\t\t\t%u\n", OUT_COUNTER[OUT_TEXTOUT_SDA_COMPLEXCLIP]);
  368. wprintf(L"\t\tFailed alloc FCI\t\t\t%u\n", OUT_COUNTER[OUT_TEXTOUT_SDA_NOFCI]);
  369. wprintf(L"\tSDA pixels\t\t\t%u\n", IN_COUNTER[IN_SDA_TEXTOUT_AREA]);
  370. wprintf(L"\tGlyph Index Order \t\t\t%u\n", OUT_COUNTER[OUT_TEXTOUT_GLYPH_INDEX]);
  371. wprintf(L"\tGlyph Index bytes \t\t\t%u\n", IN_COUNTER[IN_GLYPHINDEX_BYTES]);
  372. wprintf(L"\tFast Index Order \t\t\t%u\n", OUT_COUNTER[OUT_TEXTOUT_FAST_INDEX]);
  373. wprintf(L"\tFast Index bytes \t\t\t%u\n", IN_COUNTER[IN_FASTINDEX_BYTES]);
  374. wprintf(L"\tFast Glyph Order \t\t\t%u\n", OUT_COUNTER[OUT_TEXTOUT_FAST_GLYPH]);
  375. wprintf(L"\tFast Glyph bytes \t\t\t%u\n", IN_COUNTER[IN_FASTGLYPH_BYTES]);
  376. wprintf(L"\tCache Glyph orders\t\t\t%u\n", OUT_COUNTER[OUT_CACHEGLYPH]);
  377. wprintf(L"\tCache Glyph bytes \t\t\t%u\n", OUT_COUNTER[OUT_CACHEGLYPH_BYTES]);
  378. wprintf(L"\nDrvLineTo\n");
  379. wprintf(L"\tCalls \t\t\t\t%u\n", OUT_COUNTER[OUT_LINETO_ALL ]);
  380. wprintf(L"\tLineTo orders \t\t\t\t%u\n", OUT_COUNTER[OUT_LINETO_ORDR ]);
  381. wprintf(L"\tLineTo bytes \t\t\t%u\n", IN_COUNTER[IN_LINETO_BYTES]);
  382. wprintf(L"\tSent as SDA \t\t\t\t%u\n", OUT_COUNTER[OUT_LINETO_SDA ]);
  383. wprintf(L"\t\tUnsupported order\t\t\t%u\n", OUT_COUNTER[OUT_LINETO_SDA_UNSUPPORTED]);
  384. wprintf(L"\t\tUnsupported brush\t\t\t%u\n", OUT_COUNTER[OUT_LINETO_SDA_BADBRUSH]);
  385. wprintf(L"\t\tComplex clipping\t\t\t%u\n", OUT_COUNTER[OUT_LINETO_SDA_COMPLEXCLIP]);
  386. wprintf(L"\t\tFailed to add order\t\t\t%u\n", OUT_COUNTER[OUT_LINETO_SDA_FAILEDADD]);
  387. wprintf(L"\tSDA pixels\t\t\t%u\n", IN_COUNTER[IN_SDA_LINETO_AREA]);
  388. wprintf(L"\nDrvStrokePath\n");
  389. wprintf(L"\tCalls \t\t\t\t%u\n", OUT_COUNTER[OUT_STROKEPATH_ALL ]);
  390. wprintf(L"\tSent as SDA \t\t\t\t%u\n", OUT_COUNTER[OUT_STROKEPATH_SDA ]);
  391. wprintf(L"\t\tLineTo unsupported\t\t\t%u\n", OUT_COUNTER[OUT_STROKEPATH_SDA_NOLINETO]);
  392. wprintf(L"\t\tUnsupported brush\t\t\t%u\n", OUT_COUNTER[OUT_STROKEPATH_SDA_BADBRUSH]);
  393. wprintf(L"\t\tComplex clipping\t\t\t%u\n", OUT_COUNTER[OUT_STROKEPATH_SDA_COMPLEXCLIP]);
  394. wprintf(L"\t\tFailed to add order\t\t\t%u\n", OUT_COUNTER[OUT_STROKEPATH_SDA_FAILEDADD]);
  395. wprintf(L"\tSDA pixels\t\t\t%u\n", IN_COUNTER[IN_SDA_STROKEPATH_AREA]);
  396. wprintf(L"\tNot sent \t\t\t\t%u\n", OUT_COUNTER[OUT_STROKEPATH_UNSENT ]);
  397. wprintf(L"\tPolyLine orders \t\t\t\t%u\n", OUT_COUNTER[OUT_STROKEPATH_POLYLINE]);
  398. wprintf(L"\tPolyLine bytes \t\t\t\t%u\n", IN_COUNTER[IN_POLYLINE_BYTES]);
  399. wprintf(L"\tEllipseSC \t\t\t\t%u\n", OUT_COUNTER[OUT_STROKEPATH_ELLIPSE_SC]);
  400. wprintf(L"\tEllipseSC bytes (dup below)\t\t\t\t%u\n", IN_COUNTER[IN_ELLIPSE_SC_BYTES]);
  401. wprintf(L"\nDrvFillPath\n");
  402. wprintf(L"\tCalls \t\t\t\t%u\n", OUT_COUNTER[OUT_FILLPATH_ALL ]);
  403. wprintf(L"\tSent as SDA \t\t\t\t%u\n", OUT_COUNTER[OUT_FILLPATH_SDA ]);
  404. wprintf(L"\tSDA pixels \t\t\t\t%u\n", IN_COUNTER[IN_SDA_FILLPATH_AREA]);
  405. wprintf(L"\tNot sent \t\t\t\t%u\n", OUT_COUNTER[OUT_FILLPATH_UNSENT ]);
  406. wprintf(L"\tPolygon Solid \t\t\t\t%u\n", OUT_COUNTER[OUT_FILLPATH_POLYGON_SC]);
  407. wprintf(L"\tPolygonSC bytes \t\t\t\t%u\n", IN_COUNTER[IN_POLYGON_SC_BYTES]);
  408. wprintf(L"\tPolygon Brush \t\t\t\t%u\n", OUT_COUNTER[OUT_FILLPATH_POLYGON_CB]);
  409. wprintf(L"\tPolygonCB bytes \t\t\t\t%u\n", IN_COUNTER[IN_POLYGON_CB_BYTES]);
  410. wprintf(L"\tEllipse Solid \t\t\t\t%u\n", OUT_COUNTER[OUT_FILLPATH_ELLIPSE_SC]);
  411. wprintf(L"\tEllipseSC bytes (dup above)\t\t\t\t%u\n", IN_COUNTER[IN_ELLIPSE_SC_BYTES]);
  412. wprintf(L"\tEllipse Brush \t\t\t\t%u\n", OUT_COUNTER[OUT_FILLPATH_ELLIPSE_CB]);
  413. wprintf(L"\tEllipseCB bytes \t\t\t\t%u\n", IN_COUNTER[IN_ELLIPSE_CB_BYTES]);
  414. wprintf(L"\nDrvPaint\n");
  415. wprintf(L"\tCalls \t\t\t\t%u\n", OUT_COUNTER[OUT_PAINT_ALL ]);
  416. wprintf(L"\tSent as SDA \t\t\t\t%u\n", OUT_COUNTER[OUT_PAINT_SDA ]);
  417. wprintf(L"\t\tComplex clipping\t\t\t%u\n", OUT_COUNTER[OUT_PAINT_SDA_COMPLEXCLIP]);
  418. wprintf(L"\tNot sent \t\t\t\t%u\n", OUT_COUNTER[OUT_PAINT_UNSENT ]);
  419. wprintf(L"\nDrvRealizeBrush\n");
  420. wprintf(L"\tCalls \t\t\t\t%u\n", OUT_COUNTER[OUT_BRUSH_ALL ]);
  421. wprintf(L"\tNumber stored \t\t\t\t%u\n", OUT_COUNTER[OUT_BRUSH_STORED ]);
  422. wprintf(L"\tMono (!standard) \t\t\t\t%u\n", OUT_COUNTER[OUT_BRUSH_MONO ]);
  423. wprintf(L"\tStandard \t\t\t\t%u\n", OUT_COUNTER[OUT_BRUSH_STANDARD ]);
  424. wprintf(L"\tRejected \t\t\t\t%u\n", OUT_COUNTER[OUT_BRUSH_REJECTED ]);
  425. wprintf(L"\tCacheBrush orders \t\t\t\t%u\n", OUT_COUNTER[OUT_CACHEBRUSH]);
  426. wprintf(L"\tCacheBrush bytes \t\t\t\t%u\n", OUT_COUNTER[OUT_CACHEBRUSH_BYTES]);
  427. wprintf(L"\nDrvSaveScreenBits\n");
  428. wprintf(L"\tCalls \t\t\t\t%u\n", OUT_COUNTER[OUT_SAVESCREEN_ALL ]);
  429. wprintf(L"\tSaveBitmap orders \t\t\t\t%u\n", OUT_COUNTER[OUT_SAVEBITMAP_ORDERS]);
  430. wprintf(L"\tSaveBitmap bytes \t\t\t\t%u\n", IN_COUNTER[IN_SAVEBITMAP_BYTES]);
  431. wprintf(L"\tNot supported \t\t\t\t%u\n", OUT_COUNTER[OUT_SAVESCREEN_UNSUPP ]);
  432. wprintf(L"\nOECheckBrushIsSimple\n");
  433. wprintf(L"\tFailed realization\t\t\t\t%u\n", OUT_COUNTER[OUT_CHECKBRUSH_NOREALIZATION]);
  434. wprintf(L"\tFailed because of complex brush\t\t\t\t%u\n", OUT_COUNTER[OUT_CHECKBRUSH_COMPLEX]);
  435. wprintf(L"*** END ***\n");
  436. }
  437. void
  438. ZeroTSPerfCounters( ULONG LogonId )
  439. {
  440. /************************************************************************/
  441. /* Get the current values in the winstation info record */
  442. /************************************************************************/
  443. GetTSPerfCounters(LogonId, &WinInfo);
  444. /************************************************************************/
  445. /* Zero out the counters */
  446. /************************************************************************/
  447. memset (WinInfo.Status.Output.Specific.Reserved, 0,
  448. sizeof(WinInfo.Status.Output.Specific));
  449. memset (WinInfo.Status.Input.Specific.Reserved, 0,
  450. sizeof(WinInfo.Status.Input.Specific));
  451. /************************************************************************/
  452. /* Set the new values back */
  453. /************************************************************************/
  454. if ( !WinStationSetInformation( SERVERNAME_CURRENT,
  455. //LogonId,
  456. LOGONID_CURRENT,
  457. WinStationInformation,
  458. &WinInfo,
  459. sizeof(WinInfo))) {
  460. wprintf(ERROR_SET_PERF, GetLastError());
  461. return;
  462. }
  463. }