diff --git a/reactos/ChangeLog b/reactos/ChangeLog index bc76663081d..9c18b96f10c 100644 --- a/reactos/ChangeLog +++ b/reactos/ChangeLog @@ -1,3 +1,31 @@ +2004-02-22 Casper S. Hornstrup + + * config (REGRESSIONTESTS): Add. + * rules.mak (REGTESTS_PATH_INC): Add. + * drivers/net/tcpip/makefile: Support regression tests. + * drivers/net/tcpip/tcpip/main.c: Prepare regression tests. + * hal/halx86/Makefile: Rename TARGET_LIBPATH to TARGET_IMPLIBPATH. + * regtests/kmregtests/driver.c (KMRegTestsRegister): Add. + (KMRegTestsRun): Move call to InitializeTests() and RegisterTests() to + DriverEntry(). + (KMRegTestsDispatch): Support IOCTL_KMREGTESTS_REGISTER. + * regtests/kmregtests/kmregtests.h (IOCTL_KMREGTESTS_REGISTER): Define. + * tools/config.mk: Define REGTESTS if REGRESSIONTESTS = 1. + * tools/helper.mk: Support module private regression tests. + (TARGET_LIBPATH): Rename to TARGET_IMPLIBPATH. + (TARGET_LIBPATH, TARGET_REGTESTS): Add. + * tools/mkconfig.c: Support REGTESTS. + * tools/regtests.c (umstubfile, kmstubfile): Add. + (is_file_changed, write_file_if_changed): Add. + (KMSTUB): Add. + (HELP): Mention -u and -k switches. + (main): Parse -u and -k switches. + * drivers/net/tcpip/tests: New directory. + * drivers/net/tcpip/tests/.cvsignore: New file. + * drivers/net/tcpip/tests/Makefile: Makefile. + * drivers/net/tcpip/tests/tests: New directory. + * drivers/net/tcpip/tests/tests/.cvsignore: New file. + 2004-02-18 Casper S. Hornstrup * apistatus.lst: Correct path of videoprt.dll. diff --git a/reactos/config b/reactos/config index 2db3d9446d3..8edf2b8696f 100644 --- a/reactos/config +++ b/reactos/config @@ -25,12 +25,16 @@ MP := 0 # ACPI := 0 +# +# Whether to build regression tests +# +REGRESSIONTESTS := 0 + # # Whether to use Structured Exception Handling # SEH := 0 - # # Which version of NDIS do we support up to? # diff --git a/reactos/drivers/net/tcpip/makefile b/reactos/drivers/net/tcpip/makefile index 9a44b9f34ba..3e85e8fe05d 100644 --- a/reactos/drivers/net/tcpip/makefile +++ b/reactos/drivers/net/tcpip/makefile @@ -1,7 +1,9 @@ -# $Id: makefile,v 1.13 2003/08/04 19:31:06 royce Exp $ +# $Id: makefile,v 1.14 2004/02/22 09:59:17 chorns Exp $ PATH_TO_TOP = ../../.. +TARGET_REGTESTS = yes + TARGET_TYPE = export_driver TARGET_NAME = tcpip diff --git a/reactos/drivers/net/tcpip/tcpip/main.c b/reactos/drivers/net/tcpip/tcpip/main.c index 7c9d2e2b59a..7f43f8466cf 100644 --- a/reactos/drivers/net/tcpip/tcpip/main.c +++ b/reactos/drivers/net/tcpip/tcpip/main.c @@ -7,6 +7,7 @@ * REVISIONS: * CSH 01/08-2000 Created */ +#include #include #include #include @@ -840,6 +841,8 @@ DriverEntry( DriverObject->DriverUnload = TiUnload; + PREPARE_TESTS + return STATUS_SUCCESS; } diff --git a/reactos/drivers/net/tcpip/tests/.cvsignore b/reactos/drivers/net/tcpip/tests/.cvsignore new file mode 100644 index 00000000000..576b35ee7b0 --- /dev/null +++ b/reactos/drivers/net/tcpip/tests/.cvsignore @@ -0,0 +1,6 @@ +_regtests.c +_rtstub.c +Makefile.tests +*.d +*.o +*.a diff --git a/reactos/drivers/net/tcpip/tests/Makefile b/reactos/drivers/net/tcpip/tests/Makefile new file mode 100644 index 00000000000..4f12c38aa97 --- /dev/null +++ b/reactos/drivers/net/tcpip/tests/Makefile @@ -0,0 +1,21 @@ +# $Id: Makefile,v 1.1 2004/02/22 09:59:17 chorns Exp $ + +PATH_TO_TOP = ../../../.. + +TARGET_TYPE = library + +TARGET_NAME = regtests + +TARGET_LIBPATH = . + +TARGET_CFLAGS = -I$(REGTESTS_PATH_INC) + +-include Makefile.tests + +TARGET_OBJECTS = \ + _regtests.o \ + $(addprefix tests/, $(TESTS)) + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk diff --git a/reactos/drivers/net/tcpip/tests/tests/.cvsignore b/reactos/drivers/net/tcpip/tests/tests/.cvsignore new file mode 100644 index 00000000000..31dc3078b3a --- /dev/null +++ b/reactos/drivers/net/tcpip/tests/tests/.cvsignore @@ -0,0 +1,2 @@ +*.d +*.o diff --git a/reactos/hal/halx86/Makefile b/reactos/hal/halx86/Makefile index 5ed42e251bc..207b94c2b26 100644 --- a/reactos/hal/halx86/Makefile +++ b/reactos/hal/halx86/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.12 2003/11/05 22:37:42 gvg Exp $ +# $Id: Makefile,v 1.13 2004/02/22 09:59:17 chorns Exp $ PATH_TO_TOP = ../.. @@ -22,7 +22,7 @@ TARGET_BASENAME = hal TARGET_DEFNAME = ../hal/hal -TARGET_LIBPATH = . +TARGET_IMPLIBPATH = . TARGET_ASFLAGS = -I$(PATH_TO_TOP)/include -I$(PATH_TO_TOP)/ntoskrnl/include -D__ASM__ diff --git a/reactos/regtests/kmregtests/driver.c b/reactos/regtests/kmregtests/driver.c index 97933364cdd..4a2e50fffa6 100755 --- a/reactos/regtests/kmregtests/driver.c +++ b/reactos/regtests/kmregtests/driver.c @@ -14,6 +14,8 @@ #define NDEBUG #include +extern void AddTest(TestRoutine Routine); + PVOID AllocateMemory(ULONG Size) { @@ -36,14 +38,28 @@ ShutdownBochs() strlen("Shutdown")); } +NTSTATUS +STDCALL +KMRegTestsRegister( + PIRP Irp, + PIO_STACK_LOCATION IrpSp) +{ + TestRoutine *pTestRoutine; + + pTestRoutine = (TestRoutine*)Irp->AssociatedIrp.SystemBuffer; + AddTest(*pTestRoutine); + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + return STATUS_SUCCESS; +} + NTSTATUS STDCALL KMRegTestsRun( PIRP Irp, PIO_STACK_LOCATION IrpSp) { - InitializeTests(); - RegisterTests(); PerformTests(); ShutdownBochs(); @@ -77,6 +93,10 @@ KMRegTestsDispatch( Irp->IoStatus.Information = 0; switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) { + case IOCTL_KMREGTESTS_REGISTER: + Status = KMRegTestsRegister(Irp, IrpSp); + break; + case IOCTL_KMREGTESTS_RUN: Status = KMRegTestsRun(Irp, IrpSp); break; @@ -95,18 +115,21 @@ KMRegTestsDispatch( DPRINT("Leaving. Status (0x%X).\n", Status); - return Status; + return Status; } NTSTATUS STDCALL KMRegTestsOpenClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { - PIO_STACK_LOCATION piosStack = IoGetCurrentIrpStackLocation(Irp); - NTSTATUS nErrCode; + PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); + NTSTATUS Status; - nErrCode = STATUS_SUCCESS; + DPRINT("Called. DeviceObject is at (0x%X), IRP is at (0x%X), IrpSp->FileObject (0x%X).\n", + DeviceObject, Irp, IrpSp->FileObject); - switch(piosStack->MajorFunction) + Status = STATUS_SUCCESS; + + switch (IrpSp->MajorFunction) { /* Opening and closing handles to the device */ case IRP_MJ_CREATE: @@ -123,18 +146,18 @@ KMRegTestsOpenClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) case IRP_MJ_READ: /* Ignore */ Irp->IoStatus.Information = 0; - nErrCode = STATUS_END_OF_FILE; + Status = STATUS_END_OF_FILE; break; /* Unsupported operations */ default: - nErrCode = STATUS_NOT_IMPLEMENTED; + Status = STATUS_NOT_IMPLEMENTED; } - Irp->IoStatus.Status = nErrCode; + Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); - return nErrCode; + return Status; } NTSTATUS STDCALL @@ -177,5 +200,8 @@ DriverEntry(PDRIVER_OBJECT DriverObject, DeviceObject->Flags |= DO_BUFFERED_IO; + InitializeTests(); + RegisterTests(); + return Status; } diff --git a/reactos/regtests/kmregtests/kmregtests.h b/reactos/regtests/kmregtests/kmregtests.h index ab24c408a57..d16f56e93d8 100755 --- a/reactos/regtests/kmregtests/kmregtests.h +++ b/reactos/regtests/kmregtests/kmregtests.h @@ -10,10 +10,13 @@ /* KMREGTESTS IOCTL code definitions */ -#define FSCTL_KMREGTESTS_BASE FILE_DEVICE_NAMED_PIPE // ??? +#define FSCTL_KMREGTESTS_BASE FILE_DEVICE_NAMED_PIPE #define KMREGTESTS_CTL_CODE(Function, Method, Access) \ CTL_CODE(FSCTL_KMREGTESTS_BASE, Function, Method, Access) -#define IOCTL_KMREGTESTS_RUN \ +#define IOCTL_KMREGTESTS_REGISTER \ KMREGTESTS_CTL_CODE(0, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_KMREGTESTS_RUN \ + KMREGTESTS_CTL_CODE(1, METHOD_BUFFERED, FILE_ANY_ACCESS) diff --git a/reactos/rules.mak b/reactos/rules.mak index 3a8337f9450..f51874b828b 100644 --- a/reactos/rules.mak +++ b/reactos/rules.mak @@ -133,3 +133,4 @@ OS2_PATH_INC=$(OS2_PATH)/include # Other systems integration ROOT_PATH=$(PATH_TO_TOP)/.. +REGTESTS_PATH_INC=$(PATH_TO_TOP)/regtests/shared \ No newline at end of file diff --git a/reactos/tools/config.mk b/reactos/tools/config.mk index 73b9c725a50..91f3ae4e219 100644 --- a/reactos/tools/config.mk +++ b/reactos/tools/config.mk @@ -25,11 +25,14 @@ ifeq ($(ACPI), 1) CONFIG += ACPI endif +ifeq ($(REGRESSIONTESTS), 1) +CONFIG += REGTESTS +endif + ifeq ($(SEH), 1) CONFIG += SEH endif - $(PATH_TO_TOP)/tools/mkconfig$(EXE_POSTFIX): $(PATH_TO_TOP)/tools/mkconfig.c $(HOST_CC) -g -o $(PATH_TO_TOP)/tools/mkconfig$(EXE_POSTFIX) $(PATH_TO_TOP)/tools/mkconfig.c diff --git a/reactos/tools/helper.mk b/reactos/tools/helper.mk index 428adca0bd7..7e851cae5e7 100644 --- a/reactos/tools/helper.mk +++ b/reactos/tools/helper.mk @@ -1,4 +1,4 @@ -# $Id: helper.mk,v 1.53 2004/02/21 09:20:33 gvg Exp $ +# $Id: helper.mk,v 1.54 2004/02/22 09:59:17 chorns Exp $ # # Helper makefile for ReactOS modules # Variables this makefile accepts: @@ -18,7 +18,8 @@ # subsystem = Kernel subsystem # kmdll = Kernel mode DLL # winedll = DLL imported from wine -# $TARGET_APPTYPE = Application type (windows,native,console) +# $TARGET_APPTYPE = Application type (windows,native,console). +# Required only for TARGET_TYPEs program and proglib # $TARGET_NAME = Base name of output file and .rc, .def, and .edf files # $TARGET_OBJECTS = Object files that compose the module # $TARGET_CPPAPP = C++ application (no,yes) (optional) @@ -42,11 +43,13 @@ # $TARGET_ENTRY = Entry point (optional) # $TARGET_DEFONLY = Use .def instead of .edf extension (no,yes) (optional) # $TARGET_NORC = Do not include standard resource file (no,yes) (optional) -# $TARGET_LIBPATH = Destination path for import libraries (optional) +# $TARGET_LIBPATH = Destination path for static libraries (optional) +# $TARGET_IMPLIBPATH = Destination path for import libraries (optional) # $TARGET_INSTALLDIR = Destination path when installed (optional) # $TARGET_PCH = Filename of header to use to generate a PCH if supported by the compiler (optional) # $TARGET_BOOTSTRAP = Whether this file is needed to bootstrap the installation (no,yes) (optional) # $TARGET_BOOTSTRAP_NAME = Name on the installation medium (optional) +# $TARGET_REGTESTS = This module has regression tests (no,yes) (optional) # $WINE_MODE = Compile using WINE headers (no,yes) (optional) # $WINE_RC = Name of .rc file for WINE modules (optional) # $SUBDIRS = Subdirs in which to run make (optional) @@ -483,9 +486,15 @@ endif ifeq ($(TARGET_LIBPATH),) + MK_LIBPATH := $(SDK_PATH_LIB) +else + MK_LIBPATH := $(TARGET_LIBPATH) +endif + +ifeq ($(TARGET_IMPLIBPATH),) MK_IMPLIBPATH := $(MK_IMPLIBDEFPATH) else - MK_IMPLIBPATH := $(TARGET_LIBPATH) + MK_IMPLIBPATH := $(TARGET_IMPLIBPATH) endif @@ -583,8 +592,8 @@ TARGET_NFLAGS += $(MK_NFLAGS) MK_GCCLIBS := $(addprefix -l, $(TARGET_GCCLIBS)) -ifeq ($(TARGET_TYPE), library) - MK_FULLNAME := $(SDK_PATH_LIB)/$(MK_BASENAME)$(MK_EXT) +ifeq ($(MK_MODE),static) + MK_FULLNAME := $(MK_LIBPATH)/$(MK_BASENAME)$(MK_EXT) else MK_FULLNAME := $(MK_BASENAME)$(MK_EXT) endif @@ -608,13 +617,23 @@ else MK_STRIPPED_OBJECT := $(MK_BASENAME).stripped.o endif +ifeq ($(TARGET_REGTESTS),yes) + MK_REGTESTS := gen_regtests + MK_REGTESTS_CLEAN := clean_regtests + MK_OBJECTS += tests/_rtstub.o tests/regtests.a + TARGET_CFLAGS += -I$(REGTESTS_PATH_INC) +else + MK_REGTESTS := + MK_REGTESTS_CLEAN := +endif + ifeq ($(MK_IMPLIBONLY),yes) TARGET_CLEAN += $(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME) -all: $(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME) +all: $(MK_REGTESTS) $(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME) -$(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME): $(TARGET_OBJECTS) $(MK_DEFNAME) +$(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME): $(MK_OBJECTS) $(MK_DEFNAME) $(DLLTOOL) \ --dllname $(MK_FULLNAME) \ --def $(MK_DEFNAME) \ @@ -623,7 +642,7 @@ $(MK_IMPLIBPATH)/$(MK_IMPLIB_FULLNAME): $(TARGET_OBJECTS) $(MK_DEFNAME) else # MK_IMPLIBONLY -all: $(MK_FULLNAME) $(MK_NOSTRIPNAME) $(SUBDIRS:%=%_all) +all: $(MK_REGTESTS) $(MK_FULLNAME) $(MK_NOSTRIPNAME) $(SUBDIRS:%=%_all) ifeq ($(MK_IMPLIB),yes) @@ -644,7 +663,7 @@ else MK_EXTRACMD2 := endif -$(MK_NOSTRIPNAME): $(MK_FULLRES) $(TARGET_OBJECTS) $(MK_EXTRADEP) $(MK_LIBS) +$(MK_NOSTRIPNAME): $(MK_FULLRES) $(MK_OBJECTS) $(MK_EXTRADEP) $(MK_LIBS) ifeq ($(MK_EXETYPE),dll) $(LD_CC) -Wl,--base-file,base.tmp \ -Wl,--entry,$(TARGET_ENTRY) \ @@ -736,7 +755,7 @@ else MK_EXTRADEP := endif -$(MK_NOSTRIPNAME): $(MK_FULLRES) $(TARGET_OBJECTS) $(MK_EXTRADEP) $(MK_LIBS) +$(MK_NOSTRIPNAME): $(MK_FULLRES) $(MK_OBJECTS) $(MK_EXTRADEP) $(MK_LIBS) $(LD_CC) -Wl,--base-file,base.tmp \ -Wl,--entry,$(TARGET_ENTRY) \ $(TARGET_LFLAGS) \ @@ -766,7 +785,7 @@ else $(NM) --numeric-sort $(MK_NOSTRIPNAME) > $(MK_BASENAME).map endif -$(MK_FULLNAME): $(MK_FULLRES) $(TARGET_OBJECTS) $(MK_EXTRADEP) $(MK_LIBS) $(MK_NOSTRIPNAME) +$(MK_FULLNAME): $(MK_FULLRES) $(MK_OBJECTS) $(MK_EXTRADEP) $(MK_LIBS) $(MK_NOSTRIPNAME) - ifneq ($(TARGET_CPPAPP),yes) $(LD) -r -o $(MK_STRIPPED_OBJECT) $(MK_OBJECTS) @@ -843,7 +862,7 @@ MK_CLEANFILES := $(filter %.o,$(MK_OBJECTS)) MK_CLEANFILTERED := $(MK_OBJECTS:.o=.d) MK_CLEANDEPS := $(join $(dir $(MK_CLEANFILTERED)), $(addprefix ., $(notdir $(MK_CLEANFILTERED)))) -clean: $(SUBDIRS:%=%_clean) +clean: $(MK_REGTESTS_CLEAN) $(SUBDIRS:%=%_clean) - $(RM) *.o depend.d *.pch $(MK_BASENAME).sym $(MK_BASENAME).a $(MK_RESOURCE) \ $(MK_FULLNAME) $(MK_NOSTRIPNAME) $(MK_CLEANFILES) $(MK_CLEANDEPS) $(MK_BASENAME).map \ junk.tmp base.tmp temp.exp $(MK_RC_BINARIES) $(MK_SPECDEF) $(MK_GENERATED_MAKEFILE) \ @@ -921,7 +940,22 @@ $(MK_RC_BINARIES): $(TARGET_RC_BINSRC) $(MK_RESOURCE): $(MK_RC_BINARIES) endif -.PHONY: all depends implib clean install dist bootcd depends +gen_regtests: +ifeq ($(MK_MODE),user) + $(REGTESTS) ./tests/tests ./tests/_regtests.c ./tests/Makefile.tests -u ./tests/_rtstub.c + $(MAKE) -C tests TARGET_REGTESTS=no all +else +ifeq ($(MK_MODE),kernel) + $(REGTESTS) ./tests/tests ./tests/_regtests.c ./tests/Makefile.tests -k ./tests/_rtstub.c + $(MAKE) -C tests TARGET_REGTESTS=no all +endif +endif + +clean_regtests: + $(MAKE) -C tests TARGET_REGTESTS=no clean + $(RM) ./tests/_rtstub.c ./tests/_regtests.c ./tests/Makefile.tests + +.PHONY: all depends implib clean install dist bootcd depends gen_regtests clean_regtests ifneq ($(SUBDIRS),) $(SUBDIRS:%=%_all): %_all: diff --git a/reactos/tools/mkconfig.c b/reactos/tools/mkconfig.c index 56bb885dc08..3e92a861dbd 100644 --- a/reactos/tools/mkconfig.c +++ b/reactos/tools/mkconfig.c @@ -72,6 +72,7 @@ write_if_change(char* outbuf, char* filename) int main(int argc, char* argv[]) { + int include_tests; unsigned int i; char* outbuf; char* s; @@ -93,11 +94,16 @@ main(int argc, char* argv[]) s = outbuf; s = s + sprintf(s, "/* Automatically generated, "); s = s + sprintf(s, "Edit the Makefile to change configuration */\n"); - s = s + sprintf(s, "#ifndef __NTOSKRNL_INCLUDE_INTERNAL_CONFIG_H\n"); - s = s + sprintf(s, "#define __NTOSKRNL_INCLUDE_INTERNAL_CONFIG_H\n"); + s = s + sprintf(s, "#ifndef __INCLUDE_CONFIG_H\n"); + s = s + sprintf(s, "#define __INCLUDE_CONFIG_H\n"); strcpy(config, ""); + include_tests = 0; for (i = 2; i < argc; i++) { + if (strcmp(argv[i], "REGTESTS") == 0) + { + include_tests = 1; + } s = s + sprintf(s, "#define %s\n", argv[i]); strcat(config, argv[i]); if (i != (argc - 1)) @@ -105,8 +111,19 @@ main(int argc, char* argv[]) strcat(config, " "); } } + if (include_tests) + { + s = s + sprintf(s, "#ifndef __ASM__\n"); + s = s + sprintf(s, "extern void PrepareTests();\n"); + s = s + sprintf(s, "#define PREPARE_TESTS PrepareTests();\n"); + s = s + sprintf(s, "#endif /* __ASM__ */\n"); + } + else + { + s = s + sprintf(s, "#define PREPARE_TESTS\n"); + } s = s + sprintf(s, "#define CONFIG \"%s\"\n", config); - s = s + sprintf(s, "#endif /* __NTOSKRNL_INCLUDE_INTERNAL_CONFIG_H */\n"); + s = s + sprintf(s, "#endif /* __INCLUDE_CONFIG_H */\n"); return(write_if_change(outbuf, argv[1])); } diff --git a/reactos/tools/regtests.c b/reactos/tools/regtests.c index 062a990429e..667e22a27c0 100755 --- a/reactos/tools/regtests.c +++ b/reactos/tools/regtests.c @@ -36,6 +36,8 @@ static FILE *out; static char *path; static char *file; static char *makefile; +static char *umstubfile; +static char *kmstubfile; char* convert_path(char* origpath) { @@ -324,16 +326,136 @@ make_file_list (int type) #endif +static int +is_file_changed(char *filename, char *content) +{ + FILE *file; + int size; + int n; + char *filecontent; + + file = fopen(filename, "rb"); + if (file == NULL) + { + return 1; + } + + fseek(file, 0, SEEK_END); + size = ftell(file); + fseek(file, 0, SEEK_SET); + if (size <= 0) + { + fclose(file); + return 1; + } + filecontent = malloc(size); + if (filecontent == NULL) + { + fclose(file); + return 1; + } + + n = fread(filecontent, 1, size, file); + + if (n != strlen(content)) + { + free(filecontent); + fclose(file); + return 1; + } + + if (strcmp(content, filecontent) != 0) + { + free(filecontent); + fclose(file); + return 1; + } + + free(filecontent); + + fclose(file); + + return 0; +} + +static int +write_file_if_changed(char *filename, char *content) +{ + FILE *file; + int n; + + if (is_file_changed(filename, content) == 0) + { + return 0; + } + + file = fopen(filename, "wb"); + if (file == NULL) + { + return 1; + } + + n = fwrite(content, 1, strlen(content), file); + + fclose(file); + + return 0; +} + +static char KMSTUB[] = + "/* This file is autogenerated. */\n" + "\n" + "#include \n" + "#include <../kmregtests/kmregtests.h>\n" + "\n" + "typedef int (*TestRoutine)(int Command, char *Buffer);\n" + "\n" + "extern void RegisterTests();\n" + "\n" + "static PDEVICE_OBJECT KMRegTestsDeviceObject = NULL;\n" + "static PFILE_OBJECT KMRegTestsFileObject = NULL;\n" + "\n" + "void AddTest(TestRoutine Routine)\n" + "{\n" + " PDEVICE_OBJECT DeviceObject;\n" + " UNICODE_STRING DriverName;\n" + " IO_STATUS_BLOCK IoStatus;\n" + " NTSTATUS Status;\n" + " KEVENT Event;\n" + " PIRP Irp;\n" + "\n" + " if (KMRegTestsDeviceObject == NULL)\n" + " {\n" + " RtlInitUnicodeString(&DriverName, L\"\\Device\\KMRegTests\");\n" + " Status = IoGetDeviceObjectPointer(&DriverName, FILE_WRITE_ATTRIBUTES,\n" + " &KMRegTestsFileObject, &KMRegTestsDeviceObject);\n" + " if (!NT_SUCCESS(Status)) return;\n" + " }\n" + " KeInitializeEvent(&Event, NotificationEvent, FALSE);\n" + " Irp = IoBuildDeviceIoControlRequest(IOCTL_KMREGTESTS_REGISTER,\n" + " KMRegTestsDeviceObject, &Routine, sizeof(TestRoutine), NULL, 0, FALSE, &Event, &IoStatus);\n" + " Status = IoCallDriver(KMRegTestsDeviceObject, Irp);\n" + "}\n" + "\n" + "void PrepareTests()\n" + "{\n" + " RegisterTests();\n" + "}\n"; + static char HELP[] = - "REGTESTS path file makefile\n" + "REGTESTS path file makefile [-u umstubfile] [-k kmstubfile]\n" "\n" " path Path to files\n" " file Registration file to create\n" - " makefile Makefile to create\n"; + " makefile Makefile to create\n" + " umstubfile Optional stub for running tests internal to a user-mode module\n" + " kmstubfile Optional stub for running tests internal to a kernel-mode module\n"; int main(int argc, char **argv) { char buf[MAX_PATH]; + int i; + if (argc < 4) { puts(HELP); @@ -369,6 +491,38 @@ int main(int argc, char **argv) return 1; } + umstubfile = NULL; + kmstubfile = NULL; + for (i = 4; i < argc; i++) + { + if (argv[i][0] == '-') + { + if (argv[i][1] == 'u') + { + umstubfile = convert_path(argv[++i]); + if (umstubfile[0] == 0) + { + printf("Missing umstubfile\n"); + return 1; + } + } + else if (argv[i][1] == 'k') + { + kmstubfile = convert_path(argv[++i]); + if (kmstubfile[0] == 0) + { + printf("Missing kmstubfile\n"); + return 1; + } + } + else + { + printf("Unknown switch\n"); + return 1; + } + } + } + /* Registration file */ out = fopen(file, "wb"); @@ -416,6 +570,30 @@ int main(int argc, char **argv) fclose(out); + /* User-mode stubfile */ + if (umstubfile != NULL) + { +#if 0 + if (write_file_if_changed(umstubfile, UMSTUB) != 0) + { + perror("Cannot create output user-mode stubfile"); + return 1; + } +#else + perror("WATNING: Cannot create output user-mode stubfile"); +#endif + } + + /* Kernel-mode stubfile */ + if (kmstubfile != NULL) + { + if (write_file_if_changed(kmstubfile, KMSTUB) != 0) + { + perror("Cannot create output kernel-mode stubfile"); + return 1; + } + } + printf("Successfully generated regression test registrations.\n"); return 0;