From: Casper Hornstrup Date: Thu, 28 Oct 2004 19:01:59 +0000 (+0000) Subject: 2004-10-28 Casper S. Hornstrup X-Git-Tag: backups/win32k_user_rewrite@16797~1^2~235 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=e89808b09410623557b47af1621c2979ad987a0b;ds=sidebyside 2004-10-28 Casper S. Hornstrup * drivers/net/tcpip/tests/setup.c: Include windows.h. * lib/gdiplus/tests/setup.c: Ditto. * lib/kernel32/tests/setup.c: Ditto. * lib/ws2_32/tests/setup.c: Ditto. * subsys/win32k/tests/setup.c: Ditto. * ntoskrnl/tests/setup.c: Ditto. * ntoskrnl/include/ntoskrnl.h: Include test.h. * ntoskrnl/mm/virtual.c (NtLockVirtualMemoryInternal): New function. (NtLockVirtualMemory): Use NtLockVirtualMemoryInternal. * ntoskrnl/tests/Makefile (TARGET_CFLAGS): Add -I../include. * ntoskrnl/tests/stubs.tst: Remove stubs for functions in libgcc. * regtests/shared/regtests.h: Make independent of windows.h. * tools/helper.mk (run): Link with libgcc. * tools/regtests.c (EXESTUB): Include windows.h. * ntoskrnl/include/internal/test.h: New file. * ntoskrnl/tests/tests/VirtualMemory.c: Ditto. svn path=/trunk/; revision=11466 --- diff --git a/reactos/ChangeLog b/reactos/ChangeLog index fa54f09b09f..3a335ae045b 100644 --- a/reactos/ChangeLog +++ b/reactos/ChangeLog @@ -1,3 +1,22 @@ +2004-10-28 Casper S. Hornstrup + + * drivers/net/tcpip/tests/setup.c: Include windows.h. + * lib/gdiplus/tests/setup.c: Ditto. + * lib/kernel32/tests/setup.c: Ditto. + * lib/ws2_32/tests/setup.c: Ditto. + * subsys/win32k/tests/setup.c: Ditto. + * ntoskrnl/tests/setup.c: Ditto. + * ntoskrnl/include/ntoskrnl.h: Include test.h. + * ntoskrnl/mm/virtual.c (NtLockVirtualMemoryInternal): New function. + (NtLockVirtualMemory): Use NtLockVirtualMemoryInternal. + * ntoskrnl/tests/Makefile (TARGET_CFLAGS): Add -I../include. + * ntoskrnl/tests/stubs.tst: Remove stubs for functions in libgcc. + * regtests/shared/regtests.h: Make independent of windows.h. + * tools/helper.mk (run): Link with libgcc. + * tools/regtests.c (EXESTUB): Include windows.h. + * ntoskrnl/include/internal/test.h: New file. + * ntoskrnl/tests/tests/VirtualMemory.c: Ditto. + 2004-10-24 Casper S. Hornstrup * ntoskrnl/Makefile (TARGET_REGTESTS): Define to yes. diff --git a/reactos/drivers/net/tcpip/tests/setup.c b/reactos/drivers/net/tcpip/tests/setup.c index 86ae3e62d0e..507484da7bd 100644 --- a/reactos/drivers/net/tcpip/tests/setup.c +++ b/reactos/drivers/net/tcpip/tests/setup.c @@ -1,3 +1,4 @@ +#include #include "regtests.h" _SetupOnce() diff --git a/reactos/lib/gdiplus/tests/setup.c b/reactos/lib/gdiplus/tests/setup.c index b3793c31de2..a18de0e9164 100644 --- a/reactos/lib/gdiplus/tests/setup.c +++ b/reactos/lib/gdiplus/tests/setup.c @@ -1,3 +1,4 @@ +#include #include "regtests.h" extern BOOL diff --git a/reactos/lib/kernel32/tests/setup.c b/reactos/lib/kernel32/tests/setup.c index 86ae3e62d0e..507484da7bd 100644 --- a/reactos/lib/kernel32/tests/setup.c +++ b/reactos/lib/kernel32/tests/setup.c @@ -1,3 +1,4 @@ +#include #include "regtests.h" _SetupOnce() diff --git a/reactos/lib/ws2_32/tests/setup.c b/reactos/lib/ws2_32/tests/setup.c index b3793c31de2..a18de0e9164 100644 --- a/reactos/lib/ws2_32/tests/setup.c +++ b/reactos/lib/ws2_32/tests/setup.c @@ -1,3 +1,4 @@ +#include #include "regtests.h" extern BOOL diff --git a/reactos/ntoskrnl/include/internal/test.h b/reactos/ntoskrnl/include/internal/test.h new file mode 100644 index 00000000000..e0f12a61244 --- /dev/null +++ b/reactos/ntoskrnl/include/internal/test.h @@ -0,0 +1,40 @@ +#ifndef __NTOSKRNL_INCLUDE_INTERNAL_TEST_H +#define __NTOSKRNL_INCLUDE_INTERNAL_TEST_H + +typedef VOID STDCALL +PExFreePool(PVOID Block); + +typedef PMDL STDCALL +PMmCreateMdl(PMDL Mdl, + PVOID Base, + ULONG Length); + +typedef VOID STDCALL +PMmProbeAndLockPages(PMDL Mdl, + KPROCESSOR_MODE AccessMode, + LOCK_OPERATION Operation); + +typedef VOID FASTCALL +PObDereferenceObject(PVOID Object); + +typedef NTSTATUS STDCALL +PObReferenceObjectByHandle(HANDLE Handle, + ACCESS_MASK DesiredAccess, + POBJECT_TYPE ObjectType, + KPROCESSOR_MODE AccessMode, + PVOID* Object, + POBJECT_HANDLE_INFORMATION HandleInformation); + + +NTSTATUS STDCALL +NtLockVirtualMemoryInternal(HANDLE ProcessHandle, + PVOID BaseAddress, + ULONG NumberOfBytesToLock, + PULONG NumberOfBytesLocked, + PObReferenceObjectByHandle pObReferenceObjectByHandle, + PMmCreateMdl pMmCreateMdl, + PObDereferenceObject pObDereferenceObject, + PMmProbeAndLockPages pMmProbeAndLockPages, + PExFreePool pExFreePool); + +#endif /* __NTOSKRNL_INCLUDE_INTERNAL_TEST_H */ diff --git a/reactos/ntoskrnl/include/ntoskrnl.h b/reactos/ntoskrnl/include/ntoskrnl.h index bc8618305fa..510af7c27ca 100755 --- a/reactos/ntoskrnl/include/ntoskrnl.h +++ b/reactos/ntoskrnl/include/ntoskrnl.h @@ -54,6 +54,7 @@ #include #include #include +#include #include #include #include diff --git a/reactos/ntoskrnl/mm/virtual.c b/reactos/ntoskrnl/mm/virtual.c index 8632876a494..12c017c0e90 100644 --- a/reactos/ntoskrnl/mm/virtual.c +++ b/reactos/ntoskrnl/mm/virtual.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: virtual.c,v 1.81 2004/10/22 20:38:23 ekohl Exp $ +/* $Id: virtual.c,v 1.82 2004/10/28 19:01:58 chorns Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/virtual.c @@ -26,13 +26,7 @@ /* INCLUDE *****************************************************************/ -#include -#include -#include -#include -#include -#include -#include +#include #define NDEBUG #include @@ -59,58 +53,75 @@ NtFlushVirtualMemory(IN HANDLE ProcessHandle, return(STATUS_NOT_IMPLEMENTED); } -/* (tMk 2004.II.4) - * FUNCTION: Locks range of process virtual memory. - * Called from VirtualLock (lib\kernel32\mem\virtual.c) - * - * NOTE: This function will be correct if MmProbeAndLockPages() would be fully IMPLEMENTED. - */ + NTSTATUS STDCALL -NtLockVirtualMemory(HANDLE ProcessHandle, - PVOID BaseAddress, - ULONG NumberOfBytesToLock, - PULONG NumberOfBytesLocked) // ULONG LockOption? +NtLockVirtualMemoryInternal(HANDLE ProcessHandle, + PVOID BaseAddress, + ULONG NumberOfBytesToLock, + PULONG NumberOfBytesLocked, + PObReferenceObjectByHandle pObReferenceObjectByHandle, + PMmCreateMdl pMmCreateMdl, + PObDereferenceObject pObDereferenceObject, + PMmProbeAndLockPages pMmProbeAndLockPages, + PExFreePool pExFreePool) { - // AG [08-20-03] : I have *no* idea if this is correct, I just used the - // other functions as a template and made a few intelligent guesses... - - NTSTATUS Status; - PMDL Mdl; - PEPROCESS Process; + PEPROCESS Process; + NTSTATUS Status; + PMDL Mdl; + + Status = pObReferenceObjectByHandle(ProcessHandle, + PROCESS_VM_WRITE, + NULL, + UserMode, + (PVOID*)(&Process), + NULL); + if (!NT_SUCCESS(Status)) + return(Status); + + Mdl = pMmCreateMdl(NULL, + BaseAddress, + NumberOfBytesToLock); + if (Mdl == NULL) + { + pObDereferenceObject(Process); + return(STATUS_NO_MEMORY); + } - DPRINT("NtLockVirtualMemory(ProcessHandle %x, BaseAddress %x, " - "NumberOfBytesToLock %d), NumberOfBytesLocked %x\n",ProcessHandle,BaseAddress, - NumberOfBytesToLock, NumberOfBytesLocked); + pMmProbeAndLockPages(Mdl, + UserMode, + IoWriteAccess); - Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_VM_WRITE, - NULL, - UserMode, - (PVOID*)(&Process), - NULL); - if (!NT_SUCCESS(Status)) - { - return(Status); - } + pExFreePool(Mdl); - Mdl = MmCreateMdl(NULL, - BaseAddress, - NumberOfBytesToLock); - if(Mdl == NULL) - { - ObDereferenceObject(Process); - return(STATUS_NO_MEMORY); - } - MmProbeAndLockPages(Mdl, - UserMode, - IoWriteAccess); + pObDereferenceObject(Process); - ExFreePool(Mdl); // Are we supposed to do this here? + *NumberOfBytesLocked = NumberOfBytesToLock; + return(STATUS_SUCCESS); +} - ObDereferenceObject(Process); - *NumberOfBytesLocked = NumberOfBytesToLock; - return(STATUS_SUCCESS); +NTSTATUS STDCALL +NtLockVirtualMemory(HANDLE ProcessHandle, + PVOID BaseAddress, + ULONG NumberOfBytesToLock, + PULONG NumberOfBytesLocked) +{ + DPRINT("NtLockVirtualMemory(ProcessHandle %x, BaseAddress %x, " + "NumberOfBytesToLock %d, NumberOfBytesLocked %x)\n", + ProcessHandle, + BaseAddress, + NumberOfBytesToLock, + NumberOfBytesLocked); + + return NtLockVirtualMemoryInternal(ProcessHandle, + BaseAddress, + NumberOfBytesToLock, + NumberOfBytesLocked, + ObReferenceObjectByHandle, + MmCreateMdl, + ObfDereferenceObject, + MmProbeAndLockPages, + ExFreePool); } diff --git a/reactos/ntoskrnl/tests/Makefile b/reactos/ntoskrnl/tests/Makefile index 7ae89656900..2b562d3b6fa 100644 --- a/reactos/ntoskrnl/tests/Makefile +++ b/reactos/ntoskrnl/tests/Makefile @@ -6,7 +6,7 @@ TARGET_NAME = regtests TARGET_LIBPATH = . -TARGET_CFLAGS = -I$(REGTESTS_PATH_INC) +TARGET_CFLAGS = -I../include -I$(REGTESTS_PATH_INC) TARGET_LIBS = \ ../ntoskrnl.a \ diff --git a/reactos/ntoskrnl/tests/setup.c b/reactos/ntoskrnl/tests/setup.c index 86ae3e62d0e..507484da7bd 100644 --- a/reactos/ntoskrnl/tests/setup.c +++ b/reactos/ntoskrnl/tests/setup.c @@ -1,3 +1,4 @@ +#include #include "regtests.h" _SetupOnce() diff --git a/reactos/ntoskrnl/tests/stubs.tst b/reactos/ntoskrnl/tests/stubs.tst index 16177be73a9..199d3205385 100644 --- a/reactos/ntoskrnl/tests/stubs.tst +++ b/reactos/ntoskrnl/tests/stubs.tst @@ -1,7 +1,3 @@ -hal.dll __divdi3 -hal.dll __udivdi3 -hal.dll __moddi3 -hal.dll __umoddi3 hal.dll _init_end__ hal.dll _init_start__ hal.dll _text_end__ diff --git a/reactos/ntoskrnl/tests/tests/VirtualMemory.c b/reactos/ntoskrnl/tests/tests/VirtualMemory.c new file mode 100644 index 00000000000..cdaebc048f2 --- /dev/null +++ b/reactos/ntoskrnl/tests/tests/VirtualMemory.c @@ -0,0 +1,103 @@ +#include +#include "regtests.h" + +#define TestProcessHandle (HANDLE) 1 +#define TestProcessObject (PVOID) 0x2 +#define TestBaseAddress (PVOID) 0x1000 +#define TestNumberOfBytesToLock 0x2000 +#define TestMdl (PMDL) 0xD0000000 + +static BOOLEAN MockExFreePoolCalled = FALSE; + +static VOID STDCALL +MockExFreePool(PVOID Block) +{ + _AssertFalse(MockExFreePoolCalled); + _AssertEqualValue(TestMdl, Block); + MockExFreePoolCalled = TRUE; +} + +static BOOLEAN MockMmCreateMdlCalled = FALSE; + +static PMDL STDCALL +MockMmCreateMdl(PMDL Mdl, + PVOID Base, + ULONG Length) +{ + _AssertFalse(MockMmCreateMdlCalled); + _AssertEqualValue(TestBaseAddress, Base); + _AssertEqualValue(TestNumberOfBytesToLock, Length); + MockMmCreateMdlCalled = TRUE; + return TestMdl; +} + +static BOOLEAN MockMmProbeAndLockPagesCalled = FALSE; + +static VOID STDCALL +MockMmProbeAndLockPages(PMDL Mdl, + KPROCESSOR_MODE AccessMode, + LOCK_OPERATION Operation) +{ + _AssertFalse(MockMmProbeAndLockPagesCalled); + _AssertEqualValue(TestMdl, Mdl); + _AssertEqualValue(UserMode, AccessMode); + _AssertEqualValue(IoWriteAccess, Operation); + MockMmProbeAndLockPagesCalled = TRUE; +} + +static BOOLEAN MockObDereferenceObjectCalled = FALSE; + +static VOID FASTCALL +MockObDereferenceObject(PVOID Object) +{ + _AssertFalse(MockObDereferenceObjectCalled); + _AssertEqualValue(TestProcessObject, Object); + MockObDereferenceObjectCalled = TRUE; +} + +static BOOLEAN MockObReferenceObjectByHandleCalled = FALSE; + +static NTSTATUS STDCALL +MockObReferenceObjectByHandle(HANDLE Handle, + ACCESS_MASK DesiredAccess, + POBJECT_TYPE ObjectType, + KPROCESSOR_MODE AccessMode, + PVOID* Object, + POBJECT_HANDLE_INFORMATION HandleInformation) +{ + _AssertFalse(MockObReferenceObjectByHandleCalled); + _AssertEqualValue(TestProcessHandle, Handle); + _AssertEqualValue(PROCESS_VM_WRITE, DesiredAccess); + _AssertEqualValue(NULL, ObjectType); + _AssertEqualValue(UserMode, AccessMode); + _AssertNotEqualValue(NULL, Object); + _AssertEqualValue(NULL, HandleInformation); + *Object = TestProcessObject; + MockObReferenceObjectByHandleCalled = TRUE; + return STATUS_SUCCESS; +} + +static void RunTest() +{ + ULONG NumberOfBytesLocked; + NTSTATUS status; + + status = NtLockVirtualMemoryInternal(TestProcessHandle, + TestBaseAddress, + TestNumberOfBytesToLock, + &NumberOfBytesLocked, + MockObReferenceObjectByHandle, + MockMmCreateMdl, + MockObDereferenceObject, + MockMmProbeAndLockPages, + MockExFreePool); + _AssertEqualValue(STATUS_SUCCESS, status); + _AssertTrue(MockObReferenceObjectByHandleCalled); + _AssertTrue(MockMmCreateMdlCalled); + _AssertTrue(MockMmProbeAndLockPagesCalled); + _AssertTrue(MockExFreePoolCalled); + _AssertTrue(MockObDereferenceObjectCalled); + _AssertEqualValue(TestNumberOfBytesToLock, NumberOfBytesLocked); +} + +_Dispatcher(VirtualmemoryTest, "Virtual memory") diff --git a/reactos/regtests/shared/regtests.h b/reactos/regtests/shared/regtests.h index 8ef32763699..8d56f87c5b3 100755 --- a/reactos/regtests/shared/regtests.h +++ b/reactos/regtests/shared/regtests.h @@ -8,7 +8,6 @@ */ #include #include -#include extern void SetupOnce(); @@ -105,7 +104,7 @@ AppendAssertion(char *message) #define _AssertNotEqualValue(_Expected, _Actual) \ { \ - ULONG __Expected = (ULONG) (_Excepted); \ + ULONG __Expected = (ULONG) (_Expected); \ ULONG __Actual = (ULONG) (_Actual); \ if ((__Expected) == (__Actual)) \ { \ @@ -161,14 +160,14 @@ typedef struct _API_DESCRIPTION extern API_DESCRIPTION ExternalDependencies[]; extern ULONG MaxExternalDependency; -HMODULE STDCALL +HANDLE STDCALL _GetModuleHandleA(LPCSTR lpModuleName); -FARPROC STDCALL -_GetProcAddress(HMODULE hModule, +PVOID STDCALL +_GetProcAddress(HANDLE hModule, LPCSTR lpProcName); -HINSTANCE STDCALL +HANDLE STDCALL _LoadLibraryA(LPCSTR lpLibFileName); VOID STDCALL @@ -190,7 +189,7 @@ FrameworkGetExportedFunctionNameInternal(PAPI_DESCRIPTION ApiDescription) static inline PVOID FrameworkGetFunction(PAPI_DESCRIPTION ApiDescription) { - HMODULE hModule; + HANDLE hModule; PVOID function; PCHAR exportedFunctionName; diff --git a/reactos/subsys/win32k/tests/setup.c b/reactos/subsys/win32k/tests/setup.c index 86ae3e62d0e..507484da7bd 100644 --- a/reactos/subsys/win32k/tests/setup.c +++ b/reactos/subsys/win32k/tests/setup.c @@ -1,3 +1,4 @@ +#include #include "regtests.h" _SetupOnce() diff --git a/reactos/tools/helper.mk b/reactos/tools/helper.mk index dac1990e136..91edae4bd17 100644 --- a/reactos/tools/helper.mk +++ b/reactos/tools/helper.mk @@ -1,4 +1,4 @@ -# $Id: helper.mk,v 1.92 2004/10/24 12:39:54 chorns Exp $ +# $Id: helper.mk,v 1.93 2004/10/28 19:01:59 chorns Exp $ # # Helper makefile for ReactOS modules # Variables this makefile accepts: @@ -1072,7 +1072,7 @@ endif ifeq ($(TARGET_TYPE),test) run: all @$(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 + $(SDK_PATH_LIB)/rtshared.a $(SDK_PATH_LIB)/regtests.a _hooks.o -lgcc -lmsvcrt -lntdll @$(CP) $(REGTESTS_PATH)/regtests/regtests.dll regtests.dll @_runtest.exe @$(RM) regtests.dll diff --git a/reactos/tools/regtests.c b/reactos/tools/regtests.c index bb29ac7ce6e..3e2b4f5888b 100755 --- a/reactos/tools/regtests.c +++ b/reactos/tools/regtests.c @@ -431,6 +431,7 @@ write_file_if_changed(char *filename, static char EXESTUB[] = "/* This file is autogenerated. */\n" "\n" + "#include \n" "#include \"regtests.h\"\n" "\n" "void\n"