2004-10-23 Casper S. Hornstrup <chorns@users.sourceforge.net>
authorCasper Hornstrup <chorns@users.sourceforge.net>
Sat, 23 Oct 2004 21:05:12 +0000 (21:05 +0000)
committerCasper Hornstrup <chorns@users.sourceforge.net>
Sat, 23 Oct 2004 21:05:12 +0000 (21:05 +0000)
* Makefile: Support regtests_implib.
* rules.mak (REGTESTS_PATH): Define.
* drivers/net/tcpip/makefile (TARGET_BUILDENV_TEST): Remove.
* drivers/net/tcpip/tests/Makefile: Update.
* lib/gdiplus/tests/.cvsignore: Ditto.
* lib/gdiplus/tests/Makefile: Ditto.
* lib/kernel32/tests/Makefile: Ditto.
* lib/kernel32/tests/stubs.tst (HeapAlloc, HeapFree): Add.
* lib/ws2_32/makefile (TARGET_REGTESTS): Define to yes.
* regtests/Makefile: Update.
  * regtests/shared/regtests.c (_alloca): Define.
(FrameworkGetHook): Move to here.
  * regtests/shared/regtests.h (_AssertTrue, _AssertFalse): Define.
  (_GetModuleHandleA, _GetProcAddress, _LoadLibraryA): Define.
  (FrameworkGetExportedFunctionNameInternal): Define.
  * subsys/win32k/tests/makefile: Update.
  * tools/helper.mk: Create dependencies.
  * tools/regtests.c: Move FrameworkGetHook; Support forwarded exports.
* lib/ws2_32/tests: New directory.
* lib/ws2_32/tests/.cvsignore: New file.
* lib/ws2_32/tests/Makefile: Ditto.
* lib/ws2_32/tests/stubs.tst: Ditto.
* lib/ws2_32/tests/tests: New directory.
* lib/ws2_32/tests/tests/.cvsignore: New file.
* lib/ws2_32/tests/tests/WinsockEvent.c: New file.
* regtests/regtests: New directory.
* regtests/regtests/.cvsignore: New file.
* regtests/regtests/Makefile: Ditto.
* regtests/regtests/regtests.c: Ditto.
* regtests/regtests/regtests.def: Ditto.

svn path=/trunk/; revision=11406

25 files changed:
reactos/ChangeLog
reactos/Makefile
reactos/drivers/net/tcpip/makefile
reactos/drivers/net/tcpip/tests/Makefile
reactos/lib/gdiplus/tests/.cvsignore
reactos/lib/gdiplus/tests/Makefile
reactos/lib/kernel32/tests/Makefile
reactos/lib/kernel32/tests/stubs.tst
reactos/lib/ws2_32/makefile
reactos/lib/ws2_32/tests/.cvsignore [new file with mode: 0644]
reactos/lib/ws2_32/tests/Makefile [new file with mode: 0644]
reactos/lib/ws2_32/tests/stubs.tst [new file with mode: 0644]
reactos/lib/ws2_32/tests/tests/.cvsignore [new file with mode: 0644]
reactos/lib/ws2_32/tests/tests/WinsockEvent.c [new file with mode: 0644]
reactos/regtests/Makefile
reactos/regtests/regtests/.cvsignore [new file with mode: 0755]
reactos/regtests/regtests/Makefile [new file with mode: 0755]
reactos/regtests/regtests/regtests.c [new file with mode: 0755]
reactos/regtests/regtests/regtests.def [new file with mode: 0644]
reactos/regtests/shared/regtests.c
reactos/regtests/shared/regtests.h
reactos/rules.mak
reactos/subsys/win32k/tests/makefile
reactos/tools/helper.mk
reactos/tools/regtests.c

index 2354f35..1ee404a 100644 (file)
@@ -1,3 +1,36 @@
+2004-10-23  Casper S. Hornstrup  <chorns@users.sourceforge.net>
+
+       * Makefile: Support regtests_implib.
+       * rules.mak (REGTESTS_PATH): Define.
+       * drivers/net/tcpip/makefile (TARGET_BUILDENV_TEST): Remove.
+       * drivers/net/tcpip/tests/Makefile: Update.
+       * lib/gdiplus/tests/.cvsignore: Ditto.
+       * lib/gdiplus/tests/Makefile: Ditto.
+       * lib/kernel32/tests/Makefile: Ditto.
+       * lib/kernel32/tests/stubs.tst (HeapAlloc, HeapFree): Add.
+       * lib/ws2_32/makefile (TARGET_REGTESTS): Define to yes.
+       * regtests/Makefile: Update.
+       * regtests/shared/regtests.c (_alloca): Define.
+       (FrameworkGetHook): Move to here.
+       * regtests/shared/regtests.h (_AssertTrue, _AssertFalse): Define.
+       (_GetModuleHandleA, _GetProcAddress, _LoadLibraryA): Define.
+       (FrameworkGetExportedFunctionNameInternal): Define.
+       * subsys/win32k/tests/makefile: Update.
+       * tools/helper.mk: Create dependencies.
+       * tools/regtests.c: Move FrameworkGetHook; Support forwarded exports.
+       * lib/ws2_32/tests: New directory.
+       * lib/ws2_32/tests/.cvsignore: New file.
+       * lib/ws2_32/tests/Makefile: Ditto.
+       * lib/ws2_32/tests/stubs.tst: Ditto.
+       * lib/ws2_32/tests/tests: New directory.
+       * lib/ws2_32/tests/tests/.cvsignore: New file.
+       * lib/ws2_32/tests/tests/WinsockEvent.c: New file.
+       * regtests/regtests: New directory.
+       * regtests/regtests/.cvsignore: New file.
+       * regtests/regtests/Makefile: Ditto.
+       * regtests/regtests/regtests.c: Ditto.
+       * regtests/regtests/regtests.def: Ditto.
+
 2004-10-20  Casper S. Hornstrup  <chorns@users.sourceforge.net>
 
        * lib/gdiplus/makefile (TARGET_BUILDENV_TEST): Remove.
