ReactOS  0.4.15-dev-4927-gfe8f806
main.c File Reference
#include <win32k.h>
#include <napi.h>
#include <debug.h>
#include <kdros.h>
Include dependency graph for main.c:

Go to the source code of this file.

Macros

#define NDEBUG
 
#define NT_ROF(x)
 
#define USERLOCK_AND_ROF(x)
 

Functions

NTSTATUS ExitProcessCallback (PEPROCESS Process)
 
NTSTATUS NTAPI ExitThreadCallback (PETHREAD Thread)
 
NTSTATUS GdiProcessCreate (PEPROCESS Process)
 
NTSTATUS GdiProcessDestroy (PEPROCESS Process)
 
NTSTATUS GdiThreadCreate (PETHREAD Thread)
 
NTSTATUS GdiThreadDestroy (PETHREAD Thread)
 
NTSTATUS AllocW32Process (IN PEPROCESS Process, OUT PPROCESSINFO *W32Process)
 
VOID UserDeleteW32Process (_Pre_notnull_ __drv_freesMem(Mem) PPROCESSINFO ppiCurrent)
 
NTSTATUS UserProcessCreate (PEPROCESS Process)
 
NTSTATUS UserProcessDestroy (PEPROCESS Process)
 
NTSTATUS InitProcessCallback (PEPROCESS Process)
 
NTSTATUS APIENTRY Win32kProcessCallback (PEPROCESS Process, BOOLEAN Initialize)
 
NTSTATUS AllocW32Thread (IN PETHREAD Thread, OUT PTHREADINFO *W32Thread)
 
VOID UserDeleteW32Thread (PTHREADINFO pti)
 
NTSTATUS UserThreadCreate (PETHREAD Thread)
 
NTSTATUS UserThreadDestroy (PETHREAD Thread)
 
NTSTATUS NTAPI InitThreadCallback (PETHREAD Thread)
 
VOID UserDisplayNotifyShutdown (PPROCESSINFO ppiCurrent)
 
NTSTATUS APIENTRY Win32kThreadCallback (PETHREAD Thread, PSW32THREADCALLOUTTYPE Type)
 
 _Function_class_ (DRIVER_UNLOAD)
 
