mirror of
https://github.com/reactos/reactos.git
synced 2025-01-05 22:12:46 +00:00
- Move Process Information structure back into kernel space. We use client information via TEB to provide a pointer for user space as a reference pointer.
svn path=/trunk/; revision=41051
This commit is contained in:
parent
e7a4eae2bb
commit
bde03977f6
5 changed files with 23 additions and 66 deletions
|
@ -1,7 +1,7 @@
|
||||||
#ifndef __WIN32K_NTUSER_H
|
#ifndef __WIN32K_NTUSER_H
|
||||||
#define __WIN32K_NTUSER_H
|
#define __WIN32K_NTUSER_H
|
||||||
|
|
||||||
struct _PROCESSINFO;
|
typedef struct _PROCESSINFO *PPROCESSINFO;
|
||||||
struct _W32THREADINFO;
|
struct _W32THREADINFO;
|
||||||
struct _WINDOW;
|
struct _WINDOW;
|
||||||
|
|
||||||
|
@ -335,20 +335,6 @@ typedef struct _SERVERINFO
|
||||||
DWORD SrvEventActivity;
|
DWORD SrvEventActivity;
|
||||||
} SERVERINFO, *PSERVERINFO;
|
} SERVERINFO, *PSERVERINFO;
|
||||||
|
|
||||||
typedef struct _PROCESSINFO
|
|
||||||
{
|
|
||||||
PVOID UserHandleTable;
|
|
||||||
HANDLE hUserHeap;
|
|
||||||
ULONG_PTR UserHeapDelta;
|
|
||||||
HINSTANCE hModUser;
|
|
||||||
PWINDOWCLASS LocalClassList;
|
|
||||||
PWINDOWCLASS GlobalClassList;
|
|
||||||
PWINDOWCLASS SystemClassList;
|
|
||||||
|
|
||||||
UINT RegisteredSysClasses : 1;
|
|
||||||
|
|
||||||
} PROCESSINFO, *PPROCESSINFO;
|
|
||||||
|
|
||||||
#define CTI_INSENDMESSAGE 0x0002
|
#define CTI_INSENDMESSAGE 0x0002
|
||||||
|
|
||||||
typedef struct _CLIENTTHREADINFO
|
typedef struct _CLIENTTHREADINFO
|
||||||
|
|
|
@ -94,4 +94,17 @@ typedef struct _W32PROCESS
|
||||||
PPROCESSINFO ProcessInfo;
|
PPROCESSINFO ProcessInfo;
|
||||||
} W32PROCESS, *PW32PROCESS;
|
} W32PROCESS, *PW32PROCESS;
|
||||||
|
|
||||||
|
typedef struct _PROCESSINFO
|
||||||
|
{
|
||||||
|
W32PROCESS XzyxW32Process; /* Place holder. */
|
||||||
|
/* ReactOS */
|
||||||
|
HINSTANCE hModUser;
|
||||||
|
PWINDOWCLASS LocalClassList;
|
||||||
|
PWINDOWCLASS GlobalClassList;
|
||||||
|
PWINDOWCLASS SystemClassList;
|
||||||
|
|
||||||
|
UINT RegisteredSysClasses : 1;
|
||||||
|
|
||||||
|
} PROCESSINFO;
|
||||||
|
|
||||||
#endif /* __INCLUDE_NAPI_WIN32_H */
|
#endif /* __INCLUDE_NAPI_WIN32_H */
|
||||||
|
|
|
@ -67,12 +67,12 @@ Win32kProcessCallback(struct _EPROCESS *Process,
|
||||||
{
|
{
|
||||||
/* FIXME - lock the process */
|
/* FIXME - lock the process */
|
||||||
Win32Process = ExAllocatePoolWithTag(NonPagedPool,
|
Win32Process = ExAllocatePoolWithTag(NonPagedPool,
|
||||||
sizeof(W32PROCESS),
|
sizeof(PROCESSINFO),
|
||||||
TAG('W', '3', '2', 'p'));
|
TAG('W', '3', '2', 'p'));
|
||||||
|
|
||||||
if (Win32Process == NULL) RETURN( STATUS_NO_MEMORY);
|
if (Win32Process == NULL) RETURN( STATUS_NO_MEMORY);
|
||||||
|
|
||||||
RtlZeroMemory(Win32Process, sizeof(W32PROCESS));
|
RtlZeroMemory(Win32Process, sizeof(PROCESSINFO));
|
||||||
|
|
||||||
PsSetProcessWin32Process(Process, Win32Process);
|
PsSetProcessWin32Process(Process, Win32Process);
|
||||||
/* FIXME - unlock the process */
|
/* FIXME - unlock the process */
|
||||||
|
@ -152,12 +152,6 @@ Win32kProcessCallback(struct _EPROCESS *Process,
|
||||||
{
|
{
|
||||||
LogonProcess = NULL;
|
LogonProcess = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Win32Process->ProcessInfo != NULL)
|
|
||||||
{
|
|
||||||
UserHeapFree(Win32Process->ProcessInfo);
|
|
||||||
Win32Process->ProcessInfo = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RETURN( STATUS_SUCCESS);
|
RETURN( STATUS_SUCCESS);
|
||||||
|
@ -339,12 +333,12 @@ Win32kInitWin32Thread(PETHREAD Thread)
|
||||||
if (Process->Win32Process == NULL)
|
if (Process->Win32Process == NULL)
|
||||||
{
|
{
|
||||||
/* FIXME - lock the process */
|
/* FIXME - lock the process */
|
||||||
Process->Win32Process = ExAllocatePool(NonPagedPool, sizeof(W32PROCESS));
|
Process->Win32Process = ExAllocatePool(NonPagedPool, sizeof(PROCESSINFO));
|
||||||
|
|
||||||
if (Process->Win32Process == NULL)
|
if (Process->Win32Process == NULL)
|
||||||
return STATUS_NO_MEMORY;
|
return STATUS_NO_MEMORY;
|
||||||
|
|
||||||
RtlZeroMemory(Process->Win32Process, sizeof(W32PROCESS));
|
RtlZeroMemory(Process->Win32Process, sizeof(PROCESSINFO));
|
||||||
/* FIXME - unlock the process */
|
/* FIXME - unlock the process */
|
||||||
|
|
||||||
Win32kProcessCallback(Process, TRUE);
|
Win32kProcessCallback(Process, TRUE);
|
||||||
|
|
|
@ -463,43 +463,7 @@ IntFreeNULLTerminatedFromUnicodeString(PWSTR NullTerminated, PUNICODE_STRING Uni
|
||||||
PPROCESSINFO
|
PPROCESSINFO
|
||||||
GetW32ProcessInfo(VOID)
|
GetW32ProcessInfo(VOID)
|
||||||
{
|
{
|
||||||
PPROCESSINFO pi;
|
return (PPROCESSINFO)PsGetCurrentProcessWin32Process();
|
||||||
PW32PROCESS W32Process = PsGetCurrentProcessWin32Process();
|
|
||||||
|
|
||||||
if (W32Process == NULL)
|
|
||||||
{
|
|
||||||
/* FIXME - temporary hack for system threads... */
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (W32Process->ProcessInfo == NULL)
|
|
||||||
{
|
|
||||||
pi = UserHeapAlloc(sizeof(PROCESSINFO));
|
|
||||||
if (pi != NULL)
|
|
||||||
{
|
|
||||||
RtlZeroMemory(pi,
|
|
||||||
sizeof(PROCESSINFO));
|
|
||||||
|
|
||||||
/* initialize it */
|
|
||||||
pi->UserHandleTable = gHandleTable;
|
|
||||||
pi->hUserHeap = W32Process->HeapMappings.KernelMapping;
|
|
||||||
pi->UserHeapDelta = (ULONG_PTR)W32Process->HeapMappings.KernelMapping -
|
|
||||||
(ULONG_PTR)W32Process->HeapMappings.UserMapping;
|
|
||||||
|
|
||||||
if (InterlockedCompareExchangePointer(&W32Process->ProcessInfo,
|
|
||||||
pi,
|
|
||||||
NULL) != NULL)
|
|
||||||
{
|
|
||||||
UserHeapFree(pi);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return W32Process->ProcessInfo;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PW32THREADINFO
|
PW32THREADINFO
|
||||||
|
|
|
@ -893,12 +893,13 @@ NtUserProcessConnect(
|
||||||
{
|
{
|
||||||
UserEnterShared();
|
UserEnterShared();
|
||||||
GetW32ThreadInfo();
|
GetW32ThreadInfo();
|
||||||
PPROCESSINFO ppi = GetW32ProcessInfo();
|
PW32PROCESS W32Process = PsGetCurrentProcessWin32Process();
|
||||||
_SEH2_TRY
|
_SEH2_TRY
|
||||||
{
|
{
|
||||||
pUserConnect->siClient.psi = gpsi;
|
pUserConnect->siClient.psi = gpsi;
|
||||||
pUserConnect->siClient.aheList = ppi->UserHandleTable;
|
pUserConnect->siClient.aheList = gHandleTable;
|
||||||
pUserConnect->siClient.ulSharedDelta = ppi->UserHeapDelta;
|
pUserConnect->siClient.ulSharedDelta = (ULONG_PTR)W32Process->HeapMappings.KernelMapping -
|
||||||
|
(ULONG_PTR)W32Process->HeapMappings.UserMapping;
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
|
@ -909,7 +910,6 @@ NtUserProcessConnect(
|
||||||
{
|
{
|
||||||
SetLastNtError(Status);
|
SetLastNtError(Status);
|
||||||
}
|
}
|
||||||
DPRINT("NtUserPC SI 0x%x : HT 0x%x : D 0x%x\n", gpsi, ppi->UserHandleTable, ppi->UserHeapDelta);
|
|
||||||
UserLeave();
|
UserLeave();
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue