ReactOS  0.4.15-dev-1207-g698a8e6
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)
 

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)
 
INIT_FUNCTION 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
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
Status
Definition: gdiplustypes.h:24

Definition at line 889 of file main.c.

Function Documentation

◆ _Function_class_()

_Function_class_ ( DRIVER_UNLOAD  )

Definition at line 878 of file main.c.

881 {
882  // TODO: Do more cleanup!
883 
884  ResetCsrApiPort();
885  ResetCsrProcess();
886 }
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:259
NTSTATUS NTAPI PsSetProcessWin32Process(_Inout_ PEPROCESS Process, _In_opt_ PVOID Win32Process, _In_opt_ PVOID OldWin32Process)
Definition: process.c:1257
smooth NULL
Definition: ftsmooth.c:416
#define IntReferenceProcessInfo(ppi)
Definition: win32.h:178
#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 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
return STATUS_SUCCESS
Definition: btrfs.c:3014

Referenced by InitProcessCallback().

◆ AllocW32Thread()

NTSTATUS AllocW32Thread ( IN PETHREAD  Thread,
OUT PTHREADINFO W32Thread 
)

Definition at line 365 of file main.c.

367 {
368  PTHREADINFO ptiCurrent;
369 
370  TRACE_CH(UserThread, "In AllocW32Thread(0x%p)\n", Thread);
371 
372  /* Check that we were not called with an already existing Win32 thread info */
373  ptiCurrent = PsGetThreadWin32Thread(Thread);
374  NT_ASSERT(ptiCurrent == NULL);
375 
376  /* Allocate a new Win32 thread info */
377  ptiCurrent = ExAllocatePoolWithTag(NonPagedPool,
378  sizeof(*ptiCurrent),
380  if (ptiCurrent == NULL)
381  {
382  ERR_CH(UserThread, "Failed to allocate pti for TID:0x%lx\n",
384  return STATUS_NO_MEMORY;
385  }
386 
387  TRACE_CH(UserThread, "Allocated pti 0x%p for TID:0x%lx\n",
388  ptiCurrent, HandleToUlong(Thread->Cid.UniqueThread));
389 
390  RtlZeroMemory(ptiCurrent, sizeof(*ptiCurrent));
391 
392  PsSetThreadWin32Thread(Thread, ptiCurrent, NULL);
394  IntReferenceThreadInfo(ptiCurrent);
395 
396  *W32Thread = ptiCurrent;
397  return STATUS_SUCCESS;
398 }
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:283
smooth NULL
Definition: ftsmooth.c:416
#define IntReferenceThreadInfo(pti)
Definition: win32.h:163
CLIENT_ID Cid
Definition: pstypes.h:1070
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
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 ERR_CH(ch, fmt,...)
Definition: debug.h:105
#define ObReferenceObject
Definition: obfuncs.h:204
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
return STATUS_SUCCESS
Definition: btrfs.c:3014
#define NT_ASSERT
Definition: rtlfuncs.h:3312

Referenced by InitThreadCallback().

◆ DriverEntry()

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

Definition at line 905 of file main.c.

908 {
910  BOOLEAN Result;
911  WIN32_CALLOUTS_FPNS CalloutData = {0};
912  PVOID GlobalUserHeapBase = NULL;
913 
914  /*
915  * Register user mode call interface
916  * (system service table index = 1)
917  */
919  NULL,
921  Win32kSSPT,
922  1);
923  if (Result == FALSE)
924  {
925  DPRINT1("Adding system services failed!\n");
926  return STATUS_UNSUCCESSFUL;
927  }
928 
930  DPRINT("Win32k hInstance 0x%p!\n", hModuleWin);
931 
933 
934  /* Register Object Manager Callbacks */
936  CalloutData.ThreadCallout = Win32kThreadCallback;
937  // CalloutData.GlobalAtomTableCallout = NULL;
938  // CalloutData.PowerEventCallout = NULL;
939  // CalloutData.PowerStateCallout = NULL;
940  // CalloutData.JobCallout = NULL;
947  // CalloutData.WindowStationCloseProcedure = NULL;
950  // CalloutData.WindowStationOpenProcedure = NULL;
951 
952  /* Register our per-process and per-thread structures. */
953  PsEstablishWin32Callouts(&CalloutData);
954 
955  /* Register service hook callbacks */
956 #if DBG && defined(KDBG)
957  KdSystemDebugControl('CsoR', DbgPreServiceHook, ID_Win32PreServiceHook, 0, 0, 0, 0);
958  KdSystemDebugControl('CsoR', DbgPostServiceHook, ID_Win32PostServiceHook, 0, 0, 0, 0);
959 #endif
960 
961  /* Create the global USER heap */
963  &GlobalUserHeapBase,
964  1 * 1024 * 1024); /* FIXME: 1 MB for now... */
965  if (GlobalUserHeap == NULL)
966  {
967  DPRINT1("Failed to initialize the global heap!\n");
968  return STATUS_UNSUCCESSFUL;
969  }
970 
971  /* Allocate global server info structure */
972  gpsi = UserHeapAlloc(sizeof(*gpsi));
973  if (!gpsi)
974  {
975  DPRINT1("Failed allocate server info structure!\n");
976  return STATUS_UNSUCCESSFUL;
977  }
978 
979  RtlZeroMemory(gpsi, sizeof(*gpsi));
980  DPRINT("Global Server Data -> %p\n", gpsi);
981 
984 
985  /* Create stock objects, ie. precreated objects commonly
986  used by win32 applications */
989 
991  NT_ROF(InitPDEVImpl());
992  NT_ROF(InitLDEVImpl());
994  NT_ROF(InitDcImpl());
995  NT_ROF(InitUserImpl());
1001  NT_ROF(InitTimerImpl());
1002  NT_ROF(InitDCEImpl());
1003 
1005 
1006  /* Initialize FreeType library */
1007  if (!InitFontSupport())
1008  {
1009  DPRINT1("Unable to initialize font support\n");
1010  return Status;
1011  }
1012 
1013  return STATUS_SUCCESS;
1014 }
NTSTATUS APIENTRY Win32kThreadCallback(PETHREAD Thread, PSW32THREADCALLOUTTYPE Type)
Definition: main.c:853
INIT_FUNCTION NTSTATUS NTAPI InitKeyboardImpl(VOID)
Definition: keyboard.c:31
NTSTATUS NTAPI IntDesktopObjectOpen(_In_ PVOID Parameters)
Definition: desktop.c:202
PKWIN32_SESSION_CALLOUT WindowStationOkToCloseProcedure
Definition: pstypes.h:1636
PGDI_BATCHFLUSH_ROUTINE BatchFlushRoutine
Definition: pstypes.h:1631
INIT_FUNCTION NTSTATUS NTAPI InitGdiHandleTable(void)
Definition: gdiobj.c:259
BOOLEAN NTAPI KeAddSystemServiceTable(IN PULONG_PTR Base, IN PULONG Count OPTIONAL, IN ULONG Limit, IN PUCHAR Number, IN ULONG Index)
Definition: procobj.c:905
LONG NTSTATUS
Definition: precomp.h:26
#define NT_ROF(x)
Definition: main.c:889
NTSTATUS NTAPI IntDesktopOkToClose(_In_ PVOID Parameters)
Definition: desktop.c:178
USHORT FASTCALL UserGetLanguageID(VOID)
Definition: misc.c:96
PKWIN32_THREAD_CALLOUT ThreadCallout
Definition: pstypes.h:1626
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:1634
INIT_FUNCTION NTSTATUS NTAPI InitPaletteImpl(VOID)
Definition: palette.c:66
NTSTATUS NTAPI IntWinStaObjectParse(_In_ PVOID Parameters)
Definition: winsta.c:136
INIT_FUNCTION NTSTATUS NTAPI InitBrushImpl(VOID)
Definition: engbrush.c:31
BOOL FASTCALL InitFontSupport(VOID)
Definition: freetype.c:660
PKWIN32_SESSION_CALLOUT WindowStationDeleteProcedure
Definition: pstypes.h:1638
VOID FASTCALL CreateSysColorObjects(VOID)
Definition: stockobj.c:329
INIT_FUNCTION NTSTATUS NTAPI InitDCEImpl(VOID)
Definition: windc.c:30
#define FALSE
Definition: types.h:117
USHORT gusLanguageID
Definition: main.c:29
VOID FASTCALL CreateStockObjects(VOID)
Definition: stockobj.c:247
INIT_FUNCTION NTSTATUS NTAPI InitWindowStationImpl(VOID)
Definition: winsta.c:34
INIT_FUNCTION NTSTATUS NTAPI InitUserImpl(VOID)
Definition: ntuser.c:77
NTSTATUS NTAPI IntWinStaObjectDelete(_In_ PVOID Parameters)
Definition: winsta.c:106
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
_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
static PDRIVER_OBJECT DriverObject
Definition: template.c:42
void DPRINT(...)
Definition: polytest.cpp:61
PKWIN32_SESSION_CALLOUT DesktopOkToCloseProcedure
Definition: pstypes.h:1633
NTSTATUS APIENTRY Win32kProcessCallback(PEPROCESS Process, BOOLEAN Initialize)
Definition: main.c:335
INIT_FUNCTION NTSTATUS NTAPI MsqInitializeImpl(VOID)
Definition: msgqueue.c:30
PKWIN32_SESSION_CALLOUT DesktopDeleteProcedure
Definition: pstypes.h:1635
INIT_FUNCTION NTSTATUS NTAPI InitDcImpl(VOID)
Definition: dclife.c:53
NTSTATUS NTAPI KdSystemDebugControl(IN SYSDBG_COMMAND Command, IN PVOID InputBuffer, IN ULONG InputBufferLength, OUT PVOID OutputBuffer, IN ULONG OutputBufferLength, IN OUT PULONG ReturnLength, IN KPROCESSOR_MODE PreviousMode)
Definition: kdmain.c:436
INIT_FUNCTION NTSTATUS NTAPI InitLDEVImpl(VOID)
Definition: ldevobj.c:30
INIT_FUNCTION NTSTATUS NTAPI InitDeviceImpl(VOID)
Definition: device.c:26
PVOID NTAPI MmPageEntireDriver(IN PVOID AddressWithinSection)
Definition: sysldr.c:3385
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
INIT_FUNCTION NTSTATUS NTAPI InitPDEVImpl(VOID)
Definition: pdevobj.c:21
Status
Definition: gdiplustypes.h:24
PKWIN32_SESSION_CALLOUT DesktopOpenProcedure
Definition: pstypes.h:1632
PDRIVER_UNLOAD DriverUnload
Definition: iotypes.h:2268
NTSTATUS NTAPI IntWinStaOkToClose(_In_ PVOID Parameters)
Definition: winsta.c:201
PVOID GlobalUserHeapSection
Definition: usrheap.c:26
ULONG_PTR Win32kSSDT[]
Definition: napi.h:9
UCHAR Win32kSSPT[]
Definition: napi.h:15
NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
Definition: main.c:690
NTSTATUS NTAPI IntDesktopObjectDelete(_In_ PVOID Parameters)
Definition: desktop.c:147
static DRIVER_UNLOAD DriverUnload
Definition: kbdclass.c:17
HANDLE GlobalUserHeap
Definition: usrheap.c:25
HANDLE hModuleWin
Definition: main.c:16
INIT_FUNCTION NTSTATUS NTAPI InitInputImpl(VOID)
Definition: input.c:360
#define DPRINT1
Definition: precomp.h:8
NTSTATUS NTAPI IntDesktopObjectClose(_In_ PVOID Parameters)
Definition: desktop.c:215
VOID NTAPI PsEstablishWin32Callouts(IN PWIN32_CALLOUTS_FPNS CalloutData)
Definition: win32.c:112
INIT_FUNCTION NTSTATUS NTAPI InitDesktopImpl(VOID)
Definition: desktop.c:236
INIT_FUNCTION NTSTATUS NTAPI InitTimerImpl(VOID)
Definition: timer.c:594
PWIN32HEAP UserCreateHeap(OUT PVOID *SectionObject, IN OUT PVOID *SystemBase, IN SIZE_T HeapSize)
Definition: usrheap.c:177
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
PKWIN32_SESSION_CALLOUT WindowStationParseProcedure
Definition: pstypes.h:1639
PKWIN32_PROCESS_CALLOUT ProcessCallout
Definition: pstypes.h:1625
return STATUS_SUCCESS
Definition: btrfs.c:3014

