3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/ps/win32.c
6 * PURPOSE: win32k support
8 * PROGRAMMERS: Eric Kohl (ekohl@rz-online.de)
11 /* INCLUDES ****************************************************************/
15 /* TYPES *******************************************************************/
17 /* GLOBALS ******************************************************************/
19 static PW32_PROCESS_CALLBACK PspWin32ProcessCallback
= NULL
;
20 static PW32_THREAD_CALLBACK PspWin32ThreadCallback
= NULL
;
21 static ULONG PspWin32ProcessSize
= 0;
22 static ULONG PspWin32ThreadSize
= 0;
24 extern OBJECT_CREATE_ROUTINE ExpWindowStationObjectCreate
;
25 extern OBJECT_PARSE_ROUTINE ExpWindowStationObjectParse
;
26 extern OBJECT_DELETE_ROUTINE ExpWindowStationObjectDelete
;
27 extern OBJECT_FIND_ROUTINE ExpWindowStationObjectFind
;
28 extern OBJECT_CREATE_ROUTINE ExpDesktopObjectCreate
;
29 extern OBJECT_DELETE_ROUTINE ExpDesktopObjectDelete
;
31 /* FUNCTIONS ***************************************************************/
34 PsGetWin32Thread(VOID
)
36 return(PsGetCurrentThread()->Tcb
.Win32Thread
);
40 PsGetWin32Process(VOID
)
42 return(PsGetCurrentProcess()->Win32Process
);
46 PsCreateWin32Process(PEPROCESS Process
)
48 if (Process
->Win32Process
!= NULL
)
49 return(STATUS_SUCCESS
);
51 Process
->Win32Process
= ExAllocatePool(NonPagedPool
,
53 if (Process
->Win32Process
== NULL
)
54 return(STATUS_NO_MEMORY
);
56 RtlZeroMemory(Process
->Win32Process
,
59 return(STATUS_SUCCESS
);
67 PsEstablishWin32Callouts (PW32_PROCESS_CALLBACK W32ProcessCallback
,
68 PW32_THREAD_CALLBACK W32ThreadCallback
,
69 PW32_OBJECT_CALLBACK W32ObjectCallback
,
74 PspWin32ProcessCallback
= W32ProcessCallback
;
75 PspWin32ThreadCallback
= W32ThreadCallback
;
77 PspWin32ProcessSize
= W32ProcessSize
;
78 PspWin32ThreadSize
= W32ThreadSize
;
80 ExpWindowStationObjectCreate
= W32ObjectCallback
->WinStaCreate
;
81 ExpWindowStationObjectParse
= W32ObjectCallback
->WinStaParse
;
82 ExpWindowStationObjectDelete
= W32ObjectCallback
->WinStaDelete
;
83 ExpWindowStationObjectFind
= W32ObjectCallback
->WinStaFind
;
84 ExpDesktopObjectCreate
= W32ObjectCallback
->DesktopCreate
;
85 ExpDesktopObjectDelete
= W32ObjectCallback
->DesktopDelete
;
89 PsInitWin32Thread (PETHREAD Thread
)
93 Process
= Thread
->ThreadsProcess
;
95 if (Process
->Win32Process
== NULL
)
97 /* FIXME - lock the process */
98 Process
->Win32Process
= ExAllocatePool (NonPagedPool
,
101 if (Process
->Win32Process
== NULL
)
102 return STATUS_NO_MEMORY
;
104 RtlZeroMemory (Process
->Win32Process
,
105 PspWin32ProcessSize
);
106 /* FIXME - unlock the process */
108 if (PspWin32ProcessCallback
!= NULL
)
110 PspWin32ProcessCallback (Process
, TRUE
);
114 if (Thread
->Tcb
.Win32Thread
== NULL
)
116 Thread
->Tcb
.Win32Thread
= ExAllocatePool (NonPagedPool
,
118 if (Thread
->Tcb
.Win32Thread
== NULL
)
119 return STATUS_NO_MEMORY
;
121 RtlZeroMemory (Thread
->Tcb
.Win32Thread
,
124 if (PspWin32ThreadCallback
!= NULL
)
126 PspWin32ThreadCallback (Thread
, TRUE
);
130 return(STATUS_SUCCESS
);
135 PsTerminateWin32Process (PEPROCESS Process
)
137 if (Process
->Win32Process
== NULL
)
140 if (PspWin32ProcessCallback
!= NULL
)
142 PspWin32ProcessCallback (Process
, FALSE
);
145 /* don't delete the W32PROCESS structure at this point, wait until the
146 EPROCESS structure is being freed */
151 PsTerminateWin32Thread (PETHREAD Thread
)
153 if (Thread
->Tcb
.Win32Thread
!= NULL
)
155 if (PspWin32ThreadCallback
!= NULL
)
157 PspWin32ThreadCallback (Thread
, FALSE
);
160 /* don't delete the W32THREAD structure at this point, wait until the
161 ETHREAD structure is being freed */