ReactOS  0.4.15-dev-3326-ga91f5e8
main.c
Go to the documentation of this file.
1 /*
2  * COPYRIGHT: See COPYING in the top level directory
3  * PROJECT: ReactOS Win32k subsystem
4  * PURPOSE: Driver entry and initialization of win32k
5  * FILE: win32ss/user/ntuser/main.c
6  * PROGRAMER:
7  */
8 
9 #include <win32k.h>
10 #include <napi.h>
11 
12 #define NDEBUG
13 #include <debug.h>
14 #include <kdros.h>
15 
17 
20 
21 // TODO: Should be moved to some GDI header
26 
27 PSERVERINFO gpsi = NULL; // Global User Server Information.
28 
32 
33 extern ULONG_PTR Win32kSSDT[];
34 extern UCHAR Win32kSSPT[];
36 
37 #if DBG
38 void
39 NTAPI
40 DbgPreServiceHook(ULONG ulSyscallId, PULONG_PTR pulArguments)
41 {
42  GdiDbgPreServiceHook(ulSyscallId, pulArguments);
43  UserDbgPreServiceHook(ulSyscallId, pulArguments);
44 }
45 
47 NTAPI
48 DbgPostServiceHook(ULONG ulSyscallId, ULONG_PTR ulResult)
49 {
50  ulResult = GdiDbgPostServiceHook(ulSyscallId, ulResult);
51  ulResult = UserDbgPostServiceHook(ulSyscallId, ulResult);
52  return ulResult;
53 }
54 #endif
55 
56 
59  OUT PPROCESSINFO* W32Process)
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 }
91 
92 /*
93  * Called from IntDereferenceProcessInfo
94  */
95 VOID
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 }
120 
121 NTSTATUS
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 }
173 
174 NTSTATUS
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 }
221 
222 NTSTATUS
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 }
294 
295 NTSTATUS
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 }
332 
333 NTSTATUS
334 APIENTRY
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 }
361 
362 
363 
364 NTSTATUS
366  OUT PTHREADINFO* W32Thread)
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 }
399 
400 /*
401  * Called from IntDereferenceThreadInfo
402  */
403 VOID
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 }
434 
435 NTSTATUS
437 {
438  return STATUS_SUCCESS;
439 }
440 
441 NTSTATUS
443 {
444  return STATUS_SUCCESS;
445 }
446 
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 }
681 
682 VOID
684 
685 NTSTATUS
686 NTAPI
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 }
850 
851 NTSTATUS
852 APIENTRY
855 {
857 
858  ASSERT(NtCurrentTeb());
859 
861 
863  {
866  }
867  else // if (Type == PsW32ThreadCalloutExit)
868  {
871  }
872 
873  UserLeave();
874 
875  return Status;
876 }
877 
878 _Function_class_(DRIVER_UNLOAD)
879 VOID NTAPI
881 {
882  // TODO: Do more cleanup!
883 
884  ResetCsrApiPort();
885  ResetCsrProcess();
886 }
887 
888 // Return on failure
889 #define NT_ROF(x) \
890 { \
891  Status = (x); \
892  if (!NT_SUCCESS(Status)) \
893  { \
894  DPRINT1("Failed '%s' (0x%lx)\n", #x, Status); \
895  return Status; \
896  } \
897 }
898 
899 // Lock & return on failure
900 #define USERLOCK_AND_ROF(x) \
901 { \
902  UserEnterExclusive(); \
903  Status = (x); \
904  UserLeave(); \
905  if (!NT_SUCCESS(Status)) \
906  { \
907  DPRINT1("Failed '%s' (0x%lx)\n", #x, Status); \
908  return Status; \
909  } \
910 }
911 
912 
913 
914 /*
915  * This definition doesn't work
916  */
917 CODE_SEG("INIT")
918 NTSTATUS
919 APIENTRY
923 {
925  BOOLEAN Result;
926  WIN32_CALLOUTS_FPNS CalloutData = {0};
927  PVOID GlobalUserHeapBase = NULL;
928 
929  /*
930  * Register user mode call interface
931  * (system service table index = 1)
932  */
934  NULL,
936  Win32kSSPT,
937  1);
938  if (Result == FALSE)
939  {
940  DPRINT1("Adding system services failed!\n");
941  return STATUS_UNSUCCESSFUL;
942  }
943 
945  DPRINT("Win32k hInstance 0x%p!\n", hModuleWin);
946 
947  DriverObject->DriverUnload = DriverUnload;
948 
949  /* Register Object Manager Callbacks */
951  CalloutData.ThreadCallout = Win32kThreadCallback;
952  // CalloutData.GlobalAtomTableCallout = NULL;
953  // CalloutData.PowerEventCallout = NULL;
954  // CalloutData.PowerStateCallout = NULL;
955  // CalloutData.JobCallout = NULL;
962  // CalloutData.WindowStationCloseProcedure = NULL;
965  // CalloutData.WindowStationOpenProcedure = NULL;
966 
967  /* Register our per-process and per-thread structures. */
968  PsEstablishWin32Callouts(&CalloutData);
969 
970  /* Register service hook callbacks */
971 #if DBG && defined(KDBG)
972  KdSystemDebugControl('CsoR', DbgPreServiceHook, ID_Win32PreServiceHook, 0, 0, 0, 0);
973  KdSystemDebugControl('CsoR', DbgPostServiceHook, ID_Win32PostServiceHook, 0, 0, 0, 0);
974 #endif
975 
976  /* Create the global USER heap */
978  &GlobalUserHeapBase,
979  1 * 1024 * 1024); /* FIXME: 1 MB for now... */
980  if (GlobalUserHeap == NULL)
981  {
982  DPRINT1("Failed to initialize the global heap!\n");
983  return STATUS_UNSUCCESSFUL;
984  }
985 
986  /* Init the global user lock */
988 
989  /* Lock while we use the heap (UserHeapAlloc asserts on this) */
991 
992  /* Allocate global server info structure */
993  gpsi = UserHeapAlloc(sizeof(*gpsi));
994  UserLeave();
995  if (!gpsi)
996  {
997  DPRINT1("Failed allocate server info structure!\n");
998  return STATUS_UNSUCCESSFUL;
999  }
1000 
1001  RtlZeroMemory(gpsi, sizeof(*gpsi));
1002  DPRINT("Global Server Data -> %p\n", gpsi);
1003 
1006 
1007  /* Create stock objects, ie. precreated objects commonly
1008  used by win32 applications */
1011 
1012  NT_ROF(InitBrushImpl());
1013  NT_ROF(InitPDEVImpl());
1014  NT_ROF(InitLDEVImpl());
1016  NT_ROF(InitDcImpl());
1020  NT_ROF(InitInputImpl());
1023  NT_ROF(InitTimerImpl());
1024  NT_ROF(InitDCEImpl());
1025 
1027 
1028  /* Initialize FreeType library */
1029  if (!InitFontSupport())
1030  {
1031  DPRINT1("Unable to initialize font support\n");
1032  return Status;
1033  }
1034 
1035  return STATUS_SUCCESS;
1036 }
1037 
1038 /* EOF */
NTSTATUS APIENTRY Win32kThreadCallback(PETHREAD Thread, PSW32THREADCALLOUTTYPE Type)
Definition: main.c:853
ULONG fsHooks
Definition: ntuser.h:302
USERSTARTUPINFO usi
Definition: win32.h:276
PVOID NTAPI PsSetThreadWin32Thread(_Inout_ PETHREAD Thread, _In_ PVOID Win32Thread, _In_ PVOID OldWin32Thread)
Definition: thread.c:909
#define IN
Definition: typedefs.h:39
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
ULONG Win32ClientInfo[31]
Definition: compat.h:706
NTSTATUS NTAPI IntDesktopObjectOpen(_In_ PVOID Parameters)
Definition: desktop.c:202
PPROCESSINFO ppiScrnSaver
Definition: main.c:30
VOID FASTCALL co_MsqInsertMouseMessage(MSG *Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: msgqueue.c:580
NTSTATUS InitProcessCallback(PEPROCESS Process)
Definition: main.c:223
PPEB ProcessEnvironmentBlock
Definition: ntddk_ex.h:337
void FASTCALL DestroyProcessClasses(PPROCESSINFO Process)
Definition: class.c:300
PKWIN32_SESSION_CALLOUT WindowStationOkToCloseProcedure
Definition: pstypes.h:1694
NTSTATUS GdiThreadDestroy(PETHREAD Thread)
Definition: init.c:74
#define error(str)
Definition: mkdosfs.c:1605
PPROCESSINFO ppiNext
Definition: win32.h:259
Definition: ntbasedef.h:628
NTSTATUS AllocW32Process(IN PEPROCESS Process, OUT PPROCESSINFO *W32Process)
Definition: main.c:58
PVOID Win32ThreadInfo
Definition: compat.h:705
VOID ResetCsrProcess(VOID)
Definition: csr.c:29
PGDI_BATCHFLUSH_ROUTINE BatchFlushRoutine
Definition: pstypes.h:1689
#define TRUE
Definition: types.h:120
LIST_ENTRY WindowListHead
Definition: win32.h:156
PTHREADINFO ptiSibling
Definition: win32.h:117
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define TIF_DONTATTACHQUEUE
Definition: ntuser.h:251
#define EngGetTickCount32()
Definition: eng.h:43
NTSTATUS NTAPI InitPDEVImpl(VOID)
Definition: pdevobj.c:21
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
PVOID NTAPI PsGetProcessWin32Process(PEPROCESS Process)
Definition: process.c:1193
FLONG TIF_flags
Definition: win32.h:96
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
PWINSTATION_OBJECT InputWindowStation
Definition: winsta.c:21
NTSTATUS NTAPI InitTimerImpl(VOID)
Definition: timer.c:594
#define MAKELPARAM(l, h)
Definition: winuser.h:3984
PEPROCESS gpepCSRSS
Definition: csr.c:15
LONG NTSTATUS
Definition: precomp.h:26
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:213
#define HandleToUlong(h)
Definition: basetsd.h:79
#define NT_ROF(x)
Definition: main.c:889
NTSTATUS NTAPI IntDesktopOkToClose(_In_ PVOID Parameters)
Definition: desktop.c:178
NTSTATUS ExInitializeResourceLite(PULONG res)
Definition: env_spec_w32.h:641
ERESOURCE UserLock
Definition: ntuser.c:18
BOOL FASTCALL DestroyTimersForThread(PTHREADINFO pti)
Definition: timer.c:549
USHORT FASTCALL UserGetLanguageID(VOID)
Definition: misc.c:96
NTSTATUS ExitProcessCallback(PEPROCESS Process)
Definition: main.c:296
BOOL FASTCALL UserDereferenceObject(PVOID Object)
Definition: object.c:610
LIST_ENTRY PtiLink
Definition: win32.h:127
PKWIN32_THREAD_CALLOUT ThreadCallout
Definition: pstypes.h:1684
NTSTATUS NTAPI InitKeyboardImpl(VOID)
Definition: keyboard.c:31
PRTL_USER_PROCESS_PARAMETERS ProcessParameters
Definition: btrfs_drv.h:1959
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
#define USERTAG_EVENT
Definition: tags.h:229
UNICODE_STRING DesktopInfo
Definition: rtltypes.h:1553
#define USERTAG_THREADINFO
Definition: tags.h:283
LONG NTAPI KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
Definition: eventobj.c:159
#define TIF_SYSTEMTHREAD
Definition: ntuser.h:247
PSERVERINFO gpsi
Definition: main.c:27
Definition: send.c:48
WORD FASTCALL UserGetMouseButtonsState(VOID)
Definition: mouse.c:22
POBJECT_TYPE ExEventObjectType
Definition: event.c:18
PKWIN32_SESSION_CALLOUT DesktopCloseProcedure
Definition: pstypes.h:1692
PPROCESSINFO ppi
Definition: win32.h:89
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define USERTAG_PROCESSINFO
Definition: tags.h:259
NTSTATUS MapGlobalUserHeap(IN PEPROCESS Process, OUT PVOID *KernelMapping, OUT PVOID *UserMapping)
Definition: usrheap.c:266
NTSTATUS NTAPI IntWinStaObjectParse(_In_ PVOID Parameters)
Definition: winsta.c:136
static GENERIC_MAPPING UserMapping
Definition: samrpc.c:48
PTHREADINFO gptiForeground
Definition: focus.c:14
#define W32PF_PROCESSCONNECTED
Definition: win32.h:19
BOOL FASTCALL InitFontSupport(VOID)
Definition: freetype.c:660
PKWIN32_SESSION_CALLOUT WindowStationDeleteProcedure
Definition: pstypes.h:1696
#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:261
NTSTATUS NTAPI InitLDEVImpl(VOID)
Definition: ldevobj.c:30
VOID FASTCALL CreateSysColorObjects(VOID)
Definition: stockobj.c:329
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
NTSTATUS FASTCALL IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest, PUNICODE_STRING Source)
Definition: misc.c:658
NTSTATUS NTAPI PsGetProcessExitStatus(PEPROCESS Process)
Definition: process.c:1053
#define FALSE
Definition: types.h:117
#define TIF_CSRSSTHREAD
Definition: ntuser.h:248
USHORT gusLanguageID
Definition: main.c:29
BOOL NTAPI UserCloseClipboard(VOID)
Definition: clipboard.c:545
DECLSPEC_NORETURN VOID NTAPI KeBugCheck(ULONG BugCheckCode)
Definition: bug.c:1427
NTSTATUS NTAPI PsSetProcessWin32Process(_Inout_ PEPROCESS Process, _In_opt_ PVOID Win32Process, _In_opt_ PVOID OldWin32Process)
Definition: process.c:1257
#define TAG_STRING
Definition: oslist.h:22
NTSTATUS NTAPI InitBrushImpl(VOID)
Definition: engbrush.c:31
NTSTATUS NTAPI InitDesktopImpl(VOID)
Definition: desktop.c:240
LIST_ENTRY SentMessagesListHead
Definition: win32.h:101
#define EVENT_ALL_ACCESS
Definition: isotest.c:82
void FASTCALL DceFreeThreadDCE(PTHREADINFO)
Definition: windc.c:779
VOID FASTCALL CreateStockObjects(VOID)
Definition: stockobj.c:247
NTSTATUS AllocW32Thread(IN PETHREAD Thread, OUT PTHREADINFO *W32Thread)
Definition: main.c:365
_Function_class_(DRIVER_UNLOAD)
Definition: main.c:878
#define W32PF_TERMINATED
Definition: win32.h:16
#define STARTF_INHERITDESKTOP
Definition: undocuser.h:163
_In_ PVOID _In_ ULONG Event
Definition: iotypes.h:467
#define USERLOCK_AND_ROF(x)
Definition: main.c:900
NTSTATUS NTAPI IntWinStaObjectDelete(_In_ PVOID Parameters)
Definition: winsta.c:106
PPROCESSINFO gppiList
Definition: main.c:31
Definition: object.h:3
unsigned char BOOLEAN
NTSTATUS GdiProcessDestroy(PEPROCESS Process)
Definition: init.c:47
PPROCESSINFO gppiInputProvider
Definition: ntuser.c:16
#define IntReferenceProcessInfo(ppi)
Definition: win32.h:184
LIST_ENTRY W32CallbackListHead
Definition: win32.h:157
VOID UserDeleteW32Process(_Pre_notnull_ __drv_freesMem(Mem) PPROCESSINFO ppiCurrent)
Definition: main.c:96
_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
#define TIF_GUITHREADINITIALIZED
Definition: ntuser.h:269
NTSTATUS GdiThreadCreate(PETHREAD Thread)
Definition: init.c:68
PKWIN32_SESSION_CALLOUT DesktopOkToCloseProcedure
Definition: pstypes.h:1691
NTSTATUS APIENTRY Win32kProcessCallback(PEPROCESS Process, BOOLEAN Initialize)
Definition: main.c:335
enum _PSW32THREADCALLOUTTYPE PSW32THREADCALLOUTTYPE
struct _CLIENTTHREADINFO * pcti
Definition: win32.h:92
PKWIN32_SESSION_CALLOUT DesktopDeleteProcedure
Definition: pstypes.h:1693
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
#define TIF_ALLOWFOREGROUNDACTIVATE
Definition: ntuser.h:250
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
INT cThreads
Definition: win32.h:260
#define IntReferenceThreadInfo(pti)
Definition: win32.h:169
void NTAPI UserDbgPreServiceHook(ULONG ulSyscallId, PULONG_PTR pulArguments)
Definition: misc.c:756
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:245
Status
Definition: gdiplustypes.h:24
HWND hwndSAS
Definition: winsta.c:24
ULONG fsHooks
Definition: win32.h:118
NTSTATUS NTAPI InitPaletteImpl(VOID)
Definition: palette.c:66
BOOLEAN NTAPI DbgGdiKdbgCliCallback(IN PCHAR pszCommand, IN ULONG argc, IN PCH argv[])
Definition: gdikdbgext.c:324
VOID FASTCALL MsqDestroyMessageQueue(_In_ PTHREADINFO pti)
Definition: msgqueue.c:2468
#define ASSERT(a)
Definition: mode.c:44
NTSTATUS UserThreadDestroy(PETHREAD Thread)
Definition: main.c:442
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
PUSER_MESSAGE_QUEUE FASTCALL MsqCreateMessageQueue(PTHREADINFO pti)
Definition: msgqueue.c:2441
NTSTATUS NTAPI InitGdiHandleTable(void)
Definition: gdiobj.c:259
CLIENT_ID Cid
Definition: pstypes.h:1128
struct _DESKTOP * rpdeskStartup
Definition: win32.h:256
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
Definition: exfuncs.h:274
PKEVENT pEventQueueServer
Definition: win32.h:126
PVOID NTAPI MmPageEntireDriver(IN PVOID AddressWithinSection)
Definition: sysldr.c:3467
#define ObDereferenceObject
Definition: obfuncs.h:203
unsigned short WORD
Definition: ntddk_ex.h:93
Type
Definition: Type.h:6
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
HKL hKL
Definition: ntuser.h:313
HANDLE UniqueThread
Definition: compat.h:685
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
NTSTATUS NTAPI InitWindowStationImpl(VOID)
Definition: winsta.c:34
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
NTSTATUS UserProcessCreate(PEPROCESS Process)
Definition: main.c:122
unsigned char UCHAR
Definition: xmlstorage.h:181
BOOL DbgInitDebugChannels()
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: obhandle.c:3375
struct _CLIENTINFO * PCLIENTINFO
BOOL FASTCALL UserSetProcessWindowStation(HWINSTA hWindowStation)
Definition: winsta.c:1362
ULONG_PTR NTAPI UserDbgPostServiceHook(ULONG ulSyscallId, ULONG_PTR ulResult)
Definition: misc.c:763
#define _Pre_notnull_
Definition: ms_sal.h:680
PKWIN32_SESSION_CALLOUT DesktopOpenProcedure
Definition: pstypes.h:1690
BOOL FASTCALL co_IntGraphicsCheck(BOOL Create)
Definition: guicheck.c:52
NTSTATUS GdiProcessCreate(PEPROCESS Process)
Definition: init.c:18
#define NB_HOOKS
Definition: ntuser.h:127
LIST_ENTRY aphkStart[NB_HOOKS]
FIXME!
Definition: win32.h:144
NTSTATUS UserThreadCreate(PETHREAD Thread)
Definition: main.c:436
NTSTATUS NTAPI InitThreadCallback(PETHREAD Thread)
Definition: main.c:448
PPROCESSINFO ppiUahServer
Definition: hook.c:25
static BOOL Initialize(LPCWSTR lpDriverPath)
Definition: main.c:4
BOOL FASTCALL IntBlockInput(PTHREADINFO pti, BOOL BlockIt)
Definition: input.c:375
NTSTATUS NTAPI IntWinStaOkToClose(_In_ PVOID Parameters)
Definition: winsta.c:201
#define WM_LOGONNOTIFY
Definition: undocuser.h:37
CLIENTTHREADINFO cti
Definition: win32.h:145
VOID ResetCsrApiPort(VOID)
Definition: csr.c:58
PVOID GlobalUserHeapSection
Definition: usrheap.c:26
NTSTATUS NTAPI ExitThreadCallback(PETHREAD Thread)
Definition: main.c:687
struct tagKL * KeyboardLayout
Definition: win32.h:91
VOID FASTCALL UnregisterThreadHotKeys(PTHREADINFO pti)
Definition: hotkey.c:121
NTSTATUS NTAPI InitDcImpl(VOID)
Definition: dclife.c:53
LIST_ENTRY DriverObjListHead
Definition: win32.h:287
NTSTATUS UserProcessDestroy(PEPROCESS Process)
Definition: main.c:175
HANDLE hEventQueueClient
Definition: win32.h:124
ULONG_PTR Win32kSSDT[]
Definition: napi.h:9
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:90
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:253
Definition: compat.h:694
USHORT CodePage
Definition: ntuser.h:314
#define TRACE_CH(ch, fmt,...)
Definition: debug.h:108
#define DBG_IS_CHANNEL_ENABLED(ppi, ch, level)
Definition: win32kdebug.h:164
#define TRACE_PPI(ppi, ch, fmt,...)
Definition: win32kdebug.h:181
#define W32PF_CLASSESREGISTERED
Definition: win32.h:17
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420
VOID FASTCALL IntCleanupThreadCallbacks(PTHREADINFO W32Thread)
Definition: callback.c:76
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
unsigned short USHORT
Definition: pedump.c:61
#define STATUS_ALREADY_WIN32
Definition: ntstatus.h:141
UCHAR Win32kSSPT[]
Definition: napi.h:15
NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
Definition: main.c:687
BOOL IntSetThreadDesktop(IN HDESK hDesktop, IN BOOL FreeOnFailure)
Definition: desktop.c:3219
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
NTSTATUS NTAPI IntDesktopObjectDelete(_In_ PVOID Parameters)
Definition: desktop.c:147
struct tagUSERSTARTUPINFO USERSTARTUPINFO
static DRIVER_UNLOAD DriverUnload
Definition: kbdclass.c:17
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
PKL W32kGetDefaultKeyLayout(VOID)
Definition: kbdlayout.c:396
VOID FASTCALL IntCleanupCurIconCache(PPROCESSINFO Win32Process)
Definition: cursoricon.c:391
#define STARTF_SCREENSAVER
Definition: undocuser.h:164
NTSTATUS FASTCALL IntResolveDesktop(IN PEPROCESS Process, IN PUNICODE_STRING DesktopPath, IN BOOL bInherit, OUT HWINSTA *phWinSta, OUT HDESK *phDesktop)
Definition: desktop.c:539
HANDLE GlobalUserHeap
Definition: usrheap.c:25
NTSTATUS FASTCALL IntValidateDesktopHandle(HDESK Desktop, KPROCESSOR_MODE AccessMode, ACCESS_MASK DesiredAccess, PDESKTOP *Object)
Definition: desktop.c:1206
#define WM_MOUSEMOVE
Definition: winuser.h:1758
#define NULL
Definition: types.h:112
HANDLE hModuleWin
Definition: main.c:16
VOID FASTCALL MsqCleanupThreadMsgs(PTHREADINFO pti)
Definition: msgqueue.c:2266
#define __drv_freesMem(kind)
Definition: driverspecs.h:271
NTSTATUS APIENTRY co_IntClientThreadSetup(VOID)
Definition: callback.c:959
NTSTATUS NTAPI MsqInitializeImpl(VOID)
Definition: msgqueue.c:30
#define W32PF_APPSTARTING
Definition: win32.h:10
#define DPRINT1
Definition: precomp.h:8
NTSTATUS NTAPI IntDesktopObjectClose(_In_ PVOID Parameters)
Definition: desktop.c:215
#define ERR_CH(ch, fmt,...)
Definition: debug.h:105
WORD wShowWindow
Definition: win32.h:221
#define msg(x)
Definition: auth_time.c:54
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
NTSTATUS NTAPI InitUserImpl(VOID)
Definition: ntuser.c:77
VOID NTAPI PsEstablishWin32Callouts(IN PWIN32_CALLOUTS_FPNS CalloutData)
Definition: win32.c:112
void DbgUserDumpHandleTable()
NTSTATUS NTAPI InitDeviceImpl(VOID)
Definition: device.c:26
#define OUT
Definition: typedefs.h:40
#define ObReferenceObject
Definition: obfuncs.h:204
SINGLE_LIST_ENTRY ReferencesList
Definition: win32.h:158
unsigned int ULONG
Definition: retypes.h:1
#define IO_NO_INCREMENT
Definition: iotypes.h:598
PWIN32HEAP UserCreateHeap(OUT PVOID *SectionObject, IN OUT PVOID *SystemBase, IN SIZE_T HeapSize)
Definition: usrheap.c:181
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t * PULONG_PTR
Definition: typedefs.h:65
PTHREADINFO ptiList
Definition: win32.h:254
VOID UserDeleteW32Thread(PTHREADINFO pti)
Definition: main.c:404
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
HANDLE NTAPI PsGetProcessId(PEPROCESS Process)
Definition: process.c:1063
BOOL FASTCALL IsRemoveAttachThread(PTHREADINFO pti)
Definition: input.c:437
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
FAST_MUTEX DriverObjListLock
Definition: win32.h:286
struct _DESKTOPINFO * pDeskInfo
Definition: win32.h:94
struct _PROCESSINFO * ppi
Definition: ntuser.h:320
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define IntDereferenceProcessInfo(ppi)
Definition: win32.h:189
#define IntDereferenceThreadInfo(pti)
Definition: win32.h:174
DWORD dwTIFlags
Definition: ntuser.h:298
static CODE_SEG("PAGE")
Definition: isapnp.c:1482
INT cEnterCount
Definition: win32.h:136
VOID UserDisplayNotifyShutdown(PPROCESSINFO ppiCurrent)
Definition: display.c:857
#define TIF_INCLEANUP
Definition: ntuser.h:245
base of all file and directory entries
Definition: entries.h:82
#define W32PF_THREADCONNECTED
Definition: win32.h:18
HANDLE gpidLogon
Definition: simplecall.c:15
#define APIENTRY
Definition: api.h:79
#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
VOID FASTCALL UserReferenceObject(PVOID obj)
Definition: object.c:697
#define W32PF_SCREENSAVER
Definition: win32.h:26
#define NT_ASSERT
Definition: rtlfuncs.h:3310