Source code of Windows XP (NT5)
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.

263 lines
6.0 KiB

  1. #include <nt.h>
  2. #include <ntrtl.h>
  3. // #include <ntddk.h>
  4. #include "active.h"
  5. #include "tracedb.h"
  6. #if !TRACEDB_ACTIVE
  7. //
  8. // Dummy implementation if the module is inactive
  9. //
  10. VOID TestTraceDatabase (
  11. PVOID NotUsed
  12. )
  13. {
  14. DbgPrint ("Buggy: tracedb module is disabled \n");
  15. }
  16. #else
  17. #define assert_(Expr) { \
  18. if (!(Expr)) { \
  19. DbgPrint ("Test tracedb assert: (%s, %d): \" %s \" -- assertion failed \n", \
  20. __FILE__, __LINE__, #Expr); \
  21. DbgBreakPoint (); \
  22. return; \
  23. }}
  24. //
  25. // Real implementation if the module is active
  26. //
  27. VOID
  28. TestTraceDatabase (
  29. PVOID NotUsed
  30. )
  31. {
  32. PRTL_TRACE_DATABASE Db;
  33. ULONG_PTR Trace [16];
  34. PRTL_TRACE_BLOCK Blk;
  35. PRTL_TRACE_BLOCK BlkX;
  36. ULONG Index, I;
  37. BOOLEAN Result;
  38. ULONG Seed = 0xABCDDCBA;
  39. Db = RtlTraceDatabaseCreate (16,
  40. 0,
  41. RTL_TRACE_USE_NONPAGED_POOL,
  42. 'bDrT',
  43. 0);
  44. assert_ (RtlTraceDatabaseValidate (Db));
  45. assert_ (Db != NULL);
  46. for (Index = 0; Index < 16; Index++) {
  47. Trace[Index] = (ULONG_PTR)RtlRandom(&Seed);
  48. }
  49. Result = RtlTraceDatabaseAdd (Db, 16, (PVOID *)Trace, &Blk);
  50. assert_ (RtlTraceDatabaseValidate (Db));
  51. assert_ (Result);
  52. assert_ (Blk->Size == 16);
  53. assert_ (Blk->Count == 1);
  54. Result = RtlTraceDatabaseAdd (Db, 16, (PVOID *)Trace, &BlkX);
  55. assert_ (RtlTraceDatabaseValidate (Db));
  56. assert_ (Result);
  57. assert_ (Blk->Size == 16);
  58. assert_ (Blk->Count == 2);
  59. assert_ (Blk == BlkX);
  60. //
  61. // Stress a little bit the whole thing
  62. //
  63. Seed = 0xABCDDCBA;
  64. for (I = 0; I < 10000; I++) {
  65. for (Index = 0; Index < 16; Index++) {
  66. RtlRandom(&Seed);
  67. Trace[Index] = (ULONG_PTR)Seed;
  68. }
  69. Result = RtlTraceDatabaseAdd (Db, 16, (PVOID *)Trace, &Blk);
  70. assert_ (RtlTraceDatabaseValidate (Db));
  71. assert_ (Result);
  72. assert_ (Blk->Size == 16);
  73. assert_ (Blk->Count >= 1);
  74. Result = RtlTraceDatabaseFind (Db, 16, (PVOID *)Trace, &BlkX);
  75. assert_ (RtlTraceDatabaseValidate (Db));
  76. assert_ (Result);
  77. assert_ (Blk->Size == 16);
  78. assert_ (Blk->Count >= 1);
  79. assert_ (Blk == BlkX);
  80. if (I % 512 == 0) {
  81. DbgPrint(".");
  82. }
  83. }
  84. DbgPrint("\n");
  85. //
  86. // Stress a little bit the whole thing
  87. //
  88. Seed = 0xABCDDCBA;
  89. for (I = 0; I < 10000; I++) {
  90. for (Index = 0; Index < 16; Index++) {
  91. RtlRandom(&Seed);
  92. Trace[Index] = (ULONG_PTR)Seed;
  93. }
  94. Result = RtlTraceDatabaseFind (Db, 16, (PVOID *)Trace, &Blk);
  95. assert_ (RtlTraceDatabaseValidate (Db));
  96. assert_ (Result);
  97. assert_ (Blk->Size == 16);
  98. assert_ (Blk->Count >= 1);
  99. Result = RtlTraceDatabaseAdd (Db, 16, (PVOID *)Trace, &BlkX);
  100. assert_ (RtlTraceDatabaseValidate (Db));
  101. assert_ (Result);
  102. assert_ (Blk->Size == 16);
  103. assert_ (Blk->Count >= 2);
  104. assert_ (Blk == BlkX);
  105. if (I % 512 == 0) {
  106. DbgPrint(".");
  107. }
  108. }
  109. DbgPrint("\n");
  110. RtlTraceDatabaseDestroy (Db);
  111. //
  112. // Use paged pool also.
  113. //
  114. Db = RtlTraceDatabaseCreate (16,
  115. 0,
  116. RTL_TRACE_USE_PAGED_POOL,
  117. 'bDrT',
  118. 0);
  119. assert_ (RtlTraceDatabaseValidate (Db));
  120. assert_ (Db != NULL);
  121. for (Index = 0; Index < 16; Index++) {
  122. Trace[Index] = (ULONG_PTR)RtlRandom(&Seed);
  123. }
  124. Result = RtlTraceDatabaseAdd (Db, 16, (PVOID *)Trace, &Blk);
  125. assert_ (RtlTraceDatabaseValidate (Db));
  126. assert_ (Result);
  127. assert_ (Blk->Size == 16);
  128. assert_ (Blk->Count == 1);
  129. Result = RtlTraceDatabaseAdd (Db, 16, (PVOID *)Trace, &BlkX);
  130. assert_ (RtlTraceDatabaseValidate (Db));
  131. assert_ (Result);
  132. assert_ (Blk->Size == 16);
  133. assert_ (Blk->Count == 2);
  134. assert_ (Blk == BlkX);
  135. //
  136. // Stress a little bit the whole thing
  137. //
  138. Seed = 0xABCDDCBA;
  139. for (I = 0; I < 10000; I++) {
  140. for (Index = 0; Index < 16; Index++) {
  141. RtlRandom(&Seed);
  142. Trace[Index] = (ULONG_PTR)Seed;
  143. }
  144. Result = RtlTraceDatabaseAdd (Db, 16, (PVOID *)Trace, &Blk);
  145. assert_ (RtlTraceDatabaseValidate (Db));
  146. assert_ (Result);
  147. assert_ (Blk->Size == 16);
  148. assert_ (Blk->Count >= 1);
  149. Result = RtlTraceDatabaseFind (Db, 16, (PVOID *)Trace, &BlkX);
  150. assert_ (RtlTraceDatabaseValidate (Db));
  151. assert_ (Result);
  152. assert_ (Blk->Size == 16);
  153. assert_ (Blk->Count >= 1);
  154. assert_ (Blk == BlkX);
  155. if (I % 512 == 0) {
  156. DbgPrint(".");
  157. }
  158. }
  159. DbgPrint("\n");
  160. //
  161. // Stress a little bit the whole thing
  162. //
  163. Seed = 0xABCDDCBA;
  164. for (I = 0; I < 10000; I++) {
  165. for (Index = 0; Index < 16; Index++) {
  166. RtlRandom(&Seed);
  167. Trace[Index] = (ULONG_PTR)Seed;
  168. }
  169. Result = RtlTraceDatabaseFind (Db, 16, (PVOID *)Trace, &Blk);
  170. assert_ (RtlTraceDatabaseValidate (Db));
  171. assert_ (Result);
  172. assert_ (Blk->Size == 16);
  173. assert_ (Blk->Count >= 1);
  174. Result = RtlTraceDatabaseAdd (Db, 16, (PVOID *)Trace, &BlkX);
  175. assert_ (RtlTraceDatabaseValidate (Db));
  176. assert_ (Result);
  177. assert_ (Blk->Size == 16);
  178. assert_ (Blk->Count >= 2);
  179. assert_ (Blk == BlkX);
  180. if (I % 512 == 0) {
  181. DbgPrint(".");
  182. }
  183. }
  184. DbgPrint("\n");
  185. RtlTraceDatabaseDestroy (Db);
  186. }
  187. #endif // #if !TRACEDB_ACTIVE