◆ ExitProcessCallback()

NTSTATUS ExitProcessCallback ( PEPROCESS  Process)

Definition at line 296 of file main.c.

297 {
298  PPROCESSINFO ppiCurrent, *pppi;
299 
300  /* Get the Win32 Process */
301  ppiCurrent = PsGetProcessWin32Process(Process);
302  ASSERT(ppiCurrent);
303  ASSERT(ppiCurrent->peProcess == Process);
304 
305  TRACE_CH(UserProcess, "Destroying ppi 0x%p\n", ppiCurrent);
306  ppiCurrent->W32PF_flags |= W32PF_TERMINATED;
307 
308  /* Remove it from the list */
309  pppi = &gppiList;
310  while (*pppi != NULL && *pppi != ppiCurrent)
311  {
312  pppi = &(*pppi)->ppiNext;
313  }
314  ASSERT(*pppi == ppiCurrent);
315  *pppi = ppiCurrent->ppiNext;
316 
317  /* Cleanup GDI info */
319 
320  /* Cleanup USER info */
322 
323  /* The process is dying */
324  PsSetProcessWin32Process(Process, NULL, ppiCurrent);
325  ppiCurrent->peProcess = NULL;
326 
327  /* Finally, dereference */
328  IntDereferenceProcessInfo(ppiCurrent);
329 
330  return STATUS_SUCCESS;
331 }
PPROCESSINFO ppiNext
Definition: win32.h:253
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
smooth NULL
Definition: ftsmooth.c:416
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
NTSTATUS UserProcessDestroy(PEPROCESS Process)
Definition: main.c:175
#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
return STATUS_SUCCESS
Definition: btrfs.c:3014
#define IntDereferenceProcessInfo(ppi)
Definition: win32.h:183

