00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#include "obp.h"
00022
00023 GENERIC_MAPPING
MyGenericMapping = {
00024 STANDARD_RIGHTS_READ,
00025 STANDARD_RIGHTS_WRITE,
00026 STANDARD_RIGHTS_EXECUTE,
00027 STANDARD_RIGHTS_READ |
00028 STANDARD_RIGHTS_WRITE |
00029 STANDARD_RIGHTS_EXECUTE
00030 };
00031
00032 typedef struct _OBJECTTYPEA {
00033 KEVENT Event;
00034 ULONG
TypeALength;
00035 ULONG
Stuff[ 4 ];
00036 }
OBJECTTYPEA, *
POBJECTTYPEA;
00037
00038
00039 typedef struct _OBJECTTYPEB {
00040 KSEMAPHORE Semaphore;
00041 ULONG
TypeBLength;
00042 ULONG
Stuff[ 16 ];
00043 }
OBJECTTYPEB, *
POBJECTTYPEB;
00044
00045 OBJECT_ATTRIBUTES
DirectoryObjA;
00046 OBJECT_ATTRIBUTES
ObjectAObjA;
00047 OBJECT_ATTRIBUTES
ObjectBObjA;
00048 STRING
DirectoryName;
00049 STRING
ObjectAName;
00050 STRING
ObjectBName;
00051 STRING
ObjectAPathName;
00052 STRING
ObjectBPathName;
00053 STRING
ObjectTypeAName;
00054 STRING
ObjectTypeBName;
00055 POBJECT_TYPE ObjectTypeA;
00056 POBJECT_TYPE ObjectTypeB;
00057 PVOID
ObjectBodyA;
00058 PVOID
ObjectBodyB;
00059 PVOID
ObjectBodyA1;
00060 PVOID
ObjectBodyA2;
00061 POBJECTTYPEA ObjectA;
00062 POBJECTTYPEB ObjectB;
00063 HANDLE
DirectoryHandle;
00064 HANDLE
ObjectHandleA1;
00065 HANDLE
ObjectHandleB1;
00066 HANDLE
ObjectHandleA2;
00067 HANDLE
ObjectHandleB2;
00068
00069
00070
VOID
00071 DumpAProc(
00072 IN PVOID Object,
00073 IN
POB_DUMP_CONTROL Control OPTIONAL
00074 )
00075 {
00076
POBJECTTYPEA p = (
POBJECTTYPEA)Object;
00077 ULONG i;
00078
00079
DbgPrint(
"DumpAProc: %lx\n", p );
00080
DbgPrint(
" Length: %ld\n", p->
TypeALength );
00081
for (i=0; i<4; i++) {
00082
DbgPrint(
" Stuff[%ld]: %ld\n", i, p->
Stuff[i] );
00083 }
00084 }
00085
00086 char *
OpenReasonStrings[] = {
00087
"ObCreateHandle",
00088
"ObOpenHandle",
00089
"ObDuplicateHandle",
00090
"ObInheritHandle"
00091 };
00092
00093
VOID
00094 OpenAProc(
00095 IN OB_OPEN_REASON OpenReason,
00096 IN
PEPROCESS Process OPTIONAL,
00097 IN PVOID Object,
00098 IN ACCESS_MASK GrantedAccess,
00099 IN ULONG HandleCount
00100 )
00101 {
00102
DbgPrint(
"OpenAProc: OpenReason = %s Process: %lx \n",
00103
OpenReasonStrings[ OpenReason ], Process );
00104
DbgPrint(
" Object: %lx Access: %lx Count: %lu\n",
00105 Object, GrantedAccess, HandleCount );
00106 }
00107
00108
00109
VOID
00110 CloseAProc(
00111 IN
PEPROCESS Process OPTIONAL,
00112 IN PVOID Object,
00113 IN ACCESS_MASK GrantedAccess,
00114 IN ULONG ProcessHandleCount,
00115 IN ULONG SystemHandleCount
00116 )
00117 {
00118
DbgPrint(
"CloseAProc: Process: %lx \n", Process );
00119
DbgPrint(
" Object: %lx Access: %lx ProcessHandleCount: %lu SystemHandleCount: %lu\n",
00120 Object, GrantedAccess, ProcessHandleCount, SystemHandleCount );
00121 }
00122
00123
00124
VOID
00125 DeleteAProc(
00126 IN PVOID Object
00127 )
00128 {
00129
DbgPrint(
"DeleteAProc: %lx\n", Object );
00130 }
00131
00132
NTSTATUS
00133 ParseAProc(
00134 IN PVOID ParseObject,
00135 IN ULONG DesiredAccess,
00136 IN KPROCESSOR_MODE AccessMode,
00137 IN ULONG Attributes,
00138 IN OUT PSTRING CompleteName,
00139 IN OUT PSTRING RemainingName,
00140 IN OUT PVOID Context OPTIONAL,
00141 OUT PVOID *Object
00142 )
00143 {
00144
DbgPrint(
"ParseAProc: %lx\n", ParseObject );
00145
DbgPrint(
" CompleteName: %.*s\n", CompleteName->Length,
00146 CompleteName->Buffer );
00147
DbgPrint(
" RemainingName: %.*s\n", RemainingName->Length,
00148 RemainingName->Buffer );
00149
ObReferenceObjectByPointer(
00150 ParseObject,
00151 DesiredAccess,
00152
ObjectTypeA,
00153 AccessMode
00154 );
00155
00156 *Object = ParseObject;
00157
return( STATUS_SUCCESS );
00158 }
00159
00160
00161
VOID
00162 DumpBProc(
00163 IN PVOID Object,
00164 IN
POB_DUMP_CONTROL Control OPTIONAL
00165 )
00166 {
00167
POBJECTTYPEB p = (
POBJECTTYPEB)Object;
00168 ULONG i;
00169
00170
DbgPrint(
"DumpBProc: %lx\n", p );
00171
DbgPrint(
" Length: %ld\n", p->
TypeBLength );
00172
for (i=0; i<16; i++) {
00173
DbgPrint(
" Stuff[%ld]: %ld\n", i, p->
Stuff[i] );
00174 }
00175 }
00176
00177
VOID
00178 DeleteBProc(
00179 IN PVOID Object
00180 )
00181 {
00182
DbgPrint(
"DeleteBProc: %lx\n", Object );
00183 }
00184
00185
00186 BOOLEAN
00187 obtest(
void )
00188 {
00189 ULONG i;
00190 HANDLE Handles[ 2 ];
00191
NTSTATUS Status;
00192
OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
00193
00194 ObpDumpObjectTable(
ObpGetObjectTable(),
NULL );
00195
00196
RtlInitString( &
ObjectTypeAName,
"ObjectTypeA" );
00197
RtlInitString( &
ObjectTypeBName,
"ObjectTypeB" );
00198
00199 RtlZeroMemory( &ObjectTypeInitializer,
sizeof( ObjectTypeInitializer ) );
00200 ObjectTypeInitializer.Length =
sizeof( ObjectTypeInitializer );
00201 ObjectTypeInitializer.ValidAccessMask = -1;
00202
00203 ObjectTypeInitializer.PoolType =
NonPagedPool;
00204 ObjectTypeInitializer.MaintainHandleCount =
TRUE;
00205 ObjectTypeInitializer.DumpProcedure =
DumpAProc;
00206 ObjectTypeInitializer.OpenProcedure =
OpenAProc;
00207 ObjectTypeInitializer.CloseProcedure =
CloseAProc;
00208 ObjectTypeInitializer.DeleteProcedure =
DeleteAProc;
00209 ObjectTypeInitializer.ParseProcedure =
ParseAProc;
00210
ObCreateObjectType(
00211 &
ObjectTypeAName,
00212 &ObjectTypeInitializer,
00213 (PSECURITY_DESCRIPTOR)
NULL,
00214 &
ObjectTypeA
00215 );
00216
00217 ObjectTypeInitializer.PoolType =
NonPagedPool;
00218 ObjectTypeInitializer.MaintainHandleCount =
FALSE;
00219 ObjectTypeInitializer.GenericMapping =
MyGenericMapping;
00220 ObjectTypeInitializer.DumpProcedure =
DumpBProc;
00221 ObjectTypeInitializer.OpenProcedure =
NULL;
00222 ObjectTypeInitializer.CloseProcedure =
NULL;
00223 ObjectTypeInitializer.DeleteProcedure =
DeleteBProc;
00224 ObjectTypeInitializer.ParseProcedure =
NULL;
00225
ObCreateObjectType(
00226 &
ObjectTypeBName,
00227 &ObjectTypeInitializer,
00228 (PSECURITY_DESCRIPTOR)
NULL,
00229 &
ObjectTypeB
00230 );
00231
00232 ObpDumpTypes(
NULL );
00233
00234
RtlInitString( &
DirectoryName,
"\\MyObjects" );
00235 InitializeObjectAttributes( &
DirectoryObjA,
00236 &
DirectoryName,
00237 OBJ_PERMANENT |
00238 OBJ_CASE_INSENSITIVE,
00239
NULL,
00240
NULL
00241 );
00242
NtCreateDirectoryObject( &
DirectoryHandle,
00243 0,
00244 &
DirectoryObjA
00245 );
00246
NtClose(
DirectoryHandle );
00247
00248
RtlInitString( &
ObjectAName,
"\\myobjects\\ObjectA" );
00249 InitializeObjectAttributes( &
ObjectAObjA,
00250 &
ObjectAName,
00251 OBJ_CASE_INSENSITIVE,
00252
NULL,
00253
NULL
00254 );
00255
00256
RtlInitString( &
ObjectBName,
"\\myobjects\\ObjectB" );
00257 InitializeObjectAttributes( &
ObjectBObjA,
00258 &
ObjectBName,
00259 OBJ_CASE_INSENSITIVE,
00260
NULL,
00261
NULL
00262 );
00263
00264
Status =
ObCreateObject(
00265
KernelMode,
00266
ObjectTypeA,
00267 &
ObjectAObjA,
00268
KernelMode,
00269
NULL,
00270 (ULONG)
sizeof(
OBJECTTYPEA ),
00271 0
L,
00272 0
L,
00273 (PVOID *)&
ObjectBodyA
00274 );
00275
00276
ObjectA = (
POBJECTTYPEA)
ObjectBodyA;
00277
ObjectA->
TypeALength =
sizeof( *ObjectA );
00278
for (i=0; i<4; i++) {
00279
ObjectA->
Stuff[i] = i+1;
00280 }
00281
KeInitializeEvent( &
ObjectA->
Event, NotificationEvent,
TRUE );
00282
00283
Status =
ObCreateObject(
00284
KernelMode,
00285
ObjectTypeB,
00286 &
ObjectBObjA,
00287
KernelMode,
00288
NULL,
00289 (ULONG)
sizeof(
OBJECTTYPEB ),
00290 0
L,
00291 0
L,
00292 (PVOID *)&
ObjectBodyB
00293 );
00294
00295
ObjectB = (
POBJECTTYPEB)
ObjectBodyB;
00296
ObjectB->
TypeBLength =
sizeof( *ObjectB );
00297
for (i=0; i<16; i++) {
00298
ObjectB->
Stuff[i] = i+1;
00299 }
00300
KeInitializeSemaphore ( &
ObjectB->
Semaphore, 2
L, 2
L );
00301
00302
Status =
ObInsertObject(
00303
ObjectBodyA,
00304 SYNCHRONIZE | 0x3,
00305
NULL,
00306 1,
00307 &
ObjectBodyA,
00308 &
ObjectHandleA1
00309 );
00310
00311
DbgPrint(
"Status: %lx ObjectBodyA: %lx ObjectHandleA1: %lx\n",
00312
Status,
ObjectBodyA,
ObjectHandleA1
00313 );
00314
00315
Status =
ObInsertObject(
00316
ObjectBodyB,
00317 SYNCHRONIZE | 0x1,
00318
NULL,
00319 1,
00320 &
ObjectBodyB,
00321 &
ObjectHandleB1
00322 );
00323
00324
DbgPrint(
"Status: %lx ObjectBodyB: %lx ObjectHandleB1: %lx\n",
00325
Status,
ObjectBodyB,
ObjectHandleB1
00326 );
00327
00328 ObpDumpObjectTable(
ObpGetObjectTable(),
NULL );
00329
00330
RtlInitString( &
ObjectAName,
"\\MyObjects\\ObjectA" );
00331 InitializeObjectAttributes( &
ObjectAObjA,
00332 &
ObjectAName,
00333 OBJ_OPENIF,
00334
NULL,
00335
NULL
00336 );
00337
00338
Status =
ObCreateObject(
00339
KernelMode,
00340
ObjectTypeA,
00341 &
ObjectAObjA,
00342
KernelMode,
00343
NULL,
00344 (ULONG)
sizeof(
OBJECTTYPEA ),
00345 0
L,
00346 0
L,
00347 (PVOID *)&
ObjectBodyA1
00348 );
00349
00350
00351
Status =
ObInsertObject(
00352
ObjectBodyA1,
00353 SYNCHRONIZE | 0x3,
00354
NULL,
00355 1,
00356 &
ObjectBodyA2,
00357 &
ObjectHandleA2
00358 );
00359
00360
DbgPrint(
"Status: %lx ObjectBodyA1: %lx ObjectBodyA2: %lx ObjectHandleA2: %lx\n",
00361
Status,
ObjectBodyA1,
ObjectBodyA2,
ObjectHandleA2
00362 );
00363
00364 ObpDumpObjectTable(
ObpGetObjectTable(),
NULL );
00365
NtClose(
ObjectHandleA2 );
00366
ObDereferenceObject(
ObjectBodyA2 );
00367
00368
NtWaitForSingleObject(
ObjectHandleB1,
TRUE,
NULL );
00369 Handles[ 0 ] =
ObjectHandleA1;
00370 Handles[ 1 ] =
ObjectHandleB1;
00371
NtWaitForMultipleObjects( 2, Handles, WaitAny,
TRUE,
NULL );
00372
00373
ObReferenceObjectByHandle(
00374
ObjectHandleA1,
00375 0
L,
00376
ObjectTypeA,
00377
KernelMode,
00378 &
ObjectBodyA,
00379
NULL
00380 );
00381
00382
ObReferenceObjectByHandle(
00383
ObjectHandleB1,
00384 0
L,
00385
ObjectTypeB,
00386
KernelMode,
00387 &
ObjectBodyB,
00388
NULL
00389 );
00390
DbgPrint(
"Reference Handle %lx = %lx\n",
ObjectHandleA1,
ObjectBodyA );
00391
00392
DbgPrint(
"Reference Handle %lx = %lx\n",
ObjectHandleB1,
ObjectBodyB );
00393
00394 ObpDumpObjectTable(
ObpGetObjectTable(),
NULL );
00395
00396
ObReferenceObjectByPointer(
00397
ObjectBodyA,
00398 0
L,
00399
ObjectTypeA,
00400
KernelMode
00401 );
00402
00403
ObReferenceObjectByPointer(
00404
ObjectBodyB,
00405 0
L,
00406
ObjectTypeB,
00407
KernelMode
00408 );
00409
00410 ObpDumpObjectTable(
ObpGetObjectTable(),
NULL );
00411
00412
RtlInitString( &
ObjectAPathName,
"\\MyObjects\\ObjectA" );
00413
RtlInitString( &
ObjectBPathName,
"\\MyObjects\\ObjectB" );
00414
ObReferenceObjectByName(
00415 &
ObjectAPathName,
00416 OBJ_CASE_INSENSITIVE,
00417 0
L,
00418
ObjectTypeA,
00419
KernelMode,
00420
NULL,
00421 &
ObjectBodyA
00422 );
00423
00424
ObReferenceObjectByName(
00425 &
ObjectBPathName,
00426 OBJ_CASE_INSENSITIVE,
00427 0
L,
00428
ObjectTypeB,
00429
KernelMode,
00430
NULL,
00431 &
ObjectBodyB
00432 );
00433
00434
DbgPrint(
"Reference Name %s = %lx\n",
ObjectAPathName.Buffer,
00435
ObjectBodyA );
00436
00437
DbgPrint(
"Reference Name %s = %lx\n",
ObjectBPathName.Buffer,
00438
ObjectBodyB );
00439
00440 ObpDumpObjectTable(
ObpGetObjectTable(),
NULL );
00441
00442
ObDereferenceObject(
ObjectBodyA );
00443
ObDereferenceObject(
ObjectBodyB );
00444
00445
ObDereferenceObject(
ObjectBodyA );
00446
ObDereferenceObject(
ObjectBodyB );
00447
00448
ObDereferenceObject(
ObjectBodyA );
00449
ObDereferenceObject(
ObjectBodyB );
00450
00451
ObDereferenceObject(
ObjectBodyA );
00452
ObDereferenceObject(
ObjectBodyB );
00453
00454 ObpDumpObjectTable(
ObpGetObjectTable(),
NULL );
00455
00456 InitializeObjectAttributes( &
ObjectAObjA,
00457 &
ObjectAPathName,
00458 OBJ_CASE_INSENSITIVE,
00459
NULL,
00460
NULL
00461 );
00462
ObOpenObjectByName(
00463 &
ObjectAObjA,
00464 0
L,
00465
NULL,
00466
ObjectTypeA,
00467
KernelMode,
00468
NULL,
00469 &
ObjectHandleA2
00470 );
00471
00472 InitializeObjectAttributes( &
ObjectBObjA,
00473 &
ObjectBPathName,
00474 OBJ_CASE_INSENSITIVE,
00475
NULL,
00476
NULL
00477 );
00478
ObOpenObjectByName(
00479 &
ObjectBObjA,
00480 0
L,
00481
NULL,
00482
ObjectTypeB,
00483
KernelMode,
00484
NULL,
00485 &
ObjectHandleB2
00486 );
00487
00488
DbgPrint(
"Open Object Name %s = %lx\n",
ObjectAPathName.Buffer,
00489
ObjectHandleA2 );
00490
00491
DbgPrint(
"Open Object Name %s = %lx\n",
ObjectBPathName.Buffer,
00492
ObjectHandleB2 );
00493
00494 ObpDumpObjectTable(
ObpGetObjectTable(),
NULL );
00495
00496
NtClose(
ObjectHandleA1 );
00497
NtClose(
ObjectHandleB1 );
00498
00499 ObpDumpObjectTable(
ObpGetObjectTable(),
NULL );
00500
00501
ObReferenceObjectByHandle(
00502
ObjectHandleA2,
00503 0
L,
00504
ObjectTypeA,
00505
KernelMode,
00506 &
ObjectBodyA,
00507
NULL
00508 );
00509
00510
ObReferenceObjectByHandle(
00511
ObjectHandleB2,
00512 0
L,
00513
ObjectTypeB,
00514
KernelMode,
00515 &
ObjectBodyB,
00516
NULL
00517 );
00518
DbgPrint(
"Reference Handle %lx = %lx\n",
ObjectHandleA2,
ObjectBodyA );
00519
00520
DbgPrint(
"Reference Handle %lx = %lx\n",
ObjectHandleB2,
ObjectBodyB );
00521
00522 ObpDumpObjectTable(
ObpGetObjectTable(),
NULL );
00523
00524
ObOpenObjectByPointer(
00525
ObjectBodyA,
00526 OBJ_CASE_INSENSITIVE,
00527 0
L,
00528
NULL,
00529
ObjectTypeA,
00530
KernelMode,
00531 &
ObjectHandleA1
00532 );
00533
00534
ObOpenObjectByPointer(
00535
ObjectBodyB,
00536 OBJ_CASE_INSENSITIVE,
00537 0
L,
00538
NULL,
00539
ObjectTypeB,
00540
KernelMode,
00541 &
ObjectHandleB1
00542 );
00543
00544
DbgPrint(
"Open Object Pointer %lx = %lx\n",
ObjectBodyA,
00545
ObjectHandleA1 );
00546
00547
DbgPrint(
"Open Object Pointer %lx = %lx\n",
ObjectBodyB,
00548
ObjectHandleB1 );
00549
00550 ObpDumpObjectTable(
ObpGetObjectTable(),
NULL );
00551
00552
ObReferenceObjectByHandle(
00553
ObjectHandleA1,
00554 0
L,
00555
ObjectTypeA,
00556
KernelMode,
00557 &
ObjectBodyA,
00558
NULL
00559 );
00560
00561
ObReferenceObjectByHandle(
00562
ObjectHandleB1,
00563 0
L,
00564
ObjectTypeB,
00565
KernelMode,
00566 &
ObjectBodyB,
00567
NULL
00568 );
00569
DbgPrint(
"Reference Handle %lx = %lx\n",
ObjectHandleA1,
ObjectBodyA );
00570
00571
DbgPrint(
"Reference Handle %lx = %lx\n",
ObjectHandleB1,
ObjectBodyB );
00572
00573 ObpDumpObjectTable(
ObpGetObjectTable(),
NULL );
00574
00575
ObDereferenceObject(
ObjectBodyA );
00576
ObDereferenceObject(
ObjectBodyB );
00577
00578
ObDereferenceObject(
ObjectBodyA );
00579
ObDereferenceObject(
ObjectBodyB );
00580
00581
NtClose(
ObjectHandleA1 );
00582
NtClose(
ObjectHandleB1 );
00583
00584
NtClose(
ObjectHandleA2 );
00585
NtClose(
ObjectHandleB2 );
00586
00587 ObpDumpObjectTable(
ObpGetObjectTable(),
NULL );
00588
00589
TestFunction =
NULL;
00590
00591
return(
TRUE );
00592 }
00593
00594
00595
int
00596 _CDECL
00597 main(
00598
int argc,
00599
char *argv[]
00600 )
00601 {
00602
#ifdef SIMULATOR
00603
extern ULONG
MmNumberOfPhysicalPages;
00604
char *s;
00605
00606
while (--argc) {
00607 s = *++argv;
00608
if (*s ==
'-') {
00609 s++;
00610
if (*s >=
'0' && *s <=
'9') {
00611
MmNumberOfPhysicalPages = atol( s );
00612
DbgPrint(
"INIT: Configured with %d pages of physical memory.\n",
00613
MmNumberOfPhysicalPages
00614 );
00615 }
00616
else
00617
if (!strcmp( s,
"SCR" )) {
00618
IoInitIncludeDevices |= IOINIT_SCREEN;
00619
DbgPrint(
"INIT: Configured with Screen device driver.\n" );
00620 }
00621
else
00622
if (!strcmp( s,
"MOU" )) {
00623
IoInitIncludeDevices |= IOINIT_MOUSE;
00624
DbgPrint(
"INIT: Configured with Mouse device driver.\n" );
00625 }
00626
else
00627
if (!strcmp( s,
"KBD" )) {
00628
IoInitIncludeDevices |= IOINIT_KEYBOARD;
00629
DbgPrint(
"INIT: Configured with Keyboard device driver.\n" );
00630 }
00631
else
00632
if (!strcmp( s,
"RAW" )) {
00633
IoInitIncludeDevices |= IOINIT_RAWFS;
00634
DbgPrint(
"INIT: Configured with RAW File System driver.\n" );
00635 }
00636
else
00637
if (!strcmp( s,
"FAT" )) {
00638
IoInitIncludeDevices |= IOINIT_FATFS;
00639
DbgPrint(
"INIT: Configured with FAT File System driver.\n" );
00640 }
00641
else
00642
if (!strcmp( s,
"SVR" )) {
00643
IoInitIncludeDevices |= IOINIT_DDFS |
00644 IOINIT_FATFS |
00645 IOINIT_SERVER_FSD |
00646 IOINIT_SERVER_LOOPBACK |
00647 IOINIT_NBF;
00648
if (
MmNumberOfPhysicalPages < 512 ) {
00649
MmNumberOfPhysicalPages = 512;
00650 }
00651
DbgPrint(
"INIT: Configured for LAN Manager server.\n" );
00652 }
00653
else {
00654
DbgPrint(
"INIT: Invalid switch - %s\n", s );
00655 }
00656 }
00657
else {
00658
break;
00659 }
00660 }
00661
00662
#endif // SIMULATOR
00663
TestFunction =
NULL;
00664
KiSystemStartup();
00665
return( 0 );
00666 }