00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#include <stdio.h>
00022
#include <string.h>
00023
00024
#include "nt.h"
00025
#include "ntrtl.h"
00026
00027
00028
00029
00030
00031 ULONG
RtlRandom ( IN OUT PULONG Seed );
00032 ULONG
Seed;
00033
00034 PSZ
AnotherPrefix(IN ULONG MaxNameLength);
00035 ULONG
AlphabetLength;
00036
00037
00038
00039 PSZ
Alphabet =
"\
00040
Aa\
00041
BBbb\
00042
CCCccc\
00043
DDDDdddd\
00044
EEEEEeeeee\
00045
FFFFFFffffff\
00046
GGGGGGGggggggg\
00047
HHHHHHHHhhhhhhhh\
00048
IIIIIIIIIiiiiiiiii\
00049
JJJJJJJJJJjjjjjjjjjj\
00050
KKKKKKKKKKKkkkkkkkkkkk\
00051
LLLLLLLLLLLLllllllllllll\
00052
MMMMMMMMMMMMMmmmmmmmmmmmmm\
00053
NNNNNNNNNNNNNNnnnnnnnnnnnnnn\
00054
OOOOOOOOOOOOOOOooooooooooooooo\
00055
PPPPPPPPPPPPPPPPpppppppppppppppp\
00056
QQQQQQQQQQQQQQQQQqqqqqqqqqqqqqqqqq\
00057
RRRRRRRRRRRRRRRRRRrrrrrrrrrrrrrrrrrr\
00058
SSSSSSSSSSSSSSSSSSSsssssssssssssssssss\
00059
TTTTTTTTTTTTTTTTTTTTtttttttttttttttttttt\
00060
UUUUUUUUUUUUUUUUUUUUUuuuuuuuuuuuuuuuuuuuuu\
00061
VVVVVVVVVVVVVVVVVVVVVVvvvvvvvvvvvvvvvvvvvvvv\
00062
WWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwww\
00063
XXXXXXXXXXXXXXXXXXXXXXXXxxxxxxxxxxxxxxxxxxxxxxxx\
00064
YYYYYYYYYYYYYYYYYYYYYYYYYyyyyyyyyyyyyyyyyyyyyyyyyy\
00065
ZZZZZZZZZZZZZZZZZZZZZZZZZZzzzzzzzzzzzzzzzzzzzzzzzzzz";
00066
00067 #define BUFFER_LENGTH 8192
00068
00069 CHAR Buffer[
BUFFER_LENGTH];
00070 ULONG
NextBufferChar = 0;
00071
00072
00073
00074
00075
00076
00077 typedef struct _PREFIX_NODE {
00078 PREFIX_TABLE_ENTRY
PfxEntry;
00079 STRING
String;
00080 }
PREFIX_NODE;
00081 typedef PREFIX_NODE *
PPREFIX_NODE;
00082
00083 #define PREFIXES 512
00084
00085 PREFIX_NODE Prefixes[
PREFIXES];
00086
00087 PREFIX_TABLE
PrefixTable;
00088
00089
int
00090 main(
00091
int argc,
00092
char *argv[]
00093 )
00094 {
00095 ULONG i;
00096 PSZ Psz;
00097
00098 PPREFIX_TABLE_ENTRY PfxEntry;
00099
PPREFIX_NODE PfxNode;
00100
00101 STRING
String;
00102
00103
00104
00105
00106
00107
DbgPrint(
"Start Prefix Test\n");
00108
00109
00110
00111
00112
00113
AlphabetLength =
strlen(
Alphabet);
00114
00115
00116
00117
00118
00119
PfxInitialize(&
PrefixTable);
00120
00121
00122
00123
00124
00125
RtlInitString( &
Prefixes[i].
String,
"\\" );
00126
if (
PfxInsertPrefix( &
PrefixTable,
00127 &
Prefixes[0].
String,
00128 &
Prefixes[0].PfxEntry )) {
00129
DbgPrint(
"Insert root prefix\n");
00130 }
else {
00131
DbgPrint(
"error inserting root prefix\n");
00132 }
00133
00134
00135
00136
00137
00138
Seed = 0;
00139
00140
for (i = 1, Psz =
AnotherPrefix(3);
00141 (i <
PREFIXES) && (Psz !=
NULL);
00142 i += 1, Psz =
AnotherPrefix(3)) {
00143
00144
DbgPrint(
"[0x%x] = ", i);
00145
DbgPrint(
"\"%s\"", Psz);
00146
00147
RtlInitString(&
Prefixes[i].
String, Psz);
00148
00149
if (
PfxInsertPrefix( &
PrefixTable,
00150 &
Prefixes[i].
String,
00151 &
Prefixes[i].PfxEntry )) {
00152
00153
DbgPrint(
" inserted in table\n");
00154
00155 }
else {
00156
00157
DbgPrint(
" already in table\n");
00158
00159 }
00160
00161 }
00162
00163
00164
00165
00166
00167
DbgPrint(
"Enumerate Prefix Table the first time\n");
00168
00169
for (PfxEntry = PfxNextPrefix(&
PrefixTable,
TRUE);
00170 PfxEntry !=
NULL;
00171 PfxEntry = PfxNextPrefix(&
PrefixTable,
FALSE)) {
00172
00173 PfxNode = CONTAINING_RECORD(PfxEntry,
PREFIX_NODE, PfxEntry);
00174
00175
DbgPrint(
"%s\n", PfxNode->
String.Buffer);
00176
00177 }
00178
00179
DbgPrint(
"Start Prefix search 0x%x\n",
NextBufferChar);
00180
00181
00182
00183
00184
00185
for (Psz =
AnotherPrefix(4); Psz !=
NULL; Psz =
AnotherPrefix(4)) {
00186
00187
DbgPrint(
"0x%x ",
NextBufferChar);
00188
00189
RtlInitString(&
String, Psz);
00190
00191 PfxEntry =
PfxFindPrefix( &
PrefixTable, &
String,
FALSE );
00192
00193
if (PfxEntry ==
NULL) {
00194
00195 PfxEntry =
PfxFindPrefix( &
PrefixTable, &
String,
TRUE );
00196
00197
if (PfxEntry ==
NULL) {
00198
00199
DbgPrint(
"Not found \"%s\"\n", Psz);
00200
00201 NOTHING;
00202
00203 }
else {
00204
00205 PfxNode = CONTAINING_RECORD(PfxEntry,
PREFIX_NODE, PfxEntry);
00206
00207
DbgPrint(
"Case blind \"%s\" is \"%s\"\n", Psz, PfxNode->
String.Buffer);
00208
00209
PfxRemovePrefix( &
PrefixTable, PfxEntry );
00210
00211 }
00212
00213 }
else {
00214
00215 PfxNode = CONTAINING_RECORD(PfxEntry,
PREFIX_NODE, PfxEntry);
00216
00217
DbgPrint(
"Case sensitive \"%s\" is \"%s\"\n", Psz, PfxNode->
String.Buffer);
00218
00219
if (PfxNode != &
Prefixes[0]) {
00220
00221
PfxRemovePrefix( &
PrefixTable, PfxEntry );
00222
00223 }
00224
00225 }
00226
00227 }
00228
00229
00230
00231
00232
00233
DbgPrint(
"Enumerate Prefix Table a second time\n");
00234
00235
for (PfxEntry = PfxNextPrefix(&
PrefixTable,
TRUE);
00236 PfxEntry !=
NULL;
00237 PfxEntry = PfxNextPrefix(&
PrefixTable,
FALSE)) {
00238
00239 PfxNode = CONTAINING_RECORD(PfxEntry,
PREFIX_NODE, PfxEntry);
00240
00241
DbgPrint(
"%s\n", PfxNode->
String.Buffer);
00242
00243 }
00244
00245
00246
00247
00248
00249
for (PfxEntry = PfxNextPrefix(&
PrefixTable,
TRUE);
00250 PfxEntry !=
NULL;
00251 PfxEntry = PfxNextPrefix(&
PrefixTable,
FALSE)) {
00252
00253 PfxNode = CONTAINING_RECORD(PfxEntry,
PREFIX_NODE, PfxEntry);
00254
00255
DbgPrint(
"Delete %s\n", PfxNode->
String.Buffer);
00256
00257
PfxRemovePrefix( &
PrefixTable, PfxEntry );
00258
00259 }
00260
00261
00262
00263
00264
00265
for (PfxEntry = PfxNextPrefix(&
PrefixTable,
TRUE);
00266 PfxEntry !=
NULL;
00267 PfxEntry = PfxNextPrefix(&
PrefixTable,
FALSE)) {
00268
00269 PfxNode = CONTAINING_RECORD(PfxEntry,
PREFIX_NODE, PfxEntry);
00270
00271
DbgPrint(
"This Node should be gone \"%s\"\n", PfxNode->
String.Buffer);
00272
00273 }
00274
00275
DbgPrint(
"End PrefixTest()\n");
00276
00277
return TRUE;
00278 }
00279
00280
00281 PSZ
00282 AnotherPrefix(IN ULONG MaxNameLength)
00283 {
00284 ULONG AlphabetPosition;
00285
00286 ULONG NameLength;
00287 ULONG IndividualNameLength;
00288
00289 ULONG StartBufferPosition;
00290 ULONG i;
00291 ULONG j;
00292
00293
00294
00295
00296
00297
if (
NextBufferChar > (
BUFFER_LENGTH - (MaxNameLength * 4))) {
00298
return NULL;
00299 }
00300
00301
00302
00303
00304
00305 AlphabetPosition =
RtlRandom(&
Seed) %
AlphabetLength;
00306
00307
00308
00309
00310
00311 NameLength = (
RtlRandom(&
Seed) % MaxNameLength) + 1;
00312
00313
00314
00315
00316
00317 StartBufferPosition =
NextBufferChar;
00318
00319
for (i = 0; i < NameLength; i += 1) {
00320
00321
Buffer[
NextBufferChar++] =
'\\';
00322
00323 IndividualNameLength = (
RtlRandom(&
Seed) % 3) + 1;
00324
00325
for (j = 0; j < IndividualNameLength; j += 1) {
00326
00327
Buffer[
NextBufferChar++] =
Alphabet[AlphabetPosition];
00328 AlphabetPosition = (AlphabetPosition + 1) %
AlphabetLength;
00329
00330 }
00331
00332 }
00333
00334
Buffer[
NextBufferChar++] =
'\0';
00335
00336
return &
Buffer[StartBufferPosition];
00337
00338 }
00339