index 3082a70..e1269a5 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.254 2004/10/23 17:07:06 weiden Exp $
+# $Id: Makefile,v 1.255 2004/10/23 21:05:11 chorns Exp $
 #
 # Global makefile
 #
@@ -137,7 +137,8 @@ depends: $(LIB_STATIC:%=%_depends) $(LIB_FSLIB:%=%_depends) msvcrt_depends $(DLL
 implib: hallib $(LIB_STATIC) $(COMPONENTS:%=%_implib) $(HALS:%=%_implib) $(BUS:%=%_implib) \
              $(LIB_STATIC:%=%_implib) $(LIB_FSLIB:%=%_implib) msvcrt_implib $(DLLS:%=%_implib) \
              $(KERNEL_DRIVERS:%=%_implib) $(SUBSYS:%=%_implib) \
-             $(SYS_APPS:%=%_implib) $(SYS_SVC:%=%_implib) $(EXT_MODULES:%=%_implib)
+             $(SYS_APPS:%=%_implib) $(SYS_SVC:%=%_implib) $(EXT_MODULES:%=%_implib) \
+             $(REGTESTS:%=%_implib)
 
 test: $(COMPONENTS:%=%_test) $(HALS:%=%_test) $(BUS:%=%_test) \
            $(LIB_STATIC:%=%_test) $(LIB_FSLIB:%=%_test) msvcrt_test $(DLLS:%=%_test) \
@@ -889,6 +890,9 @@ $(SUBSYS:%=%_bootcd): %_bootcd:
 $(REGTESTS): %: $(IMPLIB)
        $(MAKE) --silent -C regtests
 
+$(REGTESTS:%=%_implib): %_implib: dk
+       $(MAKE) --silent -C regtests implib
+
 $(REGTESTS:%=%_clean): %_clean:
        $(MAKE) -C regtests clean
 
index 8b0cdb9..036b68a 100644 (file)
@@ -1,11 +1,9 @@
-# $Id: makefile,v 1.28 2004/10/18 19:11:06 chorns Exp $
+# $Id: makefile,v 1.29 2004/10/23 21:05:11 chorns Exp $
 
 PATH_TO_TOP = ../../..
 
 TARGET_REGTESTS = yes
 
-TARGET_BUILDENV_TEST = yes
-
 TARGET_TYPE = export_driver
 
 TARGET_NAME = tcpip
index 4e5023c..6d0c3c4 100644 (file)
@@ -1,8 +1,6 @@
-# $Id: Makefile,v 1.3 2004/10/18 19:11:07 chorns Exp $
-
 PATH_TO_TOP = ../../../..
 
-TARGET_TYPE = library
+TARGET_TYPE = test
 
 TARGET_NAME = regtests
 
@@ -14,18 +12,8 @@ TARGET_CFLAGS = -I$(REGTESTS_PATH_INC)
 
 -include Makefile.tests
 
-TARGET_OBJECTS = \
-  _rtstub.o \
-  _regtests.o \
-  _hooks.o \
-  _stubs.o \
-  $(addprefix tests/, $(TESTS))
+TARGET_OBJECTS = $(addprefix tests/, $(TESTS))
 
 include $(PATH_TO_TOP)/rules.mak
 
 include $(TOOLS_PATH)/helper.mk
-
-run: all
-       @$(CC) -o _runtest.exe _rtstub.o regtests.a $(SDK_PATH_LIB)/rtshared.a $(LIBS) -lntdll
-       @_runtest.exe
-       @$(RM) _runtest.exe
index f234ac5..7e9f0be 100644 (file)
@@ -1,6 +1,6 @@
-_hooks.c
 _regtests.c
 _rtstub.c
+_hooks.c
 _stubs.S
 Makefile.tests
 *.d
index f9e8c05..0731219 100644 (file)
@@ -21,12 +21,7 @@ TARGET_LIBS = ../gdiplus.a
 
 -include Makefile.tests
 
-TARGET_OBJECTS = \
-  _rtstub.o \
-  _regtests.o \
-  _hooks.o \
-  _stubs.o \
-  $(addprefix tests/, $(TESTS))
+TARGET_OBJECTS = $(addprefix tests/, $(TESTS))
 
 include $(PATH_TO_TOP)/rules.mak
 
index ac8687e..71bc670 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.3 2004/10/20 20:51:21 chorns Exp $
+# $Id: Makefile,v 1.4 2004/10/23 21:05:11 chorns Exp $
 
 PATH_TO_TOP = ../../..
 
@@ -14,12 +14,7 @@ TARGET_LIBS = ../kernel32.a
 
 -include Makefile.tests
 
-TARGET_OBJECTS = \
-  _rtstub.o \
-  _regtests.o \
-  _hooks.o \
-  _stubs.o \
-  $(addprefix tests/, $(TESTS))
+TARGET_OBJECTS = $(addprefix tests/, $(TESTS))
 
 include $(PATH_TO_TOP)/rules.mak
 
index 922ba0c..66bd45d 100644 (file)
@@ -3,6 +3,8 @@ ntdll.dll  CsrClientCallServer@16
 ntdll.dll  CsrClientConnectToServer@0
 ntdll.dll  CsrReleaseParameterBuffer@4
 ntdll.dll  DbgUiContinue@8
+ntdll.dll  HeapAlloc@12=RtlAllocateHeap
+ntdll.dll  HeapFree@12=RtlFreeHeap
 ntdll.dll  LdrAccessResource@16
 ntdll.dll  LdrDisableThreadCalloutsForDll@4
 ntdll.dll  LdrFindResource_U@16
index 7ead6a8..6f8e664 100644 (file)
@@ -1,7 +1,9 @@
-# $Id: makefile,v 1.16 2004/08/15 18:53:07 chorns Exp $
+# $Id: makefile,v 1.17 2004/10/23 21:05:11 chorns Exp $
 
 PATH_TO_TOP = ../..
 
+TARGET_REGTESTS = yes
+
 TARGET_TYPE = dynlink
 
 TARGET_NAME = ws2_32
diff --git a/reactos/lib/ws2_32/tests/.cvsignore b/reactos/lib/ws2_32/tests/.cvsignore
new file mode 100644 (file)
index 0000000..a6e5b61
--- /dev/null
@@ -0,0 +1,9 @@
+_regtests.c
+_rtstub.c
+_hooks.c
+_stubs.S
+Makefile.tests
+*.d
+*.o
+*.a
+*.pch
diff --git a/reactos/lib/ws2_32/tests/Makefile b/reactos/lib/ws2_32/tests/Makefile
new file mode 100644 (file)
index 0000000..ddbb603
--- /dev/null
@@ -0,0 +1,19 @@
+PATH_TO_TOP = ../../..
+
+TARGET_TYPE = test
+
+TARGET_NAME = regtests
+
+TARGET_LIBPATH = .
+
+TARGET_CFLAGS = -I$(REGTESTS_PATH_INC)
+
+TARGET_LIBS = ../ws2_32.a
+
+-include Makefile.tests
+
+TARGET_OBJECTS = $(addprefix tests/, $(TESTS))
+
+include $(PATH_TO_TOP)/rules.mak
+
+include $(TOOLS_PATH)/helper.mk
diff --git a/reactos/lib/ws2_32/tests/stubs.tst b/reactos/lib/ws2_32/tests/stubs.tst
new file mode 100644 (file)
index 0000000..ad1a40d
--- /dev/null
@@ -0,0 +1,18 @@
+kernel32.dll  CreateEventW@16
+kernel32.dll  InitializeCriticalSection@4
+kernel32.dll  DeleteCriticalSection@4
+kernel32.dll  EnterCriticalSection@4
+kernel32.dll  ExitProcess@4
+kernel32.dll  FreeLibrary@4
+kernel32.dll  GetLastError@0
+kernel32.dll  GetProcAddress@8
+kernel32.dll  GetProcessHeap@0
+ntdll.dll  HeapAlloc@12=RtlAllocateHeap
+ntdll.dll  HeapFree@12=RtlFreeHeap
+kernel32.dll  LeaveCriticalSection@4
+kernel32.dll  LoadLibraryW@4
+kernel32.dll  lstrcpyA@8
+ntdll.dll  ResetEvent@4
+ntdll.dll  SetEvent@4
+ntdll.dll  WaitForMultipleObjectsEx@20
+kernel32.dll  CloseHandle@4
diff --git a/reactos/lib/ws2_32/tests/tests/.cvsignore b/reactos/lib/ws2_32/tests/tests/.cvsignore
new file mode 100644 (file)
index 0000000..31dc307
--- /dev/null
@@ -0,0 +1,2 @@
+*.d
+*.o
diff --git a/reactos/lib/ws2_32/tests/tests/WinsockEvent.c b/reactos/lib/ws2_32/tests/tests/WinsockEvent.c
new file mode 100644 (file)
index 0000000..14a60eb
--- /dev/null
@@ -0,0 +1,90 @@
+#include <windows.h>
+#include <winsock2.h>
+#include "regtests.h"
+
+#define TestHandle (HANDLE) 1
+
+static BOOL CloseHandleSuccessCalled = FALSE;
+
+static BOOL STDCALL
+MockCloseHandleSuccess(HANDLE hObject)
+{
+  CloseHandleSuccessCalled = TRUE;
+  _AssertEqualValue(TestHandle, hObject);
+  return TRUE;
+}
+
+static HOOK HooksSuccess[] =
+{
+  {"CloseHandle", MockCloseHandleSuccess},
+  {NULL, NULL}
+};
+
+static void
+TestWSACloseEventSuccess()
+{
+  BOOL result;
+  
+  _SetHooks(HooksSuccess);
+  result = WSACloseEvent(TestHandle);
+  _AssertTrue(result);
+  _AssertEqualValue(NO_ERROR, WSAGetLastError());
+  _AssertTrue(CloseHandleSuccessCalled);
+  _UnsetAllHooks();
+}
+
+
+static BOOL CloseHandleFailureCalled = FALSE;
+
+static BOOL STDCALL
+MockCloseHandleFailure(HANDLE hObject)
+{
+  CloseHandleFailureCalled = TRUE;
+  return FALSE;
+}
+
+static HOOK HooksFailure[] =
+{
+  {"CloseHandle", MockCloseHandleFailure},
+  {NULL, NULL}
+};
+
+static void
+TestWSACloseEventFailure()
+{
+  BOOL result;
+  
+  _SetHooks(HooksFailure);
+  result = WSACloseEvent(TestHandle);
+  _AssertFalse(result);
+  _AssertEqualValue(WSA_INVALID_HANDLE, WSAGetLastError());
+  _AssertTrue(CloseHandleFailureCalled);
+  _UnsetAllHooks();
+}
+
+
+static void
+TestWSACloseEvent()
+{
+  TestWSACloseEventSuccess();
+  TestWSACloseEventFailure();
+}
+
+extern BOOL
+STDCALL
+DllMain(HANDLE hInstDll,
+        ULONG dwReason,
+        LPVOID lpReserved);
+
+static void
+RunTest()
+{
+  WSADATA WSAData;
+
+  DllMain(NULL, DLL_PROCESS_ATTACH, NULL);
+  WSAStartup(MAKEWORD(2, 0), &WSAData);
+  TestWSACloseEvent();
+  WSACleanup();
+}
+
+DISPATCHER(WinsockeventTest, "Winsock 2 event")
index c8c7605..19cf73a 100755 (executable)
@@ -1,14 +1,18 @@
-# $Id: Makefile,v 1.5 2004/10/18 19:11:07 chorns Exp $
-
 PATH_TO_TOP = ..
 
 all:
+       $(MAKE) -C regtests all
        $(MAKE) -C shared all
 
+implib:
+       - $(MAKE) -C regtests implib
+
 clean:
+       - $(MAKE) -C regtests clean
        - $(MAKE) -C shared clean
 
 install:
+       $(MAKE) -C regtests install
        $(MAKE) -C shared install
 
 .PHONY: all clean install
diff --git a/reactos/regtests/regtests/.cvsignore b/reactos/regtests/regtests/.cvsignore
new file mode 100755 (executable)
index 0000000..4308480
--- /dev/null
@@ -0,0 +1,11 @@
+temp.exp
+*.d
+*.a
+*.o
+*.dll
+*.coff
+*.sym
+*.tmp
+*.gch
+*.pch
+*.map
diff --git a/reactos/regtests/regtests/Makefile b/reactos/regtests/regtests/Makefile
new file mode 100755 (executable)
index 0000000..8ea5ef9
--- /dev/null
@@ -0,0 +1,16 @@
+PATH_TO_TOP = ../..
+
+TARGET_NORC = yes
+
+TARGET_TYPE = dynlink
+
+TARGET_NAME = regtests
+
+TARGET_CFLAGS = -Wall -Werror
+
+TARGET_OBJECTS = \
+  regtests.o
+
+include $(PATH_TO_TOP)/rules.mak
+
+include $(TOOLS_PATH)/helper.mk
diff --git a/reactos/regtests/regtests/regtests.c b/reactos/regtests/regtests/regtests.c
new file mode 100755 (executable)
index 0000000..79df018
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * PROJECT:         ReactOS kernel
+ * FILE:            regtests/regtests/regtests.c
+ * PURPOSE:         Regression testing framework
+ * PROGRAMMER:      Casper S. Hornstrup (chorns@users.sourceforge.net)
+ * UPDATE HISTORY:
+ *      23-10-2004  CSH  Created
+ */
+#include <windows.h>
+
+HMODULE STDCALL
+_GetModuleHandleA(LPCSTR lpModuleName)
+{
+  return GetModuleHandleA(lpModuleName);
+}
+
+FARPROC STDCALL
+_GetProcAddress(HMODULE hModule,
+  LPCSTR lpProcName)
+{
+  return GetProcAddress(hModule, lpProcName);
+}
+
+HINSTANCE STDCALL
+_LoadLibraryA(LPCSTR lpLibFileName)
+{
+  return LoadLibraryA(lpLibFileName);
+}
diff --git a/reactos/regtests/regtests/regtests.def b/reactos/regtests/regtests/regtests.def
new file mode 100644 (file)
index 0000000..355d2e6
--- /dev/null
@@ -0,0 +1,5 @@
+LIBRARY REGTESTS.DLL
+EXPORTS
+_GetModuleHandleA@4
+_GetProcAddress@8
+_LoadLibraryA@4
index 933ddd2..a22e1eb 100755 (executable)
@@ -23,22 +23,20 @@ char *_Buffer;
 
 static LIST_ENTRY AllTests;
 
-int
-DriverTest()
+void *_alloca(size_t size)
 {
-  /* Dummy */
-  return 0;
-}
+  void *ret;
 
+  asm ("movl %1, %%eax\n"
+       "addl $3, %%eax\n"
+       "andl $-4, %%eax\n"
+       "subl %%eax, %%esp\n"
+       "movl %%esp, %0\n"
+       : "=m" (ret) : "m" (size) : "eax");
 
-int
-_regtestsTest()
-{
-  /* Dummy */
-  return 0;
+  return ret;
 }
 
-
 VOID
 InitializeTests()
 {
@@ -83,7 +81,7 @@ PerformTest(TestOutputRoutine OutputRoutine, PROS_TEST Test, LPSTR TestName)
     (Test->Routine)(TESTCMD_RUN);
 #ifdef SEH
   } __except(EXCEPTION_EXECUTE_HANDLER) {
-    Result = TS_FAILED;
+    _Result = TS_FAILED;
     strcpy(Buffer, "Failed due to exception");
   }
 #endif
@@ -128,7 +126,7 @@ AddTest(TestRoutine Routine)
 {
   PROS_TEST Test;
 
-  Test = (PROS_TEST) AllocateMemory(sizeof(ROS_TEST));
+  Test = (PROS_TEST) malloc(sizeof(ROS_TEST));
   if (Test == NULL)
     {
       DbgPrint("Out of memory");
@@ -139,3 +137,9 @@ AddTest(TestRoutine Routine)
 
   InsertTailList(&AllTests, &Test->ListEntry);
 }
+
+PVOID STDCALL
+FrameworkGetHook(ULONG index)
+{
+  return FrameworkGetHookInternal(index);
+}
index a93b575..8ec5c89 100755 (executable)
@@ -50,35 +50,63 @@ AppendAssertion(char *message)
   _Result = TS_FAILED;
 }
 
+#define _AssertTrue(_Condition) \
+{ \
+  if (!(_Condition)) \
+    { \
+      char _message[100]; \
+      sprintf(_message, "Condition was not true at %s:%d", \
+        __FILE__, __LINE__); \
+      AppendAssertion(_message); \
+    } \
+}
+
+#define _AssertFalse(_Condition) \
+{ \
+  if (_Condition) \
+    { \
+      char _message[100]; \
+      sprintf(_message, "Condition was not false at %s:%d", \
+        __FILE__, __LINE__); \
+      AppendAssertion(_message); \
+    } \
+}
+
 #define _AssertEqualValue(_Expected, _Actual) \
 { \
-  if ((_Expected) != (_Actual)) \
+  ULONG __Expected = (ULONG) (_Expected); \
+  ULONG __Actual = (ULONG) (_Actual); \
+  if ((__Expected) != (__Actual)) \
     { \
       char _message[100]; \
       sprintf(_message, "Expected %d/0x%.08x was %d/0x%.08x at %s:%d", \
-        (_Expected), (_Expected), (_Actual), (_Actual), __FILE__, __LINE__); \
+        (__Expected), (__Expected), (__Actual), (__Actual), __FILE__, __LINE__); \
       AppendAssertion(_message); \
     } \
 }
 
 #define _AssertEqualWideString(_Expected, _Actual) \
 { \
-  if (wcscmp((_Expected), (_Actual)) != 0) \
+  LPWSTR __Expected = (LPWSTR) (_Expected); \
+  LPWSTR __Actual = (LPWSTR) (_Actual); \
+  if (wcscmp((__Expected), (__Actual)) != 0) \
     { \
       char _message[100]; \
       sprintf(_message, "Expected %S was %S at %s:%d", \
-        (_Expected), (_Actual), __FILE__, __LINE__); \
+        (__Expected), (__Actual), __FILE__, __LINE__); \
       AppendAssertion(_message); \
     } \
 }
 
 #define _AssertNotEqualValue(_Expected, _Actual) \
 { \
-  if ((_Expected) == (_Actual)) \
+  ULONG __Expected = (ULONG) (_Excepted); \
+  ULONG __Actual = (ULONG) (_Actual); \
+  if ((__Expected) == (__Actual)) \
     { \
       char _message[100]; \
       sprintf(_message, "Actual value expected to be different from %d/0x%.08x at %s:%d", \
-        (_Expected), (_Expected), __FILE__, __LINE__); \
+        (__Expected), (__Expected), __FILE__, __LINE__); \
       AppendAssertion(_message); \
     } \
 }
