Author: fireball Date: Fri Jun 9 01:39:51 2006 New Revision: 22289
URL: http://svn.reactos.ru/svn/reactos?rev=22289&view=rev Log: - Added DPRINT logic in all files (to be used as "TRACE" to aid in debugging of tests) - Added initial part of Ob tests which uses ObCreateObjectType, NtCreateDirectoryObject, ObCreateObject exported APIs.
Added: trunk/reactos/drivers/test/kmtest/ntos_ob.c Modified: trunk/reactos/drivers/test/kmtest/deviface.c trunk/reactos/drivers/test/kmtest/deviface_test.c trunk/reactos/drivers/test/kmtest/kmtest.c trunk/reactos/drivers/test/kmtest/kmtest.h trunk/reactos/drivers/test/kmtest/kmtest.rbuild trunk/reactos/drivers/test/kmtest/ntos_io.c
Modified: trunk/reactos/drivers/test/kmtest/deviface.c URL: http://svn.reactos.ru/svn/reactos/trunk/reactos/drivers/test/kmtest/deviface... ============================================================================== --- trunk/reactos/drivers/test/kmtest/deviface.c (original) +++ trunk/reactos/drivers/test/kmtest/deviface.c Fri Jun 9 01:39:51 2006 @@ -25,6 +25,9 @@
#include <ddk/ntddk.h> #include "kmtest.h" + +//#define NDEBUG +#include "debug.h"
/* PUBLIC FUNCTIONS ***********************************************************/
Modified: trunk/reactos/drivers/test/kmtest/deviface_test.c URL: http://svn.reactos.ru/svn/reactos/trunk/reactos/drivers/test/kmtest/deviface... ============================================================================== --- trunk/reactos/drivers/test/kmtest/deviface_test.c (original) +++ trunk/reactos/drivers/test/kmtest/deviface_test.c Fri Jun 9 01:39:51 2006 @@ -24,6 +24,9 @@
#include <ddk/ntddk.h> #include "kmtest.h" + +//#define NDEBUG +#include "debug.h"
/* PRIVATE FUNCTIONS **********************************************************/
Modified: trunk/reactos/drivers/test/kmtest/kmtest.c URL: http://svn.reactos.ru/svn/reactos/trunk/reactos/drivers/test/kmtest/kmtest.c... ============================================================================== --- trunk/reactos/drivers/test/kmtest/kmtest.c (original) +++ trunk/reactos/drivers/test/kmtest/kmtest.c Fri Jun 9 01:39:51 2006 @@ -105,6 +105,7 @@ */ VOID FASTCALL DeviceInterfaceTest(); VOID FASTCALL NtoskrnlIoMdlTest(); +VOID FASTCALL NtoskrnlObTest();
/* * DriverEntry @@ -114,9 +115,10 @@ DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) { - DbgPrint("Kernel Mode Regression Test driver starting...\n"); + DbgPrint("\n===============================================\nKernel Mode Regression Test driver starting...\n"); //DeviceInterfaceTest(); NtoskrnlIoMdlTest(); + NtoskrnlObTest();
return STATUS_UNSUCCESSFUL; }
Modified: trunk/reactos/drivers/test/kmtest/kmtest.h URL: http://svn.reactos.ru/svn/reactos/trunk/reactos/drivers/test/kmtest/kmtest.h... ============================================================================== --- trunk/reactos/drivers/test/kmtest/kmtest.h (original) +++ trunk/reactos/drivers/test/kmtest/kmtest.h Fri Jun 9 01:39:51 2006 @@ -9,12 +9,6 @@ Wine regression tests Copyright (C) 2002 Alexandre Julliard. Everything else is done by Aleksey Bragin based on PnPTest by Filip Navara */ - -#if 0 -#define DPRINT DbgPrint("%s:%d ", __FILE__, __LINE__), DbgPrint -#else -#define DPRINT DbgPrint -#endif
extern ULONG successes; /* number of successful tests */ extern ULONG failures; /* number of failures */
Modified: trunk/reactos/drivers/test/kmtest/kmtest.rbuild URL: http://svn.reactos.ru/svn/reactos/trunk/reactos/drivers/test/kmtest/kmtest.r... ============================================================================== --- trunk/reactos/drivers/test/kmtest/kmtest.rbuild (original) +++ trunk/reactos/drivers/test/kmtest/kmtest.rbuild Fri Jun 9 01:39:51 2006 @@ -8,5 +8,6 @@ <file>deviface.c</file> <file>deviface_test.c</file> <file>ntos_io.c</file> + <file>ntos_ob.c</file> <file>kmtest.rc</file> </module>
Modified: trunk/reactos/drivers/test/kmtest/ntos_io.c URL: http://svn.reactos.ru/svn/reactos/trunk/reactos/drivers/test/kmtest/ntos_io.... ============================================================================== --- trunk/reactos/drivers/test/kmtest/ntos_io.c (original) +++ trunk/reactos/drivers/test/kmtest/ntos_io.c Fri Jun 9 01:39:51 2006 @@ -24,6 +24,9 @@
#include <ddk/ntddk.h> #include "kmtest.h" + +#define NDEBUG +#include "debug.h"
/* PUBLIC FUNCTIONS ***********************************************************/
Added: 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 (added) +++ trunk/reactos/drivers/test/kmtest/ntos_ob.c Fri Jun 9 01:39:51 2006 @@ -1,0 +1,231 @@ +/* + * NTOSKRNL Ob Regressions KM-Test + * ReactOS Kernel Mode Regression Testing framework + * + * Copyright 2006 Aleksey Bragin aleksey@reactos.org + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* INCLUDES *******************************************************************/ + +#include <ddk/ntddk.h> +#include "kmtest.h" + +//#define NDEBUG +#include "debug.h" + +#include "ndk/obtypes.h" +#include "ndk/obfuncs.h" + +#include "ndk/ifssupp.h" +#include "ndk/setypes.h" +#include "ndk/sefuncs.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; + +POBJECT_TYPE ObTypes[NUM_OBTYPES]; +UNICODE_STRING ObTypeName[NUM_OBTYPES]; +UNICODE_STRING ObName[NUM_OBTYPES]; +OBJECT_TYPE_INITIALIZER ObTypeInitializer[NUM_OBTYPES]; +UNICODE_STRING ObDirectoryName; +OBJECT_ATTRIBUTES ObDirectoryAttributes; +OBJECT_ATTRIBUTES ObAttributes[NUM_OBTYPES]; +PVOID ObBody[NUM_OBTYPES]; +PMY_OBJECT1 ObObject1; +PMY_OBJECT2 ObObject2; + +/* PRIVATE FUNCTIONS **********************************************************/ + +VOID +DumpProc(IN PVOID Object, + IN POB_DUMP_CONTROL DumpControl) +{ + DbgPrint("DumpProc() called\n"); +} + +VOID +OpenProc(IN OB_OPEN_REASON OpenReason, + IN PEPROCESS Process, + IN PVOID Object, + IN ACCESS_MASK GrantedAccess, + IN ULONG HandleCount) +{ + DbgPrint("OpenProc() called\n"); +} + +VOID +CloseProc(IN PEPROCESS Process, + IN PVOID Object, + IN ACCESS_MASK GrantedAccess, + IN ULONG ProcessHandleCount, + IN ULONG SystemHandleCount) +{ + DbgPrint("CloseProc() called\n"); +} + +VOID +DeleteProc(IN PVOID Object) +{ + DbgPrint("DeleteProc()called\n"); +} + +NTSTATUS +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"); + return STATUS_SUCCESS; +} + +VOID +ObtCreateObjectTypes() +{ + UCHAR i; + NTSTATUS Status; + + for (i=0; i<NUM_OBTYPES; i++) + { + // Prepare object type name + // TODO: Generate type names and don't use this unprofessional, + // ugly looking, and otherwise bad if-condition + if (i == 0) + RtlInitUnicodeString(&ObTypeName[i], L"MyObjectType1"); + else + RtlInitUnicodeString(&ObTypeName[i], L"MyObjectType2"); + + // 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; + + // 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; + + 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); + } +} + +VOID +ObtCreateDirectory() +{ + NTSTATUS Status; + HANDLE DirectoryHandle; + + // 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); + + Status = ZwClose(DirectoryHandle); + ok(Status == STATUS_SUCCESS, + "Failed to close handle with status=0x%lX", Status); +} + +VOID +ObtCreateObjects() +{ + NTSTATUS Status; + + 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); + DPRINT("Created Object 0\n"); + + 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); + DPRINT("Created Object 1\n"); +} + +VOID +ObtClose() +{ + // TODO: Close what we have opened and free what we allocated +} + +/* PUBLIC FUNCTIONS ***********************************************************/ + +VOID +FASTCALL +NtoskrnlObTest() +{ + StartTest(); + + // 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"); + + // Clean up + ObtClose(); + DPRINT("Cleanup done\n"); + + FinishTest("NTOSKRNL Ob Manager"); +}