Referenced by InitProcessCallback(), and Win32kProcessCallback().

◆ ExitThreadCallback()

NTSTATUS NTAPI ExitThreadCallback ( PETHREAD  Thread)

Definition at line 687 of file main.c.

688 {
689  PTHREADINFO *ppti;
690  PSINGLE_LIST_ENTRY psle;
691  PPROCESSINFO ppiCurrent;
693  PTHREADINFO ptiCurrent;
694 
695  Process = Thread->ThreadsProcess;
696 
697  /* Get the Win32 Thread */
698  ptiCurrent = PsGetThreadWin32Thread(Thread);
699  ASSERT(ptiCurrent);
700 
701  TRACE_CH(UserThread, "Destroying pti 0x%p eThread 0x%p\n", ptiCurrent, Thread);
702 
703  ptiCurrent->TIF_flags |= TIF_INCLEANUP;
704  ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
705 
706  ppiCurrent = ptiCurrent->ppi;
707  ASSERT(ppiCurrent);
708 
709  IsRemoveAttachThread(ptiCurrent);
710 
711  ptiCurrent->TIF_flags |= TIF_DONTATTACHQUEUE;
712  ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
713 
715 
716  /* Decrement thread count and check if its 0 */
717  ppiCurrent->cThreads--;
718 
719  if (ptiCurrent->TIF_flags & TIF_GUITHREADINITIALIZED)
720  {
721  /* Do now some process cleanup that requires a valid win32 thread */
722  if (ptiCurrent->ppi->cThreads == 0)
723  {
724  /* Check if we have registered the user api hook */
725  if (ptiCurrent->ppi == ppiUahServer)
726  {
727  /* Unregister the api hook */
729  }
730 
731  /* Notify logon application to restart shell if needed */
732  if (ptiCurrent->pDeskInfo)
733  {
734  if (ptiCurrent->pDeskInfo->ppiShellProcess == ppiCurrent)
735  {
737 
738  TRACE_CH(UserProcess, "Shell process is exiting (%lu)\n", ExitCode);
739 
743  ExitCode);
744 
745  ptiCurrent->pDeskInfo->ppiShellProcess = NULL;
746  }
747  }
748  }
749 
750  DceFreeThreadDCE(ptiCurrent);
751  DestroyTimersForThread(ptiCurrent);
753  UnregisterThreadHotKeys(ptiCurrent);
754 
755  if (!UserDestroyObjectsForOwner(gHandleTable, ptiCurrent))
756  {
757  DPRINT1("Failed to delete objects belonging to thread %p. This is VERY BAD!.\n", ptiCurrent);
758  ASSERT(FALSE);
759  return STATUS_UNSUCCESSFUL;
760  }
761 
762  if (ppiCurrent && ppiCurrent->ptiList == ptiCurrent && !ptiCurrent->ptiSibling &&
763  ppiCurrent->W32PF_flags & W32PF_CLASSESREGISTERED)
764  {
765  TRACE_CH(UserThread, "DestroyProcessClasses\n");
766  /* no process windows should exist at this point, or the function will assert! */
767  DestroyProcessClasses(ppiCurrent);
768  ppiCurrent->W32PF_flags &= ~W32PF_CLASSESREGISTERED;
769  }
770 
771  IntBlockInput(ptiCurrent, FALSE);
772  IntCleanupThreadCallbacks(ptiCurrent);
773 
774  /* cleanup user object references stack */
775  psle = PopEntryList(&ptiCurrent->ReferencesList);
776  while (psle)
777  {
779  TRACE_CH(UserThread, "thread clean: remove reference obj 0x%p\n",ref->obj);
781 
782  psle = PopEntryList(&ptiCurrent->ReferencesList);
783  }
784  }
785 
786  if (ptiCurrent->cEnterCount)
787  {
789  ptiCurrent->cEnterCount = 0;
790  }
791 
792  /* Find the THREADINFO in the PROCESSINFO's list */
793  ppti = &ppiCurrent->ptiList;
794  while (*ppti != NULL && *ppti != ptiCurrent)
795  {
796  ppti = &((*ppti)->ptiSibling);
797  }
798 
799  /* we must have found it */
800  ASSERT(*ppti == ptiCurrent);
801 
802  /* Remove it from the list */
803  *ppti = ptiCurrent->ptiSibling;
804 
805  if (ptiCurrent->KeyboardLayout)
807 
808  if (gptiForeground == ptiCurrent)
809  {
810 // IntNotifyWinEvent(EVENT_OBJECT_FOCUS, NULL, OBJID_CLIENT, CHILDID_SELF, 0);
811 // IntNotifyWinEvent(EVENT_SYSTEM_FOREGROUND, NULL, OBJID_WINDOW, CHILDID_SELF, 0);
812 
814  }
815 
816  /* Restore display mode when we are the last thread, and we changed the display mode */
817  if (ppiCurrent->cThreads == 0)
818  UserDisplayNotifyShutdown(ppiCurrent);
819 
820 
821  // Fixes CORE-6384 & CORE-7030.
822 /* if (ptiLastInput == ptiCurrent)
823  {
824  if (!ppiCurrent->ptiList)
825  ptiLastInput = gptiForeground;
826  else
827  ptiLastInput = ppiCurrent->ptiList;
828  ERR_CH(UserThread, "DTI: ptiLastInput is Cleared!!\n");
829  }
830 */
831  TRACE_CH(UserThread, "Freeing pti 0x%p\n", ptiCurrent);
832 
834 
835  if (ptiCurrent->hEventQueueClient != NULL)
836  {
839  }
840  ptiCurrent->hEventQueueClient = NULL;
841 
842  /* The thread is dying */
843  PsSetThreadWin32Thread(Thread /*ptiCurrent->pEThread*/, NULL, ptiCurrent);
844 
845  /* Dereference the THREADINFO */
846  IntDereferenceThreadInfo(ptiCurrent);
847 
848  return STATUS_SUCCESS;
849 }
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
Definition: ntbasedef.h:629
#define TRUE
Definition: types.h:120
PTHREADINFO ptiSibling
Definition: win32.h:115
#define TIF_DONTATTACHQUEUE
Definition: ntuser.h:246
FLONG TIF_flags
Definition: win32.h:94
BOOL FASTCALL DestroyTimersForThread(PTHREADINFO pti)
Definition: timer.c:549
BOOL FASTCALL UserDereferenceObject(PVOID Object)
Definition: object.c:610
VOID NTAPI ObDereferenceObject(IN PVOID Object)
Definition: obref.c:375
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:87
PTHREADINFO gptiForeground
Definition: focus.c:14
NTSTATUS NTAPI PsGetProcessExitStatus(PEPROCESS Process)
Definition: process.c:1053
#define FALSE
Definition: types.h:117
BOOL NTAPI UserCloseClipboard(VOID)
Definition: clipboard.c:542
void FASTCALL DceFreeThreadDCE(PTHREADINFO)
Definition: windc.c:779
Definition: object.h:3
smooth NULL
Definition: ftsmooth.c:416
#define TIF_GUITHREADINITIALIZED
Definition: ntuser.h:264
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:254
HWND hwndSAS
Definition: winsta.c:24
PKEVENT pEventQueueServer
Definition: win32.h:124
unsigned long DWORD
Definition: ntddk_ex.h:95
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
struct _CLIENTINFO * pClientInfo
Definition: win32.h:93
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: obhandle.c:3376
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:89
VOID FASTCALL UnregisterThreadHotKeys(PTHREADINFO pti)
Definition: hotkey.c:121
HANDLE hEventQueueClient
Definition: win32.h:122
#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:3211
#define DPRINT1
Definition: precomp.h:8
BOOLEAN UserDestroyObjectsForOwner(PUSER_HANDLE_TABLE Table, PVOID Owner)
Definition: object.c:720
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
SINGLE_LIST_ENTRY ReferencesList
Definition: win32.h:152
#define IO_NO_INCREMENT
Definition: iotypes.h:581
PTHREADINFO ptiList
Definition: win32.h:248
BOOL FASTCALL IsRemoveAttachThread(PTHREADINFO pti)
Definition: input.c:437
struct _DESKTOPINFO * pDeskInfo
Definition: win32.h:92
return STATUS_SUCCESS
Definition: btrfs.c:3014
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
#define IntDereferenceThreadInfo(pti)
Definition: win32.h:168
INT cEnterCount
Definition: win32.h:130
VOID UserDisplayNotifyShutdown(PPROCESSINFO ppiCurrent)
Definition: display.c:931
#define TIF_INCLEANUP
Definition: ntuser.h:240
base of all file and directory entries
Definition: entries.h:82
#define LN_SHELL_EXITED
Definition: undocuser.h:114
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:284
UINT PrivateMemFontHandleCount
Definition: win32.h:278
PVOID NTAPI GDI_MapHandleTable(PEPROCESS pProcess)
Definition: gdiobj.c:1515
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:283
FAST_MUTEX PrivateFontListLock
Definition: win32.h:275
LIST_ENTRY PrivateMemFontListHead
Definition: win32.h:277
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
Definition: exfuncs.h:274
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
struct _GDI_POOL * pPoolRgnAttr
Definition: win32.h:285
#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
return STATUS_SUCCESS
Definition: btrfs.c:3014
LIST_ENTRY PrivateFontListHead
Definition: win32.h:276

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:284
PVOID NTAPI PsGetProcessWin32Process(PEPROCESS Process)
Definition: process.c:1193
BOOL NTAPI GDI_CleanupForProcess(struct _EPROCESS *Process)
Definition: gdiobj.c:1545
VOID FASTCALL IntGdiCleanupPrivateFontsForProcess(VOID)
Definition: freetype.c:1947
struct _GDI_POOL * pPoolDcAttr
Definition: win32.h:283
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
struct _GDI_POOL * pPoolRgnAttr
Definition: win32.h:285
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
return STATUS_SUCCESS
Definition: btrfs.c:3014
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 }
return STATUS_SUCCESS
Definition: btrfs.c:3014

