Index: subsystems/win32/csrss/csrsrv/api/wapi.c =================================================================== --- subsystems/win32/csrss/csrsrv/api/wapi.c (révision 57641) +++ subsystems/win32/csrss/csrsrv/api/wapi.c (copie de travail) @@ -16,6 +16,8 @@ /* GLOBALS *******************************************************************/ +BOOLEAN (*CsrClientThreadSetup)(VOID) = NULL; + static unsigned ApiDefinitionsCount = 0; static PCSRSS_API_DEFINITION ApiDefinitions = NULL; UNICODE_STRING CsrApiPortName; @@ -864,18 +866,21 @@ { PTEB Teb = NtCurrentTeb(); PCSR_THREAD CsrThread; -#if 0 - NTSTATUS Status; + + NTSTATUS Status = STATUS_SUCCESS; ANSI_STRING DllName; UNICODE_STRING TempName; HANDLE hUser32; STRING StartupName; + BOOLEAN Connected = FALSE; + DPRINT("CsrConnectToUser\n"); + /* Check if we didn't already find it */ if (!CsrClientThreadSetup) { /* Get the DLL Handle for user32.dll */ - RtlInitAnsiString(&DllName, "user32"); + RtlInitAnsiString(&DllName, "user32.dll"); RtlAnsiStringToUnicodeString(&TempName, &DllName, TRUE); Status = LdrGetDllHandle(NULL, NULL, @@ -883,7 +888,7 @@ &hUser32); RtlFreeUnicodeString(&TempName); - /* If we got teh handle, get the Client Thread Startup Entrypoint */ + /* If we got the handle, get the Client Thread Startup Entrypoint */ if (NT_SUCCESS(Status)) { RtlInitAnsiString(&StartupName,"ClientThreadSetup"); @@ -895,8 +900,22 @@ } /* Connect to user32 */ - CsrClientThreadSetup(); -#endif + if (NT_SUCCESS(Status)) + { + DPRINT("User32.DLL loaded!\n"); + Connected = CsrClientThreadSetup(); + } + else + { + DPRINT("User32.DLL did not load!\n"); + } + + if (!Connected) + { + DPRINT1("CSRSS: CsrConnectToUser failed\n"); + return NULL; + } + /* Save pointer to this thread in TEB */ CsrThread = CsrLocateThreadInProcess(NULL, &Teb->ClientId); if (CsrThread) Teb->CsrClientThread = CsrThread; Index: win32ss/user/ntuser/ntstubs.c =================================================================== --- win32ss/user/ntuser/ntstubs.c (révision 57641) +++ win32ss/user/ntuser/ntstubs.c (copie de travail) @@ -713,6 +713,16 @@ UserEnterShared(); GetW32ThreadInfo(); W32Process = PsGetCurrentProcessWin32Process(); + + /* This needs to be called from CsrProcess. */ + if (CsrProcess == PsGetCurrentProcess()) + { + DPRINT1("Same CsrProcess! CsrProcess: 0x%x\n", CsrProcess); + } + else + { + DPRINT1("Not CsrProcess! CsrProcess: 0x%x CurProc: 0x%x\n",CsrProcess, PsGetCurrentProcess()); + } _SEH2_TRY { pUserConnect->siClient.psi = gpsi; Index: win32ss/user/ntuser/ntuser.c =================================================================== --- win32ss/user/ntuser/ntuser.c (révision 57641) +++ win32ss/user/ntuser/ntuser.c (copie de travail) @@ -102,7 +102,17 @@ HBITMAP hPattern55AABitmap = NULL; NTSTATUS Status; + PPROCESSINFO ppi; + + CsrInit(); // 1 + + ppi = PsGetProcessWin32Process(CsrProcess); + // Set W32PF_Flags |= (W32PF_READSCREENACCESSGRANTED | W32PF_IOWINSTA) + /* TODO: DPI aware is not supported. */ + ppi->W32PF_flags |= (W32PF_DPIAWARE | W32PF_READSCREENACCESSGRANTED | W32PF_IOWINSTA); + + // Create Event for Diconnect Desktop. Status = UserCreateWinstaDirectoy(); @@ -121,20 +131,19 @@ // Create ThreadInfo for this Thread! // { - GetW32ThreadInfo(); + GetW32ThreadInfo(); // 2 + NtUserUpdatePerUserSystemParameters(0, TRUE); // 3 // Callback to User32 Client Thread Setup + if (!NT_SUCCESS(co_IntClientThreadSetup())) // 4 + { + DPRINT1("Error Client Thread Setup.\n"); + } - co_IntClientThreadSetup(); - // } // Set Global SERVERINFO Error flags. // Load Resources. - NtUserUpdatePerUserSystemParameters(0, TRUE); - - CsrInit(); - if (gpsi->hbrGray == NULL) { hPattern55AABitmap = GreCreateBitmap(8, 8, 1, 1, (LPBYTE)wPattern55AA); @@ -147,7 +156,7 @@ } /* - Called from win32csr. + Called from win32csr:Win32CsrInitialization. */ NTSTATUS APIENTRY Index: win32ss/user/user32/misc/dllmain.c =================================================================== --- win32ss/user/user32/misc/dllmain.c (révision 57641) +++ win32ss/user/user32/misc/dllmain.c (copie de travail) @@ -222,22 +222,28 @@ KernelCallbackTable[USER32_CALLBACK_GETCHARSETINFO] = (PVOID)User32CallGetCharsetInfo; - NtUserProcessConnect( NtCurrentProcess(), - &UserCon, - sizeof(USERCONNECT)); + if (!gpsi && !g_ppi) + { + // ERR("User DllMain Running!\n"); + // Never called from CsrProcess or it seems not called! - g_ppi = GetWin32ClientInfo()->ppi; // Snapshot PI, used as pointer only! - g_ulSharedDelta = UserCon.siClient.ulSharedDelta; - gpsi = SharedPtrToUser(UserCon.siClient.psi); - gHandleTable = SharedPtrToUser(UserCon.siClient.aheList); - gHandleEntries = SharedPtrToUser(gHandleTable->handles); + NtUserProcessConnect(NtCurrentProcess(), + &UserCon, + sizeof(USERCONNECT)); - RtlInitializeCriticalSection(&gcsUserApiHook); - gfServerProcess = FALSE; // FIXME HAX! Used in CsrClientConnectToServer(,,,,&gfServerProcess); + g_ppi = GetWin32ClientInfo()->ppi; // Snapshot PI, used as pointer only! + g_ulSharedDelta = UserCon.siClient.ulSharedDelta; + gpsi = SharedPtrToUser(UserCon.siClient.psi); + gHandleTable = SharedPtrToUser(UserCon.siClient.aheList); + gHandleEntries = SharedPtrToUser(gHandleTable->handles); - //CsrClientConnectToServer(L"\\Windows", 0, NULL, 0, &gfServerProcess); - //ERR("1 SI 0x%x : HT 0x%x : D 0x%x\n", UserCon.siClient.psi, UserCon.siClient.aheList, g_ulSharedDelta); + RtlInitializeCriticalSection(&gcsUserApiHook); + gfServerProcess = FALSE; // FIXME HAX! Used in CsrClientConnectToServer(,,,,&gfServerProcess); + //CsrClientConnectToServer(L"\\Windows", 0, NULL, 0, &gfServerProcess); + //ERR("1 SI 0x%x : HT 0x%x : D 0x%x\n", UserCon.siClient.psi, UserCon.siClient.aheList, g_ulSharedDelta); + } + /* Allocate an index for user32 thread local data. */ User32TlsIndex = TlsAlloc(); if (User32TlsIndex != TLS_OUT_OF_INDEXES) @@ -324,16 +330,17 @@ FASTCALL GetConnected(VOID) { - USERCONNECT UserCon; +////////////////////////////////////////////////////////// USERCONNECT UserCon; // ERR("GetConnected\n"); if ((PTHREADINFO)NtCurrentTeb()->Win32ThreadInfo == NULL) NtUserGetThreadState(THREADSTATE_GETTHREADINFO); - if (gpsi && g_ppi) return; -// FIXME HAX: Due to the "Dll Initialization Bug" we have to call this too. - GdiDllInitialize(NULL, DLL_PROCESS_ATTACH, NULL); +////////////////////////////////////////////////////////// if (gpsi && g_ppi) return; +////////////////////////////////////////////////////////// // FIXME HAX: Due to the "Dll Initialization Bug" we have to call this too. +////////////////////////////////////////////////////////// GdiDllInitialize(NULL, DLL_PROCESS_ATTACH, NULL); +/* NtUserProcessConnect( NtCurrentProcess(), &UserCon, sizeof(USERCONNECT)); @@ -343,14 +350,36 @@ gpsi = SharedPtrToUser(UserCon.siClient.psi); gHandleTable = SharedPtrToUser(UserCon.siClient.aheList); gHandleEntries = SharedPtrToUser(gHandleTable->handles); - +*/ + + return; } +/* + * @implemented + */ +BOOL +WINAPI +ClientThreadSetup(VOID) +{ + // Always called from CsrProcess server! + // DllMain is called before ClientThreadSetup or the win32k callback. + ERR("ClientThreadSetup\n"); + + if (gpsi && g_ppi) + { + ERR("Already Setup!\n"); + return TRUE; + } + return TRUE; +} + NTSTATUS WINAPI User32CallClientThreadSetupFromKernel(PVOID Arguments, ULONG ArgumentLength) { - ERR("GetConnected\n"); + ERR("Win32k Call GetConnected\n"); + ClientThreadSetup(); return ZwCallbackReturn(NULL, 0, STATUS_SUCCESS); } Index: win32ss/user/user32/misc/stubs.c =================================================================== --- win32ss/user/user32/misc/stubs.c (révision 57641) +++ win32ss/user/user32/misc/stubs.c (copie de travail) @@ -222,17 +222,6 @@ /* * @unimplemented */ -BOOL -WINAPI -ClientThreadSetup ( VOID ) -{ - UNIMPLEMENTED; - return FALSE; -} - -/* - * @unimplemented - */ UINT WINAPI GetRawInputDeviceInfoW(