- Code formatting for NtUserProcessConnect.
[USER32]
- Hack a call to GetConnected in ClientThreadSetup in an attempt to temporarily "fix" a bug that makes the bots fail. Now we really need to fix user32 init!

svn path=/trunk/; revision=65714
This commit is contained in:
Hermès Bélusca-Maïto 2014-12-18 00:30:27 +00:00
parent 5b624b75db
commit c6fccde6d2
4 changed files with 101 additions and 70 deletions

View file

@ -13,7 +13,7 @@
typedef typedef
BOOL BOOL
(CALLBACK *BASE_PROCESS_CREATE_NOTIFY_ROUTINE)( (NTAPI *BASE_PROCESS_CREATE_NOTIFY_ROUTINE)(
HANDLE NewProcessId, HANDLE NewProcessId,
HANDLE ParentThreadId, HANDLE ParentThreadId,
ULONG dwUnknown, ULONG dwUnknown,

View file

@ -2521,9 +2521,9 @@ BOOL
NTAPI NTAPI
NtUserNotifyProcessCreate( NtUserNotifyProcessCreate(
HANDLE NewProcessId, HANDLE NewProcessId,
HANDLE SourceThreadId, HANDLE ParentThreadId,
DWORD dwUnknown, ULONG dwUnknown,
ULONG CreateFlags); ULONG CreateFlags);
VOID VOID
NTAPI NTAPI

View file

@ -724,34 +724,43 @@ NtUserProcessConnect(
PUSERCONNECT pUserConnect, PUSERCONNECT pUserConnect,
DWORD Size) DWORD Size)
{ {
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
TRACE("NtUserProcessConnect\n"); PPROCESSINFO W32Process;
if (pUserConnect && ( Size == sizeof(USERCONNECT) ))
{ TRACE("NtUserProcessConnect\n");
PPROCESSINFO W32Process;
UserEnterShared(); if ( pUserConnect == NULL ||
GetW32ThreadInfo(); Size != sizeof(*pUserConnect) )
W32Process = PsGetCurrentProcessWin32Process(); {
_SEH2_TRY return STATUS_UNSUCCESSFUL;
{ }
UserEnterShared();
W32Process = PsGetCurrentProcessWin32Process();
_SEH2_TRY
{
// FIXME: Check that pUserConnect->ulVersion == USER_VERSION;
pUserConnect->siClient.psi = gpsi; pUserConnect->siClient.psi = gpsi;
pUserConnect->siClient.aheList = gHandleTable; pUserConnect->siClient.aheList = gHandleTable;
pUserConnect->siClient.ulSharedDelta = (ULONG_PTR)W32Process->HeapMappings.KernelMapping - pUserConnect->siClient.ulSharedDelta =
(ULONG_PTR)W32Process->HeapMappings.UserMapping; (ULONG_PTR)W32Process->HeapMappings.KernelMapping -
} (ULONG_PTR)W32Process->HeapMappings.UserMapping;
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) }
{ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
Status = _SEH2_GetExceptionCode(); Status = _SEH2_GetExceptionCode();
} }
_SEH2_END _SEH2_END;
if (!NT_SUCCESS(Status))
{ if (!NT_SUCCESS(Status))
{
SetLastNtError(Status); SetLastNtError(Status);
} }
UserLeave();
return Status; UserLeave();
} return Status;
return STATUS_UNSUCCESSFUL;
} }
NTSTATUS NTSTATUS

View file