◆ GdiThreadDestroy()

NTSTATUS GdiThreadDestroy ( PETHREAD  Thread)

Definition at line 74 of file init.c.

75 {
76  return STATUS_SUCCESS;
77 }
return STATUS_SUCCESS
Definition: btrfs.c:3014

◆ InitProcessCallback()

NTSTATUS InitProcessCallback ( PEPROCESS  Process)

Definition at line 223 of file main.c.

224 {
226  PPROCESSINFO ppiCurrent;
227  PVOID KernelMapping = NULL, UserMapping = NULL;
228 
229  /* We might be called with an already allocated win32 process */
230  ppiCurrent = PsGetProcessWin32Process(Process);
231  if (ppiCurrent != NULL)
232  {
233  /* There is no more to do for us (this is a success code!) */
234  return STATUS_ALREADY_WIN32;
235  }
236  // if (ppiCurrent->W32PF_flags & W32PF_PROCESSCONNECTED)
237  // return STATUS_ALREADY_WIN32;
238 
239  /* Allocate a new Win32 process info */
240  Status = AllocW32Process(Process, &ppiCurrent);
241  if (!NT_SUCCESS(Status))
242  {
243  ERR_CH(UserProcess, "Failed to allocate ppi for PID:0x%lx\n",
244  HandleToUlong(Process->UniqueProcessId));
245  return Status;
246  }
247 
248 #if DBG
250 #if defined(KDBG)
251  KdRosRegisterCliCallback(DbgGdiKdbgCliCallback);
252 #endif
253 #endif
254 
255  /* Map the global user heap into the process */
256  Status = MapGlobalUserHeap(Process, &KernelMapping, &UserMapping);
257  if (!NT_SUCCESS(Status))
258  {
259  TRACE_CH(UserProcess, "Failed to map the global heap! 0x%x\n", Status);
260  goto error;
261  }
262 
263  TRACE_CH(UserProcess, "InitProcessCallback -- We have KernelMapping 0x%p and UserMapping 0x%p with delta = 0x%x\n",
264  KernelMapping, UserMapping, (ULONG_PTR)KernelMapping - (ULONG_PTR)UserMapping);
265 
266  /* Initialize USER process info */
268  if (!NT_SUCCESS(Status))
269  {
270  ERR_CH(UserProcess, "UserProcessCreate failed, Status 0x%08lx\n", Status);
271  goto error;
272  }
273 
274  /* Initialize GDI process info */
276  if (!NT_SUCCESS(Status))
277  {
278  ERR_CH(UserProcess, "GdiProcessCreate failed, Status 0x%08lx\n", Status);
279  goto error;
280  }
281 
282  /* Add the process to the global list */
283  ppiCurrent->ppiNext = gppiList;
284  gppiList = ppiCurrent;
285 
286  return STATUS_SUCCESS;
287 
288 error:
289  ERR_CH(UserProcess, "InitProcessCallback failed! Freeing ppi 0x%p for PID:0x%lx\n",
290  ppiCurrent, HandleToUlong(Process->UniqueProcessId));
292  return Status;
293 }
#define error(str)
Definition: mkdosfs.c:1605
PPROCESSINFO ppiNext
Definition: win32.h:253
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:296
uint32_t ULONG_PTR
Definition: typedefs.h:65
NTSTATUS MapGlobalUserHeap(IN PEPROCESS Process, OUT PVOID *KernelMapping, OUT PVOID *UserMapping)
Definition: usrheap.c:262
static GENERIC_MAPPING UserMapping
Definition: samrpc.c:48
PPROCESSINFO gppiList
Definition: main.c:31
smooth NULL
Definition: ftsmooth.c:416
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()
Status
Definition: gdiplustypes.h:24
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 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
return STATUS_SUCCESS
Definition: btrfs.c:3014