NTSTATUS APIENTRY DriverEntry (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
 

Variables

HANDLE hModuleWin
 
PSERVERINFO gpsi = NULL
 
USHORT gusLanguageID
 
PPROCESSINFO ppiScrnSaver
 
PPROCESSINFO gppiList = NULL
 
ULONG_PTR Win32kSSDT []
 
UCHAR Win32kSSPT []
 
ULONG Win32kNumberOfSysCalls
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 12 of file main.c.

◆ NT_ROF

#define NT_ROF (   x)
Value:
{ \
Status = (x); \
if (!NT_SUCCESS(Status)) \
{ \
DPRINT1("Failed '%s' (0x%lx)\n", #x, Status); \
return Status; \
} \
}
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32

Definition at line 916 of file main.c.

◆ USERLOCK_AND_ROF

#define USERLOCK_AND_ROF (   x)
Value:
{ \
UserEnterExclusive(); \
Status = (x); \
UserLeave(); \
if (!NT_SUCCESS(Status)) \
{ \
DPRINT1("Failed '%s' (0x%lx)\n", #x, Status); \
return Status; \
} \
}
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
Status
Definition: gdiplustypes.h:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32

Definition at line 927 of file main.c.

Function Documentation

◆ _Function_class_()

_Function_class_ ( DRIVER_UNLOAD  )

Definition at line 905 of file main.c.

908 {
909  // TODO: Do more cleanup!
910 
911  ResetCsrApiPort();
912  ResetCsrProcess();
913 }
VOID ResetCsrProcess(VOID)
Definition: csr.c:29
VOID ResetCsrApiPort(VOID)
Definition: csr.c:58

◆ AllocW32Process()

NTSTATUS AllocW32Process ( IN PEPROCESS  Process,
OUT PPROCESSINFO W32Process 
)

Definition at line 58 of file main.c.

60 {
61  PPROCESSINFO ppiCurrent;
62 
63  TRACE_CH(UserProcess, "In AllocW32Process(0x%p)\n", Process);
64 
65  /* Check that we were not called with an already existing Win32 process info */
66  ppiCurrent = PsGetProcessWin32Process(Process);
67  if (ppiCurrent) return STATUS_SUCCESS;
68 
69  /* Allocate a new Win32 process info */
71  sizeof(*ppiCurrent),
73  if (ppiCurrent == NULL)
74  {
75  ERR_CH(UserProcess, "Failed to allocate ppi for PID:0x%lx\n",
76  HandleToUlong(Process->UniqueProcessId));
77  return STATUS_NO_MEMORY;
78  }
79 
80  TRACE_CH(UserProcess, "Allocated ppi 0x%p for PID:0x%lx\n",
81  ppiCurrent, HandleToUlong(Process->UniqueProcessId));
82 
83  RtlZeroMemory(ppiCurrent, sizeof(*ppiCurrent));
84 
86  IntReferenceProcessInfo(ppiCurrent);
87 
88  *W32Process = ppiCurrent;
89  return STATUS_SUCCESS;
90 }
PVOID NTAPI PsGetProcessWin32Process(PEPROCESS Process)
Definition: process.c:1193
#define HandleToUlong(h)
Definition: basetsd.h:79
#define USERTAG_PROCESSINFO
Definition: tags.h:260
NTSTATUS NTAPI PsSetProcessWin32Process(_Inout_ PEPROCESS Process, _In_opt_ PVOID Win32Process, _In_opt_ PVOID OldWin32Process)
Definition: process.c:1257
#define IntReferenceProcessInfo(ppi)
Definition: win32.h:182
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define TRACE_CH(ch, fmt,...)
Definition: debug.h:108
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
#define NULL
Definition: types.h:112
#define ERR_CH(ch, fmt,...)
Definition: debug.h:105
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define STATUS_SUCCESS
Definition: shellext.h:65

Referenced by InitProcessCallback().

◆ AllocW32Thread()

NTSTATUS AllocW32Thread ( IN PETHREAD  Thread,
OUT PTHREADINFO W32Thread 
)

Definition at line 373 of file main.c.

375 {
376  PTHREADINFO ptiCurrent;
377 
378  TRACE_CH(UserThread, "In AllocW32Thread(0x%p)\n", Thread);
379 
380  /* Check that we were not called with an already existing Win32 thread info */
381  ptiCurrent = PsGetThreadWin32Thread(Thread);
382  NT_ASSERT(ptiCurrent == NULL);
383 
384  /* Allocate a new Win32 thread info */
385  ptiCurrent = ExAllocatePoolWithTag(NonPagedPool,
386  sizeof(*ptiCurrent),
388  if (ptiCurrent == NULL)
389  {
390  ERR_CH(UserThread, "Failed to allocate pti for TID:0x%lx\n",
392  return STATUS_NO_MEMORY;
393  }
394 
395  TRACE_CH(UserThread, "Allocated pti 0x%p for TID:0x%lx\n",
396  ptiCurrent, HandleToUlong(Thread->Cid.UniqueThread));
397 
398  RtlZeroMemory(ptiCurrent, sizeof(*ptiCurrent));
399 
400  PsSetThreadWin32Thread(Thread, ptiCurrent, NULL);
402  IntReferenceThreadInfo(ptiCurrent);
403 
404  *W32Thread = ptiCurrent;
405  return STATUS_SUCCESS;
406 }
PVOID NTAPI PsSetThreadWin32Thread(_Inout_ PETHREAD Thread, _In_ PVOID Win32Thread, _In_ PVOID OldWin32Thread)
Definition: thread.c:909
PVOID NTAPI PsGetThreadWin32Thread(IN PETHREAD Thread)
Definition: thread.c:795
#define HandleToUlong(h)
Definition: basetsd.h:79
#define USERTAG_THREADINFO
Definition: tags.h:284
#define IntReferenceThreadInfo(pti)
Definition: win32.h:167
CLIENT_ID Cid
Definition: pstypes.h:1128
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2652
HANDLE UniqueThread
Definition: compat.h:685
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define TRACE_CH(ch, fmt,...)
Definition: debug.h:108
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
#define NULL
Definition: types.h:112
#define ERR_CH(ch, fmt,...)
Definition: debug.h:105
#define ObReferenceObject
Definition: obfuncs.h:204
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define STATUS_SUCCESS
Definition: shellext.h:65
#define NT_ASSERT
Definition: rtlfuncs.h:3310

Referenced by InitThreadCallback().

◆ DriverEntry()

NTSTATUS APIENTRY DriverEntry ( IN PDRIVER_OBJECT  DriverObject,
IN PUNICODE_STRING  RegistryPath 
)

Definition at line 947 of file main.c.

950 {
952  BOOLEAN Result;
953  WIN32_CALLOUTS_FPNS CalloutData = {0};
954  PVOID GlobalUserHeapBase = NULL;
955 
956  /*
957  * Register user mode call interface
958  * (system service table index = 1)
959  */
961  NULL,
963  Win32kSSPT,
964  1);
965  if (Result == FALSE)
966  {
967  DPRINT1("Adding system services failed!\n");
968  return STATUS_UNSUCCESSFUL;
969  }
970 
972  DPRINT("Win32k hInstance 0x%p!\n", hModuleWin);
973 
974  DriverObject->DriverUnload = DriverUnload;
975 
976  /* Register Object Manager Callbacks */
978  CalloutData.ThreadCallout = Win32kThreadCallback;
979  // CalloutData.GlobalAtomTableCallout = NULL;
980  // CalloutData.PowerEventCallout = NULL;
981  // CalloutData.PowerStateCallout = NULL;
982  // CalloutData.JobCallout = NULL;
989  // CalloutData.WindowStationCloseProcedure = NULL;
992  // CalloutData.WindowStationOpenProcedure = NULL;
993 
994  /* Register our per-process and per-thread structures. */
995  PsEstablishWin32Callouts(&CalloutData);
996 
997  /* Register service hook callbacks */
998 #if DBG && defined(KDBG)
999  KdSystemDebugControl('CsoR', DbgPreServiceHook, ID_Win32PreServiceHook, 0, 0, 0, 0);
1000  KdSystemDebugControl('CsoR', DbgPostServiceHook, ID_Win32PostServiceHook, 0, 0, 0, 0);
1001 #endif
1002 
1003  /* Create the global USER heap */
1005  &GlobalUserHeapBase,
1006  1 * 1024 * 1024); /* FIXME: 1 MB for now... */
1007  if (GlobalUserHeap == NULL)
1008  {
1009  DPRINT1("Failed to initialize the global heap!\n");
1010  return STATUS_UNSUCCESSFUL;
1011  }
1012 
1013  /* Init the global user lock */
1015 
1016  /* Lock while we use the heap (UserHeapAlloc asserts on this) */
1018 
1019  /* Allocate global server info structure */
1020  gpsi = UserHeapAlloc(sizeof(*gpsi));
1021  UserLeave();
1022  if (!gpsi)
1023  {
1024  DPRINT1("Failed allocate server info structure!\n");
1025  return STATUS_UNSUCCESSFUL;
1026  }
1027 
1028  RtlZeroMemory(gpsi, sizeof(*gpsi));
1029  DPRINT("Global Server Data -> %p\n", gpsi);
1030 
1033 
1034  /* Create stock objects, ie. precreated objects commonly
1035  used by win32 applications */
1038 
1039  NT_ROF(InitBrushImpl());
1040  NT_ROF(InitPDEVImpl());
1041  NT_ROF(InitLDEVImpl());
1043  NT_ROF(InitDcImpl());
1047  NT_ROF(InitInputImpl());
1050  NT_ROF(InitTimerImpl());
1051  NT_ROF(InitDCEImpl());
1052 
1054 
1055  /* Initialize FreeType library */
1056  if (!InitFontSupport())
1057  {
1058  DPRINT1("Unable to initialize font support\n");
1059  return Status;
1060  }
1061 
1062  return STATUS_SUCCESS;
1063 }
NTSTATUS APIENTRY Win32kThreadCallback(PETHREAD Thread, PSW32THREADCALLOUTTYPE Type)
Definition: main.c:880
NTSTATUS NTAPI IntDesktopObjectOpen(_In_ PVOID Parameters)
Definition: desktop.c:210
PKWIN32_SESSION_CALLOUT WindowStationOkToCloseProcedure
Definition: pstypes.h:1694
PGDI_BATCHFLUSH_ROUTINE BatchFlushRoutine
Definition: pstypes.h:1689
NTSTATUS NTAPI InitPDEVImpl(VOID)
Definition: pdevobj.c:30
NTSTATUS NTAPI InitInputImpl(VOID)
Definition: input.c:360
BOOLEAN NTAPI KeAddSystemServiceTable(IN PULONG_PTR Base, IN PULONG Count OPTIONAL, IN ULONG Limit, IN PUCHAR Number, IN ULONG Index)
Definition: procobj.c:908
NTSTATUS NTAPI InitTimerImpl(VOID)
Definition: timer.c:594
LONG NTSTATUS
Definition: precomp.h:26
#define NT_ROF(x)
Definition: main.c:916
NTSTATUS NTAPI IntDesktopOkToClose(_In_ PVOID Parameters)
Definition: desktop.c:186
NTSTATUS ExInitializeResourceLite(PULONG res)
Definition: env_spec_w32.h:641
ERESOURCE UserLock
Definition: ntuser.c:18
USHORT FASTCALL UserGetLanguageID(VOID)
Definition: misc.c:97
PKWIN32_THREAD_CALLOUT ThreadCallout
Definition: pstypes.h:1684
NTSTATUS NTAPI InitKeyboardImpl(VOID)
Definition: keyboard.c:31
ULONG Win32kNumberOfSysCalls
Definition: napi.h:22
static __inline PVOID UserHeapAlloc(SIZE_T Bytes)
Definition: usrheap.h:34
NTSTATUS APIENTRY NtGdiFlushUserBatch(VOID)
Definition: gdibatch.c:487
PSERVERINFO gpsi
Definition: main.c:27
PKWIN32_SESSION_CALLOUT DesktopCloseProcedure
Definition: pstypes.h:1692
NTSTATUS NTAPI IntWinStaObjectParse(_In_ PVOID Parameters)
Definition: winsta.c:138
BOOL FASTCALL InitFontSupport(VOID)
Definition: freetype.c:660
PKWIN32_SESSION_CALLOUT WindowStationDeleteProcedure
Definition: pstypes.h:1696
NTSTATUS NTAPI InitLDEVImpl(VOID)
Definition: ldevobj.c:30
VOID FASTCALL CreateSysColorObjects(VOID)
Definition: stockobj.c:329
#define FALSE
Definition: types.h:117
USHORT gusLanguageID
Definition: main.c:29
NTSTATUS NTAPI InitBrushImpl(VOID)
Definition: engbrush.c:31
NTSTATUS NTAPI InitDesktopImpl(VOID)
Definition: desktop.c:252
VOID FASTCALL CreateStockObjects(VOID)
Definition: stockobj.c:247
#define USERLOCK_AND_ROF(x)
Definition: main.c:927
NTSTATUS NTAPI IntWinStaObjectDelete(_In_ PVOID Parameters)
Definition: winsta.c:106
unsigned char BOOLEAN
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
PKWIN32_SESSION_CALLOUT DesktopOkToCloseProcedure
Definition: pstypes.h:1691
NTSTATUS APIENTRY Win32kProcessCallback(PEPROCESS Process, BOOLEAN Initialize)
Definition: main.c:343
PKWIN32_SESSION_CALLOUT DesktopDeleteProcedure
Definition: pstypes.h:1693
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:249
Status
Definition: gdiplustypes.h:24
NTSTATUS NTAPI InitPaletteImpl(VOID)
Definition: palette.c:66
NTSTATUS NTAPI InitGdiHandleTable(void)
Definition: gdiobj.c:259
PVOID NTAPI MmPageEntireDriver(IN PVOID AddressWithinSection)
Definition: sysldr.c:3467
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
NTSTATUS NTAPI InitWindowStationImpl(VOID)
Definition: winsta.c:34
PKWIN32_SESSION_CALLOUT DesktopOpenProcedure
Definition: pstypes.h:1690
NTSTATUS NTAPI IntWinStaOkToClose(_In_ PVOID Parameters)
Definition: winsta.c:203
PVOID GlobalUserHeapSection
Definition: usrheap.c:26
NTSTATUS NTAPI InitDcImpl(VOID)
Definition: dclife.c:53
ULONG_PTR Win32kSSDT[]
Definition: napi.h:9
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:258
UCHAR Win32kSSPT[]
Definition: napi.h:15
NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
Definition: main.c:687
NTSTATUS NTAPI IntDesktopObjectDelete(_In_ PVOID Parameters)
Definition: desktop.c:155
static DRIVER_UNLOAD DriverUnload
Definition: kbdclass.c:17
HANDLE GlobalUserHeap
Definition: usrheap.c:25
#define NULL
Definition: types.h:112
HANDLE hModuleWin
Definition: main.c:16
NTSTATUS NTAPI MsqInitializeImpl(VOID)
Definition: msgqueue.c:30
#define DPRINT1
Definition: precomp.h:8
NTSTATUS NTAPI IntDesktopObjectClose(_In_ PVOID Parameters)
Definition: desktop.c:227
NTSTATUS NTAPI InitUserImpl(VOID)
Definition: ntuser.c:79
VOID NTAPI PsEstablishWin32Callouts(IN PWIN32_CALLOUTS_FPNS CalloutData)
Definition: win32.c:112
NTSTATUS NTAPI InitDeviceImpl(VOID)
Definition: device.c:26
PWIN32HEAP UserCreateHeap(OUT PVOID *SectionObject, IN OUT PVOID *SystemBase, IN SIZE_T HeapSize)
Definition: usrheap.c:181
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
NTSTATUS NTAPI KdSystemDebugControl(_In_ SYSDBG_COMMAND Command, _In_ PVOID InputBuffer, _In_ ULONG InputBufferLength, _Out_ PVOID OutputBuffer, _In_ ULONG OutputBufferLength, _Inout_ PULONG ReturnLength, _In_ KPROCESSOR_MODE PreviousMode)
Definition: kdapi.c:2152
#define STATUS_SUCCESS
Definition: shellext.h:65
PKWIN32_SESSION_CALLOUT WindowStationParseProcedure
Definition: pstypes.h:1697
PKWIN32_PROCESS_CALLOUT ProcessCallout
Definition: pstypes.h:1683
#define DPRINT
Definition: sndvol32.h:71
NTSTATUS NTAPI InitDCEImpl(VOID)
Definition: windc.c:30

◆ ExitProcessCallback()

NTSTATUS ExitProcessCallback ( PEPROCESS  Process)

Definition at line 304 of file main.c.

305 {
306  PPROCESSINFO ppiCurrent, *pppi;
307 
308  /* Get the Win32 Process */
309  ppiCurrent = PsGetProcessWin32Process(Process);
310  ASSERT(ppiCurrent);
311  ASSERT(ppiCurrent->peProcess == Process);
312 
313  TRACE_CH(UserProcess, "Destroying ppi 0x%p\n", ppiCurrent);
314  ppiCurrent->W32PF_flags |= W32PF_TERMINATED;
315 
316  /* Remove it from the list */
317  pppi = &gppiList;
318  while (*pppi != NULL && *pppi != ppiCurrent)
319  {
320  pppi = &(*pppi)->ppiNext;
321  }
322  ASSERT(*pppi == ppiCurrent);
323  *pppi = ppiCurrent->ppiNext;
324 
325  /* Cleanup GDI info */
327 
328  /* Cleanup USER info */
330 
331  /* The process is dying */
332  PsSetProcessWin32Process(Process, NULL, ppiCurrent);
333  ppiCurrent->peProcess = NULL;
334 
335  /* Finally, dereference */
336  IntDereferenceProcessInfo(ppiCurrent);
337 
338  return STATUS_SUCCESS;
339 }
PPROCESSINFO ppiNext
Definition: win32.h:257
PVOID NTAPI PsGetProcessWin32Process(PEPROCESS Process)
Definition: process.c:1193
NTSTATUS NTAPI PsSetProcessWin32Process(_Inout_ PEPROCESS Process, _In_opt_ PVOID Win32Process, _In_opt_ PVOID OldWin32Process)
Definition: process.c:1257
#define W32PF_TERMINATED
Definition: win32.h:16
PPROCESSINFO gppiList
Definition: main.c:31
NTSTATUS GdiProcessDestroy(PEPROCESS Process)
Definition: init.c:47
#define ASSERT(a)
Definition: mode.c:44
NTSTATUS UserProcessDestroy(PEPROCESS Process)
Definition: main.c:175
#define TRACE_CH(ch, fmt,...)
Definition: debug.h:108
#define NULL
Definition: types.h:112
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
#define STATUS_SUCCESS
Definition: shellext.h:65
#define IntDereferenceProcessInfo(ppi)
Definition: win32.h:187

Referenced by InitProcessCallback(), and Win32kProcessCallback().

◆ ExitThreadCallback()

NTSTATUS NTAPI ExitThreadCallback ( PETHREAD  Thread)

Definition at line 702 of file main.c.

703 {
704  PTHREADINFO *ppti;
705  PSINGLE_LIST_ENTRY psle;
706  PPROCESSINFO ppiCurrent;
708  PTHREADINFO ptiCurrent;
709  PWINDOWLIST pwl, pwlNext;
710 
711  Process = Thread->ThreadsProcess;
712 
713  /* Get the Win32 Thread */
714  ptiCurrent = PsGetThreadWin32Thread(Thread);
715  ASSERT(ptiCurrent);
716 
717  TRACE_CH(UserThread, "Destroying pti 0x%p eThread 0x%p\n", ptiCurrent, Thread);
718 
719  ptiCurrent->TIF_flags |= TIF_INCLEANUP;
720  ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
721 
722  ppiCurrent = ptiCurrent->ppi;
723  ASSERT(ppiCurrent);
724 
725  IsRemoveAttachThread(ptiCurrent);
726 
727  if (gpwlList)
728  {
729  for (pwl = gpwlList; pwl; pwl = pwlNext)
730  {
731  pwlNext = pwl->pNextList;
732  if (pwl->pti == ptiCurrent)
733  IntFreeHwndList(pwl);
734  }
735  }
736 
737  ptiCurrent->TIF_flags |= TIF_DONTATTACHQUEUE;
738  ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
739 
741 
742  /* Decrement thread count and check if its 0 */
743  ppiCurrent->cThreads--;
744 
745  if (ptiCurrent->TIF_flags & TIF_GUITHREADINITIALIZED)
746  {
747  /* Do now some process cleanup that requires a valid win32 thread */
748  if (ptiCurrent->ppi->cThreads == 0)
749  {
750  /* Check if we have registered the user api hook */
751  if (ptiCurrent->ppi == ppiUahServer)
752  {
753  /* Unregister the api hook */
755  }
756 
757  /* Notify logon application to restart shell if needed */
758  if (ptiCurrent->pDeskInfo)
759  {
760  if (ptiCurrent->pDeskInfo->ppiShellProcess == ppiCurrent)
761  {
763 
764  TRACE_CH(UserProcess, "Shell process is exiting (%lu)\n", ExitCode);
765 
769  ExitCode);
770 
771  ptiCurrent->pDeskInfo->ppiShellProcess = NULL;
772  }
773  }
774  }
775 
776  DceFreeThreadDCE(ptiCurrent);
777  DestroyTimersForThread(ptiCurrent);
779  UnregisterThreadHotKeys(ptiCurrent);
780 
781  if (!UserDestroyObjectsForOwner(gHandleTable, ptiCurrent))
782  {
783  DPRINT1("Failed to delete objects belonging to thread %p. This is VERY BAD!.\n", ptiCurrent);
784  ASSERT(FALSE);
785  return STATUS_UNSUCCESSFUL;
786  }
787  UserAssignmentUnlock((PVOID*)&ptiCurrent->spDefaultImc);
788 
789  if (ppiCurrent && ppiCurrent->ptiList == ptiCurrent && !ptiCurrent->ptiSibling &&
790  ppiCurrent->W32PF_flags & W32PF_CLASSESREGISTERED)
791  {
792  TRACE_CH(UserThread, "DestroyProcessClasses\n");
793  /* no process windows should exist at this point, or the function will assert! */
794  DestroyProcessClasses(ppiCurrent);
795  ppiCurrent->W32PF_flags &= ~W32PF_CLASSESREGISTERED;
796  }
797 
798  IntBlockInput(ptiCurrent, FALSE);
799  IntCleanupThreadCallbacks(ptiCurrent);
800 
801  /* cleanup user object references stack */
802  psle = PopEntryList(&ptiCurrent->ReferencesList);
803  while (psle)
804  {
806  TRACE_CH(UserThread, "thread clean: remove reference obj 0x%p\n",ref->obj);
808 
809  psle = PopEntryList(&ptiCurrent->ReferencesList);
810  }
811  }
812 
813  if (ptiCurrent->cEnterCount)
814  {
816  ptiCurrent->cEnterCount = 0;
817  }
818 
819  /* Find the THREADINFO in the PROCESSINFO's list */
820  ppti = &ppiCurrent->ptiList;
821  while (*ppti != NULL && *ppti != ptiCurrent)
822  {
823  ppti = &((*ppti)->ptiSibling);
824  }
825 
826  /* we must have found it */
827  ASSERT(*ppti == ptiCurrent);
828 
829  /* Remove it from the list */
830  *ppti = ptiCurrent->ptiSibling;
831 
832  if (ptiCurrent->KeyboardLayout)
834 
835  if (gptiForeground == ptiCurrent)
836  {
837 // IntNotifyWinEvent(EVENT_OBJECT_FOCUS, NULL, OBJID_CLIENT, CHILDID_SELF, 0);
838 // IntNotifyWinEvent(EVENT_SYSTEM_FOREGROUND, NULL, OBJID_WINDOW, CHILDID_SELF, 0);
839 
841  }
842 
843  /* Restore display mode when we are the last thread, and we changed the display mode */
844  if (ppiCurrent->cThreads == 0)
845  UserDisplayNotifyShutdown(ppiCurrent);
846 
847 
848  // Fixes CORE-6384 & CORE-7030.
849 /* if (ptiLastInput == ptiCurrent)
850  {
851  if (!ppiCurrent->ptiList)
852  ptiLastInput = gptiForeground;
853  else
854  ptiLastInput = ppiCurrent->ptiList;
855  ERR_CH(UserThread, "DTI: ptiLastInput is Cleared!!\n");
856  }
857 */
858  TRACE_CH(UserThread, "Freeing pti 0x%p\n", ptiCurrent);
859 
861 
862  if (ptiCurrent->hEventQueueClient != NULL)
863  {
866  }
867  ptiCurrent->hEventQueueClient = NULL;
868 
869  /* The thread is dying */
870  PsSetThreadWin32Thread(Thread /*ptiCurrent->pEThread*/, NULL, ptiCurrent);
871 
872  /* Dereference the THREADINFO */
873  IntDereferenceThreadInfo(ptiCurrent);
874 
875  return STATUS_SUCCESS;
876 }
PVOID NTAPI PsSetThreadWin32Thread(_Inout_ PETHREAD Thread, _In_ PVOID Win32Thread, _In_ PVOID OldWin32Thread)
Definition: thread.c:909
PVOID NTAPI PsGetThreadWin32Thread(IN PETHREAD Thread)
Definition: thread.c:795
BOOL FASTCALL UserPostMessage(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1346
void FASTCALL DestroyProcessClasses(PPROCESSINFO Process)
Definition: class.c:300
struct tagIMC * spDefaultImc
Definition: win32.h:133
Definition: ntbasedef.h:628
#define TRUE
Definition: types.h:120
PTHREADINFO ptiSibling
Definition: win32.h:117
#define TIF_DONTATTACHQUEUE
Definition: ntuser.h:260
struct tagWINDOWLIST * pNextList
Definition: window.h:86
FLONG TIF_flags
Definition: win32.h:96
BOOL FASTCALL DestroyTimersForThread(PTHREADINFO pti)
Definition: timer.c:549
BOOL FASTCALL UserDereferenceObject(PVOID Object)
Definition: object.c:644
LONG NTAPI KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
Definition: eventobj.c:159
Definition: send.c:48
PPROCESSINFO ppi
Definition: win32.h:89
PTHREADINFO gptiForeground
Definition: focus.c:15
NTSTATUS NTAPI PsGetProcessExitStatus(PEPROCESS Process)
Definition: process.c:1053
#define FALSE
Definition: types.h:117
BOOL NTAPI UserCloseClipboard(VOID)
Definition: clipboard.c:545
void FASTCALL DceFreeThreadDCE(PTHREADINFO)
Definition: windc.c:780
Definition: object.h:3
VOID FASTCALL IntFreeHwndList(PWINDOWLIST pwlTarget)
Definition: window.c:1456
#define TIF_GUITHREADINITIALIZED
Definition: ntuser.h:278
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
FORCEINLINE PSINGLE_LIST_ENTRY PopEntryList(_Inout_ PSINGLE_LIST_ENTRY ListHead)
Definition: rtlfuncs.h:240
INT cThreads
Definition: win32.h:258
HWND hwndSAS
Definition: winsta.c:24
#define ASSERT(a)
Definition: mode.c:44
PKEVENT pEventQueueServer
Definition: win32.h:126
#define ObDereferenceObject
Definition: obfuncs.h:203
unsigned long DWORD
Definition: ntddk_ex.h:95
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2652
struct _CLIENTINFO * pClientInfo
Definition: win32.h:95
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: obhandle.c:3379
PPROCESSINFO ppiUahServer
Definition: hook.c:25
BOOL FASTCALL IntBlockInput(PTHREADINFO pti, BOOL BlockIt)
Definition: input.c:375
#define WM_LOGONNOTIFY
Definition: undocuser.h:37
struct tagKL * KeyboardLayout
Definition: win32.h:91
VOID FASTCALL UnregisterThreadHotKeys(PTHREADINFO pti)
Definition: hotkey.c:121
HANDLE hEventQueueClient
Definition: win32.h:124
#define TRACE_CH(ch, fmt,...)
Definition: debug.h:108
#define W32PF_CLASSESREGISTERED
Definition: win32.h:17
VOID FASTCALL IntCleanupThreadCallbacks(PTHREADINFO W32Thread)
Definition: callback.c:76
BOOL IntSetThreadDesktop(IN HDESK hDesktop, IN BOOL FreeOnFailure)
Definition: desktop.c:3252
PWINDOWLIST gpwlList
Definition: window.c:16
#define NULL
Definition: types.h:112
#define DPRINT1
Definition: precomp.h:8
BOOLEAN UserDestroyObjectsForOwner(PUSER_HANDLE_TABLE Table, PVOID Owner)
Definition: object.c:754
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
PVOID FASTCALL UserAssignmentUnlock(PVOID *ppvObj)
Definition: object.c:861
SINGLE_LIST_ENTRY ReferencesList
Definition: win32.h:158
#define IO_NO_INCREMENT
Definition: iotypes.h:598
PTHREADINFO ptiList
Definition: win32.h:252
#define STATUS_SUCCESS
Definition: shellext.h:65
BOOL FASTCALL IsRemoveAttachThread(PTHREADINFO pti)
Definition: input.c:437
struct _DESKTOPINFO * pDeskInfo
Definition: win32.h:94
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
PTHREADINFO pti
Definition: window.h:89
#define IntDereferenceThreadInfo(pti)
Definition: win32.h:172
INT cEnterCount
Definition: win32.h:136
VOID UserDisplayNotifyShutdown(PPROCESSINFO ppiCurrent)
Definition: display.c:933
#define TIF_INCLEANUP
Definition: ntuser.h:254
base of all file and directory entries
Definition: entries.h:82
#define LN_SHELL_EXITED
Definition: undocuser.h:115
BOOLEAN NTAPI KeSetKernelStackSwapEnable(IN BOOLEAN Enable)
Definition: thrdobj.c:997
BOOL FASTCALL UserUnregisterUserApiHook(VOID)
Definition: hook.c:207

Referenced by InitThreadCallback(), and Win32kThreadCallback().

◆ GdiProcessCreate()

NTSTATUS GdiProcessCreate ( PEPROCESS  Process)

Definition at line 18 of file init.c.

19 {
21  ASSERT(ppiCurrent);
22 
25  ppiCurrent->PrivateMemFontHandleCount = 0;
27 
28  InitializeListHead(&ppiCurrent->GDIBrushAttrFreeList);
29  InitializeListHead(&ppiCurrent->GDIDcAttrFreeList);
30 
31  /* Map the GDI handle table to user land */
32  Process->Peb->GdiSharedHandleTable = GDI_MapHandleTable(Process);
33  Process->Peb->GdiDCAttributeList = GDI_BATCH_LIMIT;
34 
35  /* Create pools for GDI object attributes */
36  ppiCurrent->pPoolDcAttr = GdiPoolCreate(sizeof(DC_ATTR), 'acdG');
37  ppiCurrent->pPoolBrushAttr = GdiPoolCreate(sizeof(BRUSH_ATTR), 'arbG');
38  ppiCurrent->pPoolRgnAttr = GdiPoolCreate(sizeof(RGN_ATTR), 'agrG');
39  ASSERT(ppiCurrent->pPoolDcAttr);
40  ASSERT(ppiCurrent->pPoolBrushAttr);
41  ASSERT(ppiCurrent->pPoolRgnAttr);
42 
43  return STATUS_SUCCESS;
44 }
struct _GDI_POOL * pPoolBrushAttr
Definition: win32.h:288
UINT PrivateMemFontHandleCount
Definition: win32.h:282
PVOID NTAPI GDI_MapHandleTable(PEPROCESS pProcess)
Definition: gdiobj.c:1552
PVOID NTAPI PsGetProcessWin32Process(PEPROCESS Process)
Definition: process.c:1193
#define GDI_BATCH_LIMIT
Definition: ntgdityp.h:201
PGDI_POOL NTAPI GdiPoolCreate(ULONG cjAllocSize, ULONG ulTag)
Definition: gdipool.c:316
struct _GDI_POOL * pPoolDcAttr
Definition: win32.h:287
FAST_MUTEX PrivateFontListLock
Definition: win32.h:279
#define ASSERT(a)
Definition: mode.c:44
LIST_ENTRY PrivateMemFontListHead
Definition: win32.h:281
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
Definition: exfuncs.h:274
struct _GDI_POOL * pPoolRgnAttr
Definition: win32.h:289
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
#define STATUS_SUCCESS
Definition: shellext.h:65
LIST_ENTRY PrivateFontListHead
Definition: win32.h:280

Referenced by InitProcessCallback().

◆ GdiProcessDestroy()

NTSTATUS GdiProcessDestroy ( PEPROCESS  Process)

Definition at line 47 of file init.c.

48 {
50  ASSERT(ppiCurrent);
51  ASSERT(ppiCurrent->peProcess == Process);
52 
54 
55  /* And GDI ones too */
57 
58  /* So we can now free the pools */
59  GdiPoolDestroy(ppiCurrent->pPoolDcAttr);
60  GdiPoolDestroy(ppiCurrent->pPoolBrushAttr);
61  GdiPoolDestroy(ppiCurrent->pPoolRgnAttr);
62 
63  return STATUS_SUCCESS;
64 }
struct _GDI_POOL * pPoolBrushAttr
Definition: win32.h:288
PVOID NTAPI PsGetProcessWin32Process(PEPROCESS Process)
Definition: process.c:1193
BOOL NTAPI GDI_CleanupForProcess(struct _EPROCESS *Process)
Definition: gdiobj.c:1582
VOID FASTCALL IntGdiCleanupPrivateFontsForProcess(VOID)
Definition: freetype.c:1971
struct _GDI_POOL * pPoolDcAttr
Definition: win32.h:287
#define ASSERT(a)
Definition: mode.c:44
struct _GDI_POOL * pPoolRgnAttr
Definition: win32.h:289
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
#define STATUS_SUCCESS
Definition: shellext.h:65
VOID NTAPI GdiPoolDestroy(PGDI_POOL pPool)
Definition: gdipool.c:343

Referenced by ExitProcessCallback().

◆ GdiThreadCreate()

NTSTATUS GdiThreadCreate ( PETHREAD  Thread)

Definition at line 68 of file init.c.

69 {
70  return STATUS_SUCCESS;
71 }
#define STATUS_SUCCESS
Definition: shellext.h:65

◆ GdiThreadDestroy()

NTSTATUS GdiThreadDestroy ( PETHREAD  Thread)

Definition at line 74 of file init.c.

75 {
76  return STATUS_SUCCESS;
77 }
#define STATUS_SUCCESS
Definition: shellext.h:65

◆ InitProcessCallback()

NTSTATUS InitProcessCallback ( PEPROCESS  Process)

Definition at line 231 of file main.c.

232 {
234  PPROCESSINFO ppiCurrent;
235  PVOID KernelMapping = NULL, UserMapping = NULL;
236 
237  /* We might be called with an already allocated win32 process */
238  ppiCurrent = PsGetProcessWin32Process(Process);
239  if (ppiCurrent != NULL)
240  {
241  /* There is no more to do for us (this is a success code!) */
242  return STATUS_ALREADY_WIN32;
243  }
244  // if (ppiCurrent->W32PF_flags & W32PF_PROCESSCONNECTED)
245  // return STATUS_ALREADY_WIN32;
246 
247  /* Allocate a new Win32 process info */
248  Status = AllocW32Process(Process, &ppiCurrent);
249  if (!NT_SUCCESS(Status))
250  {
251  ERR_CH(UserProcess, "Failed to allocate ppi for PID:0x%lx\n",
252  HandleToUlong(Process->UniqueProcessId));
253  return Status;
254  }
255 
256 #if DBG
258 #if defined(KDBG)
259  KdRosRegisterCliCallback(DbgGdiKdbgCliCallback);
260 #endif
261 #endif
262 
263  /* Map the global user heap into the process */
264  Status = MapGlobalUserHeap(Process, &KernelMapping, &UserMapping);
265  if (!NT_SUCCESS(Status))
266  {
267  TRACE_CH(UserProcess, "Failed to map the global heap! 0x%x\n", Status);
268  goto error;
269  }
270 
271  TRACE_CH(UserProcess, "InitProcessCallback -- We have KernelMapping 0x%p and UserMapping 0x%p with delta = 0x%x\n",
272  KernelMapping, UserMapping, (ULONG_PTR)KernelMapping - (ULONG_PTR)UserMapping);
273 
274  /* Initialize USER process info */
276  if (!NT_SUCCESS(Status))
277  {
278  ERR_CH(UserProcess, "UserProcessCreate failed, Status 0x%08lx\n", Status);
279  goto error;
280  }
281 
282  /* Initialize GDI process info */
284  if (!NT_SUCCESS(Status))
285  {
286  ERR_CH(UserProcess, "GdiProcessCreate failed, Status 0x%08lx\n", Status);
287  goto error;
288  }
289 
290  /* Add the process to the global list */
291  ppiCurrent->ppiNext = gppiList;
292  gppiList = ppiCurrent;
293 
294  return STATUS_SUCCESS;
295 
296 error:
297  ERR_CH(UserProcess, "InitProcessCallback failed! Freeing ppi 0x%p for PID:0x%lx\n",
298  ppiCurrent, HandleToUlong(Process->UniqueProcessId));
300  return Status;
301 }
#define error(str)
Definition: mkdosfs.c:1605
PPROCESSINFO ppiNext
Definition: win32.h:257
NTSTATUS AllocW32Process(IN PEPROCESS Process, OUT PPROCESSINFO *W32Process)
Definition: main.c:58
PVOID NTAPI PsGetProcessWin32Process(PEPROCESS Process)
Definition: process.c:1193
LONG NTSTATUS
Definition: precomp.h:26
#define HandleToUlong(h)
Definition: basetsd.h:79
NTSTATUS ExitProcessCallback(PEPROCESS Process)
Definition: main.c:304
uint32_t ULONG_PTR
Definition: typedefs.h:65
NTSTATUS MapGlobalUserHeap(IN PEPROCESS Process, OUT PVOID *KernelMapping, OUT PVOID *UserMapping)
Definition: usrheap.c:266
static GENERIC_MAPPING UserMapping
Definition: samrpc.c:48
PPROCESSINFO gppiList
Definition: main.c:31
Status
Definition: gdiplustypes.h:24
BOOLEAN NTAPI DbgGdiKdbgCliCallback(IN PCHAR pszCommand, IN ULONG argc, IN PCH argv[])
Definition: gdikdbgext.c:324
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
NTSTATUS UserProcessCreate(PEPROCESS Process)
Definition: main.c:122
BOOL DbgInitDebugChannels()
NTSTATUS GdiProcessCreate(PEPROCESS Process)
Definition: init.c:18
#define TRACE_CH(ch, fmt,...)
Definition: debug.h:108
#define STATUS_ALREADY_WIN32
Definition: ntstatus.h:141
#define NULL
Definition: types.h:112
#define ERR_CH(ch, fmt,...)
Definition: debug.h:105
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
#define STATUS_SUCCESS
Definition: shellext.h:65

Referenced by Win32kProcessCallback().

◆ InitThreadCallback()

NTSTATUS NTAPI InitThreadCallback ( PETHREAD  Thread)

Definition at line 456 of file main.c.

457 {
459  PCLIENTINFO pci;
460  PTHREADINFO ptiCurrent;
461  int i;
463  PTEB pTeb;
464  PRTL_USER_PROCESS_PARAMETERS ProcessParams;
465 
466  Process = Thread->ThreadsProcess;
467 
468  pTeb = NtCurrentTeb();
469  ASSERT(pTeb);
470 
471  ProcessParams = pTeb->ProcessEnvironmentBlock->ProcessParameters;
472 
473  /* Allocate a new Win32 thread info */
474  Status = AllocW32Thread(Thread, &ptiCurrent);
475  if (!NT_SUCCESS(Status))
476  {
477  ERR_CH(UserThread, "Failed to allocate pti for TID:0x%lx\n",
479  return Status;
480  }
481 
482  /* Initialize the THREADINFO */
483  ptiCurrent->pEThread = Thread;
484  ptiCurrent->ppi = PsGetProcessWin32Process(Process);
485  IntReferenceProcessInfo(ptiCurrent->ppi);
486  pTeb->Win32ThreadInfo = ptiCurrent;
487  ptiCurrent->pClientInfo = (PCLIENTINFO)pTeb->Win32ClientInfo;
488  ptiCurrent->pcti = &ptiCurrent->cti;
489 
490  /* Mark the process as having threads */
491  ptiCurrent->ppi->W32PF_flags |= W32PF_THREADCONNECTED;
492 
493  InitializeListHead(&ptiCurrent->WindowListHead);
497  InitializeListHead(&ptiCurrent->PtiLink);
498  for (i = 0; i < NB_HOOKS; i++)
499  {
500  InitializeListHead(&ptiCurrent->aphkStart[i]);
501  }
502  ptiCurrent->ptiSibling = ptiCurrent->ppi->ptiList;
503  ptiCurrent->ppi->ptiList = ptiCurrent;
504  ptiCurrent->ppi->cThreads++;
505 
506  ptiCurrent->hEventQueueClient = NULL;
507  Status = ZwCreateEvent(&ptiCurrent->hEventQueueClient, EVENT_ALL_ACCESS,
509  if (!NT_SUCCESS(Status))
510  {
511  ERR_CH(UserThread, "Event creation failed, Status 0x%08x.\n", Status);
512  goto error;
513  }
516  (PVOID*)&ptiCurrent->pEventQueueServer, NULL);
517  if (!NT_SUCCESS(Status))
518  {
519  ERR_CH(UserThread, "Failed referencing the event object, Status 0x%08x.\n", Status);
521  ptiCurrent->hEventQueueClient = NULL;
522  goto error;
523  }
524 
525  ptiCurrent->pcti->timeLastRead = EngGetTickCount32();
526 
527  ptiCurrent->MessageQueue = MsqCreateMessageQueue(ptiCurrent);
528  if (ptiCurrent->MessageQueue == NULL)
529  {
530  ERR_CH(UserThread, "Failed to allocate message loop\n");
532  goto error;
533  }
534 
535  ptiCurrent->KeyboardLayout = W32kGetDefaultKeyLayout();
536  if (ptiCurrent->KeyboardLayout)
537  UserReferenceObject(ptiCurrent->KeyboardLayout);
538 
539  ptiCurrent->TIF_flags &= ~TIF_INCLEANUP;
540 
541  // FIXME: Flag SYSTEM threads with... TIF_SYSTEMTHREAD !!
542 
543  /* CSRSS threads have some special features */
544  if (Process == gpepCSRSS || !gpepCSRSS)
546 
547  /* Initialize the CLIENTINFO */
548  pci = (PCLIENTINFO)pTeb->Win32ClientInfo;
549  RtlZeroMemory(pci, sizeof(*pci));
550  pci->ppi = ptiCurrent->ppi;
551  pci->fsHooks = ptiCurrent->fsHooks;
552  pci->dwTIFlags = ptiCurrent->TIF_flags;
553  if (ptiCurrent->KeyboardLayout)
554  {
555  pci->hKL = ptiCurrent->KeyboardLayout->hkl;
556  pci->CodePage = ptiCurrent->KeyboardLayout->CodePage;
557  }
558 
559  /* Need to pass the user Startup Information to the current process. */
560  if ( ProcessParams )
561  {
562  if ( ptiCurrent->ppi->usi.cb == 0 ) // Not initialized yet.
563  {
564  if ( ProcessParams->WindowFlags != 0 ) // Need window flags set.
565  {
566  ptiCurrent->ppi->usi.cb = sizeof(USERSTARTUPINFO);
567  ptiCurrent->ppi->usi.dwX = ProcessParams->StartingX;
568  ptiCurrent->ppi->usi.dwY = ProcessParams->StartingY;
569  ptiCurrent->ppi->usi.dwXSize = ProcessParams->CountX;
570  ptiCurrent->ppi->usi.dwYSize = ProcessParams->CountY;
571  ptiCurrent->ppi->usi.dwFlags = ProcessParams->WindowFlags;
572  ptiCurrent->ppi->usi.wShowWindow = (WORD)ProcessParams->ShowWindowFlags;
573  }
574  }
575  }
576 
577  /*
578  * Assign a default window station and desktop to the process.
579  * Do not try to open a desktop or window station before the very first
580  * (interactive) window station has been created by Winlogon.
581  */
582  if (!(ptiCurrent->TIF_flags & (TIF_SYSTEMTHREAD | TIF_CSRSSTHREAD)) &&
583  ptiCurrent->ppi->hdeskStartup == NULL &&
585  {
586  HWINSTA hWinSta = NULL;
587  HDESK hDesk = NULL;
588  UNICODE_STRING DesktopPath;
589  PDESKTOP pdesk;
590 
591  /*
592  * Inherit the thread desktop and process window station (if not yet inherited)
593  * from the process startup info structure. See documentation of CreateProcess().
594  */
596  if (ProcessParams && ProcessParams->DesktopInfo.Length > 0)
597  {
598  Status = IntSafeCopyUnicodeStringTerminateNULL(&DesktopPath, &ProcessParams->DesktopInfo);
599  }
600  if (!NT_SUCCESS(Status))
601  {
602  RtlInitUnicodeString(&DesktopPath, NULL);
603  }
604 
606  &DesktopPath,
607  !!(ProcessParams->WindowFlags & STARTF_INHERITDESKTOP),
608  &hWinSta,
609  &hDesk);
610 
611  if (DesktopPath.Buffer)
612  ExFreePoolWithTag(DesktopPath.Buffer, TAG_STRING);
613 
614  if (!NT_SUCCESS(Status))
615  {
616  ERR_CH(UserThread, "Failed to assign default desktop and winsta to process\n");
617  goto error;
618  }
619 
620  if (!UserSetProcessWindowStation(hWinSta))
621  {
623  ERR_CH(UserThread, "Failed to set initial process winsta\n");
624  goto error;
625  }
626 
627  /* Validate the new desktop */
628  Status = IntValidateDesktopHandle(hDesk, UserMode, 0, &pdesk);
629  if (!NT_SUCCESS(Status))
630  {
631  ERR_CH(UserThread, "Failed to validate initial desktop handle\n");
632  goto error;
633  }
634 
635  /* Store the parsed desktop as the initial desktop */
636  ASSERT(ptiCurrent->ppi->hdeskStartup == NULL);
637  ASSERT(Process->UniqueProcessId != gpidLogon);
638  ptiCurrent->ppi->hdeskStartup = hDesk;
639  ptiCurrent->ppi->rpdeskStartup = pdesk;
640  }
641 
642  if (ptiCurrent->ppi->hdeskStartup != NULL)
643  {
644  if (!IntSetThreadDesktop(ptiCurrent->ppi->hdeskStartup, FALSE))
645  {
646  ERR_CH(UserThread, "Failed to set thread desktop\n");
648  goto error;
649  }
650  }
651 
652  /* Mark the thread as fully initialized */
653  ptiCurrent->TIF_flags |= TIF_GUITHREADINITIALIZED;
654 
655  if (!(ptiCurrent->ppi->W32PF_flags & (W32PF_ALLOWFOREGROUNDACTIVATE | W32PF_APPSTARTING)) &&
656  (gptiForeground && gptiForeground->ppi == ptiCurrent->ppi ))
657  {
658  ptiCurrent->TIF_flags |= TIF_ALLOWFOREGROUNDACTIVATE;
659  }
660  ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
661 
662  /* Create the default input context */
663  if (IS_IMM_MODE())
664  {
666  }
667 
668  /* Last things to do only if we are not a SYSTEM or CSRSS thread */
669  if (!(ptiCurrent->TIF_flags & (TIF_SYSTEMTHREAD | TIF_CSRSSTHREAD)))
670  {
671  /* Callback to User32 Client Thread Setup */
672  TRACE_CH(UserThread, "Call co_IntClientThreadSetup...\n");
674  if (!NT_SUCCESS(Status))
675  {
676  ERR_CH(UserThread, "ClientThreadSetup failed with Status 0x%08lx\n", Status);
677  goto error;
678  }
679  TRACE_CH(UserThread, "co_IntClientThreadSetup succeeded!\n");
680  }
681  else
682  {
683  TRACE_CH(UserThread, "co_IntClientThreadSetup cannot be called...\n");
684  }
685 
686  TRACE_CH(UserThread, "UserCreateW32Thread pti 0x%p\n", ptiCurrent);
687  return STATUS_SUCCESS;
688 
689 error:
690  ERR_CH(UserThread, "InitThreadCallback failed! Freeing pti 0x%p for TID:0x%lx\n",
691  ptiCurrent, HandleToUlong(Thread->Cid.UniqueThread));
693  return Status;
694 }
ULONG fsHooks
Definition: ntuser.h:311
USERSTARTUPINFO usi
Definition: win32.h:274
ULONG Win32ClientInfo[31]
Definition: compat.h:706
PPEB ProcessEnvironmentBlock
Definition: ntddk_ex.h:337
#define error(str)
Definition: mkdosfs.c:1605
PVOID Win32ThreadInfo
Definition: compat.h:705
LIST_ENTRY WindowListHead
Definition: win32.h:156
PTHREADINFO ptiSibling
Definition: win32.h:117
#define TIF_DONTATTACHQUEUE
Definition: ntuser.h:260
#define EngGetTickCount32()
Definition: eng.h:43
PVOID NTAPI PsGetProcessWin32Process(PEPROCESS Process)
Definition: process.c:1193
FLONG TIF_flags
Definition: win32.h:96
PWINSTATION_OBJECT InputWindowStation
Definition: winsta.c:21
PEPROCESS gpepCSRSS
Definition: csr.c:15
LONG NTSTATUS
Definition: precomp.h:26
#define HandleToUlong(h)
Definition: basetsd.h:79
LIST_ENTRY PtiLink
Definition: win32.h:127
PRTL_USER_PROCESS_PARAMETERS ProcessParameters
Definition: btrfs_drv.h:1903
UNICODE_STRING DesktopInfo
Definition: rtltypes.h:1555
#define TIF_SYSTEMTHREAD
Definition: ntuser.h:256
POBJECT_TYPE ExEventObjectType
Definition: event.c:18
PPROCESSINFO ppi
Definition: win32.h:89
PTHREADINFO gptiForeground
Definition: focus.c:15
#define W32PF_ALLOWFOREGROUNDACTIVATE
Definition: win32.h:12
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
Definition: obref.c:494
HDESK hdeskStartup
Definition: win32.h:259
NTSTATUS FASTCALL IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest, PUNICODE_STRING Source)
Definition: misc.c:679
#define FALSE
Definition: types.h:117
#define TIF_CSRSSTHREAD
Definition: ntuser.h:257
#define TAG_STRING
Definition: oslist.h:22
LIST_ENTRY SentMessagesListHead
Definition: win32.h:101
#define EVENT_ALL_ACCESS
Definition: isotest.c:82
NTSTATUS AllocW32Thread(IN PETHREAD Thread, OUT PTHREADINFO *W32Thread)
Definition: main.c:373
#define STARTF_INHERITDESKTOP
Definition: undocuser.h:163
#define IntReferenceProcessInfo(ppi)
Definition: win32.h:182
LIST_ENTRY W32CallbackListHead
Definition: win32.h:157
#define TIF_GUITHREADINITIALIZED
Definition: ntuser.h:278
struct _CLIENTTHREADINFO * pcti
Definition: win32.h:92
#define TIF_ALLOWFOREGROUNDACTIVATE
Definition: ntuser.h:259
INT cThreads
Definition: win32.h:258
Status
Definition: gdiplustypes.h:24
ULONG fsHooks
Definition: win32.h:118
#define ASSERT(a)
Definition: mode.c:44
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
PUSER_MESSAGE_QUEUE FASTCALL MsqCreateMessageQueue(PTHREADINFO pti)
Definition: msgqueue.c:2440
CLIENT_ID Cid
Definition: pstypes.h:1128
struct _DESKTOP * rpdeskStartup
Definition: win32.h:254
PKEVENT pEventQueueServer
Definition: win32.h:126
unsigned short WORD
Definition: ntddk_ex.h:93
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2652
struct _CLIENTINFO * pClientInfo
Definition: win32.h:95
HKL hKL
Definition: ntuser.h:322
HANDLE UniqueThread
Definition: compat.h:685
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: obhandle.c:3379
struct _CLIENTINFO * PCLIENTINFO
BOOL FASTCALL UserSetProcessWindowStation(HWINSTA hWindowStation)
Definition: winsta.c:1382
#define NB_HOOKS
Definition: ntuser.h:127
LIST_ENTRY aphkStart[NB_HOOKS]
FIXME!
Definition: win32.h:144
#define IS_IMM_MODE()
Definition: precomp.h:117
#define VOID
Definition: acefi.h:82
CLIENTTHREADINFO cti
Definition: win32.h:145
NTSTATUS NTAPI ExitThreadCallback(PETHREAD Thread)
Definition: main.c:702
struct tagKL * KeyboardLayout
Definition: win32.h:91
HANDLE hEventQueueClient
Definition: win32.h:124
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:90
Definition: compat.h:694
USHORT CodePage
Definition: ntuser.h:323
#define TRACE_CH(ch, fmt,...)
Definition: debug.h:108
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
LIST_ENTRY PostedMessagesListHead
Definition: win32.h:138
BOOL IntSetThreadDesktop(IN HDESK hDesktop, IN BOOL FreeOnFailure)
Definition: desktop.c:3252
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
struct tagUSERSTARTUPINFO USERSTARTUPINFO
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
PKL W32kGetDefaultKeyLayout(VOID)
Definition: kbdlayout.c:508
NTSTATUS FASTCALL IntResolveDesktop(IN PEPROCESS Process, IN PUNICODE_STRING DesktopPath, IN BOOL bInherit, OUT HWINSTA *phWinSta, OUT HDESK *phDesktop)
Definition: desktop.c:551
NTSTATUS FASTCALL IntValidateDesktopHandle(HDESK Desktop, KPROCESSOR_MODE AccessMode, ACCESS_MASK DesiredAccess, PDESKTOP *Object)
Definition: desktop.c:1237
#define NULL
Definition: types.h:112
NTSTATUS APIENTRY co_IntClientThreadSetup(VOID)
Definition: callback.c:959
#define W32PF_APPSTARTING
Definition: win32.h:10
#define ERR_CH(ch, fmt,...)
Definition: debug.h:105
WORD wShowWindow
Definition: win32.h:219
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
PTHREADINFO ptiList
Definition: win32.h:252
#define STATUS_SUCCESS
Definition: shellext.h:65
struct _PROCESSINFO * ppi
Definition: ntuser.h:329
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
DWORD dwTIFlags
Definition: ntuser.h:307
PIMC FASTCALL UserCreateInputContext(ULONG_PTR dwClientImcData)
Definition: ime.c:1540
#define TIF_INCLEANUP
Definition: ntuser.h:254
#define W32PF_THREADCONNECTED
Definition: win32.h:18
HANDLE gpidLogon
Definition: simplecall.c:15
VOID FASTCALL UserReferenceObject(PVOID obj)
Definition: object.c:731

Referenced by Win32kThreadCallback().

◆ UserDeleteW32Process()

VOID UserDeleteW32Process ( _Pre_notnull_ __drv_freesMem(Mem) PPROCESSINFO  ppiCurrent)

Definition at line 96 of file main.c.

98 {
99  if (ppiCurrent->InputIdleEvent)
100  {
101  /* Free the allocated memory */
102  ExFreePoolWithTag(ppiCurrent->InputIdleEvent, USERTAG_EVENT);
103  }
104 
105  /* Close the startup desktop */
106  if (ppiCurrent->rpdeskStartup)
107  ObDereferenceObject(ppiCurrent->rpdeskStartup);
108 
109 #if DBG
110  if (DBG_IS_CHANNEL_ENABLED(ppiCurrent, DbgChUserObj, WARN_LEVEL))
111  {
112  TRACE_PPI(ppiCurrent, UserObj, "Dumping user handles now that process info %p is gets freed.\n", ppiCurrent);
114  }
115 #endif
116 
117  /* Free the PROCESSINFO */
119 }
#define USERTAG_EVENT
Definition: tags.h:230
#define USERTAG_PROCESSINFO
Definition: tags.h:260
#define ObDereferenceObject
Definition: obfuncs.h:203
#define DBG_IS_CHANNEL_ENABLED(ppi, ch, level)
Definition: win32kdebug.h:166
#define TRACE_PPI(ppi, ch, fmt,...)
Definition: win32kdebug.h:183
void DbgUserDumpHandleTable()
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099

◆ UserDeleteW32Thread()

VOID UserDeleteW32Thread ( PTHREADINFO  pti)

Definition at line 412 of file main.c.

413 {
414  PPROCESSINFO ppi = pti->ppi;
415 
416  TRACE_CH(UserThread, "UserDeleteW32Thread pti 0x%p\n",pti);
417 
418  /* Free the message queue */
419  if (pti->MessageQueue)
420  {
422  }
423 
425 
426  ObDereferenceObject(pti->pEThread);
427 
429 
431 
432  {
433  // Find another queue for mouse cursor.
434  MSG msg;
435  msg.message = WM_MOUSEMOVE;
436  msg.wParam = UserGetMouseButtonsState();
437  msg.lParam = MAKELPARAM(gpsi->ptCursor.x, gpsi->ptCursor.y);
438  msg.pt = gpsi->ptCursor;
440  }
441 }
VOID FASTCALL co_MsqInsertMouseMessage(MSG *Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: msgqueue.c:580
#define TRUE
Definition: types.h:120
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
#define MAKELPARAM(l, h)
Definition: winuser.h:3988
#define USERTAG_THREADINFO
Definition: tags.h:284
PSERVERINFO gpsi
Definition: main.c:27
WORD FASTCALL UserGetMouseButtonsState(VOID)
Definition: mouse.c:22
PPROCESSINFO ppi
Definition: win32.h:89
VOID FASTCALL MsqDestroyMessageQueue(_In_ PTHREADINFO pti)
Definition: msgqueue.c:2467
#define ObDereferenceObject
Definition: obfuncs.h:203
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:90
#define TRACE_CH(ch, fmt,...)
Definition: debug.h:108
#define WM_MOUSEMOVE
Definition: winuser.h:1762
VOID FASTCALL MsqCleanupThreadMsgs(PTHREADINFO pti)
Definition: msgqueue.c:2265
#define msg(x)
Definition: auth_time.c:54
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define IntDereferenceProcessInfo(ppi)
Definition: win32.h:187

◆ UserDisplayNotifyShutdown()

VOID UserDisplayNotifyShutdown ( PPROCESSINFO  ppiCurrent)

Definition at line 933 of file display.c.

935 {
936  if (ppiCurrent == gpFullscreen)
937  {
939  if (gpFullscreen)
940  ERR("Failed to restore display mode!\n");
941  }
942 }
static PPROCESSINFO gpFullscreen
Definition: display.c:13
LONG APIENTRY UserChangeDisplaySettings(PUNICODE_STRING pustrDevice, LPDEVMODEW pdm, DWORD flags, LPVOID lParam)
Definition: display.c:716
#define ERR(fmt,...)
Definition: debug.h:110
#define NULL
Definition: types.h:112

Referenced by ExitThreadCallback().

◆ UserProcessCreate()

NTSTATUS UserProcessCreate ( PEPROCESS  Process)

Definition at line 122 of file main.c.

123 {
125  ASSERT(ppiCurrent);
126 
129 
130  {
131  PKEVENT Event;
132 
133  /* Allocate memory for the event structure */
135  sizeof(*Event),
136  USERTAG_EVENT);
137  if (Event)
138  {
139  /* Initialize the kernel event */
142  FALSE);
143  }
144  else
145  {
146  /* Out of memory */
147  DPRINT("CreateEvent() failed\n");
148  KeBugCheck(0);
149  }
150 
151  /* Set the event */
152  ppiCurrent->InputIdleEvent = Event;
153  KeInitializeEvent(ppiCurrent->InputIdleEvent, NotificationEvent, FALSE);
154  }
155 
156  ppiCurrent->peProcess = Process;
157  ppiCurrent->W32Pid = HandleToUlong(PsGetProcessId(Process));
158 
159  /* Setup process flags */
160  ppiCurrent->W32PF_flags |= W32PF_PROCESSCONNECTED;
161  if (Process->Peb->ProcessParameters &&
162  (Process->Peb->ProcessParameters->WindowFlags & STARTF_SCREENSAVER))
163  {
164  ppiScrnSaver = ppiCurrent;
165  ppiCurrent->W32PF_flags |= W32PF_SCREENSAVER;
166  }
167 
168  // FIXME: check if this process is allowed.
169  ppiCurrent->W32PF_flags |= W32PF_ALLOWFOREGROUNDACTIVATE; // Starting application will get it toggled off.
170 
171  return STATUS_SUCCESS;
172 }
PPROCESSINFO ppiScrnSaver
Definition: main.c:30
PVOID NTAPI PsGetProcessWin32Process(PEPROCESS Process)
Definition: process.c:1193
#define HandleToUlong(h)
Definition: basetsd.h:79
#define USERTAG_EVENT
Definition: tags.h:230
#define W32PF_PROCESSCONNECTED
Definition: win32.h:19
#define W32PF_ALLOWFOREGROUNDACTIVATE
Definition: win32.h:12
#define FALSE
Definition: types.h:117
DECLSPEC_NORETURN VOID NTAPI KeBugCheck(ULONG BugCheckCode)
Definition: bug.c:1427
_In_ PVOID _In_ ULONG Event
Definition: iotypes.h:467
#define ASSERT(a)
Definition: mode.c:44
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
Definition: exfuncs.h:274
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
LIST_ENTRY DriverObjListHead
Definition: win32.h:285
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define STARTF_SCREENSAVER
Definition: undocuser.h:164
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
#define STATUS_SUCCESS
Definition: shellext.h:65
HANDLE NTAPI PsGetProcessId(PEPROCESS Process)
Definition: process.c:1063
#define DPRINT
Definition: sndvol32.h:71
FAST_MUTEX DriverObjListLock
Definition: win32.h:284
#define W32PF_SCREENSAVER
Definition: win32.h:26

Referenced by InitProcessCallback().

◆ UserProcessDestroy()

NTSTATUS UserProcessDestroy ( PEPROCESS  Process)

Definition at line 175 of file main.c.

176 {
178  ASSERT(ppiCurrent);
179 
180  if (ppiScrnSaver == ppiCurrent)
181  ppiScrnSaver = NULL;
182 
184 
185  if (gpwlCache)
186  {
188  gpwlCache = NULL;
189  }
190 
191  /* Destroy user objects */
193 
194  TRACE_CH(UserProcess, "Freeing ppi 0x%p\n", ppiCurrent);
195 #if DBG
196  if (DBG_IS_CHANNEL_ENABLED(ppiCurrent, DbgChUserObj, WARN_LEVEL))
197  {
198  TRACE_CH(UserObj, "Dumping user handles at the end of the process %s (Info %p).\n",
199  ppiCurrent->peProcess->ImageFileName, ppiCurrent);
201  }
202 #endif
203 
204  /* Remove it from the list of GUI apps */
206 
207  /*
208  * Deregister logon application automatically
209  */
210  if (gpidLogon == ppiCurrent->peProcess->UniqueProcessId)
211  gpidLogon = 0;
212 
213  /* Close the current window station */
215 
216  if (gppiInputProvider == ppiCurrent) gppiInputProvider = NULL;
217 
218  if (ppiCurrent->hdeskStartup)
219  {
220  ZwClose(ppiCurrent->hdeskStartup);
221  ppiCurrent->hdeskStartup = NULL;
222  }
223 
224  /* Clean up the process icon cache */
225  IntCleanupCurIconCache(ppiCurrent);
226 
227  return STATUS_SUCCESS;
228 }
PPROCESSINFO ppiScrnSaver
Definition: main.c:30
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
PVOID NTAPI PsGetProcessWin32Process(PEPROCESS Process)
Definition: process.c:1193
HDESK hdeskStartup
Definition: win32.h:259
#define FALSE
Definition: types.h:117
PWINDOWLIST gpwlCache
Definition: window.c:17
PPROCESSINFO gppiInputProvider
Definition: ntuser.c:16
#define ASSERT(a)
Definition: mode.c:44
BOOL FASTCALL UserSetProcessWindowStation(HWINSTA hWindowStation)
Definition: winsta.c:1382
BOOL FASTCALL co_IntGraphicsCheck(BOOL Create)
Definition: guicheck.c:52
#define TRACE_CH(ch, fmt,...)
Definition: debug.h:108
#define DBG_IS_CHANNEL_ENABLED(ppi, ch, level)
Definition: win32kdebug.h:166
VOID FASTCALL IntCleanupCurIconCache(PPROCESSINFO Win32Process)
Definition: cursoricon.c:391
#define NULL
Definition: types.h:112
BOOLEAN UserDestroyObjectsForOwner(PUSER_HANDLE_TABLE Table, PVOID Owner)
Definition: object.c:754
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
void DbgUserDumpHandleTable()
#define STATUS_SUCCESS
Definition: shellext.h:65
#define USERTAG_WINDOWLIST
Definition: tags.h:298
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
VOID FASTCALL IntFreeImeHotKeys(VOID)
Definition: ime.c:340
HANDLE gpidLogon
Definition: simplecall.c:15

Referenced by ExitProcessCallback().

◆ UserThreadCreate()

NTSTATUS UserThreadCreate ( PETHREAD  Thread)

Definition at line 444 of file main.c.

445 {
446  return STATUS_SUCCESS;
447 }
#define STATUS_SUCCESS
Definition: shellext.h:65

◆ UserThreadDestroy()

NTSTATUS UserThreadDestroy ( PETHREAD  Thread)

Definition at line 450 of file main.c.

451 {
452  return STATUS_SUCCESS;
453 }
#define STATUS_SUCCESS
Definition: shellext.h:65

◆ Win32kProcessCallback()

NTSTATUS APIENTRY Win32kProcessCallback ( PEPROCESS  Process,
BOOLEAN  Initialize 
)

Definition at line 343 of file main.c.

345 {
347 
348  ASSERT(Process->Peb);
349 
350  TRACE_CH(UserProcess, "Win32kProcessCallback -->\n");
351 
353 
354  if (Initialize)
355  {
357  }
358  else
359  {
361  }
362 
363  UserLeave();
364 
365  TRACE_CH(UserProcess, "<-- Win32kProcessCallback\n");
366 
367  return Status;
368 }
NTSTATUS InitProcessCallback(PEPROCESS Process)
Definition: main.c:231
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS ExitProcessCallback(PEPROCESS Process)
Definition: main.c:304
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:249
Status
Definition: gdiplustypes.h:24
#define ASSERT(a)
Definition: mode.c:44
static BOOL Initialize(LPCWSTR lpDriverPath)
Definition: main.c:4
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:258
#define TRACE_CH(ch, fmt,...)
Definition: debug.h:108
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219

Referenced by DriverEntry().

◆ Win32kThreadCallback()

NTSTATUS APIENTRY Win32kThreadCallback ( PETHREAD  Thread,
PSW32THREADCALLOUTTYPE  Type 
)

Definition at line 880 of file main.c.

882 {
884 
885  ASSERT(NtCurrentTeb());
886 
888 
890  {
893  }
894  else // if (Type == PsW32ThreadCalloutExit)
895  {
898  }
899 
900  UserLeave();
901 
902  return Status;
903 }
PVOID NTAPI PsGetThreadWin32Thread(IN PETHREAD Thread)
Definition: thread.c:795
LONG NTSTATUS
Definition: precomp.h:26
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:249
Status
Definition: gdiplustypes.h:24
#define ASSERT(a)
Definition: mode.c:44
Type
Definition: Type.h:6
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2652
NTSTATUS NTAPI InitThreadCallback(PETHREAD Thread)
Definition: main.c:456
NTSTATUS NTAPI ExitThreadCallback(PETHREAD Thread)
Definition: main.c:702
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:258
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420
#define NULL
Definition: types.h:112

Referenced by DriverEntry().

Variable Documentation

◆ gppiList

PPROCESSINFO gppiList = NULL

Definition at line 31 of file main.c.

Referenced by ExitProcessCallback(), and InitProcessCallback().

◆ gpsi

PSERVERINFO gpsi = NULL

Definition at line 27 of file main.c.

Referenced by DriverEntry(), and UserDeleteW32Thread().

◆ gusLanguageID

◆ hModuleWin

HANDLE hModuleWin

Definition at line 16 of file main.c.

Referenced by DriverEntry(), and UserRegisterSystemClasses().

◆ ppiScrnSaver

◆ Win32kNumberOfSysCalls

ULONG Win32kNumberOfSysCalls

Definition at line 22 of file napi.h.

Referenced by DriverEntry().

◆ Win32kSSDT

ULONG_PTR Win32kSSDT[]

Definition at line 9 of file napi.h.

Referenced by DriverEntry().

◆ Win32kSSPT

UCHAR Win32kSSPT[]

Definition at line 15 of file napi.h.

Referenced by DriverEntry().