- 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
BOOL
(CALLBACK *BASE_PROCESS_CREATE_NOTIFY_ROUTINE)(
(NTAPI *BASE_PROCESS_CREATE_NOTIFY_ROUTINE)(
HANDLE NewProcessId,
HANDLE ParentThreadId,
ULONG dwUnknown,

View file

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

View file

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

View file

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