[PATCH 1/2] ntdll/tests: Add some tests for unloaded modules traces.
Nikolay Sivov
nsivov at codeweavers.com
Tue Apr 23 00:47:29 CDT 2019
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/ntdll/tests/exception.c | 147 ++++++++++++++++++++++++-----------
1 file changed, 102 insertions(+), 45 deletions(-)
diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c
index 3b3f72f07d..d2e0317315 100644
--- a/dlls/ntdll/tests/exception.c
+++ b/dlls/ntdll/tests/exception.c
@@ -56,6 +56,21 @@ static NTSTATUS (WINAPI *pNtClose)(HANDLE);
static NTSTATUS (WINAPI *pNtSuspendProcess)(HANDLE process);
static NTSTATUS (WINAPI *pNtResumeProcess)(HANDLE process);
+#define RTL_UNLOAD_EVENT_TRACE_NUMBER 64
+
+typedef struct _RTL_UNLOAD_EVENT_TRACE
+{
+ void *BaseAddress;
+ SIZE_T SizeOfImage;
+ ULONG Sequence;
+ ULONG TimeDateStamp;
+ ULONG CheckSum;
+ WCHAR ImageName[32];
+} RTL_UNLOAD_EVENT_TRACE, *PRTL_UNLOAD_EVENT_TRACE;
+
+static RTL_UNLOAD_EVENT_TRACE *(WINAPI *pRtlGetUnloadEventTrace)(void);
+static void (WINAPI *pRtlGetUnloadEventTraceEx)(ULONG **element_size, ULONG **element_count, void **event_trace);
+
#if defined(__x86_64__)
typedef struct
{
@@ -3325,6 +3340,53 @@ static void test_suspend_process(void)
CloseHandle(event2);
}
+static void test_unload_trace(void)
+{
+ static const WCHAR imageW[] = {'m','s','x','m','l','3','.','d','l','l',0};
+ RTL_UNLOAD_EVENT_TRACE *unload_trace, *ptr;
+ ULONG *element_size, *element_count, size;
+ BOOL found = FALSE;
+ HMODULE hmod;
+
+ unload_trace = pRtlGetUnloadEventTrace();
+todo_wine
+ ok(unload_trace != NULL, "Failed to get unload events pointer.\n");
+
+ if (pRtlGetUnloadEventTraceEx)
+ {
+ ptr = NULL;
+ pRtlGetUnloadEventTraceEx(&element_size, &element_count, (void **)&ptr);
+ todo_wine {
+ ok(*element_size >= sizeof(*ptr), "Unexpected element size.\n");
+ ok(*element_count == RTL_UNLOAD_EVENT_TRACE_NUMBER, "Unexpected trace element count %u.\n", *element_count);
+ ok(ptr != NULL, "Unexpected pointer %p.\n", ptr);
+ }
+ size = *element_size;
+ }
+ else
+ size = sizeof(*unload_trace);
+
+ hmod = LoadLibraryA("msxml3.dll");
+ ok(hmod != NULL, "Failed to load library.\n");
+ FreeLibrary(hmod);
+
+if (unload_trace)
+{
+ ptr = unload_trace;
+ while (ptr->BaseAddress != NULL)
+ {
+ if (!lstrcmpW(imageW, ptr->ImageName))
+ {
+ found = TRUE;
+ break;
+ }
+ ptr = (RTL_UNLOAD_EVENT_TRACE *)((char *)ptr + size);
+ }
+}
+todo_wine
+ ok(found, "Unloaded module wasn't found.\n");
+}
+
START_TEST(exception)
{
HMODULE hntdll = GetModuleHandleA("ntdll.dll");
@@ -3346,29 +3408,28 @@ START_TEST(exception)
return;
}
- pNtGetContextThread = (void *)GetProcAddress( hntdll, "NtGetContextThread" );
- pNtSetContextThread = (void *)GetProcAddress( hntdll, "NtSetContextThread" );
- pNtReadVirtualMemory = (void *)GetProcAddress( hntdll, "NtReadVirtualMemory" );
- pNtClose = (void *)GetProcAddress( hntdll, "NtClose" );
- pRtlUnwind = (void *)GetProcAddress( hntdll, "RtlUnwind" );
- pRtlRaiseException = (void *)GetProcAddress( hntdll, "RtlRaiseException" );
- pRtlCaptureContext = (void *)GetProcAddress( hntdll, "RtlCaptureContext" );
- pNtTerminateProcess = (void *)GetProcAddress( hntdll, "NtTerminateProcess" );
- pRtlAddVectoredExceptionHandler = (void *)GetProcAddress( hntdll,
- "RtlAddVectoredExceptionHandler" );
- pRtlRemoveVectoredExceptionHandler = (void *)GetProcAddress( hntdll,
- "RtlRemoveVectoredExceptionHandler" );
- pRtlAddVectoredContinueHandler = (void *)GetProcAddress( hntdll,
- "RtlAddVectoredContinueHandler" );
- pRtlRemoveVectoredContinueHandler = (void *)GetProcAddress( hntdll,
- "RtlRemoveVectoredContinueHandler" );
- pNtQueryInformationProcess = (void*)GetProcAddress( hntdll,
- "NtQueryInformationProcess" );
- pNtSetInformationProcess = (void*)GetProcAddress( hntdll,
- "NtSetInformationProcess" );
+#define X(f) p##f = (void*)GetProcAddress(hntdll, #f)
+ X(NtGetContextThread);
+ X(NtSetContextThread);
+ X(NtReadVirtualMemory);
+ X(NtClose);
+ X(RtlUnwind);
+ X(RtlRaiseException);
+ X(RtlCaptureContext);
+ X(NtTerminateProcess);
+ X(RtlAddVectoredExceptionHandler);
+ X(RtlRemoveVectoredExceptionHandler);
+ X(RtlAddVectoredContinueHandler);
+ X(RtlRemoveVectoredContinueHandler);
+ X(NtQueryInformationProcess);
+ X(NtSetInformationProcess);
+ X(NtSuspendProcess);
+ X(NtResumeProcess);
+ X(RtlGetUnloadEventTrace);
+ X(RtlGetUnloadEventTraceEx);
+#undef X
+
pIsWow64Process = (void *)GetProcAddress(GetModuleHandleA("kernel32.dll"), "IsWow64Process");
- pNtSuspendProcess = (void *)GetProcAddress( hntdll, "NtSuspendProcess" );
- pNtResumeProcess = (void *)GetProcAddress( hntdll, "NtResumeProcess" );
#ifdef __i386__
if (!pIsWow64Process || !pIsWow64Process( GetCurrentProcess(), &is_wow64 )) is_wow64 = FALSE;
@@ -3455,31 +3516,26 @@ START_TEST(exception)
test_thread_context();
test_suspend_thread();
test_suspend_process();
+ test_unload_trace();
#elif defined(__x86_64__)
- pRtlAddFunctionTable = (void *)GetProcAddress( hntdll,
- "RtlAddFunctionTable" );
- pRtlDeleteFunctionTable = (void *)GetProcAddress( hntdll,
- "RtlDeleteFunctionTable" );
- pRtlInstallFunctionTableCallback = (void *)GetProcAddress( hntdll,
- "RtlInstallFunctionTableCallback" );
- pRtlLookupFunctionEntry = (void *)GetProcAddress( hntdll,
- "RtlLookupFunctionEntry" );
- pRtlAddGrowableFunctionTable = (void *)GetProcAddress( hntdll, "RtlAddGrowableFunctionTable" );
- pRtlGrowFunctionTable = (void *)GetProcAddress( hntdll, "RtlGrowFunctionTable" );
- pRtlDeleteGrowableFunctionTable = (void *)GetProcAddress( hntdll, "RtlDeleteGrowableFunctionTable" );
- p__C_specific_handler = (void *)GetProcAddress( hntdll,
- "__C_specific_handler" );
- pRtlCaptureContext = (void *)GetProcAddress( hntdll,
- "RtlCaptureContext" );
- pRtlRestoreContext = (void *)GetProcAddress( hntdll,
- "RtlRestoreContext" );
- pRtlUnwindEx = (void *)GetProcAddress( hntdll,
- "RtlUnwindEx" );
- pRtlWow64GetThreadContext = (void *)GetProcAddress( hntdll,
- "RtlWow64GetThreadContext" );
- pRtlWow64SetThreadContext = (void *)GetProcAddress( hntdll,
- "RtlWow64SetThreadContext" );
+
+#define X(f) p##f = (void*)GetProcAddress(hntdll, #f)
+ X(RtlAddFunctionTable);
+ X(RtlDeleteFunctionTable);
+ X(RtlInstallFunctionTableCallback);
+ X(RtlLookupFunctionEntry);
+ X(RtlAddGrowableFunctionTable);
+ X(RtlGrowFunctionTable);
+ X(RtlDeleteGrowableFunctionTable);
+ X(__C_specific_handler);
+ X(RtlCaptureContext);
+ X(RtlRestoreContext);
+ X(RtlUnwindEx);
+ X(RtlWow64GetThreadContext);
+ X(RtlWow64SetThreadContext);
+#undef X
+
p_setjmp = (void *)GetProcAddress( hmsvcrt,
"_setjmp" );
@@ -3498,6 +3554,7 @@ START_TEST(exception)
test_wow64_context();
test_suspend_thread();
test_suspend_process();
+ test_unload_trace();
if (pRtlAddFunctionTable && pRtlDeleteFunctionTable && pRtlInstallFunctionTableCallback && pRtlLookupFunctionEntry)
test_dynamic_unwind();
--
2.20.1
More information about the wine-devel
mailing list