Author: tfaber Date: Fri Nov 20 17:27:27 2015 New Revision: 69962
URL: http://svn.reactos.org/svn/reactos?rev=69962&view=rev Log: [USER32_DYNAMIC] - Show that user32 keeps an extra reference to itself CORE-10540
Modified: trunk/rostests/apitests/user32_dynamic/load.c
Modified: trunk/rostests/apitests/user32_dynamic/load.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/user32_dynamic/lo... ============================================================================== --- trunk/rostests/apitests/user32_dynamic/load.c [iso-8859-1] (original) +++ trunk/rostests/apitests/user32_dynamic/load.c [iso-8859-1] Fri Nov 20 17:27:27 2015 @@ -6,6 +6,8 @@ */
#include <apitest.h> +#include <ndk/pstypes.h> +#include <ndk/rtlfuncs.h>
START_TEST(load) { @@ -13,6 +15,15 @@ HMODULE hUser32_2; BOOL Ret; DWORD Error; + PPEB Peb = NtCurrentPeb(); + PTEB Teb = NtCurrentTeb(); + + /* Before init */ + hUser32 = GetModuleHandleW(L"user32"); + ok(hUser32 == NULL, "hUser32 = %p\n", hUser32); + ok(Peb->KernelCallbackTable == NULL, "KernelCallbackTable = %p\n", Peb->KernelCallbackTable); + ok(Peb->PostProcessInitRoutine == NULL, "PostProcessInitRoutine = %p\n", Peb->PostProcessInitRoutine); + ok(Teb->Win32ClientInfo != NULL, "Win32ClientInfo = %p\n", Teb->Win32ClientInfo);
SetLastError(12345); hUser32 = LoadLibraryW(L"user32"); @@ -20,30 +31,101 @@ ok(hUser32 != NULL, "LoadLibrary failed\n"); ok(Error != 12345, "Error = %lu\n", Error);
+ /* Initialized */ + hUser32_2 = GetModuleHandleW(L"user32"); + ok(hUser32_2 == hUser32, "hUser32 = %p\n", hUser32); + ok(Peb->KernelCallbackTable != NULL, "KernelCallbackTable = %p\n", Peb->KernelCallbackTable); + ok(Peb->PostProcessInitRoutine == NULL, "PostProcessInitRoutine = %p\n", Peb->PostProcessInitRoutine); + ok(Teb->Win32ClientInfo != NULL, "Win32ClientInfo = %p\n", Teb->Win32ClientInfo); + SetLastError(12345); hUser32_2 = LoadLibraryW(L"user32"); Error = GetLastError(); ok(hUser32_2 == hUser32, "LoadLibrary failed\n"); ok(Error == 12345, "Error = %lu\n", Error);
+ /* Still initialized */ + hUser32_2 = GetModuleHandleW(L"user32"); + ok(hUser32_2 == hUser32, "hUser32 = %p\n", hUser32); + ok(Peb->KernelCallbackTable != NULL, "KernelCallbackTable = %p\n", Peb->KernelCallbackTable); + ok(Peb->PostProcessInitRoutine == NULL, "PostProcessInitRoutine = %p\n", Peb->PostProcessInitRoutine); + ok(Teb->Win32ClientInfo != NULL, "Win32ClientInfo = %p\n", Teb->Win32ClientInfo); + + SetLastError(12345); Ret = FreeLibrary(hUser32); Error = GetLastError(); ok(Ret == TRUE, "FreeLibrary returned %d\n", Ret); ok(Error == 12345, "Error = %lu\n", Error);
+ /* Still initialized */ + hUser32_2 = GetModuleHandleW(L"user32"); + ok(hUser32_2 == hUser32, "hUser32 = %p\n", hUser32); + ok(Peb->KernelCallbackTable != NULL, "KernelCallbackTable = %p\n", Peb->KernelCallbackTable); + ok(Peb->PostProcessInitRoutine == NULL, "PostProcessInitRoutine = %p\n", Peb->PostProcessInitRoutine); + ok(Teb->Win32ClientInfo != NULL, "Win32ClientInfo = %p\n", Teb->Win32ClientInfo); + + SetLastError(12345); Ret = FreeLibrary(hUser32); Error = GetLastError(); ok(Ret == TRUE, "FreeLibrary returned %d\n", Ret); ok(Error == 12345, "Error = %lu\n", Error);
+ /* Somebody kept an extra reference! */ + hUser32_2 = GetModuleHandleW(L"user32"); + ok(hUser32_2 == hUser32, "hUser32 = %p\n", hUser32); + ok(Peb->KernelCallbackTable != NULL, "KernelCallbackTable = %p\n", Peb->KernelCallbackTable); + ok(Peb->PostProcessInitRoutine == NULL, "PostProcessInitRoutine = %p\n", Peb->PostProcessInitRoutine); + ok(Teb->Win32ClientInfo != NULL, "Win32ClientInfo = %p\n", Teb->Win32ClientInfo); + + SetLastError(12345); + Ret = FreeLibrary(hUser32); + Error = GetLastError(); + ok(Ret == TRUE, "FreeLibrary returned %d\n", Ret); + ok(Error == 12345, "Error = %lu\n", Error); + + /* Uninitialized */ + hUser32 = GetModuleHandleW(L"user32"); + ok(hUser32 == NULL, "hUser32 = %p\n", hUser32); + ok(Peb->KernelCallbackTable != NULL, "KernelCallbackTable = %p\n", Peb->KernelCallbackTable); + ok(Peb->PostProcessInitRoutine == NULL, "PostProcessInitRoutine = %p\n", Peb->PostProcessInitRoutine); + ok(Teb->Win32ClientInfo != NULL, "Win32ClientInfo = %p\n", Teb->Win32ClientInfo); + SetLastError(12345); hUser32 = LoadLibraryW(L"user32"); Error = GetLastError(); ok(hUser32 != NULL, "LoadLibrary failed\n"); - ok(Error == 12345, "Error = %lu\n", Error); + ok(Error != 12345, "Error = %lu\n", Error);
+ /* Initialized again */ + hUser32_2 = GetModuleHandleW(L"user32"); + ok(hUser32_2 == hUser32, "hUser32 = %p\n", hUser32); + ok(Peb->KernelCallbackTable != NULL, "KernelCallbackTable = %p\n", Peb->KernelCallbackTable); + ok(Peb->PostProcessInitRoutine == NULL, "PostProcessInitRoutine = %p\n", Peb->PostProcessInitRoutine); + ok(Teb->Win32ClientInfo != NULL, "Win32ClientInfo = %p\n", Teb->Win32ClientInfo); + + SetLastError(12345); Ret = FreeLibrary(hUser32); Error = GetLastError(); ok(Ret == TRUE, "FreeLibrary returned %d\n", Ret); ok(Error == 12345, "Error = %lu\n", Error); + + /* Extra reference again */ + hUser32_2 = GetModuleHandleW(L"user32"); + ok(hUser32_2 == hUser32, "hUser32 = %p\n", hUser32); + ok(Peb->KernelCallbackTable != NULL, "KernelCallbackTable = %p\n", Peb->KernelCallbackTable); + ok(Peb->PostProcessInitRoutine == NULL, "PostProcessInitRoutine = %p\n", Peb->PostProcessInitRoutine); + ok(Teb->Win32ClientInfo != NULL, "Win32ClientInfo = %p\n", Teb->Win32ClientInfo); + + SetLastError(12345); + Ret = FreeLibrary(hUser32); + Error = GetLastError(); + ok(Ret == TRUE, "FreeLibrary returned %d\n", Ret); + ok(Error == 12345, "Error = %lu\n", Error); + + /* Uninitialized again */ + hUser32 = GetModuleHandleW(L"user32"); + ok(hUser32 == NULL, "hUser32 = %p\n", hUser32); + ok(Peb->KernelCallbackTable != NULL, "KernelCallbackTable = %p\n", Peb->KernelCallbackTable); + ok(Peb->PostProcessInitRoutine == NULL, "PostProcessInitRoutine = %p\n", Peb->PostProcessInitRoutine); + ok(Teb->Win32ClientInfo != NULL, "Win32ClientInfo = %p\n", Teb->Win32ClientInfo); }