@@ -115,15 +143,12 @@ extern VOID InitializeTests();
 extern VOID RegisterTests();
 extern VOID PerformTests(TestOutputRoutine OutputRoutine, LPSTR TestName);
 
-/* Routines provided by the driver */
-extern PVOID AllocateMemory(ULONG Size);
-extern VOID FreeMemory(PVOID Base);
-
 
 typedef struct _API_DESCRIPTION
 {
   PCHAR FileName;
   PCHAR FunctionName;
+  PCHAR ForwardedFunctionName;
   PVOID FunctionAddress;
   PVOID MockFunctionAddress;
 } API_DESCRIPTION, *PAPI_DESCRIPTION;
@@ -131,33 +156,60 @@ typedef struct _API_DESCRIPTION
 extern API_DESCRIPTION ExternalDependencies[];
 extern ULONG MaxExternalDependency;
 
+HMODULE STDCALL
+_GetModuleHandleA(LPCSTR lpModuleName);
+
+FARPROC STDCALL
+_GetProcAddress(HMODULE hModule,
+  LPCSTR lpProcName);
+
+HINSTANCE STDCALL
+_LoadLibraryA(LPCSTR lpLibFileName);
+
+static inline PCHAR
+FrameworkGetExportedFunctionNameInternal(PAPI_DESCRIPTION ApiDescription)
+{
+  if (ApiDescription->ForwardedFunctionName != NULL)
+    {
+      return ApiDescription->ForwardedFunctionName;
+    }
+  else
+    {
+      return ApiDescription->FunctionName;
+    }
+}
+
 static inline PVOID
 FrameworkGetFunction(PAPI_DESCRIPTION ApiDescription)
 {
   HMODULE hModule;
-  PVOID Function;
+  PVOID function;
+  PCHAR exportedFunctionName;
 
-  hModule = GetModuleHandleA(ApiDescription->FileName);
+  exportedFunctionName = FrameworkGetExportedFunctionNameInternal(ApiDescription);
+
+  hModule = _GetModuleHandleA(ApiDescription->FileName);
   if (hModule != NULL) 
     {
-      Function = GetProcAddress(hModule, ApiDescription->FunctionName);
+      function = _GetProcAddress(hModule, exportedFunctionName);
     }
   else
          {
-      hModule = LoadLibraryA(ApiDescription->FileName);
+      hModule = _LoadLibraryA(ApiDescription->FileName);
       if (hModule != NULL)
         {
-          Function = GetProcAddress(hModule, ApiDescription->FunctionName);
+          function = _GetProcAddress(hModule, exportedFunctionName);
           //FreeLibrary(hModule);
         }
     }
-  return Function;
+  return function;
 }
 