@ -240,6 +240,8 @@ ClientThreadSetup(VOID)
// continue as normal. // continue as normal.
// //
GetConnected();
UNIMPLEMENTED; UNIMPLEMENTED;
return TRUE; return TRUE;
} }
@ -247,44 +249,53 @@ ClientThreadSetup(VOID)
BOOL BOOL
Init(VOID) Init(VOID)
{ {
USERCONNECT UserCon; NTSTATUS Status;
USERCONNECT UserCon;
/* Set PEB data */ TRACE("user32::Init()\n");
NtCurrentPeb()->KernelCallbackTable = apfnDispatch;
NtCurrentPeb()->PostProcessInitRoutine = NULL;
NtUserProcessConnect( NtCurrentProcess(), /* Set PEB data */
&UserCon, NtCurrentPeb()->KernelCallbackTable = apfnDispatch;
sizeof(USERCONNECT)); NtCurrentPeb()->PostProcessInitRoutine = NULL;
g_ppi = GetWin32ClientInfo()->ppi; // Snapshot PI, used as pointer only! /* Minimal setup of the connect info structure */
g_ulSharedDelta = UserCon.siClient.ulSharedDelta; UserCon.ulVersion = USER_VERSION;
gpsi = SharedPtrToUser(UserCon.siClient.psi);
gHandleTable = SharedPtrToUser(UserCon.siClient.aheList);
gHandleEntries = SharedPtrToUser(gHandleTable->handles);
RtlInitializeCriticalSection(&gcsUserApiHook); /* Connect to win32k */
Status = NtUserProcessConnect(NtCurrentProcess(),
&UserCon,
sizeof(UserCon));
if (!NT_SUCCESS(Status)) return FALSE;
//ERR("1 SI 0x%x : HT 0x%x : D 0x%x\n", UserCon.siClient.psi, UserCon.siClient.aheList, g_ulSharedDelta); /* Retrieve data */
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);
/* Allocate an index for user32 thread local data. */ RtlInitializeCriticalSection(&gcsUserApiHook);
User32TlsIndex = TlsAlloc();
if (User32TlsIndex != TLS_OUT_OF_INDEXES) //ERR("1 SI 0x%x : HT 0x%x : D 0x%x\n", UserCon.siClient.psi, UserCon.siClient.aheList, g_ulSharedDelta);
{
if (MessageInit()) /* Allocate an index for user32 thread local data */
{ User32TlsIndex = TlsAlloc();
if (MenuInit()) if (User32TlsIndex == TLS_OUT_OF_INDEXES)
{ return FALSE;
if (MessageInit())
{
if (MenuInit())
{
InitializeCriticalSection(&U32AccelCacheLock); InitializeCriticalSection(&U32AccelCacheLock);
LoadAppInitDlls(); LoadAppInitDlls();
return TRUE; return TRUE;
} }
MessageCleanup(); MessageCleanup();
} }
TlsFree(User32TlsIndex);
}
return FALSE; TlsFree(User32TlsIndex);
return FALSE;
} }
VOID VOID
@ -324,6 +335,9 @@ DllMain(
/* Don't bother us for each thread */ /* Don't bother us for each thread */
DisableThreadLibraryCalls(hInstanceDll); DisableThreadLibraryCalls(hInstanceDll);
/* Minimal setup of the connect info structure */
ConnectInfo.ulVersion = USER_VERSION;
/* Setup the Object Directory path */ /* Setup the Object Directory path */
if (!SessionId) if (!SessionId)
{ {
@ -373,32 +387,40 @@ DllMain(
} }
} }
/* Finally init GDI */ /* Finally, initialize GDI */
return GdiDllInitialize(hInstanceDll, dwReason, reserved); return GdiDllInitialize(hInstanceDll, dwReason, reserved);
} }
// FIXME: This function seems to be unused... // FIXME: This function IS A BIIG HACK!!
VOID VOID
FASTCALL FASTCALL
GetConnected(VOID) GetConnected(VOID)
{ {
USERCONNECT UserCon; NTSTATUS Status;
USERCONNECT UserCon;
if ((PTHREADINFO)NtCurrentTeb()->Win32ThreadInfo == NULL) TRACE("user32::GetConnected()\n");
NtUserGetThreadState(THREADSTATE_GETTHREADINFO);
if (gpsi && g_ppi) return; if ((PTHREADINFO)NtCurrentTeb()->Win32ThreadInfo == NULL)
NtUserGetThreadState(THREADSTATE_GETTHREADINFO);
NtUserProcessConnect( NtCurrentProcess(), if (gpsi && g_ppi) return;
&UserCon,
sizeof(USERCONNECT));
g_ppi = GetWin32ClientInfo()->ppi; /* Minimal setup of the connect info structure */
g_ulSharedDelta = UserCon.siClient.ulSharedDelta; UserCon.ulVersion = USER_VERSION;
gpsi = SharedPtrToUser(UserCon.siClient.psi);
gHandleTable = SharedPtrToUser(UserCon.siClient.aheList);
gHandleEntries = SharedPtrToUser(gHandleTable->handles);
/* Connect to win32k */
Status = NtUserProcessConnect(NtCurrentProcess(),
&UserCon,
sizeof(UserCon));
if (!NT_SUCCESS(Status)) return;
/* Retrieve data */
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);
} }
NTSTATUS NTSTATUS