Referenced by Win32kProcessCallback().

◆ InitThreadCallback()

NTSTATUS NTAPI InitThreadCallback ( PETHREAD  Thread)

Definition at line 448 of file main.c.

449 {
451  PCLIENTINFO pci;
452  PTHREADINFO ptiCurrent;
453  int i;
455  PTEB pTeb;
456  PRTL_USER_PROCESS_PARAMETERS ProcessParams;
457 
458  Process = Thread->ThreadsProcess;
459 
460  pTeb = NtCurrentTeb();
461  ASSERT(pTeb);
462 
463  ProcessParams = pTeb->ProcessEnvironmentBlock->ProcessParameters;
464 
465  /* Allocate a new Win32 thread info */
466  Status = AllocW32Thread(Thread, &ptiCurrent);
467  if (!NT_SUCCESS(Status))
468  {
469  ERR_CH(UserThread, "Failed to allocate pti for TID:0x%lx\n",
471  return Status;
472  }
473 
474  /* Initialize the THREADINFO */
475  ptiCurrent->pEThread = Thread;
476  ptiCurrent->ppi = PsGetProcessWin32Process(Process);
477  IntReferenceProcessInfo(ptiCurrent->ppi);
478  pTeb->Win32ThreadInfo = ptiCurrent;
479  ptiCurrent->pClientInfo = (PCLIENTINFO)pTeb->Win32ClientInfo;
480  ptiCurrent->pcti = &ptiCurrent->cti;
481 
482  /* Mark the process as having threads */
483  ptiCurrent->ppi->W32PF_flags |= W32PF_THREADCONNECTED;
484 
485  InitializeListHead(&ptiCurrent->WindowListHead);
489  InitializeListHead(&ptiCurrent->PtiLink);
490  for (i = 0; i < NB_HOOKS; i++)
491  {
492  InitializeListHead(&ptiCurrent->aphkStart[i]);
493  }
494  ptiCurrent->ptiSibling = ptiCurrent->ppi->ptiList;
495  ptiCurrent->ppi->ptiList = ptiCurrent;
496  ptiCurrent->ppi->cThreads++;
497 
498  ptiCurrent->hEventQueueClient = NULL;
499  Status = ZwCreateEvent(&ptiCurrent->hEventQueueClient, EVENT_ALL_ACCESS,
501  if (!NT_SUCCESS(Status))
502  {
503  ERR_CH(UserThread, "Event creation failed, Status 0x%08x.\n", Status);
504  goto error;
505  }
508  (PVOID*)&ptiCurrent->pEventQueueServer, NULL);
509  if (!NT_SUCCESS(Status))
510  {
511  ERR_CH(UserThread, "Failed referencing the event object, Status 0x%08x.\n", Status);
513  ptiCurrent->hEventQueueClient = NULL;
514  goto error;
515  }
516 
517  ptiCurrent->pcti->timeLastRead = EngGetTickCount32();
518 
519  ptiCurrent->MessageQueue = MsqCreateMessageQueue(ptiCurrent);
520  if (ptiCurrent->MessageQueue == NULL)
521  {
522  ERR_CH(UserThread, "Failed to allocate message loop\n");
524  goto error;
525  }
526 
527  ptiCurrent->KeyboardLayout = W32kGetDefaultKeyLayout();
528  if (ptiCurrent->KeyboardLayout)
529  UserReferenceObject(ptiCurrent->KeyboardLayout);
530 
531  ptiCurrent->TIF_flags &= ~TIF_INCLEANUP;
532 
533  // FIXME: Flag SYSTEM threads with... TIF_SYSTEMTHREAD !!
534 
535  /* CSRSS threads have some special features */
536  if (Process == gpepCSRSS || !gpepCSRSS)
538 
539  /* Initialize the CLIENTINFO */
540  pci = (PCLIENTINFO)pTeb->Win32ClientInfo;
541  RtlZeroMemory(pci, sizeof(*pci));
542  pci->ppi = ptiCurrent->ppi;
543  pci->fsHooks = ptiCurrent->fsHooks;
544  pci->dwTIFlags = ptiCurrent->TIF_flags;
545  if (ptiCurrent->KeyboardLayout)
546  {
547  pci->hKL = ptiCurrent->KeyboardLayout->hkl;
548  pci->CodePage = ptiCurrent->KeyboardLayout->CodePage;
549  }
550 
551  /* Need to pass the user Startup Information to the current process. */
552  if ( ProcessParams )
553  {
554  if ( ptiCurrent->ppi->usi.cb == 0 ) // Not initialized yet.
555  {
556  if ( ProcessParams->WindowFlags != 0 ) // Need window flags set.
557  {
558  ptiCurrent->ppi->usi.cb = sizeof(USERSTARTUPINFO);
559  ptiCurrent->ppi->usi.dwX = ProcessParams->StartingX;
560  ptiCurrent->ppi->usi.dwY = ProcessParams->StartingY;
561  ptiCurrent->ppi->usi.dwXSize = ProcessParams->CountX;
562  ptiCurrent->ppi->usi.dwYSize = ProcessParams->CountY;
563  ptiCurrent->ppi->usi.dwFlags = ProcessParams->WindowFlags;
564  ptiCurrent->ppi->usi.wShowWindow = (WORD)ProcessParams->ShowWindowFlags;
565  }
566  }
567  }
568 
569  /*
570  * Assign a default window station and desktop to the process.
571  * Do not try to open a desktop or window station before the very first
572  * (interactive) window station has been created by Winlogon.
573  */
574  if (!(ptiCurrent->TIF_flags & (TIF_SYSTEMTHREAD | TIF_CSRSSTHREAD)) &&
575  ptiCurrent->ppi->hdeskStartup == NULL &&
577  {
578  HWINSTA hWinSta = NULL;
579  HDESK hDesk = NULL;
580  UNICODE_STRING DesktopPath;
581  PDESKTOP pdesk;
582 
583  /*
584  * Inherit the thread desktop and process window station (if not yet inherited)
585  * from the process startup info structure. See documentation of CreateProcess().
586  */
588  if (ProcessParams && ProcessParams->DesktopInfo.Length > 0)
589  {
590  Status = IntSafeCopyUnicodeStringTerminateNULL(&DesktopPath, &ProcessParams->DesktopInfo);
591  }
592  if (!NT_SUCCESS(Status))
593  {
594  RtlInitUnicodeString(&DesktopPath, NULL);
595  }
596 
598  &DesktopPath,
599  !!(ProcessParams->WindowFlags & STARTF_INHERITDESKTOP),
600  &hWinSta,
601  &hDesk);
602 
603  if (DesktopPath.Buffer)
604  ExFreePoolWithTag(DesktopPath.Buffer, TAG_STRING);
605 
606  if (!NT_SUCCESS(Status))
607  {
608  ERR_CH(UserThread, "Failed to assign default desktop and winsta to process\n");
609  goto error;
610  }
611 
612  if (!UserSetProcessWindowStation(hWinSta))
613  {
615  ERR_CH(UserThread, "Failed to set initial process winsta\n");
616  goto error;
617  }
618 
619  /* Validate the new desktop */
620  Status = IntValidateDesktopHandle(hDesk, UserMode, 0, &pdesk);
621  if (!NT_SUCCESS(Status))
622  {
623  ERR_CH(UserThread, "Failed to validate initial desktop handle\n");
624  goto error;
625  }
626 
627  /* Store the parsed desktop as the initial desktop */
628  ASSERT(ptiCurrent->ppi->hdeskStartup == NULL);
629  ASSERT(Process->UniqueProcessId != gpidLogon);
630  ptiCurrent->ppi->hdeskStartup = hDesk;
631  ptiCurrent->ppi->rpdeskStartup = pdesk;
632  }
633 
634  if (ptiCurrent->ppi->hdeskStartup != NULL)
635  {
636  if (!IntSetThreadDesktop(ptiCurrent->ppi->hdeskStartup, FALSE))
637  {
638  ERR_CH(UserThread, "Failed to set thread desktop\n");
640  goto error;
641  }
642  }
643 
644  /* Mark the thread as fully initialized */
645  ptiCurrent->TIF_flags |= TIF_GUITHREADINITIALIZED;
646 
647  if (!(ptiCurrent->ppi->W32PF_flags & (W32PF_ALLOWFOREGROUNDACTIVATE | W32PF_APPSTARTING)) &&
648  (gptiForeground && gptiForeground->ppi == ptiCurrent->ppi ))
649  {
650  ptiCurrent->TIF_flags |= TIF_ALLOWFOREGROUNDACTIVATE;
651  }
652  ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
653 
654  /* Last things to do only if we are not a SYSTEM or CSRSS thread */
655  if (!(ptiCurrent->TIF_flags & (TIF_SYSTEMTHREAD | TIF_CSRSSTHREAD)))
656  {
657  /* Callback to User32 Client Thread Setup */
658  TRACE_CH(UserThread, "Call co_IntClientThreadSetup...\n");
660  if (!NT_SUCCESS(Status))
661  {
662  ERR_CH(UserThread, "ClientThreadSetup failed with Status 0x%08lx\n", Status);
663  goto error;
664  }
665  TRACE_CH(UserThread, "co_IntClientThreadSetup succeeded!\n");
666  }
667  else
668  {
669  TRACE_CH(UserThread, "co_IntClientThreadSetup cannot be called...\n");
670  }
671 
672  TRACE_CH(UserThread, "UserCreateW32Thread pti 0x%p\n", ptiCurrent);
673  return STATUS_SUCCESS;
674 
675 error:
676  ERR_CH(UserThread, "InitThreadCallback failed! Freeing pti 0x%p for TID:0x%lx\n",
677  ptiCurrent, HandleToUlong(Thread->Cid.UniqueThread));
679  return Status;
680 }
ULONG fsHooks
Definition: ntuser.h:296
USERSTARTUPINFO usi
Definition: win32.h:270
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:150
PTHREADINFO ptiSibling
Definition: win32.h:115
#define TIF_DONTATTACHQUEUE
Definition: ntuser.h:246
#define EngGetTickCount32()
Definition: eng.h:43
PVOID NTAPI PsGetProcessWin32Process(PEPROCESS Process)
Definition: process.c:1193
FLONG TIF_flags
Definition: win32.h:94
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:125
PRTL_USER_PROCESS_PARAMETERS ProcessParameters
Definition: btrfs_drv.h:1959
UNICODE_STRING DesktopInfo
Definition: rtltypes.h:1553
#define TIF_SYSTEMTHREAD
Definition: ntuser.h:242
POBJECT_TYPE ExEventObjectType
Definition: event.c:22
PPROCESSINFO ppi
Definition: win32.h:87
PTHREADINFO gptiForeground
Definition: focus.c:14
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
#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:496
HDESK hdeskStartup
Definition: win32.h:255
NTSTATUS FASTCALL IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest, PUNICODE_STRING Source)
Definition: misc.c:655
#define FALSE
Definition: types.h:117
#define TIF_CSRSSTHREAD
Definition: ntuser.h:243
#define TAG_STRING
Definition: oslist.h:22
LIST_ENTRY SentMessagesListHead
Definition: win32.h:99
#define EVENT_ALL_ACCESS
Definition: isotest.c:82
NTSTATUS AllocW32Thread(IN PETHREAD Thread, OUT PTHREADINFO *W32Thread)
Definition: main.c:365
#define STARTF_INHERITDESKTOP
Definition: undocuser.h:162
smooth NULL
Definition: ftsmooth.c:416
#define IntReferenceProcessInfo(ppi)
Definition: win32.h:178
LIST_ENTRY W32CallbackListHead
Definition: win32.h:151
#define TIF_GUITHREADINITIALIZED
Definition: ntuser.h:264
struct _CLIENTTHREADINFO * pcti
Definition: win32.h:90
#define TIF_ALLOWFOREGROUNDACTIVATE
Definition: ntuser.h:245
INT cThreads
Definition: win32.h:254
ULONG fsHooks
Definition: win32.h:116
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
PUSER_MESSAGE_QUEUE FASTCALL MsqCreateMessageQueue(PTHREADINFO pti)
Definition: msgqueue.c:2441
CLIENT_ID Cid
Definition: pstypes.h:1070
struct _DESKTOP * rpdeskStartup
Definition: win32.h:250
PKEVENT pEventQueueServer
Definition: win32.h:124
unsigned short WORD
Definition: ntddk_ex.h:93
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
struct _CLIENTINFO * pClientInfo
Definition: win32.h:93
HKL hKL
Definition: ntuser.h:307
HANDLE UniqueThread
Definition: compat.h:685
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: obhandle.c:3376
struct _CLIENTINFO * PCLIENTINFO
Status
Definition: gdiplustypes.h:24
BOOL FASTCALL UserSetProcessWindowStation(HWINSTA hWindowStation)
Definition: winsta.c:1346
#define NB_HOOKS
Definition: ntuser.h:130
LIST_ENTRY aphkStart[NB_HOOKS]
FIXME!
Definition: win32.h:138
CLIENTTHREADINFO cti
Definition: win32.h:139
NTSTATUS NTAPI ExitThreadCallback(PETHREAD Thread)
Definition: main.c:687
struct tagKL * KeyboardLayout
Definition: win32.h:89
HANDLE hEventQueueClient
Definition: win32.h:122
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:88
Definition: compat.h:694
USHORT CodePage
Definition: ntuser.h:308
#define TRACE_CH(ch, fmt,...)
Definition: debug.h:108
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420
LIST_ENTRY PostedMessagesListHead
Definition: win32.h:132
BOOL IntSetThreadDesktop(IN HDESK hDesktop, IN BOOL FreeOnFailure)
Definition: desktop.c:3211
#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:343
NTSTATUS FASTCALL IntResolveDesktop(IN PEPROCESS Process, IN PUNICODE_STRING DesktopPath, IN BOOL bInherit, OUT HWINSTA *phWinSta, OUT HDESK *phDesktop)
Definition: desktop.c:535
NTSTATUS FASTCALL IntValidateDesktopHandle(HDESK Desktop, KPROCESSOR_MODE AccessMode, ACCESS_MASK DesiredAccess, PDESKTOP *Object)
Definition: desktop.c:1200
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:215
_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:248
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
struct _PROCESSINFO * ppi
Definition: ntuser.h:314
return STATUS_SUCCESS
Definition: btrfs.c:3014
DWORD dwTIFlags
Definition: ntuser.h:292
#define TIF_INCLEANUP
Definition: ntuser.h:240
#define W32PF_THREADCONNECTED
Definition: win32.h:18
HANDLE gpidLogon
Definition: simplecall.c:15
VOID FASTCALL UserReferenceObject(PVOID obj)
Definition: object.c:697

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 }
VOID NTAPI ObDereferenceObject(IN PVOID Object)
Definition: obref.c:375
#define USERTAG_EVENT
Definition: tags.h:229
#define USERTAG_PROCESSINFO
Definition: tags.h:259
#define DBG_IS_CHANNEL_ENABLED(ppi, ch, level)
Definition: win32kdebug.h:164
#define TRACE_PPI(ppi, ch, fmt,...)
Definition: win32kdebug.h:181
void DbgUserDumpHandleTable()
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099

