- Add 2 more Ob Methods (currently turned off in testing)
authorAleksey Bragin <aleksey@reactos.org>
Sat, 17 Jun 2006 12:18:08 +0000 (12:18 +0000)
committerAleksey Bragin <aleksey@reactos.org>
Sat, 17 Jun 2006 12:18:08 +0000 (12:18 +0000)
- Add Open method to tests
- Make debug output of Ob Methods more informative
- Add Ob Methods counting tests

svn path=/trunk/; revision=22381

reactos/drivers/test/kmtest/ntos_ob.c

index 2099851..85ae52f 100644 (file)
@@ -64,6 +64,9 @@ HANDLE                  ObHandle1[NUM_OBTYPES];
 HANDLE                  ObHandle2[NUM_OBTYPES];\r
 HANDLE                  DirectoryHandle;\r
 \r
+USHORT                  DumpCount, OpenCount, CloseCount, DeleteCount,\r
+                        ParseCount, OkayToCloseCount, QueryNameCount;\r
+\r
 /* PRIVATE FUNCTIONS **********************************************************/\r
 \r
 VOID\r
@@ -72,9 +75,10 @@ DumpProc(IN PVOID Object,
          IN POB_DUMP_CONTROL DumpControl)\r
 {\r
     DbgPrint("DumpProc() called\n");\r
+    DumpCount++;\r
 }\r
 \r
