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
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
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
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
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
{\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
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
{\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
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
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
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
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
"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
{\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