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/l…
==============================================================================
--- 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);
}