-static inline PVOID STDCALL
+static inline PVOID
 FrameworkGetHookInternal(ULONG index)
 {
   PVOID address;
+  PCHAR exportedFunctionName;
 
   if (index > MaxExternalDependency)
     return NULL;
@@ -168,8 +220,10 @@ FrameworkGetHookInternal(ULONG index)
   if (ExternalDependencies[index].FunctionAddress != NULL)
     return ExternalDependencies[index].FunctionAddress;
 
+  exportedFunctionName = FrameworkGetExportedFunctionNameInternal(&ExternalDependencies[index]);
+
   printf("Calling function '%s' in DLL '%s'.\n",
-    ExternalDependencies[index].FunctionName,
+    exportedFunctionName,
     ExternalDependencies[index].FileName);
 
   address = FrameworkGetFunction(&ExternalDependencies[index]);
@@ -177,7 +231,7 @@ FrameworkGetHookInternal(ULONG index)
   if (address == NULL)
     {
       printf("Function '%s' not found in DLL '%s'.\n",
-        ExternalDependencies[index].FunctionName,
+        exportedFunctionName,
         ExternalDependencies[index].FileName);
     }
   ExternalDependencies[index].FunctionAddress = address;
@@ -193,7 +247,7 @@ _SetHook(PCHAR name,
   PAPI_DESCRIPTION api;
   ULONG index;
 
-  for (index = 0; index < MaxExternalDependency; index++)
+  for (index = 0; index <= MaxExternalDependency; index++)
     {
       api = &ExternalDependencies[index];
       if (strcmp(api->FunctionName, name) == 0)
@@ -244,7 +298,7 @@ _UnsetAllHooks()
   PAPI_DESCRIPTION api;
   ULONG index;
 
-  for (index = 0; index < MaxExternalDependency; index++)
+  for (index = 0; index <= MaxExternalDependency; index++)
     {
       api = &ExternalDependencies[index];
       api->MockFunctionAddress = NULL;
index ebeb66c..aa37eb0 100644 (file)
@@ -178,5 +178,5 @@ export OS2_PATH_LIB=$(OS2_PATH)/lib
 export OS2_PATH_INC=$(OS2_PATH)/include
 
 # Other systems integration
-export ROOT_PATH=$(PATH_TO_TOP)/..
+export REGTESTS_PATH=$(PATH_TO_TOP)/regtests
 export REGTESTS_PATH_INC=$(PATH_TO_TOP)/regtests/shared
index cacf2f9..c4b27a5 100644 (file)
@@ -14,12 +14,7 @@ TARGET_LIBS = ../win32k.a
 
 -include Makefile.tests
 
-TARGET_OBJECTS = \
-  _rtstub.o \
-  _regtests.o \
-  _hooks.o \
-  _stubs.o \
-  $(addprefix tests/, $(TESTS))
+TARGET_OBJECTS = $(addprefix tests/, $(TESTS))
 
 include $(PATH_TO_TOP)/rules.mak
 
index 30d4ec9..0df4129 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: helper.mk,v 1.90 2004/10/21 18:04:48 arty Exp $
+# $Id: helper.mk,v 1.91 2004/10/23 21:05:12 chorns Exp $
 #
 # Helper makefile for ReactOS modules
 # Variables this makefile accepts:
@@ -371,6 +371,7 @@ ifeq ($(TARGET_TYPE),test)
   MK_BOOTCDDIR := system32
   MK_DISTDIR := # none
   MK_RES_BASE :=
+  TARGET_OBJECTS := _rtstub.o _regtests.o $(TARGET_OBJECTS)
 endif
 
 
@@ -661,6 +662,10 @@ MK_NOSTRIPNAME := $(MK_BASENAME).nostrip$(MK_EXT)
 
 MK_EXTRADEP := $(filter %.h,$(TARGET_OBJECTS))
 
+ifeq ($(TARGET_TYPE),test)
+MK_EXTRADEP += _stubs.o _hooks.o
+endif
+
 # We don't want to link header files
 MK_OBJECTS := $(filter-out %.h,$(TARGET_OBJECTS))
 
@@ -876,8 +881,8 @@ endif # MK_MODE
 # Static library target
 ifeq ($(MK_MODE),static)
 
-$(MK_FULLNAME): $(TARGET_OBJECTS)
-       $(AR) -r $(MK_FULLNAME) $(TARGET_OBJECTS)
+$(MK_FULLNAME): $(MK_EXTRADEP) $(MK_OBJECTS)
+       $(AR) -r $(MK_FULLNAME) $(MK_OBJECTS)
        @echo $(MK_BASENAME)$(MK_EXT) was successfully built.
 
 # Static libraries dont have a nostrip version
@@ -1017,7 +1022,7 @@ endif
 
 REGTEST_TESTS = $(wildcard tests/tests/*.c)
 
-$(REGTEST_TARGETS): $(REGTEST_TESTS)
+$(REGTEST_TARGETS): $(REGTEST_TESTS) ./tests/stubs.tst
        $(REGTESTS) ./tests/tests ./tests/_regtests.c ./tests/Makefile.tests -e ./tests/_rtstub.c
        $(REGTESTS) -s ./tests/stubs.tst ./tests/_stubs.S ./tests/_hooks.c
 
@@ -1064,8 +1069,11 @@ endif
 
 ifeq ($(TARGET_TYPE),test)
 run: all
-       @$(CC) -o _runtest.exe _rtstub.o regtests.a $(SDK_PATH_LIB)/rtshared.a $(TARGET_LIBS) -lntdll
+       @$(CC) -nostdlib -o _runtest.exe regtests.a $(TARGET_LIBS) _stubs.o \
+       $(SDK_PATH_LIB)/rtshared.a $(SDK_PATH_LIB)/regtests.a _hooks.o -lmsvcrt -lntdll
+       @$(CP) $(REGTESTS_PATH)/regtests/regtests.dll regtests.dll
        @_runtest.exe
+       @$(RM) regtests.dll
        @$(RM) _runtest.exe
 endif
 
index fe9ad7f..4f7869b 100755 (executable)
@@ -515,23 +515,18 @@ static char UMSTUB[] =
 static char EXESTUB[] =
   "/* This file is autogenerated. */\n"
   "\n"
-  "#include <stdio.h>\n"
-  "#include <windows.h>\n"
-  "#define NTOS_MODE_USER\n"
-  "#include <ntos.h>\n"
   "#include \"regtests.h\"\n"
   "\n"
-  "PVOID\n"
-  "AllocateMemory(ULONG Size)\n"
-  "{\n"
-  "  return (PVOID) RtlAllocateHeap(RtlGetProcessHeap(), 0, Size);\n"
-  "}\n"
+  "#if defined(__USE_W32API)\n"
+  "  #define HANDLE PVOID\n"
+  "  #define NTSTATUS ULONG\n"
   "\n"
-  "VOID\n"
-  "FreeMemory(PVOID Base)\n"
-  "{\n"
-  "  RtlFreeHeap(RtlGetProcessHeap(), 0, Base);\n"
-  "}\n"
+  "  NTSTATUS STDCALL\n"
+  "  NtTerminateProcess(HANDLE ProcessHandle,\n"
+  "    NTSTATUS ExitStatus);\n"
+  "\n"
+  "  #define NtCurrentProcess() ((HANDLE) 0xFFFFFFFF)\n"
+  "#endif\n"
   "\n"
   "void\n"
   "ConsoleWrite(char *Buffer)\n"
@@ -540,7 +535,10 @@ static char EXESTUB[] =
   "}\n"
   "\n"
   "int\n"
-  "main()\n"
+  "mainCRTStartup(HANDLE hInstance,\n"
+  "  HANDLE hPrevInstance,\n"
+  "  LPSTR lpszCmdParam,\n"
+  "  int nCmdShow)\n"
   "{\n"
   "  InitializeTests();\n"
   "  RegisterTests();\n"
@@ -573,13 +571,7 @@ static char HOOKS_FOOTER[] =
   "};\n"
   "\n"
   "#define ExternalDependencyCount %d\n"
-  "ULONG MaxExternalDependency = ExternalDependencyCount - 1;\n"
-  "\n"
-  "PVOID STDCALL\n"
-  "FrameworkGetHook(ULONG index)\n"
-  "{\n"
-  "  return FrameworkGetHookInternal(index);\n"
-  "}\n";
+  "ULONG MaxExternalDependency = ExternalDependencyCount - 1;\n";
 
 static char HELP[] =
   "REGTESTS path file makefile [-u umstubfile] [-k kmstubfile] [-e exestubfile]\n"
@@ -616,7 +608,7 @@ write_hooks_footer(FILE *hooks_out, unsigned long nr_stubs)
 }
 
 char *
-get_undecorate_name(char *buf,
+get_undecorated_name(char *buf,
   char *decoratedname)
 {
   int start = 0;
@@ -639,20 +631,56 @@ get_undecorate_name(char *buf,
   return buf;
 }
 
+char *
+get_forwarded_export(char *forwardedexport)
+{
+  char buf[300];
+
+  if (forwardedexport == NULL)
+    {
+      strcpy(buf, "NULL");
+    }
+  else
+    {
+      sprintf(buf, "\"%s\"", forwardedexport);
+    }
+  return strdup(buf);
+}
+
 void
 write_stub(FILE *stubs_out, FILE *hooks_out, char *dllname,
-  char *decoratedname, unsigned int stub_index)
+  char *decoratedname_and_forward, unsigned int stub_index)
 {
   char buf[300];
+  char *p;
+  char *decoratedname = NULL;
+  char *forwardedexport = NULL;
+
+  p = strtok(decoratedname_and_forward, "=");
+  if (p != NULL)
+    {
+      decoratedname = p;
+
+      p = strtok(NULL, "=");
+      forwardedexport = p;
+    }
+  else
+    {
+      decoratedname = decoratedname_and_forward;
+      forwardedexport = decoratedname_and_forward;
+    }
 
   fprintf(stubs_out, ".globl _%s\n", decoratedname);
   fprintf(stubs_out, "_%s:\n", decoratedname);
   fprintf(stubs_out, "  pushl $%d\n", stub_index);
   fprintf(stubs_out, "  jmp passthrough\n");
   fprintf(stubs_out, "\n");
-
-  fprintf(hooks_out, "  {\"%s\", \"%s\", NULL, NULL},\n",
-    dllname, get_undecorate_name(buf, decoratedname));
+  forwardedexport = get_forwarded_export(forwardedexport);
+  fprintf(hooks_out, "  {\"%s\", \"%s\", %s, NULL, NULL},\n",
+    dllname,
+    get_undecorated_name(buf, decoratedname),
+    forwardedexport);
+  free(forwardedexport);
 }
 
 void
@@ -664,7 +692,7 @@ create_stubs_and_hooks(
   char line[INPUT_BUFFER_SIZE];
   char *s;
   char *dllname;
-  char *decoratedname;
+  char *decoratedname_and_forward;
   int stub_index;
 
   write_stubs_header(stubs_out);
@@ -679,13 +707,14 @@ create_stubs_and_hooks(
         * DLLNAME (e.g. ntdll.dll)
         * DECORATED NAME (e.g. NtCreateProcess@32, @InterlockedIncrement@4 or printf)
         */
+  stub_index = 0; /* First stub has index zero */
+
        for (
-    /* First stub has index zero */
-               stub_index = 0;
+    ;
                /* Go on until EOF or read zero bytes */
                ((!feof(in)) && (fgets(line, sizeof line, in) != NULL));
                /* Next stub index */
-         stub_index++)
+         )
        {
                /*
                 * Remove, if present, the trailing LF.
@@ -709,16 +738,24 @@ create_stubs_and_hooks(
                s = & line[0];
                if ((*s) != '#' && (*s) != '\0')
                {
-                       /* Extract the DLL name */
-                       dllname = (char *) strtok(s," \t");
-                       /* Extract the decorated function name */
-                       decoratedname = (char *) strtok(NULL," \t");
-                       /* Extract the argument count */
-                       write_stub(stubs_out, hooks_out, dllname, decoratedname, stub_index);
+        /* Extract the DLL name */
+        dllname = (char *) strtok(s, " \t");
+        if (dllname != NULL && strlen(dllname) > 0)
+          {
+                         /*
+             * Extract the decorated function name and possibly forwarded export.
+             * Format:
+             *   decoratedname=forwardedexport (no DLL name)
+             */
+                 decoratedname_and_forward = (char *) strtok(NULL, " \t");
+                           /* Extract the argument count */
+                           write_stub(stubs_out, hooks_out, dllname, decoratedname_and_forward, stub_index);
+            stub_index++;
+          }
                }
        }
 
-  write_hooks_footer(hooks_out, stub_index + 1);
+  write_hooks_footer(hooks_out, stub_index);
 }
 
 int run_stubs(int argc,