-// prototype doesn't match Win2003! (causes BSOD)\r
+// Tested in Win2k3\r
 VOID\r
 NTAPI\r
 OpenProc(IN OB_OPEN_REASON OpenReason,\r
@@ -83,8 +87,9 @@ OpenProc(IN OB_OPEN_REASON OpenReason,
          IN ACCESS_MASK GrantedAccess,\r
          IN ULONG HandleCount)\r
 {\r
-    DbgPrint("OpenProc() called\n");\r
-    DbgBreakPoint();\r
+    DbgPrint("OpenProc() 0x%p, OpenReason %d, HC %d, AM 0x%X\n",\r
+        Object, OpenReason, HandleCount, GrantedAccess);\r
+    OpenCount++;\r
 }\r
 \r
 // Tested in Win2k3\r
@@ -96,7 +101,9 @@ CloseProc(IN PEPROCESS Process,
           IN ULONG ProcessHandleCount,\r
           IN ULONG SystemHandleCount)\r
 {\r
-    DPRINT("CloseProc() called for Object=0x%p\n", Object);\r
+    DbgPrint("CloseProc() 0x%p, PHC %d, SHC %d, AM 0x%X\n", Object,\r
+        ProcessHandleCount, SystemHandleCount, GrantedAccess);\r
+    CloseCount++;\r
 }\r
 \r
 // Tested in Win2k3\r
@@ -104,7 +111,8 @@ VOID
 NTAPI\r
 DeleteProc(IN PVOID Object)\r
 {\r
-    DPRINT("DeleteProc() called for Object=0x%p\n", Object);\r
+    DbgPrint("DeleteProc() 0x%p\n", Object);\r
+    DeleteCount++;\r
 }\r
 \r
 NTSTATUS\r
@@ -122,9 +130,44 @@ ParseProc(IN PVOID ParseObject,
 {\r
     DbgPrint("ParseProc() called\n");\r
     *Object = NULL;\r
+\r
+    ParseCount++;\r
     return STATUS_OBJECT_NAME_NOT_FOUND;//STATUS_SUCCESS;\r
 }\r
 \r
+// Tested in Win2k3\r
+NTSTATUS\r
+NTAPI\r
+OkayToCloseProc(IN PEPROCESS Process OPTIONAL,\r
+                IN PVOID Object,\r
+                IN HANDLE Handle,\r
+                IN KPROCESSOR_MODE AccessMode)\r
+{\r
+    DbgPrint("OkayToCloseProc() 0x%p, H 0x%p, AM 0x%X\n", Object, Handle,\r
+        AccessMode);\r
+    OkayToCloseCount++;\r
+    return STATUS_SUCCESS;\r
+}\r
+\r
+NTSTATUS\r
+NTAPI\r
+QueryNameProc(IN PVOID Object,\r
+              IN BOOLEAN HasObjectName,\r
+              OUT POBJECT_NAME_INFORMATION ObjectNameInfo,\r
+              IN ULONG Length,\r
+              OUT PULONG ReturnLength,\r
+              IN KPROCESSOR_MODE AccessMode)\r
+{\r
+    DbgPrint("QueryNameProc() 0x%p, HON %d, Len %d, AM 0x%X\n",\r
+        Object, HasObjectName, Length, AccessMode);\r
+    QueryNameCount++;\r
+\r
+    ObjectNameInfo = NULL;\r
+    ReturnLength = 0;\r
+    return STATUS_OBJECT_NAME_NOT_FOUND;\r
+}\r
+\r
+\r
 VOID\r
 ObtCreateObjectTypes()\r
 {\r
@@ -158,8 +201,16 @@ ObtCreateObjectTypes()
         ObTypeInitializer[i].CloseProcedure = (OB_CLOSE_METHOD)CloseProc;\r
         ObTypeInitializer[i].DeleteProcedure = (OB_DELETE_METHOD)DeleteProc;\r
         ObTypeInitializer[i].DumpProcedure = (OB_DUMP_METHOD)DumpProc;\r
-        //ObTypeInitializer[i].OpenProcedure = (OB_OPEN_METHOD)OpenProc;\r
+        ObTypeInitializer[i].OpenProcedure = (OB_OPEN_METHOD)OpenProc;\r
         ObTypeInitializer[i].ParseProcedure = (OB_PARSE_METHOD)ParseProc;\r
+        //ObTypeInitializer[i].OkayToCloseProcedure =\r
+        //    (OB_OKAYTOCLOSE_METHOD)OkayToCloseProc;\r
+        \r
+        //ObTypeInitializer[i].QueryNameProcedure =\r
+        //    (OB_QUERYNAME_METHOD)QueryNameProc;\r
+        \r
+        //ObTypeInitializer[i].SecurityProcedure =\r
+        // (OB_SECURITY_METHOD)SecurityProc;\r
 \r
         Status = ObCreateObjectType(&ObTypeName[i], &ObTypeInitializer[i],\r
             (PSECURITY_DESCRIPTOR)NULL, &ObTypes[i]);\r
@@ -188,6 +239,8 @@ ObtCreateObjects()
 {\r
     PVOID ObBody1[2];\r
     NTSTATUS Status;\r
+    USHORT OpenSave, CloseSave, DeleteSave, ParseSave,\r
+           OkayToCloseSave, QueryNameSave;\r
 \r
     // Create two objects\r
     RtlInitUnicodeString(&ObName[0], L"\\ObtDirectory\\MyObject1");\r
@@ -210,6 +263,11 @@ ObtCreateObjects()
     ok(Status == STATUS_SUCCESS,\r
         "Failed to create object with status=0x%lX", Status);\r
 \r
+    // save counters\r
+    OpenSave=OpenCount; CloseSave=CloseCount; DeleteSave=DeleteCount;\r
+    ParseSave=ParseCount; OkayToCloseSave=OkayToCloseCount;\r
+    QueryNameSave=QueryNameCount;\r
+\r
     // Insert them\r
     Status = ObInsertObject(ObBody[0], NULL, STANDARD_RIGHTS_ALL, 0,\r
         &ObBody[0], &ObHandle1[0]);\r
@@ -218,6 +276,17 @@ ObtCreateObjects()
     ok(ObBody[0] != NULL, "Object body = NULL");\r
     ok(ObHandle1[0] != NULL, "Handle = NULL");\r
 \r
+    // check counters\r
+    ok(OpenSave+1 == OpenCount, "Open method calls mismatch\n");\r
+    ok(CloseSave == CloseCount, "Excessive Close method call\n");\r
+    ok(DeleteSave == DeleteCount, "Excessive Delete method call\n");\r
+    ok(ParseSave == ParseCount, "Excessive Parse method call\n");\r
+\r
+    // save counters\r
+    OpenSave=OpenCount; CloseSave=CloseCount; DeleteSave=DeleteCount;\r
+    ParseSave=ParseCount; OkayToCloseSave=OkayToCloseCount;\r
+    QueryNameSave=QueryNameCount;\r
+\r
     Status = ObInsertObject(ObBody[1], NULL, GENERIC_ALL, 0,\r
         &ObBody[1], &ObHandle1[1]); \r
     ok(Status == STATUS_SUCCESS,\r
@@ -225,6 +294,17 @@ ObtCreateObjects()
     ok(ObBody[1] != NULL, "Object body = NULL");\r
     ok(ObHandle1[1] != NULL, "Handle = NULL");\r
 \r
+    // check counters\r
+    ok(OpenSave+1 == OpenCount, "Open method calls mismatch\n");\r
+    ok(CloseSave == CloseCount, "Excessive Close method call\n");\r
+    ok(DeleteSave == DeleteCount, "Excessive Delete method call\n");\r
+    ok(ParseSave == ParseCount, "Excessive Parse method call\n");\r
+\r
+    // save counters\r
+    OpenSave=OpenCount; CloseSave=CloseCount; DeleteSave=DeleteCount;\r
+    ParseSave=ParseCount; OkayToCloseSave=OkayToCloseCount;\r
+    QueryNameSave=QueryNameCount;\r
+\r
     // Now create an object of type 0, of the same name and expect it to fail\r
     // inserting, but success creation\r
     RtlInitUnicodeString(&ObName[0], L"\\ObtDirectory\\MyObject1");\r
@@ -236,6 +316,12 @@ ObtCreateObjects()
     ok(Status == STATUS_SUCCESS,\r
         "Failed to create object with status=0x%lX", Status);\r
 \r
+    // check counters\r
+    ok(OpenSave == OpenCount, "Excessive Open method call\n");\r
+    ok(CloseSave == CloseCount, "Excessive Close method call\n");\r
+    ok(DeleteSave == DeleteCount, "Excessive Delete method call\n");\r
+    ok(ParseSave == ParseCount, "Excessive Parse method call\n");\r
+\r
     Status = ObInsertObject(ObBody1[0], NULL, GENERIC_ALL, 0,\r
         &ObBody1[1], &ObHandle2[0]);\r
     ok(Status == STATUS_OBJECT_NAME_EXISTS,\r
@@ -244,15 +330,44 @@ ObtCreateObjects()
         "Object bodies doesn't match, 0x%p != 0x%p", ObBody[0], ObBody1[1]);\r
     ok(ObHandle2[0] != NULL, "Bad handle returned 0x%lX", (ULONG)ObHandle2[0]);\r
 \r
+    DPRINT1("%d %d %d %d %d %d %d\n", DumpCount, OpenCount, // deletecount+1\r
+        CloseCount, DeleteCount, ParseCount, OkayToCloseCount, QueryNameCount);\r
+\r
+    // check counters and then save\r
+    ok(OpenSave+1 == OpenCount, "Excessive Open method call\n");\r
+    ok(CloseSave == CloseCount, "Excessive Close method call\n");\r
+    ok(DeleteSave+1 == DeleteCount, "Delete method call mismatch\n");\r
+    ok(ParseSave == ParseCount, "Excessive Parse method call\n");\r
+    OpenSave=OpenCount; CloseSave=CloseCount; DeleteSave=DeleteCount;\r
+    ParseSave=ParseCount; OkayToCloseSave=OkayToCloseCount;\r
+    QueryNameSave=QueryNameCount;\r
+\r
     // Close its handle\r
     Status = ZwClose(ObHandle2[0]);\r
     ok(Status == STATUS_SUCCESS,\r
         "Failed to close handle status=0x%lX", Status);\r
 \r
+    // check counters and then save\r
+    ok(OpenSave == OpenCount, "Excessive Open method call\n");\r
+    ok(CloseSave+1 == CloseCount, "Close method call mismatch\n");\r
+    ok(DeleteSave == DeleteCount, "Excessive Delete method call\n");\r
+    ok(ParseSave == ParseCount, "Excessive Parse method call\n");\r
+    OpenSave=OpenCount; CloseSave=CloseCount; DeleteSave=DeleteCount;\r
+    ParseSave=ParseCount; OkayToCloseSave=OkayToCloseCount;\r
+    QueryNameSave=QueryNameCount;\r
+\r
+\r
     // Object referenced 2 times:\r
     // 1) ObInsertObject\r
     // 2) AdditionalReferences\r
     ObDereferenceObject(ObBody1[1]);\r
+\r
+    //DPRINT1("%d %d %d %d %d %d %d\n", DumpCount, OpenCount, // no change\r
+    //    CloseCount, DeleteCount, ParseCount, OkayToCloseCount, QueryNameCount);\r
+    ok(OpenSave == OpenCount, "Open method call mismatch\n");\r
+    ok(CloseSave == CloseCount, "Close method call mismatch\n");\r
+    ok(DeleteSave == DeleteCount, "Delete method call mismatch\n");\r
+    ok(ParseSave == ParseCount, "Parse method call mismatch\n");\r
 }\r
 \r
 VOID\r
@@ -381,6 +496,9 @@ NtoskrnlObTest()
 {\r
     StartTest();\r
 \r
+    DumpCount = 0; OpenCount = 0; CloseCount = 0;\r
+    DeleteCount = 0; ParseCount = 0;\r
+\r
     // Create object-types to use in tests\r
     ObtCreateObjectTypes();\r
     DPRINT("ObtCreateObjectTypes() done\n");\r