Author: fireball
Date: Sat Jun 17 16:18:08 2006
New Revision: 22381
URL:
http://svn.reactos.ru/svn/reactos?rev=22381&view=rev
Log:
- Add 2 more Ob Methods (currently turned off in testing)
- Add Open method to tests
- Make debug output of Ob Methods more informative
- Add Ob Methods counting tests
Modified:
trunk/reactos/drivers/test/kmtest/ntos_ob.c
Modified: trunk/reactos/drivers/test/kmtest/ntos_ob.c
URL:
http://svn.reactos.ru/svn/reactos/trunk/reactos/drivers/test/kmtest/ntos_ob…
==============================================================================
--- trunk/reactos/drivers/test/kmtest/ntos_ob.c (original)
+++ trunk/reactos/drivers/test/kmtest/ntos_ob.c Sat Jun 17 16:18:08 2006
@@ -64,6 +64,9 @@
HANDLE ObHandle2[NUM_OBTYPES];
HANDLE DirectoryHandle;
+USHORT DumpCount, OpenCount, CloseCount, DeleteCount,
+ ParseCount, OkayToCloseCount, QueryNameCount;
+
/* PRIVATE FUNCTIONS **********************************************************/
VOID
@@ -72,9 +75,10 @@
IN POB_DUMP_CONTROL DumpControl)
{
DbgPrint("DumpProc() called\n");
-}
-
-// prototype doesn't match Win2003! (causes BSOD)
+ DumpCount++;
+}
+
+// Tested in Win2k3
VOID
NTAPI
OpenProc(IN OB_OPEN_REASON OpenReason,
@@ -83,8 +87,9 @@
IN ACCESS_MASK GrantedAccess,
IN ULONG HandleCount)
{
- DbgPrint("OpenProc() called\n");
- DbgBreakPoint();
+ DbgPrint("OpenProc() 0x%p, OpenReason %d, HC %d, AM 0x%X\n",
+ Object, OpenReason, HandleCount, GrantedAccess);
+ OpenCount++;
}
// Tested in Win2k3
@@ -96,7 +101,9 @@
IN ULONG ProcessHandleCount,
IN ULONG SystemHandleCount)
{
- DPRINT("CloseProc() called for Object=0x%p\n", Object);
+ DbgPrint("CloseProc() 0x%p, PHC %d, SHC %d, AM 0x%X\n", Object,
+ ProcessHandleCount, SystemHandleCount, GrantedAccess);
+ CloseCount++;
}
// Tested in Win2k3
@@ -104,7 +111,8 @@
NTAPI
DeleteProc(IN PVOID Object)
{
- DPRINT("DeleteProc() called for Object=0x%p\n", Object);
+ DbgPrint("DeleteProc() 0x%p\n", Object);
+ DeleteCount++;
}
NTSTATUS
@@ -122,8 +130,43 @@
{
DbgPrint("ParseProc() called\n");
*Object = NULL;
+
+ ParseCount++;
return STATUS_OBJECT_NAME_NOT_FOUND;//STATUS_SUCCESS;
}
+
+// Tested in Win2k3
+NTSTATUS
+NTAPI
+OkayToCloseProc(IN PEPROCESS Process OPTIONAL,
+ IN PVOID Object,
+ IN HANDLE Handle,
+ IN KPROCESSOR_MODE AccessMode)
+{
+ DbgPrint("OkayToCloseProc() 0x%p, H 0x%p, AM 0x%X\n", Object, Handle,
+ AccessMode);
+ OkayToCloseCount++;
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+QueryNameProc(IN PVOID Object,
+ IN BOOLEAN HasObjectName,
+ OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
+ IN ULONG Length,
+ OUT PULONG ReturnLength,
+ IN KPROCESSOR_MODE AccessMode)
+{
+ DbgPrint("QueryNameProc() 0x%p, HON %d, Len %d, AM 0x%X\n",
+ Object, HasObjectName, Length, AccessMode);
+ QueryNameCount++;
+
+ ObjectNameInfo = NULL;
+ ReturnLength = 0;
+ return STATUS_OBJECT_NAME_NOT_FOUND;
+}
+
VOID
ObtCreateObjectTypes()
@@ -158,8 +201,16 @@
ObTypeInitializer[i].CloseProcedure = (OB_CLOSE_METHOD)CloseProc;
ObTypeInitializer[i].DeleteProcedure = (OB_DELETE_METHOD)DeleteProc;
ObTypeInitializer[i].DumpProcedure = (OB_DUMP_METHOD)DumpProc;
- //ObTypeInitializer[i].OpenProcedure = (OB_OPEN_METHOD)OpenProc;
+ ObTypeInitializer[i].OpenProcedure = (OB_OPEN_METHOD)OpenProc;
ObTypeInitializer[i].ParseProcedure = (OB_PARSE_METHOD)ParseProc;
+ //ObTypeInitializer[i].OkayToCloseProcedure =
+ // (OB_OKAYTOCLOSE_METHOD)OkayToCloseProc;
+
+ //ObTypeInitializer[i].QueryNameProcedure =
+ // (OB_QUERYNAME_METHOD)QueryNameProc;
+
+ //ObTypeInitializer[i].SecurityProcedure =
+ // (OB_SECURITY_METHOD)SecurityProc;
Status = ObCreateObjectType(&ObTypeName[i], &ObTypeInitializer[i],
(PSECURITY_DESCRIPTOR)NULL, &ObTypes[i]);
@@ -188,6 +239,8 @@
{
PVOID ObBody1[2];
NTSTATUS Status;
+ USHORT OpenSave, CloseSave, DeleteSave, ParseSave,
+ OkayToCloseSave, QueryNameSave;
// Create two objects
RtlInitUnicodeString(&ObName[0], L"\\ObtDirectory\\MyObject1");
@@ -210,6 +263,11 @@
ok(Status == STATUS_SUCCESS,
"Failed to create object with status=0x%lX", Status);
+ // save counters
+ OpenSave=OpenCount; CloseSave=CloseCount; DeleteSave=DeleteCount;
+ ParseSave=ParseCount; OkayToCloseSave=OkayToCloseCount;
+ QueryNameSave=QueryNameCount;
+
// Insert them
Status = ObInsertObject(ObBody[0], NULL, STANDARD_RIGHTS_ALL, 0,
&ObBody[0], &ObHandle1[0]);
@@ -218,12 +276,34 @@
ok(ObBody[0] != NULL, "Object body = NULL");
ok(ObHandle1[0] != NULL, "Handle = NULL");
+ // check counters
+ ok(OpenSave+1 == OpenCount, "Open method calls mismatch\n");
+ ok(CloseSave == CloseCount, "Excessive Close method call\n");
+ ok(DeleteSave == DeleteCount, "Excessive Delete method call\n");
+ ok(ParseSave == ParseCount, "Excessive Parse method call\n");
+
+ // save counters
+ OpenSave=OpenCount; CloseSave=CloseCount; DeleteSave=DeleteCount;
+ ParseSave=ParseCount; OkayToCloseSave=OkayToCloseCount;
+ QueryNameSave=QueryNameCount;
+
Status = ObInsertObject(ObBody[1], NULL, GENERIC_ALL, 0,
&ObBody[1], &ObHandle1[1]);
ok(Status == STATUS_SUCCESS,
"Failed to insert object 1 with status=0x%lX", Status);
ok(ObBody[1] != NULL, "Object body = NULL");
ok(ObHandle1[1] != NULL, "Handle = NULL");
+
+ // check counters
+ ok(OpenSave+1 == OpenCount, "Open method calls mismatch\n");
+ ok(CloseSave == CloseCount, "Excessive Close method call\n");
+ ok(DeleteSave == DeleteCount, "Excessive Delete method call\n");
+ ok(ParseSave == ParseCount, "Excessive Parse method call\n");
+
+ // save counters
+ OpenSave=OpenCount; CloseSave=CloseCount; DeleteSave=DeleteCount;
+ ParseSave=ParseCount; OkayToCloseSave=OkayToCloseCount;
+ QueryNameSave=QueryNameCount;
// Now create an object of type 0, of the same name and expect it to fail
// inserting, but success creation
@@ -235,6 +315,12 @@
NULL, (ULONG)sizeof(MY_OBJECT1), 0L, 0L, (PVOID *)&ObBody1[0]);
ok(Status == STATUS_SUCCESS,
"Failed to create object with status=0x%lX", Status);
+
+ // check counters
+ ok(OpenSave == OpenCount, "Excessive Open method call\n");
+ ok(CloseSave == CloseCount, "Excessive Close method call\n");
+ ok(DeleteSave == DeleteCount, "Excessive Delete method call\n");
+ ok(ParseSave == ParseCount, "Excessive Parse method call\n");
Status = ObInsertObject(ObBody1[0], NULL, GENERIC_ALL, 0,
&ObBody1[1], &ObHandle2[0]);
@@ -244,15 +330,44 @@
"Object bodies doesn't match, 0x%p != 0x%p", ObBody[0],
ObBody1[1]);
ok(ObHandle2[0] != NULL, "Bad handle returned 0x%lX",
(ULONG)ObHandle2[0]);
+ DPRINT1("%d %d %d %d %d %d %d\n", DumpCount, OpenCount, // deletecount+1
+ CloseCount, DeleteCount, ParseCount, OkayToCloseCount, QueryNameCount);
+
+ // check counters and then save
+ ok(OpenSave+1 == OpenCount, "Excessive Open method call\n");
+ ok(CloseSave == CloseCount, "Excessive Close method call\n");
+ ok(DeleteSave+1 == DeleteCount, "Delete method call mismatch\n");
+ ok(ParseSave == ParseCount, "Excessive Parse method call\n");
+ OpenSave=OpenCount; CloseSave=CloseCount; DeleteSave=DeleteCount;
+ ParseSave=ParseCount; OkayToCloseSave=OkayToCloseCount;
+ QueryNameSave=QueryNameCount;
+
// Close its handle
Status = ZwClose(ObHandle2[0]);
ok(Status == STATUS_SUCCESS,
"Failed to close handle status=0x%lX", Status);
+
+ // check counters and then save
+ ok(OpenSave == OpenCount, "Excessive Open method call\n");
+ ok(CloseSave+1 == CloseCount, "Close method call mismatch\n");
+ ok(DeleteSave == DeleteCount, "Excessive Delete method call\n");
+ ok(ParseSave == ParseCount, "Excessive Parse method call\n");
+ OpenSave=OpenCount; CloseSave=CloseCount; DeleteSave=DeleteCount;
+ ParseSave=ParseCount; OkayToCloseSave=OkayToCloseCount;
+ QueryNameSave=QueryNameCount;
+
// Object referenced 2 times:
// 1) ObInsertObject
// 2) AdditionalReferences
ObDereferenceObject(ObBody1[1]);
+
+ //DPRINT1("%d %d %d %d %d %d %d\n", DumpCount, OpenCount, // no change
+ // CloseCount, DeleteCount, ParseCount, OkayToCloseCount, QueryNameCount);
+ ok(OpenSave == OpenCount, "Open method call mismatch\n");
+ ok(CloseSave == CloseCount, "Close method call mismatch\n");
+ ok(DeleteSave == DeleteCount, "Delete method call mismatch\n");
+ ok(ParseSave == ParseCount, "Parse method call mismatch\n");
}
VOID
@@ -381,6 +496,9 @@
{
StartTest();
+ DumpCount = 0; OpenCount = 0; CloseCount = 0;
+ DeleteCount = 0; ParseCount = 0;
+
// Create object-types to use in tests
ObtCreateObjectTypes();
DPRINT("ObtCreateObjectTypes() done\n");