Author: tfaber
Date: Sat Aug 6 17:09:39 2011
New Revision: 53103
URL:
http://svn.reactos.org/svn/reactos?rev=53103&view=rev
Log:
[KMTESTS]
- Rename ObCreate test to ObType, and apply some major refactoring. Now _almost_ works on
Windows....
- Add a readme file
Added:
branches/GSoC_2011/KMTestSuite/kmtests/ntos_ob/ObType.c
- copied, changed from r53083,
branches/GSoC_2011/KMTestSuite/kmtests/ntos_ob/ObCreate.c
branches/GSoC_2011/KMTestSuite/kmtests/readme.txt (with props)
Removed:
branches/GSoC_2011/KMTestSuite/kmtests/ntos_ob/ObCreate.c
Modified:
branches/GSoC_2011/KMTestSuite/kmtests/CMakeLists.txt
branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv.rbuild
branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv/testlist.c
Modified: branches/GSoC_2011/KMTestSuite/kmtests/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/KMTestSuite/kmtests/C…
==============================================================================
--- branches/GSoC_2011/KMTestSuite/kmtests/CMakeLists.txt [iso-8859-1] (original)
+++ branches/GSoC_2011/KMTestSuite/kmtests/CMakeLists.txt [iso-8859-1] Sat Aug 6 17:09:39
2011
@@ -34,7 +34,7 @@
ntos_ke/KeIrql.c
ntos_ke/KeProcessor.c
ntos_ke/KeSpinLock.c
- ntos_ob/ObCreate.c
+ ntos_ob/ObType.c
rtl/RtlAvlTree.c
rtl/RtlMemory.c
rtl/RtlSplayTree.c
Modified: branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv.rbuild
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/KMTestSuite/kmtests/k…
==============================================================================
--- branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv.rbuild [iso-8859-1] (original)
+++ branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv.rbuild [iso-8859-1] Sat Aug 6
17:09:39 2011
@@ -41,7 +41,7 @@
<file>KeSpinLock.c</file>
</directory>
<directory name="ntos_ob">
- <file>ObCreate.c</file>
+ <file>ObType.c</file>
</directory>
<directory name="rtl">
<file>RtlAvlTree.c</file>
Modified: branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv/testlist.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/KMTestSuite/kmtests/k…
==============================================================================
--- branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv/testlist.c [iso-8859-1] (original)
+++ branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv/testlist.c [iso-8859-1] Sat Aug 6
17:09:39 2011
@@ -27,7 +27,9 @@
KMT_TESTFUNC Test_KeIrql;
KMT_TESTFUNC Test_KeProcessor;
KMT_TESTFUNC Test_KernelType;
-KMT_TESTFUNC Test_ObCreate;
+KMT_TESTFUNC Test_ObType;
+KMT_TESTFUNC Test_ObTypeClean;
+KMT_TESTFUNC Test_ObTypeNoClean;
KMT_TESTFUNC Test_RtlAvlTree;
KMT_TESTFUNC Test_RtlMemory;
KMT_TESTFUNC Test_RtlSplayTree;
@@ -54,7 +56,9 @@
{ "KeIrql", Test_KeIrql },
{ "KeProcessor", Test_KeProcessor },
{ "-KernelType", Test_KernelType },
- { "ObCreate", Test_ObCreate },
+ { "ObType", Test_ObType },
+ { "-ObTypeClean", Test_ObTypeClean },
+ { "-ObTypeNoClean", Test_ObTypeNoClean },
{ "RtlAvlTreeKM", Test_RtlAvlTree },
{ "RtlMemoryKM", Test_RtlMemory },
{ "RtlSplayTreeKM", Test_RtlSplayTree },
Removed: branches/GSoC_2011/KMTestSuite/kmtests/ntos_ob/ObCreate.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/KMTestSuite/kmtests/n…
==============================================================================
--- branches/GSoC_2011/KMTestSuite/kmtests/ntos_ob/ObCreate.c [iso-8859-1] (original)
+++ branches/GSoC_2011/KMTestSuite/kmtests/ntos_ob/ObCreate.c (removed)
@@ -1,506 +1,0 @@
-/*
- * PROJECT: ReactOS kernel-mode tests
- * LICENSE: LGPLv2+ - See COPYING.LIB in the top level directory
- * PURPOSE: Kernel-Mode Test Suite Ob Regressions KM-Test
- * PROGRAMMER: Aleksey Bragin <aleksey(a)reactos.org>
- */
-
-/* TODO: this test terminates with an access violation in Windows */
-
-#include <kmt_test.h>
-
-#define NDEBUG
-#include <debug.h>
-
-// I ment to make this test scalable, but for now
-// we work with two object types only
-#define NUM_OBTYPES 2
-
-typedef struct _MY_OBJECT1
-{
- ULONG Something1;
-} MY_OBJECT1, *PMY_OBJECT1;
-
-typedef struct _MY_OBJECT2
-{
- ULONG Something1;
- ULONG SomeLong[10];
-} MY_OBJECT2, *PMY_OBJECT2;
-
-static POBJECT_TYPE ObTypes[NUM_OBTYPES];
-static UNICODE_STRING ObTypeName[NUM_OBTYPES];
-static UNICODE_STRING ObName[NUM_OBTYPES];
-static OBJECT_TYPE_INITIALIZER ObTypeInitializer[NUM_OBTYPES];
-static UNICODE_STRING ObDirectoryName;
-static OBJECT_ATTRIBUTES ObDirectoryAttributes;
-static OBJECT_ATTRIBUTES ObAttributes[NUM_OBTYPES];
-static PVOID ObBody[NUM_OBTYPES];
-//static PMY_OBJECT1 ObObject1;
-//static PMY_OBJECT2 ObObject2;
-static HANDLE ObHandle1[NUM_OBTYPES];
-static HANDLE ObHandle2[NUM_OBTYPES];
-static HANDLE DirectoryHandle;
-
-static USHORT DumpCount, OpenCount, CloseCount, DeleteCount,
- ParseCount, OkayToCloseCount, QueryNameCount;
-
-static
-VOID
-NTAPI
-DumpProc(IN PVOID Object,
- IN POB_DUMP_CONTROL DumpControl)
-{
- DbgPrint("DumpProc() called\n");
- DumpCount++;
-}
-
-// Tested in Win2k3
-static
-VOID
-NTAPI
-OpenProc(IN OB_OPEN_REASON OpenReason,
- IN PEPROCESS Process,
- IN PVOID Object,
- IN ACCESS_MASK GrantedAccess,
- IN ULONG HandleCount)
-{
- DbgPrint("OpenProc() 0x%p, OpenReason %d, HC %d, AM 0x%X\n",
- Object, OpenReason, HandleCount, GrantedAccess);
- OpenCount++;
-}
-
-// Tested in Win2k3
-static
-VOID
-NTAPI
-CloseProc(IN PEPROCESS Process,
- IN PVOID Object,
- IN ACCESS_MASK GrantedAccess,
- IN ULONG ProcessHandleCount,
- IN ULONG SystemHandleCount)
-{
- DbgPrint("CloseProc() 0x%p, PHC %d, SHC %d, AM 0x%X\n", Object,
- ProcessHandleCount, SystemHandleCount, GrantedAccess);
- CloseCount++;
-}
-
-// Tested in Win2k3
-static
-VOID
-NTAPI
-DeleteProc(IN PVOID Object)
-{
- DbgPrint("DeleteProc() 0x%p\n", Object);
- DeleteCount++;
-}
-
-static
-NTSTATUS
-NTAPI
-ParseProc(IN PVOID ParseObject,
- IN PVOID ObjectType,
- IN OUT PACCESS_STATE AccessState,
- IN KPROCESSOR_MODE AccessMode,
- IN ULONG Attributes,
- IN OUT PUNICODE_STRING CompleteName,
- IN OUT PUNICODE_STRING RemainingName,
- IN OUT PVOID Context OPTIONAL,
- IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
- OUT PVOID *Object)
-{
- DbgPrint("ParseProc() called\n");
- *Object = NULL;
-
- ParseCount++;
- return STATUS_OBJECT_NAME_NOT_FOUND;//STATUS_SUCCESS;
-}
-
-#if 0
-// Tested in Win2k3
-static
-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;
-}
-
-static
-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;
-}
-#endif /* 0 */
-
-static
-VOID
-ObtCreateObjectTypes()
-{
- USHORT i;
- NTSTATUS Status;
- WCHAR Name[15];
-
- for (i=0; i<NUM_OBTYPES; i++)
- {
- // Prepare object type name
- // TODO: Generate type names and don't use this unprofessional,
- swprintf(Name, L"MyObjectType%lx", i);
- RtlInitUnicodeString(&ObTypeName[i], Name);
-
- // Prepare initializer
- RtlZeroMemory(&ObTypeInitializer[i], sizeof(ObTypeInitializer[i]));
- ObTypeInitializer[i].Length = sizeof(ObTypeInitializer[i]);
- ObTypeInitializer[i].PoolType = NonPagedPool;
- ObTypeInitializer[i].MaintainHandleCount = TRUE;
- ObTypeInitializer[i].ValidAccessMask = OBJECT_TYPE_ALL_ACCESS;
-
- // Test for invalid parameter
- // FIXME: Make it more exact, to see which params Win2k3 checks
- // existence of
- Status = ObCreateObjectType(&ObTypeName[i], &ObTypeInitializer[i],
- (PSECURITY_DESCRIPTOR)NULL, &ObTypes[i]);
- ok(Status == STATUS_INVALID_PARAMETER,
- "ObCreateObjectType returned 0x%lX", Status);
-
- // Object procedures
- 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].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]);
- ok(Status == STATUS_SUCCESS,
- "Failed to create object type with status=0x%lX", Status);
- }
-}
-
-static
-VOID
-ObtCreateDirectory()
-{
- NTSTATUS Status;
-
- // Directory will have permanent and case insensitive flags
- RtlInitUnicodeString(&ObDirectoryName, L"\\ObtDirectory");
- InitializeObjectAttributes(&ObDirectoryAttributes, &ObDirectoryName,
- OBJ_PERMANENT | OBJ_CASE_INSENSITIVE, NULL, NULL);
-
- Status = ZwCreateDirectoryObject(&DirectoryHandle, 0,
&ObDirectoryAttributes);
- ok(Status == STATUS_SUCCESS,
- "Failed to create directory object with status=0x%lX", Status);
-}
-
-static
-VOID
-ObtCreateObjects()
-{
- PVOID ObBody1[2];
- NTSTATUS Status;
- USHORT OpenSave, CloseSave, DeleteSave, ParseSave,
- OkayToCloseSave, QueryNameSave;
-
- // Create two objects
- RtlInitUnicodeString(&ObName[0], L"\\ObtDirectory\\MyObject1");
- InitializeObjectAttributes(&ObAttributes[0], &ObName[0],
- OBJ_CASE_INSENSITIVE, NULL, NULL);
-
- RtlInitUnicodeString(&ObName[1], L"\\ObtDirectory\\MyObject2");
- InitializeObjectAttributes(&ObAttributes[1], &ObName[1],
- OBJ_CASE_INSENSITIVE, NULL, NULL);
-
- Status = ObCreateObject(KernelMode, ObTypes[0], &ObAttributes[0],
- KernelMode, NULL, (ULONG)sizeof(MY_OBJECT1), 0L, 0L,
- (PVOID *)&ObBody[0]);
- ok(Status == STATUS_SUCCESS,
- "Failed to create object with status=0x%lX", Status);
-
- Status = ObCreateObject(KernelMode, ObTypes[1], &ObAttributes[1],
- KernelMode, NULL, (ULONG)sizeof(MY_OBJECT2), 0L, 0L,
- (PVOID *)&ObBody[1]);
- 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]);
- ok(Status == STATUS_SUCCESS,
- "Failed to insert object 0 with status=0x%lX", Status);
- 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
- RtlInitUnicodeString(&ObName[0], L"\\ObtDirectory\\MyObject1");
- InitializeObjectAttributes(&ObAttributes[0], &ObName[0], OBJ_OPENIF,
- NULL, NULL);
-
- Status = ObCreateObject(KernelMode, ObTypes[0], &ObAttributes[0], KernelMode,
- 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]);
- ok(Status == STATUS_OBJECT_NAME_EXISTS,
- "Object insertion should have failed, but got 0x%lX", Status);
- ok(ObBody[0] == ObBody1[1],
- "Object bodies doesn't match, 0x%p != 0x%p", ObBody[0],
ObBody1[1]);
- ok(ObHandle2[0] != NULL, "Bad handle returned 0x%lX",
(ULONG_PTR)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");
-}
-
-static
-VOID
-ObtClose()
-{
- PVOID DirObject;
- NTSTATUS Status;
- //PVOID TypeObject;
- USHORT i;
- //UNICODE_STRING ObPathName[NUM_OBTYPES];
-
- // Close what we have opened and free what we allocated
- ZwClose(ObHandle1[0]);
- ZwClose(ObHandle1[1]);
- ZwClose(ObHandle2[0]);
- ZwClose(ObHandle2[1]);
-
- // Now we have to get rid of a directory object
- // Since it is permanent, we have to firstly make it temporary
- // and only then kill
- // (this procedure is described in DDK)
- Status = ObReferenceObjectByHandle(DirectoryHandle, 0L, NULL,
- KernelMode, &DirObject, NULL);
- ok(Status == STATUS_SUCCESS,
- "Failed to reference object by handle with status=0x%lX", Status);
-
- // Dereference 2 times - first for just previous referencing
- // and 2nd time for creation of permanent object itself
- ObDereferenceObject(DirObject);
- ObDereferenceObject(DirObject);
-
- Status = ZwMakeTemporaryObject(DirectoryHandle);
- ok(Status == STATUS_SUCCESS,
- "Failed to make temp object with status=0x%lX", Status);
-
- // Close the handle now and we are done
- Status = ZwClose(DirectoryHandle);
- ok(Status == STATUS_SUCCESS,
- "Failed to close handle with status=0x%lX", Status);
-
- // Now delete the last piece - object types
- // In fact, it's weird to get rid of object types, especially the way,
- // how it's done in the commented section below
- for (i=0; i<NUM_OBTYPES; i++)
- ObDereferenceObject(ObTypes[i]);
-/*
- RtlInitUnicodeString(&ObPathName[0], L"\\ObjectTypes\\MyObjectType1");
- RtlInitUnicodeString(&ObPathName[1], L"\\ObjectTypes\\MyObjectType2");
-
- for (i=0; i<NUM_OBTYPES; i++)
- {
- Status = ObReferenceObjectByName(&ObPathName[i],
- OBJ_CASE_INSENSITIVE, NULL, 0L, NULL, KernelMode, NULL,
- &TypeObject);
-
- ObDereferenceObject(TypeObject);
- ObDereferenceObject(TypeObject);
- DPRINT("Reference Name %S = %p, ObTypes[%d] = %p\n",
- ObPathName[i], TypeObject, i, ObTypes[i]);
- }
-*/
-}
-
-#if 0
-static
-VOID
-ObtReferenceTests()
-{
- USHORT i;
- NTSTATUS Status;
- UNICODE_STRING ObPathName[NUM_OBTYPES];
-
- // Reference them by handle
- for (i=0; i<NUM_OBTYPES; i++)
- {
- Status = ObReferenceObjectByHandle(ObHandle1[i], 0L, ObTypes[i],
- KernelMode, &ObBody[i], NULL);
- ok(Status == STATUS_SUCCESS,
- "Failed to reference object by handle, status=0x%lX", Status);
- DPRINT("Ref by handle %lx = %p\n", ObHandle1[i], ObBody[i]);
- }
-
- // Reference them by pointer
- for (i=0; i<NUM_OBTYPES; i++)
- {
- Status = ObReferenceObjectByPointer(ObBody[i], 0L, ObTypes[i], KernelMode);
- ok(Status == STATUS_SUCCESS,
- "Failed to reference object by pointer, status=0x%lX", Status);
- }
-
- // Reference them by name
- RtlInitUnicodeString(&ObPathName[0], L"\\ObtDirectory\\MyObject1");
- RtlInitUnicodeString(&ObPathName[1], L"\\ObtDirectory\\MyObject2");
-
- for (i=0; i<NUM_OBTYPES; i++)
- {
- Status = ObReferenceObjectByName(&ObPathName[i],
- OBJ_CASE_INSENSITIVE, NULL, 0L, ObTypes[i], KernelMode, NULL,
- &ObBody[0]);
-
- DPRINT("Ref by name %wZ = %p\n", &ObPathName[i], ObBody[i]);
- }
-
- // Dereference now all of them
-
- // For ObInsertObject, AdditionalReference
- ObDereferenceObject(ObBody[0]);
- ObDereferenceObject(ObBody[1]);
-
- // For ByHandle
- ObDereferenceObject(ObBody[0]);
- ObDereferenceObject(ObBody[1]);
-
- // For ByPointer
- ObDereferenceObject(ObBody[0]);
- ObDereferenceObject(ObBody[1]);
-
- // For ByName
- ObDereferenceObject(ObBody[0]);
- ObDereferenceObject(ObBody[1]);
-}
-#endif /* 0 */
-
-START_TEST(ObCreate)
-{
- DumpCount = 0; OpenCount = 0; CloseCount = 0;
- DeleteCount = 0; ParseCount = 0;
-
- // Create object-types to use in tests
- ObtCreateObjectTypes();
- DPRINT("ObtCreateObjectTypes() done\n");
-
- // Create Directory
- ObtCreateDirectory();
- DPRINT("ObtCreateDirectory() done\n");
-
- // Create and insert objects
- ObtCreateObjects();
- DPRINT("ObtCreateObjects() done\n");
-
- // Reference them in a variety of ways
- //ObtReferenceTests();
-
- // Clean up
- // FIXME: Disable to see results of creating objects in usermode.
- // Also it has problems with object types removal
- ObtClose();
- DPRINT("Cleanup done\n");
-}
Copied: branches/GSoC_2011/KMTestSuite/kmtests/ntos_ob/ObType.c (from r53083,
branches/GSoC_2011/KMTestSuite/kmtests/ntos_ob/ObCreate.c)
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/KMTestSuite/kmtests/n…
==============================================================================
--- branches/GSoC_2011/KMTestSuite/kmtests/ntos_ob/ObCreate.c [iso-8859-1] (original)
+++ branches/GSoC_2011/KMTestSuite/kmtests/ntos_ob/ObType.c [iso-8859-1] Sat Aug 6
17:09:39 2011
@@ -3,18 +3,27 @@
* LICENSE: LGPLv2+ - See COPYING.LIB in the top level directory
* PURPOSE: Kernel-Mode Test Suite Ob Regressions KM-Test
* PROGRAMMER: Aleksey Bragin <aleksey(a)reactos.org>
+ * Thomas Faber <thfabba(a)gmx.de>
*/
-/* TODO: this test terminates with an access violation in Windows */
+/* TODO: split this into multiple tests! ObLifetime, ObHandle, ObName, ... */
#include <kmt_test.h>
-#define NDEBUG
+//#define NDEBUG
#include <debug.h>
-// I ment to make this test scalable, but for now
-// we work with two object types only
-#define NUM_OBTYPES 2
+#define CheckObject(Handle, PCount, HCount) do \
+{ \
+ PUBLIC_OBJECT_BASIC_INFORMATION ObjectInfo; \
+ Status = ZwQueryObject(Handle, ObjectBasicInformation, \
+ &ObjectInfo, sizeof ObjectInfo, NULL); \
+ ok_eq_hex(Status, STATUS_SUCCESS); \
+ ok_eq_ulong(ObjectInfo.PointerCount, PCount); \
+ ok_eq_ulong(ObjectInfo.HandleCount, HCount); \
+} while (0)
+
+#define NUM_OBTYPES 5
typedef struct _MY_OBJECT1
{
@@ -35,8 +44,6 @@
static OBJECT_ATTRIBUTES ObDirectoryAttributes;
static OBJECT_ATTRIBUTES ObAttributes[NUM_OBTYPES];
static PVOID ObBody[NUM_OBTYPES];
-//static PMY_OBJECT1 ObObject1;
-//static PMY_OBJECT2 ObObject2;
static HANDLE ObHandle1[NUM_OBTYPES];
static HANDLE ObHandle2[NUM_OBTYPES];
static HANDLE DirectoryHandle;
@@ -47,68 +54,71 @@
static
VOID
NTAPI
-DumpProc(IN PVOID Object,
- IN POB_DUMP_CONTROL DumpControl)
-{
- DbgPrint("DumpProc() called\n");
+DumpProc(
+ IN PVOID Object,
+ IN POB_DUMP_CONTROL DumpControl)
+{
+ DPRINT("DumpProc() called\n");
DumpCount++;
}
-// Tested in Win2k3
-static
-VOID
-NTAPI
-OpenProc(IN OB_OPEN_REASON OpenReason,
- IN PEPROCESS Process,
- IN PVOID Object,
- IN ACCESS_MASK GrantedAccess,
- IN ULONG HandleCount)
-{
- DbgPrint("OpenProc() 0x%p, OpenReason %d, HC %d, AM 0x%X\n",
+static
+NTSTATUS
+NTAPI
+OpenProc(
+ IN OB_OPEN_REASON OpenReason,
+ IN PEPROCESS Process,
+ IN PVOID Object,
+ IN ACCESS_MASK GrantedAccess,
+ IN ULONG HandleCount)
+{
+ DPRINT("OpenProc() 0x%p, OpenReason %d, HandleCount %lu, AccessMask
0x%lX\n",
Object, OpenReason, HandleCount, GrantedAccess);
OpenCount++;
-}
-
-// Tested in Win2k3
-static
-VOID
-NTAPI
-CloseProc(IN PEPROCESS Process,
- IN PVOID Object,
- IN ACCESS_MASK GrantedAccess,
- IN ULONG ProcessHandleCount,
- IN ULONG SystemHandleCount)
-{
- DbgPrint("CloseProc() 0x%p, PHC %d, SHC %d, AM 0x%X\n", Object,
- ProcessHandleCount, SystemHandleCount, GrantedAccess);
+ return STATUS_SUCCESS;
+}
+
+static
+VOID
+NTAPI
+CloseProc(
+ IN PEPROCESS Process,
+ IN PVOID Object,
+ IN ACCESS_MASK GrantedAccess,
+ IN ULONG ProcessHandleCount,
+ IN ULONG SystemHandleCount)
+{
+ DPRINT("CloseProc() 0x%p, ProcessHandleCount %lu, SystemHandleCount %lu,
AccessMask 0x%lX\n",
+ Object, ProcessHandleCount, SystemHandleCount, GrantedAccess);
CloseCount++;
}
-// Tested in Win2k3
-static
-VOID
-NTAPI
-DeleteProc(IN PVOID Object)
-{
- DbgPrint("DeleteProc() 0x%p\n", Object);
+static
+VOID
+NTAPI
+DeleteProc(
+ IN PVOID Object)
+{
+ DPRINT("DeleteProc() 0x%p\n", Object);
DeleteCount++;
}
static
NTSTATUS
NTAPI
-ParseProc(IN PVOID ParseObject,
- IN PVOID ObjectType,
- IN OUT PACCESS_STATE AccessState,
- IN KPROCESSOR_MODE AccessMode,
- IN ULONG Attributes,
- IN OUT PUNICODE_STRING CompleteName,
- IN OUT PUNICODE_STRING RemainingName,
- IN OUT PVOID Context OPTIONAL,
- IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
- OUT PVOID *Object)
-{
- DbgPrint("ParseProc() called\n");
+ParseProc(
+ IN PVOID ParseObject,
+ IN PVOID ObjectType,
+ IN OUT PACCESS_STATE AccessState,
+ IN KPROCESSOR_MODE AccessMode,
+ IN ULONG Attributes,
+ IN OUT PUNICODE_STRING CompleteName,
+ IN OUT PUNICODE_STRING RemainingName,
+ IN OUT PVOID Context OPTIONAL,
+ IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
+ OUT PVOID *Object)
+{
+ DPRINT("ParseProc() called\n");
*Object = NULL;
ParseCount++;
@@ -116,17 +126,17 @@
}
#if 0
-// Tested in Win2k3
static
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);
+OkayToCloseProc(
+ IN PEPROCESS Process OPTIONAL,
+ IN PVOID Object,
+ IN HANDLE Handle,
+ IN KPROCESSOR_MODE AccessMode)
+{
+ DPRINT("OkayToCloseProc() 0x%p, Handle 0x%p, AccessMask 0x%lX\n",
+ Object, Handle, AccessMode);
OkayToCloseCount++;
return STATUS_SUCCESS;
}
@@ -134,14 +144,15 @@
static
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",
+QueryNameProc(
+ IN PVOID Object,
+ IN BOOLEAN HasObjectName,
+ OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
+ IN ULONG Length,
+ OUT PULONG ReturnLength,
+ IN KPROCESSOR_MODE AccessMode)
+{
+ DPRINT("QueryNameProc() 0x%p, HasObjectName %d, Len %lu, AccessMask
0x%lX\n",
Object, HasObjectName, Length, AccessMode);
QueryNameCount++;
@@ -153,22 +164,20 @@
static
VOID
-ObtCreateObjectTypes()
-{
- USHORT i;
+ObtCreateObjectTypes(VOID)
+{
+ INT i;
NTSTATUS Status;
- WCHAR Name[15];
-
- for (i=0; i<NUM_OBTYPES; i++)
- {
- // Prepare object type name
- // TODO: Generate type names and don't use this unprofessional,
- swprintf(Name, L"MyObjectType%lx", i);
+ WCHAR Name[15];
+
+ for (i = 0; i < NUM_OBTYPES; i++)
+ {
+ Status = RtlStringCbPrintfW(Name, sizeof Name, L"MyObjectType%x", i);
+ ASSERT(NT_SUCCESS(Status));
RtlInitUnicodeString(&ObTypeName[i], Name);
- // Prepare initializer
- RtlZeroMemory(&ObTypeInitializer[i], sizeof(ObTypeInitializer[i]));
- ObTypeInitializer[i].Length = sizeof(ObTypeInitializer[i]);
+ RtlZeroMemory(&ObTypeInitializer[i], sizeof ObTypeInitializer[i]);
+ ObTypeInitializer[i].Length = sizeof ObTypeInitializer[i];
ObTypeInitializer[i].PoolType = NonPagedPool;
ObTypeInitializer[i].MaintainHandleCount = TRUE;
ObTypeInitializer[i].ValidAccessMask = OBJECT_TYPE_ALL_ACCESS;
@@ -176,331 +185,330 @@
// Test for invalid parameter
// FIXME: Make it more exact, to see which params Win2k3 checks
// existence of
- Status = ObCreateObjectType(&ObTypeName[i], &ObTypeInitializer[i],
- (PSECURITY_DESCRIPTOR)NULL, &ObTypes[i]);
- ok(Status == STATUS_INVALID_PARAMETER,
- "ObCreateObjectType returned 0x%lX", Status);
-
- // Object procedures
- 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].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]);
- ok(Status == STATUS_SUCCESS,
- "Failed to create object type with status=0x%lX", Status);
- }
-}
-
-static
-VOID
-ObtCreateDirectory()
+ Status = ObCreateObjectType(&ObTypeName[i], &ObTypeInitializer[i], NULL,
&ObTypes[i]);
+ ok_eq_hex(Status, STATUS_INVALID_PARAMETER);
+
+ ObTypeInitializer[i].CloseProcedure = CloseProc;
+ ObTypeInitializer[i].DeleteProcedure = DeleteProc;
+ ObTypeInitializer[i].DumpProcedure = DumpProc;
+ ObTypeInitializer[i].OpenProcedure = OpenProc;
+ ObTypeInitializer[i].ParseProcedure = ParseProc;
+ //ObTypeInitializer[i].OkayToCloseProcedure = OkayToCloseProc;
+ //ObTypeInitializer[i].QueryNameProcedure = QueryNameProc;
+ //ObTypeInitializer[i].SecurityProcedure = SecurityProc;
+
+ Status = ObCreateObjectType(&ObTypeName[i], &ObTypeInitializer[i], NULL,
&ObTypes[i]);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+ }
+}
+
+static
+VOID
+ObtCreateDirectory(VOID)
{
NTSTATUS Status;
- // Directory will have permanent and case insensitive flags
RtlInitUnicodeString(&ObDirectoryName, L"\\ObtDirectory");
- InitializeObjectAttributes(&ObDirectoryAttributes, &ObDirectoryName,
- OBJ_PERMANENT | OBJ_CASE_INSENSITIVE, NULL, NULL);
-
- Status = ZwCreateDirectoryObject(&DirectoryHandle, 0,
&ObDirectoryAttributes);
- ok(Status == STATUS_SUCCESS,
- "Failed to create directory object with status=0x%lX", Status);
-}
-
-static
-VOID
-ObtCreateObjects()
-{
- PVOID ObBody1[2];
+ InitializeObjectAttributes(&ObDirectoryAttributes, &ObDirectoryName,
OBJ_PERMANENT | OBJ_CASE_INSENSITIVE, NULL, NULL);
+ Status = ZwCreateDirectoryObject(&DirectoryHandle, DELETE,
&ObDirectoryAttributes);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+ CheckObject(DirectoryHandle, 3LU, 1LU);
+}
+
+#define CheckCounts(Open, Close, Delete, Parse, OkayToClose, QueryName) do \
+{ \
+ ok_eq_uint(OpenCount, Open); \
+ ok_eq_uint(CloseCount, Close); \
+ ok_eq_uint(DeleteCount, Delete); \
+ ok_eq_uint(ParseCount, Parse); \
+ ok_eq_uint(OkayToCloseCount, OkayToClose); \
+ ok_eq_uint(QueryNameCount, QueryName); \
+} while (0)
+
+#define SaveCounts(Open, Close, Delete, Parse, OkayToClose, QueryName) do \
+{ \
+ Open = OpenCount; \
+ Close = CloseCount; \
+ Delete = DeleteCount; \
+ Parse = ParseCount; \
+ OkayToClose = OkayToCloseCount; \
+ QueryName = QueryNameCount; \
+} while (0)
+
+/* TODO: make this the same as NUM_OBTYPES */
+#define NUM_OBTYPES2 2
+static
+VOID
+ObtCreateObjects(VOID)
+{
+ PVOID ObBody1[2] = { NULL };
NTSTATUS Status;
- USHORT OpenSave, CloseSave, DeleteSave, ParseSave,
- OkayToCloseSave, QueryNameSave;
+ WCHAR Name[NUM_OBTYPES2][MAX_PATH];
+ USHORT OpenSave, CloseSave, DeleteSave, ParseSave, OkayToCloseSave, QueryNameSave;
+ INT i;
+ ACCESS_MASK Access[NUM_OBTYPES2] = { STANDARD_RIGHTS_ALL, GENERIC_ALL };
+ ULONG ObjectSize[NUM_OBTYPES2] = { sizeof(MY_OBJECT1), sizeof(MY_OBJECT2) };
// Create two objects
- RtlInitUnicodeString(&ObName[0], L"\\ObtDirectory\\MyObject1");
- InitializeObjectAttributes(&ObAttributes[0], &ObName[0],
- OBJ_CASE_INSENSITIVE, NULL, NULL);
-
- RtlInitUnicodeString(&ObName[1], L"\\ObtDirectory\\MyObject2");
- InitializeObjectAttributes(&ObAttributes[1], &ObName[1],
- OBJ_CASE_INSENSITIVE, NULL, NULL);
-
- Status = ObCreateObject(KernelMode, ObTypes[0], &ObAttributes[0],
- KernelMode, NULL, (ULONG)sizeof(MY_OBJECT1), 0L, 0L,
- (PVOID *)&ObBody[0]);
- ok(Status == STATUS_SUCCESS,
- "Failed to create object with status=0x%lX", Status);
-
- Status = ObCreateObject(KernelMode, ObTypes[1], &ObAttributes[1],
- KernelMode, NULL, (ULONG)sizeof(MY_OBJECT2), 0L, 0L,
- (PVOID *)&ObBody[1]);
- 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;
+ for (i = 0; i < NUM_OBTYPES2; ++i)
+ {
+ ASSERT(sizeof Name[i] == MAX_PATH * sizeof(WCHAR));
+ Status = RtlStringCbPrintfW(Name[i], sizeof Name[i],
L"\\ObtDirectory\\MyObject%d", i + 1);
+ ASSERT(Status == STATUS_SUCCESS);
+ RtlInitUnicodeString(&ObName[i], Name[i]);
+ InitializeObjectAttributes(&ObAttributes[i], &ObName[i],
OBJ_CASE_INSENSITIVE, NULL, NULL);
+ }
+
+ for (i = 0; i < NUM_OBTYPES2; ++i)
+ {
+ Status = ObCreateObject(KernelMode, ObTypes[i], &ObAttributes[i], KernelMode,
NULL, ObjectSize[i], 0L, 0L, &ObBody[i]);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+ }
+
+ SaveCounts(OpenSave, CloseSave, DeleteSave, ParseSave, OkayToCloseSave,
QueryNameSave);
// Insert them
- Status = ObInsertObject(ObBody[0], NULL, STANDARD_RIGHTS_ALL, 0,
- &ObBody[0], &ObHandle1[0]);
- ok(Status == STATUS_SUCCESS,
- "Failed to insert object 0 with status=0x%lX", Status);
- 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;
+ for (i = 0; i < NUM_OBTYPES2; ++i)
+ {
+ Status = ObInsertObject(ObBody[i], NULL, Access[i], 0, &ObBody[i],
&ObHandle1[i]);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+ ok(ObBody[i] != NULL, "Object body = NULL\n");
+ ok(ObHandle1[i] != NULL, "Handle = NULL\n");
+ CheckObject(ObHandle1[i], 3LU, 1LU);
+ CheckCounts(OpenSave + 1, CloseSave, DeleteSave, ParseSave, OkayToCloseSave,
QueryNameSave);
+ SaveCounts(OpenSave, CloseSave, DeleteSave, ParseSave, OkayToCloseSave,
QueryNameSave);
+ }
// Now create an object of type 0, of the same name and expect it to fail
// inserting, but success creation
+ ok_eq_wstr(ObName[0].Buffer, L"\\ObtDirectory\\MyObject1");
RtlInitUnicodeString(&ObName[0], L"\\ObtDirectory\\MyObject1");
- InitializeObjectAttributes(&ObAttributes[0], &ObName[0], OBJ_OPENIF,
- NULL, NULL);
-
- Status = ObCreateObject(KernelMode, ObTypes[0], &ObAttributes[0], KernelMode,
- 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]);
- ok(Status == STATUS_OBJECT_NAME_EXISTS,
- "Object insertion should have failed, but got 0x%lX", Status);
- ok(ObBody[0] == ObBody1[1],
- "Object bodies doesn't match, 0x%p != 0x%p", ObBody[0],
ObBody1[1]);
- ok(ObHandle2[0] != NULL, "Bad handle returned 0x%lX",
(ULONG_PTR)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;
+ InitializeObjectAttributes(&ObAttributes[0], &ObName[0], OBJ_OPENIF, NULL,
NULL);
+
+ Status = ObCreateObject(KernelMode, ObTypes[0], &ObAttributes[0], KernelMode,
NULL, sizeof(MY_OBJECT1), 0L, 0L, &ObBody1[0]);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+ CheckCounts(OpenSave, CloseSave, DeleteSave, ParseSave, OkayToCloseSave,
QueryNameSave);
+
+ Status = ObInsertObject(ObBody1[0], NULL, GENERIC_ALL, 0, &ObBody1[1],
&ObHandle2[0]);
+ ok_eq_hex(Status, STATUS_ACCESS_DENIED/*STATUS_OBJECT_NAME_EXISTS*/);
+ ok_eq_pointer(ObBody[0], ObBody1[1]);
+ ok(ObHandle2[0] != NULL, "NULL handle returned\n");
+
+ DPRINT("%d %d %d %d %d %d %d\n", DumpCount, OpenCount, CloseCount,
DeleteCount, ParseCount, OkayToCloseCount, QueryNameCount);
+ CheckCounts(OpenSave + 1, CloseSave, DeleteSave + 1, ParseSave, OkayToCloseSave,
QueryNameSave);
+ SaveCounts(OpenSave, CloseSave, DeleteSave, ParseSave, OkayToCloseSave,
QueryNameSave);
// 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;
-
+ if (!skip(ObHandle2[0] && ObHandle2[0] != INVALID_HANDLE_VALUE, "Nothing
to close\n"))
+ {
+ Status = ZwClose(ObHandle2[0]);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+ CheckCounts(OpenSave, CloseSave + 1, DeleteSave, ParseSave, OkayToCloseSave,
QueryNameSave);
+ SaveCounts(OpenSave, CloseSave, DeleteSave, ParseSave, OkayToCloseSave,
QueryNameSave);
+ }
// 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");
-}
-
-static
-VOID
-ObtClose()
+ if (ObBody1[1])
+ ObDereferenceObject(ObBody1[1]);
+ //DPRINT1("%d %d %d %d %d %d %d\n", DumpCount, OpenCount, CloseCount,
DeleteCount, ParseCount, OkayToCloseCount, QueryNameCount);
+ CheckCounts(OpenSave, CloseSave, DeleteSave, ParseSave, OkayToCloseSave,
QueryNameSave);
+}
+
+static
+VOID
+ObtClose(
+ BOOLEAN Clean,
+ BOOLEAN AlternativeMethod)
{
PVOID DirObject;
NTSTATUS Status;
- //PVOID TypeObject;
- USHORT i;
- //UNICODE_STRING ObPathName[NUM_OBTYPES];
+ PVOID TypeObject;
+ INT i;
+ UNICODE_STRING ObPathName[NUM_OBTYPES];
+ WCHAR Name[MAX_PATH];
// Close what we have opened and free what we allocated
- ZwClose(ObHandle1[0]);
- ZwClose(ObHandle1[1]);
- ZwClose(ObHandle2[0]);
- ZwClose(ObHandle2[1]);
+ for (i = 0; i < NUM_OBTYPES2; ++i)
+ {
+ if (ObBody[i])
+ {
+ if (ObHandle1[i]) CheckObject(ObHandle1[i], 3LU, 1LU);
+ ObDereferenceObject(ObBody[i]);
+ if (ObHandle1[i]) CheckObject(ObHandle1[i], 2LU, 1LU);
+ ObBody[i] = NULL;
+ }
+ if (ObHandle1[i])
+ {
+ ZwClose(ObHandle1[i]);
+ ObHandle1[i] = NULL;
+ }
+ if (ObHandle2[i])
+ {
+ ZwClose(ObHandle2[i]);
+ ObHandle2[i] = NULL;
+ }
+ }
+
+ if (!Clean)
+ return;
// Now we have to get rid of a directory object
// Since it is permanent, we have to firstly make it temporary
// and only then kill
// (this procedure is described in DDK)
- Status = ObReferenceObjectByHandle(DirectoryHandle, 0L, NULL,
- KernelMode, &DirObject, NULL);
- ok(Status == STATUS_SUCCESS,
- "Failed to reference object by handle with status=0x%lX", Status);
-
- // Dereference 2 times - first for just previous referencing
- // and 2nd time for creation of permanent object itself
- ObDereferenceObject(DirObject);
- ObDereferenceObject(DirObject);
-
- Status = ZwMakeTemporaryObject(DirectoryHandle);
- ok(Status == STATUS_SUCCESS,
- "Failed to make temp object with status=0x%lX", Status);
-
- // Close the handle now and we are done
- Status = ZwClose(DirectoryHandle);
- ok(Status == STATUS_SUCCESS,
- "Failed to close handle with status=0x%lX", Status);
+ if (DirectoryHandle && DirectoryHandle != INVALID_HANDLE_VALUE)
+ {
+ CheckObject(DirectoryHandle, 3LU, 1LU);
+ Status = ObReferenceObjectByHandle(DirectoryHandle, 0L, NULL, KernelMode,
&DirObject, NULL);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+ CheckObject(DirectoryHandle, 4LU, 1LU);
+
+ Status = ZwMakeTemporaryObject(DirectoryHandle);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+ CheckObject(DirectoryHandle, 4LU, 1LU);
+
+ // Dereference 2 times - first for just previous referencing
+ // and 2nd time for creation of permanent object itself
+ ObDereferenceObject(DirObject);
+ CheckObject(DirectoryHandle, 3LU, 1LU);
+ ObDereferenceObject(DirObject);
+ CheckObject(DirectoryHandle, 2LU, 1LU);
+
+ Status = ZwClose(DirectoryHandle);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+ }
// Now delete the last piece - object types
// In fact, it's weird to get rid of object types, especially the way,
// how it's done in the commented section below
- for (i=0; i<NUM_OBTYPES; i++)
- ObDereferenceObject(ObTypes[i]);
-/*
- RtlInitUnicodeString(&ObPathName[0], L"\\ObjectTypes\\MyObjectType1");
- RtlInitUnicodeString(&ObPathName[1], L"\\ObjectTypes\\MyObjectType2");
-
- for (i=0; i<NUM_OBTYPES; i++)
- {
- Status = ObReferenceObjectByName(&ObPathName[i],
- OBJ_CASE_INSENSITIVE, NULL, 0L, NULL, KernelMode, NULL,
- &TypeObject);
-
- ObDereferenceObject(TypeObject);
- ObDereferenceObject(TypeObject);
- DPRINT("Reference Name %S = %p, ObTypes[%d] = %p\n",
- ObPathName[i], TypeObject, i, ObTypes[i]);
- }
-*/
+ if (!AlternativeMethod)
+ {
+ for (i = 0; i < NUM_OBTYPES; ++i)
+ if (ObTypes[i])
+ {
+ ObDereferenceObject(ObTypes[i]);
+ ObTypes[i] = NULL;
+ }
+ }
+ else
+ {
+ for (i = 0; i < NUM_OBTYPES; ++i)
+ {
+ if (ObTypes[i])
+ {
+ Status = RtlStringCbPrintfW(Name, sizeof Name,
L"\\ObjectTypes\\MyObjectType%d", i);
+ RtlInitUnicodeString(&ObPathName[0], Name);
+ Status = ObReferenceObjectByName(&ObPathName[i],
OBJ_CASE_INSENSITIVE, NULL, 0L, NULL, KernelMode, NULL, &TypeObject);
+
+ ObDereferenceObject(TypeObject);
+ ObDereferenceObject(TypeObject);
+ DPRINT("Reference Name %wZ = %p, ObTypes[%d] = %p\n",
+ ObPathName[i], TypeObject, i, ObTypes[i]);
+ ObTypes[i] = NULL;
+ }
+ }
+ }
}
#if 0
static
VOID
-ObtReferenceTests()
-{
- USHORT i;
+ObtReferenceTests(VOID)
+{
+ INT i;
NTSTATUS Status;
UNICODE_STRING ObPathName[NUM_OBTYPES];
// Reference them by handle
- for (i=0; i<NUM_OBTYPES; i++)
- {
- Status = ObReferenceObjectByHandle(ObHandle1[i], 0L, ObTypes[i],
- KernelMode, &ObBody[i], NULL);
- ok(Status == STATUS_SUCCESS,
- "Failed to reference object by handle, status=0x%lX", Status);
+ for (i = 0; i < NUM_OBTYPES2; i++)
+ {
+ CheckObject(ObHandle1[i], 2LU, 1LU);
+ Status = ObReferenceObjectByHandle(ObHandle1[i], 0L, ObTypes[i], KernelMode,
&ObBody[i], NULL);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+ CheckObject(ObHandle1[i], 3LU, 1LU);
DPRINT("Ref by handle %lx = %p\n", ObHandle1[i], ObBody[i]);
}
// Reference them by pointer
- for (i=0; i<NUM_OBTYPES; i++)
- {
+ for (i = 0; i < NUM_OBTYPES2; i++)
+ {
+ CheckObject(ObHandle1[i], 3LU, 1LU);
Status = ObReferenceObjectByPointer(ObBody[i], 0L, ObTypes[i], KernelMode);
- ok(Status == STATUS_SUCCESS,
- "Failed to reference object by pointer, status=0x%lX", Status);
+ CheckObject(ObHandle1[i], 4LU, 1LU);
+ ok_eq_hex(Status, STATUS_SUCCESS);
}
// Reference them by name
RtlInitUnicodeString(&ObPathName[0], L"\\ObtDirectory\\MyObject1");
RtlInitUnicodeString(&ObPathName[1], L"\\ObtDirectory\\MyObject2");
- for (i=0; i<NUM_OBTYPES; i++)
- {
- Status = ObReferenceObjectByName(&ObPathName[i],
- OBJ_CASE_INSENSITIVE, NULL, 0L, ObTypes[i], KernelMode, NULL,
- &ObBody[0]);
-
+#if 0
+ for (i = 0; i < NUM_OBTYPES2; i++)
+ {
+ Status = ObReferenceObjectByName(&ObPathName[i], OBJ_CASE_INSENSITIVE, NULL,
0L, ObTypes[i], KernelMode, NULL, &ObBody[i]);
DPRINT("Ref by name %wZ = %p\n", &ObPathName[i], ObBody[i]);
}
+#endif
// Dereference now all of them
- // For ObInsertObject, AdditionalReference
- ObDereferenceObject(ObBody[0]);
- ObDereferenceObject(ObBody[1]);
-
- // For ByHandle
- ObDereferenceObject(ObBody[0]);
- ObDereferenceObject(ObBody[1]);
-
- // For ByPointer
- ObDereferenceObject(ObBody[0]);
- ObDereferenceObject(ObBody[1]);
-
- // For ByName
- ObDereferenceObject(ObBody[0]);
- ObDereferenceObject(ObBody[1]);
+ for (i = 0; i < NUM_OBTYPES2; ++i)
+ if (!skip(ObBody[i] != NULL, "Object pointer is NULL\n"))
+ {
+ CheckObject(ObHandle1[i], 4LU, 1LU);
+ // For ObInsertObject, AdditionalReference
+ //ObDereferenceObject(ObBody[i]);
+ // For ByName
+ //ObDereferenceObject(ObBody[i]);
+ // For ByPointer
+ ObDereferenceObject(ObBody[i]);
+ CheckObject(ObHandle1[i], 3LU, 1LU);
+ // For ByHandle
+ ObDereferenceObject(ObBody[i]);
+ CheckObject(ObHandle1[i], 2LU, 1LU);
+ }
}
#endif /* 0 */
-START_TEST(ObCreate)
+static
+VOID
+TestObjectType(
+ IN BOOLEAN Clean)
{
DumpCount = 0; OpenCount = 0; CloseCount = 0;
DeleteCount = 0; ParseCount = 0;
- // Create object-types to use in tests
ObtCreateObjectTypes();
DPRINT("ObtCreateObjectTypes() done\n");
- // Create Directory
ObtCreateDirectory();
DPRINT("ObtCreateDirectory() done\n");
- // Create and insert objects
ObtCreateObjects();
DPRINT("ObtCreateObjects() done\n");
- // Reference them in a variety of ways
//ObtReferenceTests();
- // Clean up
- // FIXME: Disable to see results of creating objects in usermode.
- // Also it has problems with object types removal
- ObtClose();
- DPRINT("Cleanup done\n");
-}
+ ObtClose(Clean, FALSE);
+}
+
+START_TEST(ObType)
+{
+ TestObjectType(TRUE);
+}
+
+/* run this to see the objects created in user mode */
+START_TEST(ObTypeNoClean)
+{
+ TestObjectType(FALSE);
+ trace("Cleanup skipped as requested! Run ObTypeClean to clean up\n");
+}
+
+/* run this to clean up after ObTypeNoClean */
+START_TEST(ObTypeClean)
+{
+ ObtClose(TRUE, FALSE);
+ trace("Cleanup done\n");
+}
Added: branches/GSoC_2011/KMTestSuite/kmtests/readme.txt
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/KMTestSuite/kmtests/r…
==============================================================================
--- branches/GSoC_2011/KMTestSuite/kmtests/readme.txt (added)
+++ branches/GSoC_2011/KMTestSuite/kmtests/readme.txt [iso-8859-1] Sat Aug 6 17:09:39
2011
@@ -1,0 +1,11 @@
+This directory contains the ReactOS Kernel-Mode Test Suite.
+
+The kmtest, kmtest_drv and include subdirectories contain the
+testing framework infrastructure, other directories contain tests.
+
+The example subdirectory contains a set of small tests that can be used as
+examples and templates.
+
+
+See
http://www.reactos.org/wiki/User:ThFabba/KmtestsHowto for more
+information and a guide on how to use the framework.
Propchange: branches/GSoC_2011/KMTestSuite/kmtests/readme.txt
------------------------------------------------------------------------------
svn:eol-style = native