Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

tob.c

Go to the documentation of this file.
00001 /*++ 00002 00003 Copyright (c) 1989 Microsoft Corporation 00004 00005 Module Name: 00006 00007 tex.c 00008 00009 Abstract: 00010 00011 Test program for the OB subcomponent of the NTOS project 00012 00013 Author: 00014 00015 Steve Wood (stevewo) 31-Mar-1989 00016 00017 Revision History: 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 0L, 00272 0L, 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 0L, 00291 0L, 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, 2L, 2L ); 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 0L, 00346 0L, 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 ); // ObInsertObject,ObjectPointerBias 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 0L, 00376 ObjectTypeA, 00377 KernelMode, 00378 &ObjectBodyA, 00379 NULL 00380 ); 00381 00382 ObReferenceObjectByHandle( 00383 ObjectHandleB1, 00384 0L, 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 0L, 00399 ObjectTypeA, 00400 KernelMode 00401 ); 00402 00403 ObReferenceObjectByPointer( 00404 ObjectBodyB, 00405 0L, 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 0L, 00418 ObjectTypeA, 00419 KernelMode, 00420 NULL, 00421 &ObjectBodyA 00422 ); 00423 00424 ObReferenceObjectByName( 00425 &ObjectBPathName, 00426 OBJ_CASE_INSENSITIVE, 00427 0L, 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 ); // ObInsertObject,ObjectPointerBias 00443 ObDereferenceObject( ObjectBodyB ); 00444 00445 ObDereferenceObject( ObjectBodyA ); // ObReferenceObjectByHandle 00446 ObDereferenceObject( ObjectBodyB ); 00447 00448 ObDereferenceObject( ObjectBodyA ); // ObReferenceObjectByPointer 00449 ObDereferenceObject( ObjectBodyB ); 00450 00451 ObDereferenceObject( ObjectBodyA ); // ObReferenceObjectByName 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 0L, 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 0L, 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 0L, 00504 ObjectTypeA, 00505 KernelMode, 00506 &ObjectBodyA, 00507 NULL 00508 ); 00509 00510 ObReferenceObjectByHandle( 00511 ObjectHandleB2, 00512 0L, 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 0L, 00528 NULL, 00529 ObjectTypeA, 00530 KernelMode, 00531 &ObjectHandleA1 00532 ); 00533 00534 ObOpenObjectByPointer( 00535 ObjectBodyB, 00536 OBJ_CASE_INSENSITIVE, 00537 0L, 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 0L, 00555 ObjectTypeA, 00556 KernelMode, 00557 &ObjectBodyA, 00558 NULL 00559 ); 00560 00561 ObReferenceObjectByHandle( 00562 ObjectHandleB1, 00563 0L, 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 ); // ObReferenceObjectByHandle 00576 ObDereferenceObject( ObjectBodyB ); 00577 00578 ObDereferenceObject( ObjectBodyA ); // ObReferenceObjectByHandle 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 }

Generated on Sat May 15 19:42:00 2004 for test by doxygen 1.3.7