- 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,8 +2521,8 @@ BOOL
NTAPI NTAPI
NtUserNotifyProcessCreate( NtUserNotifyProcessCreate(
HANDLE NewProcessId, HANDLE NewProcessId,
HANDLE SourceThreadId, HANDLE ParentThreadId,
DWORD dwUnknown, ULONG dwUnknown,
ULONG CreateFlags); ULONG CreateFlags);
VOID VOID

View file

@ -725,34 +725,43 @@ NtUserProcessConnect(
DWORD Size) DWORD Size)
{ {
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
TRACE("NtUserProcessConnect\n");
if (pUserConnect && ( Size == sizeof(USERCONNECT) ))
{
PPROCESSINFO W32Process; PPROCESSINFO W32Process;
TRACE("NtUserProcessConnect\n");
if ( pUserConnect == NULL ||
Size != sizeof(*pUserConnect) )
{
return STATUS_UNSUCCESSFUL;
}
UserEnterShared(); UserEnterShared();
GetW32ThreadInfo();
W32Process = PsGetCurrentProcessWin32Process(); W32Process = PsGetCurrentProcessWin32Process();
_SEH2_TRY _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.KernelMapping -
(ULONG_PTR)W32Process->HeapMappings.UserMapping; (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(); UserLeave();
return Status; return Status;
} }
return STATUS_UNSUCCESSFUL;
}
NTSTATUS NTSTATUS
APIENTRY APIENTRY

View file

@ -240,6 +240,8 @@ ClientThreadSetup(VOID)
// continue as normal. // continue as normal.
// //
GetConnected();
UNIMPLEMENTED; UNIMPLEMENTED;
return TRUE; return TRUE;
} }
@ -247,16 +249,25 @@ ClientThreadSetup(VOID)
BOOL BOOL
Init(VOID) Init(VOID)
{ {
NTSTATUS Status;
USERCONNECT UserCon; USERCONNECT UserCon;
TRACE("user32::Init()\n");
/* Set PEB data */ /* Set PEB data */
NtCurrentPeb()->KernelCallbackTable = apfnDispatch; NtCurrentPeb()->KernelCallbackTable = apfnDispatch;
NtCurrentPeb()->PostProcessInitRoutine = NULL; NtCurrentPeb()->PostProcessInitRoutine = NULL;
NtUserProcessConnect( NtCurrentProcess(), /* Minimal setup of the connect info structure */
&UserCon, UserCon.ulVersion = USER_VERSION;
sizeof(USERCONNECT));
/* Connect to win32k */
Status = NtUserProcessConnect(NtCurrentProcess(),
&UserCon,
sizeof(UserCon));
if (!NT_SUCCESS(Status)) return FALSE;
/* Retrieve data */
g_ppi = GetWin32ClientInfo()->ppi; // Snapshot PI, used as pointer only! g_ppi = GetWin32ClientInfo()->ppi; // Snapshot PI, used as pointer only!
g_ulSharedDelta = UserCon.siClient.ulSharedDelta; g_ulSharedDelta = UserCon.siClient.ulSharedDelta;
gpsi = SharedPtrToUser(UserCon.siClient.psi); gpsi = SharedPtrToUser(UserCon.siClient.psi);
@ -267,10 +278,11 @@ Init(VOID)
//ERR("1 SI 0x%x : HT 0x%x : D 0x%x\n", UserCon.siClient.psi, UserCon.siClient.aheList, g_ulSharedDelta); //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. */ /* Allocate an index for user32 thread local data */
User32TlsIndex = TlsAlloc(); User32TlsIndex = TlsAlloc();
if (User32TlsIndex != TLS_OUT_OF_INDEXES) if (User32TlsIndex == TLS_OUT_OF_INDEXES)
{ return FALSE;
if (MessageInit()) if (MessageInit())
{ {
if (MenuInit()) if (MenuInit())
@ -281,9 +293,8 @@ Init(VOID)
} }
MessageCleanup(); MessageCleanup();
} }
TlsFree(User32TlsIndex);
}
TlsFree(User32TlsIndex);
return FALSE; return FALSE;
} }
@ -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)
{ {
NTSTATUS Status;
USERCONNECT UserCon; USERCONNECT UserCon;
TRACE("user32::GetConnected()\n");
if ((PTHREADINFO)NtCurrentTeb()->Win32ThreadInfo == NULL) if ((PTHREADINFO)NtCurrentTeb()->Win32ThreadInfo == NULL)
NtUserGetThreadState(THREADSTATE_GETTHREADINFO); NtUserGetThreadState(THREADSTATE_GETTHREADINFO);
if (gpsi && g_ppi) return; if (gpsi && g_ppi) return;
NtUserProcessConnect( NtCurrentProcess(), /* Minimal setup of the connect info structure */
&UserCon, UserCon.ulVersion = USER_VERSION;
sizeof(USERCONNECT));
g_ppi = GetWin32ClientInfo()->ppi; /* 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; g_ulSharedDelta = UserCon.siClient.ulSharedDelta;
gpsi = SharedPtrToUser(UserCon.siClient.psi); gpsi = SharedPtrToUser(UserCon.siClient.psi);
gHandleTable = SharedPtrToUser(UserCon.siClient.aheList); gHandleTable = SharedPtrToUser(UserCon.siClient.aheList);
gHandleEntries = SharedPtrToUser(gHandleTable->handles); gHandleEntries = SharedPtrToUser(gHandleTable->handles);
} }
NTSTATUS NTSTATUS