◆ UserDeleteW32Thread()

VOID UserDeleteW32Thread ( PTHREADINFO  pti)

Definition at line 404 of file main.c.

405 {
406  PPROCESSINFO ppi = pti->ppi;
407 
408  TRACE_CH(UserThread, "UserDeleteW32Thread pti 0x%p\n",pti);
409 
410  /* Free the message queue */
411  if (pti->MessageQueue)
412  {
414  }
415 
417 
418  ObDereferenceObject(pti->pEThread);
419 
421 
423 
424  {
425  // Find another queue for mouse cursor.
426  MSG msg;
427  msg.message = WM_MOUSEMOVE;
428  msg.wParam = UserGetMouseButtonsState();
429  msg.lParam = MAKELPARAM(gpsi->ptCursor.x, gpsi->ptCursor.y);
430  msg.pt = gpsi->ptCursor;
432  }
433 }
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:3983
VOID NTAPI ObDereferenceObject(IN PVOID Object)
Definition: obref.c:375
#define USERTAG_THREADINFO
Definition: tags.h:283
PSERVERINFO gpsi
Definition: main.c:27
WORD FASTCALL UserGetMouseButtonsState(VOID)
Definition: mouse.c:22
PPROCESSINFO ppi
Definition: win32.h:87
VOID FASTCALL MsqDestroyMessageQueue(_In_ PTHREADINFO pti)
Definition: msgqueue.c:2468
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:88
#define TRACE_CH(ch, fmt,...)
Definition: debug.h:108
#define WM_MOUSEMOVE
Definition: winuser.h:1757
VOID FASTCALL MsqCleanupThreadMsgs(PTHREADINFO pti)
Definition: msgqueue.c:2266
#define msg(x)
Definition: auth_time.c:54
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define IntDereferenceProcessInfo(ppi)
Definition: win32.h:183

