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.2 KiB
263 lines
6.2 KiB
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
// #include <ntddk.h>
|
|
|
|
#include "active.h"
|
|
#include "tracedb.h"
|
|
|
|
#if !TRACEDB_ACTIVE
|
|
|
|
//
|
|
// Dummy implementation if the module is inactive
|
|
//
|
|
|
|
VOID TestTraceDatabase (
|
|
PVOID NotUsed
|
|
)
|
|
{
|
|
DbgPrint ("Buggy: tracedb module is disabled \n");
|
|
}
|
|
|
|
#else
|
|
|
|
|
|
#define assert_(Expr) { \
|
|
if (!(Expr)) { \
|
|
DbgPrint ("Test tracedb assert: (%s, %d): \" %s \" -- assertion failed \n", \
|
|
__FILE__, __LINE__, #Expr); \
|
|
DbgBreakPoint (); \
|
|
return; \
|
|
}}
|
|
|
|
//
|
|
// Real implementation if the module is active
|
|
//
|
|
|
|
VOID
|
|
TestTraceDatabase (
|
|
PVOID NotUsed
|
|
)
|
|
{
|
|
PRTL_TRACE_DATABASE Db;
|
|
ULONG_PTR Trace [16];
|
|
PRTL_TRACE_BLOCK Blk;
|
|
PRTL_TRACE_BLOCK BlkX;
|
|
ULONG Index, I;
|
|
BOOLEAN Result;
|
|
ULONG Seed = 0xABCDDCBA;
|
|
|
|
Db = RtlTraceDatabaseCreate (16,
|
|
0,
|
|
RTL_TRACE_USE_NONPAGED_POOL,
|
|
'bDrT',
|
|
0);
|
|
|
|
assert_ (RtlTraceDatabaseValidate (Db));
|
|
|
|
assert_ (Db != NULL);
|
|
|
|
for (Index = 0; Index < 16; Index++) {
|
|
Trace[Index] = (ULONG_PTR)RtlRandom(&Seed);
|
|
}
|
|
|
|
Result = RtlTraceDatabaseAdd (Db, 16, (PVOID *)Trace, &Blk);
|
|
assert_ (RtlTraceDatabaseValidate (Db));
|
|
|
|
assert_ (Result);
|
|
assert_ (Blk->Size == 16);
|
|
assert_ (Blk->Count == 1);
|
|
|
|
Result = RtlTraceDatabaseAdd (Db, 16, (PVOID *)Trace, &BlkX);
|
|
assert_ (RtlTraceDatabaseValidate (Db));
|
|
|
|
assert_ (Result);
|
|
assert_ (Blk->Size == 16);
|
|
assert_ (Blk->Count == 2);
|
|
assert_ (Blk == BlkX);
|
|
|
|
//
|
|
// Stress a little bit the whole thing
|
|
//
|
|
|
|
Seed = 0xABCDDCBA;
|
|
|
|
for (I = 0; I < 10000; I++) {
|
|
|
|
for (Index = 0; Index < 16; Index++) {
|
|
RtlRandom(&Seed);
|
|
Trace[Index] = (ULONG_PTR)Seed;
|
|
}
|
|
|
|
Result = RtlTraceDatabaseAdd (Db, 16, (PVOID *)Trace, &Blk);
|
|
assert_ (RtlTraceDatabaseValidate (Db));
|
|
|
|
assert_ (Result);
|
|
assert_ (Blk->Size == 16);
|
|
assert_ (Blk->Count >= 1);
|
|
|
|
Result = RtlTraceDatabaseFind (Db, 16, (PVOID *)Trace, &BlkX);
|
|
assert_ (RtlTraceDatabaseValidate (Db));
|
|
|
|
assert_ (Result);
|
|
assert_ (Blk->Size == 16);
|
|
assert_ (Blk->Count >= 1);
|
|
assert_ (Blk == BlkX);
|
|
|
|
if (I % 512 == 0) {
|
|
DbgPrint(".");
|
|
}
|
|
}
|
|
|
|
DbgPrint("\n");
|
|
|
|
//
|
|
// Stress a little bit the whole thing
|
|
//
|
|
|
|
Seed = 0xABCDDCBA;
|
|
|
|
for (I = 0; I < 10000; I++) {
|
|
|
|
for (Index = 0; Index < 16; Index++) {
|
|
RtlRandom(&Seed);
|
|
Trace[Index] = (ULONG_PTR)Seed;
|
|
}
|
|
|
|
Result = RtlTraceDatabaseFind (Db, 16, (PVOID *)Trace, &Blk);
|
|
assert_ (RtlTraceDatabaseValidate (Db));
|
|
|
|
assert_ (Result);
|
|
assert_ (Blk->Size == 16);
|
|
assert_ (Blk->Count >= 1);
|
|
|
|
Result = RtlTraceDatabaseAdd (Db, 16, (PVOID *)Trace, &BlkX);
|
|
assert_ (RtlTraceDatabaseValidate (Db));
|
|
|
|
assert_ (Result);
|
|
assert_ (Blk->Size == 16);
|
|
assert_ (Blk->Count >= 2);
|
|
assert_ (Blk == BlkX);
|
|
|
|
if (I % 512 == 0) {
|
|
DbgPrint(".");
|
|
}
|
|
}
|
|
|
|
DbgPrint("\n");
|
|
|
|
RtlTraceDatabaseDestroy (Db);
|
|
|
|
|
|
//
|
|
// Use paged pool also.
|
|
//
|
|
|
|
Db = RtlTraceDatabaseCreate (16,
|
|
0,
|
|
RTL_TRACE_USE_PAGED_POOL,
|
|
'bDrT',
|
|
0);
|
|
|
|
assert_ (RtlTraceDatabaseValidate (Db));
|
|
|
|
assert_ (Db != NULL);
|
|
|
|
for (Index = 0; Index < 16; Index++) {
|
|
Trace[Index] = (ULONG_PTR)RtlRandom(&Seed);
|
|
}
|
|
|
|
Result = RtlTraceDatabaseAdd (Db, 16, (PVOID *)Trace, &Blk);
|
|
assert_ (RtlTraceDatabaseValidate (Db));
|
|
|
|
assert_ (Result);
|
|
assert_ (Blk->Size == 16);
|
|
assert_ (Blk->Count == 1);
|
|
|
|
Result = RtlTraceDatabaseAdd (Db, 16, (PVOID *)Trace, &BlkX);
|
|
assert_ (RtlTraceDatabaseValidate (Db));
|
|
|
|
assert_ (Result);
|
|
assert_ (Blk->Size == 16);
|
|
assert_ (Blk->Count == 2);
|
|
assert_ (Blk == BlkX);
|
|
|
|
//
|
|
// Stress a little bit the whole thing
|
|
//
|
|
|
|
Seed = 0xABCDDCBA;
|
|
|
|
for (I = 0; I < 10000; I++) {
|
|
|
|
for (Index = 0; Index < 16; Index++) {
|
|
RtlRandom(&Seed);
|
|
Trace[Index] = (ULONG_PTR)Seed;
|
|
}
|
|
|
|
Result = RtlTraceDatabaseAdd (Db, 16, (PVOID *)Trace, &Blk);
|
|
assert_ (RtlTraceDatabaseValidate (Db));
|
|
|
|
assert_ (Result);
|
|
assert_ (Blk->Size == 16);
|
|
assert_ (Blk->Count >= 1);
|
|
|
|
Result = RtlTraceDatabaseFind (Db, 16, (PVOID *)Trace, &BlkX);
|
|
assert_ (RtlTraceDatabaseValidate (Db));
|
|
|
|
assert_ (Result);
|
|
assert_ (Blk->Size == 16);
|
|
assert_ (Blk->Count >= 1);
|
|
assert_ (Blk == BlkX);
|
|
|
|
if (I % 512 == 0) {
|
|
DbgPrint(".");
|
|
}
|
|
}
|
|
|
|
DbgPrint("\n");
|
|
|
|
//
|
|
// Stress a little bit the whole thing
|
|
//
|
|
|
|
Seed = 0xABCDDCBA;
|
|
|
|
for (I = 0; I < 10000; I++) {
|
|
|
|
for (Index = 0; Index < 16; Index++) {
|
|
RtlRandom(&Seed);
|
|
Trace[Index] = (ULONG_PTR)Seed;
|
|
}
|
|
|
|
Result = RtlTraceDatabaseFind (Db, 16, (PVOID *)Trace, &Blk);
|
|
assert_ (RtlTraceDatabaseValidate (Db));
|
|
|
|
assert_ (Result);
|
|
assert_ (Blk->Size == 16);
|
|
assert_ (Blk->Count >= 1);
|
|
|
|
Result = RtlTraceDatabaseAdd (Db, 16, (PVOID *)Trace, &BlkX);
|
|
assert_ (RtlTraceDatabaseValidate (Db));
|
|
|
|
assert_ (Result);
|
|
assert_ (Blk->Size == 16);
|
|
assert_ (Blk->Count >= 2);
|
|
assert_ (Blk == BlkX);
|
|
|
|
if (I % 512 == 0) {
|
|
DbgPrint(".");
|
|
}
|
|
}
|
|
|
|
DbgPrint("\n");
|
|
|
|
RtlTraceDatabaseDestroy (Db);
|
|
|
|
}
|
|
|
|
#endif // #if !TRACEDB_ACTIVE
|
|
|
|
|
|
|
|
|