◆ UserDisplayNotifyShutdown()

VOID UserDisplayNotifyShutdown ( PPROCESSINFO  ppiCurrent)

Definition at line 931 of file display.c.

933 {
934  if (ppiCurrent == gpFullscreen)
935  {
937  if (gpFullscreen)
938  ERR("Failed to restore display mode!\n");
939  }
940 }
static PPROCESSINFO gpFullscreen
Definition: display.c:13
smooth NULL
Definition: ftsmooth.c:416
LONG APIENTRY UserChangeDisplaySettings(PUNICODE_STRING pustrDevice, LPDEVMODEW pdm, DWORD flags, LPVOID lParam)
Definition: display.c:721
#define ERR(fmt,...)
Definition: debug.h:110

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:229
#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:1431
_In_ PVOID _In_ ULONG Event
Definition: iotypes.h:450
void DPRINT(...)
Definition: polytest.cpp:61
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
Definition: exfuncs.h:274
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
LIST_ENTRY DriverObjListHead
Definition: win32.h:281
#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:163
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
HANDLE NTAPI PsGetProcessId(PEPROCESS Process)
Definition: process.c:1063
FAST_MUTEX DriverObjListLock
Definition: win32.h:280
return STATUS_SUCCESS
Definition: btrfs.c:3014
#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 
183  /* Destroy user objects */
185 
186  TRACE_CH(UserProcess, "Freeing ppi 0x%p\n", ppiCurrent);
187 #if DBG
188  if (DBG_IS_CHANNEL_ENABLED(ppiCurrent, DbgChUserObj, WARN_LEVEL))
189  {
190  TRACE_CH(UserObj, "Dumping user handles at the end of the process %s (Info %p).\n",
191  ppiCurrent->peProcess->ImageFileName, ppiCurrent);
193  }
194 #endif
195 
196  /* Remove it from the list of GUI apps */
198 
199  /*
200  * Deregister logon application automatically
201  */
202  if (gpidLogon == ppiCurrent->peProcess->UniqueProcessId)
203  gpidLogon = 0;
204 
205  /* Close the current window station */
207 
208  if (gppiInputProvider == ppiCurrent) gppiInputProvider = NULL;
209 
210  if (ppiCurrent->hdeskStartup)
211  {
212  ZwClose(ppiCurrent->hdeskStartup);
213  ppiCurrent->hdeskStartup = NULL;
214  }
215 
216  /* Clean up the process icon cache */
217  IntCleanupCurIconCache(ppiCurrent);
218 
219  return STATUS_SUCCESS;
220 }
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:255
#define FALSE
Definition: types.h:117
PPROCESSINFO gppiInputProvider
Definition: ntuser.c:16
smooth NULL
Definition: ftsmooth.c:416
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
BOOL FASTCALL UserSetProcessWindowStation(HWINSTA hWindowStation)
Definition: winsta.c:1346
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:164
VOID FASTCALL IntCleanupCurIconCache(PPROCESSINFO Win32Process)
Definition: cursoricon.c:391
BOOLEAN UserDestroyObjectsForOwner(PUSER_HANDLE_TABLE Table, PVOID Owner)
Definition: object.c:720
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
void DbgUserDumpHandleTable()
return STATUS_SUCCESS
Definition: btrfs.c:3014
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
HANDLE gpidLogon
Definition: simplecall.c:15

Referenced by ExitProcessCallback().

◆ UserThreadCreate()

NTSTATUS UserThreadCreate ( PETHREAD  Thread)

Definition at line 436 of file main.c.

437 {
438  return STATUS_SUCCESS;
439 }
return STATUS_SUCCESS
Definition: btrfs.c:3014

◆ UserThreadDestroy()

NTSTATUS UserThreadDestroy ( PETHREAD  Thread)

Definition at line 442 of file main.c.

443 {
444  return STATUS_SUCCESS;
445 }
return STATUS_SUCCESS
Definition: btrfs.c:3014

◆ Win32kProcessCallback()

NTSTATUS APIENTRY Win32kProcessCallback ( PEPROCESS  Process,
BOOLEAN  Initialize 
)

Definition at line 335 of file main.c.

337 {
339 
340  ASSERT(Process->Peb);
341 
342  TRACE_CH(UserProcess, "Win32kProcessCallback -->\n");
343 
345 
346  if (Initialize)
347  {
349  }
350  else
351  {
353  }
354 
355  UserLeave();
356 
357  TRACE_CH(UserProcess, "<-- Win32kProcessCallback\n");
358 
359  return Status;
360 }
NTSTATUS InitProcessCallback(PEPROCESS Process)
Definition: main.c:223
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS ExitProcessCallback(PEPROCESS Process)
Definition: main.c:296
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:247
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
Status
Definition: gdiplustypes.h:24
static BOOL Initialize(LPCWSTR lpDriverPath)
Definition: main.c:4
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:255
#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 853 of file main.c.

855 {
857 
858  ASSERT(NtCurrentTeb());
859 
861 
863  {
866  }
867  else // if (Type == PsW32ThreadCalloutExit)
868  {
871  }
872 
873  UserLeave();
874 
875  return Status;
876 }
PVOID NTAPI PsGetThreadWin32Thread(IN PETHREAD Thread)
Definition: thread.c:795
Type
Definition: Type.h:6
LONG NTSTATUS
Definition: precomp.h:26
smooth NULL
Definition: ftsmooth.c:416
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:247
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
Status
Definition: gdiplustypes.h:24
NTSTATUS NTAPI InitThreadCallback(PETHREAD Thread)
Definition: main.c:448
NTSTATUS NTAPI ExitThreadCallback(PETHREAD Thread)
Definition: main.c:687
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:255
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420

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 alloc_user_entry(), co_IntInitializeDesktopGraphics(), co_IntSendActivateMessages(), co_IntSendMessageTimeout(), co_IntSetCaretPos(), co_IntSetupOBM(), co_IntSetWndIcons(), co_IntShellHookNotify(), co_MsqInsertMouseMessage(), co_MsqSendMessage(), co_UserCreateWindowEx(), co_UserDestroyWindow(), co_UserShowCaret(), co_WinPosSetWindowPos(), CreateSysColorObjects(), DefWndControlColor(), DefWndGetIcon(), DefWndHandleSetCursor(), DefWndSetIcon(), DrawFocusRect(), DriverEntry(), EnumerateCallback(), free_user_entry(), GetLastInputInfo(), GetSysColor(), GetSysColorBrush(), GetSystemMetrics(), InitMetrics(), InitUserAtoms(), IntCoalesceMouseMove(), IntCreateClass(), IntCreateDesktop(), IntCreateWindow(), IntDeactivateWindow(), IntDefWindowProc(), IntDrawState(), IntFlashWindowEx(), IntGetSysColor(), IntGetSysColorBrush(), IntGetWindowContextHelpId(), IntGrayString(), IntImmProcessKey(), IntIsFontRenderingEnabled(), IntIsGhostWindow(), IntLastInputTick(), IntNotifyWinEvent(), IntRealChildWindowFromPoint(), IntRemoveEvent(), IntSetCaretBlinkTime(), IntSetSrvEventMask(), IntSetSysColors(), IntTranslateKbdMessage(), IsDialogMessageW(), IsWinEventHookInstalled(), LoadSystemCursors(), LoadUserApiHook(), MENU_AdjustMenuItemRect(), MENU_CalcItemSize(), MENU_DrawMenuItem(), MENU_DrawScrollArrows(), MENU_EnsureMenuItemVisible(), MENU_InitPopup(), MouseSafetyOnDrawEnd(), NC_IconForWindow(), NotifyWinEvent(), NtUserCallHwnd(), NtUserCallHwndParam(), NtUserCallNoParam(), NtUserCallOneParam(), NtUserCreateCaret(), NtUserGetCaretBlinkTime(), NtUserGetClassName(), NtUserGetComboBoxInfo(), NtUserGetCursorInfo(), NtUserGetListBoxInfo(), NtUserInitializeClientPfnArrays(), NtUserMessageCall(), NtUserNotifyWinEvent(), NtUserProcessConnect(), PostTimerMessages(), ProcessKeyEvent(), RealGetSystemMetrics(), RegisterControlAtoms(), SpiUpdatePerUserSystemParameters(), SystemTimerProc(), UITOOLS_DrawCheckedRect(), UpdatePerUserImmEnabling(), UserAttachThreadInput(), UserChangeDisplaySettings(), UserClipCursor(), UserDeleteW32Thread(), UserDrawWindowFrame(), UserGetSystemMetrics(), UserInitialize(), UserPaintCaption(), UserPostMessage(), UserPostThreadMessage(), UserRegisterUserApiHook(), UserSendMouseInput(), UserSendNotifyMessage(), UserSetCursor(), UserSetCursorPos(), UserShowCursor(), UserUnregisterUserApiHook(), and UserUpdateMonitorSize().

◆ 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().