ReactOS  0.4.15-dev-321-g2d9b385
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 /*
900  * This definition doesn't work
901  */
902 INIT_FUNCTION
903 NTSTATUS
904 APIENTRY
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 }
1015 
1016 /* EOF */
NTSTATUS APIENTRY Win32kThreadCallback(PETHREAD Thread, PSW32THREADCALLOUTTYPE Type)
Definition: main.c:853
INIT_FUNCTION NTSTATUS NTAPI InitKeyboardImpl(VOID)
Definition: keyboard.c:31
ULONG fsHooks
Definition: ntuser.h:296
USERSTARTUPINFO usi
Definition: win32.h:270
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:505
NTSTATUS NTAPI IntDesktopObjectOpen(_In_ PVOID Parameters)
Definition: desktop.c:202
PPROCESSINFO ppiScrnSaver
Definition: main.c:30
#define TRUE
Definition: types.h:120
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
Type
Definition: Type.h:6
PKWIN32_SESSION_CALLOUT WindowStationOkToCloseProcedure
Definition: pstypes.h:1633
NTSTATUS GdiThreadDestroy(PETHREAD Thread)
Definition: init.c:74
#define error(str)
Definition: mkdosfs.c:1605
PPROCESSINFO ppiNext
Definition: win32.h:253
Definition: ntbasedef.h:635
NTSTATUS AllocW32Process(IN PEPROCESS Process, OUT PPROCESSINFO *W32Process)
Definition: main.c:58
PVOID Win32ThreadInfo
Definition: compat.h:504
VOID ResetCsrProcess(VOID)
Definition: csr.c:29
PGDI_BATCHFLUSH_ROUTINE BatchFlushRoutine
Definition: pstypes.h:1628
INIT_FUNCTION NTSTATUS NTAPI InitGdiHandleTable(void)
Definition: gdiobj.c:259
LIST_ENTRY WindowListHead
Definition: win32.h:150
PTHREADINFO ptiSibling
Definition: win32.h:115
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define TIF_DONTATTACHQUEUE
Definition: ntuser.h:246
#define EngGetTickCount32()
Definition: eng.h:43
BOOLEAN NTAPI KeAddSystemServiceTable(IN PULONG_PTR Base, IN PULONG Count OPTIONAL, IN ULONG Limit, IN PUCHAR Number, IN ULONG Index)
Definition: procobj.c:905
PVOID NTAPI PsGetProcessWin32Process(PEPROCESS Process)
Definition: process.c:1193
FLONG TIF_flags
Definition: win32.h:94
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
PWINSTATION_OBJECT InputWindowStation
Definition: winsta.c:21
#define MAKELPARAM(l, h)
Definition: winuser.h:3983
PEPROCESS gpepCSRSS
Definition: csr.c:15
LONG NTSTATUS
Definition: precomp.h:26
#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
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:125
VOID NTAPI ObDereferenceObject(IN PVOID Object)
Definition: obref.c:375
PKWIN32_THREAD_CALLOUT ThreadCallout
Definition: pstypes.h:1623
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:1530
#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:242
PSERVERINFO gpsi
Definition: main.c:27
Definition: send.c:48
WORD FASTCALL UserGetMouseButtonsState(VOID)
Definition: mouse.c:22
POBJECT_TYPE ExEventObjectType
Definition: event.c:22
PKWIN32_SESSION_CALLOUT DesktopCloseProcedure
Definition: pstypes.h:1631
PPROCESSINFO ppi
Definition: win32.h:87
uint32_t ULONG_PTR
Definition: typedefs.h:64
#define USERTAG_PROCESSINFO
Definition: tags.h:259
INIT_FUNCTION NTSTATUS NTAPI InitPaletteImpl(VOID)
Definition: palette.c:66
NTSTATUS MapGlobalUserHeap(IN PEPROCESS Process, OUT PVOID *KernelMapping, OUT PVOID *UserMapping)
Definition: usrheap.c:262
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
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:1635
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
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
INIT_FUNCTION NTSTATUS NTAPI InitDCEImpl(VOID)
Definition: windc.c:30
NTSTATUS FASTCALL IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest, PUNICODE_STRING Source)
Definition: misc.c:656
NTSTATUS NTAPI PsGetProcessExitStatus(PEPROCESS Process)
Definition: process.c:1053
#define TIF_CSRSSTHREAD
Definition: ntuser.h:243
USHORT gusLanguageID
Definition: main.c:29
BOOL NTAPI UserCloseClipboard(VOID)
Definition: clipboard.c:542
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
LIST_ENTRY SentMessagesListHead
Definition: win32.h:99
#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
INIT_FUNCTION NTSTATUS NTAPI InitWindowStationImpl(VOID)
Definition: winsta.c:34
#define STARTF_INHERITDESKTOP
Definition: undocuser.h:162
INIT_FUNCTION NTSTATUS NTAPI InitUserImpl(VOID)
Definition: ntuser.c:77
_In_ PVOID _In_ ULONG Event
Definition: iotypes.h:435
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
smooth NULL
Definition: ftsmooth.c:416
#define IntReferenceProcessInfo(ppi)
Definition: win32.h:178
LIST_ENTRY W32CallbackListHead
Definition: win32.h:151
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
static PDRIVER_OBJECT DriverObject
Definition: template.c:42
#define TIF_GUITHREADINITIALIZED
Definition: ntuser.h:264
void DPRINT(...)
Definition: polytest.cpp:61
NTSTATUS GdiThreadCreate(PETHREAD Thread)
Definition: init.c:68
VOID NTAPI KeBugCheck(ULONG BugCheckCode)
Definition: bug.c:1428
PKWIN32_SESSION_CALLOUT DesktopOkToCloseProcedure
Definition: pstypes.h:1630
NTSTATUS APIENTRY Win32kProcessCallback(PEPROCESS Process, BOOLEAN Initialize)
Definition: main.c:335
INIT_FUNCTION NTSTATUS NTAPI MsqInitializeImpl(VOID)
Definition: msgqueue.c:30
enum _PSW32THREADCALLOUTTYPE PSW32THREADCALLOUTTYPE
struct _CLIENTTHREADINFO * pcti
Definition: win32.h:90
PKWIN32_SESSION_CALLOUT DesktopDeleteProcedure
Definition: pstypes.h:1632
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:245
INT cThreads
Definition: win32.h:254
INIT_FUNCTION NTSTATUS NTAPI InitDcImpl(VOID)
Definition: dclife.c:53
#define IntReferenceThreadInfo(pti)
Definition: win32.h:163
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
void NTAPI UserDbgPreServiceHook(ULONG ulSyscallId, PULONG_PTR pulArguments)
Definition: misc.c:754
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:247
HWND hwndSAS
Definition: winsta.c:24
INIT_FUNCTION NTSTATUS NTAPI InitLDEVImpl(VOID)
Definition: ldevobj.c:30
INIT_FUNCTION NTSTATUS NTAPI InitDeviceImpl(VOID)
Definition: device.c:26
ULONG fsHooks
Definition: win32.h:116
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
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
CLIENT_ID Cid
Definition: pstypes.h:1067
struct _DESKTOP * rpdeskStartup
Definition: win32.h:250
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
Definition: exfuncs.h:274
PKEVENT pEventQueueServer
Definition: win32.h:124
PVOID NTAPI MmPageEntireDriver(IN PVOID AddressWithinSection)
Definition: sysldr.c:3370
unsigned short WORD
Definition: ntddk_ex.h:93
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
HKL hKL
Definition: ntuser.h:307
HANDLE UniqueThread
Definition: compat.h:484
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#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:3376
INIT_FUNCTION NTSTATUS NTAPI InitPDEVImpl(VOID)
Definition: pdevobj.c:21
struct _CLIENTINFO * PCLIENTINFO
BOOL FASTCALL UserSetProcessWindowStation(HWINSTA hWindowStation)
Definition: winsta.c:1346
ULONG_PTR NTAPI UserDbgPostServiceHook(ULONG ulSyscallId, ULONG_PTR ulResult)
Definition: misc.c:761
PKWIN32_SESSION_CALLOUT DesktopOpenProcedure
Definition: pstypes.h:1629
BOOL FASTCALL co_IntGraphicsCheck(BOOL Create)
Definition: guicheck.c:52
NTSTATUS GdiProcessCreate(PEPROCESS Process)
Definition: init.c:18
#define NB_HOOKS
Definition: ntuser.h:130
PDRIVER_UNLOAD DriverUnload
Definition: iotypes.h:2180
LIST_ENTRY aphkStart[NB_HOOKS]
FIXME!
Definition: win32.h:138
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:139
VOID ResetCsrApiPort(VOID)
Definition: csr.c:58
PVOID GlobalUserHeapSection
Definition: usrheap.c:26
NTSTATUS NTAPI ExitThreadCallback(PETHREAD Thread)
Definition: main.c:687
#define _Pre_notnull_
Definition: no_sal2.h:496
struct tagKL * KeyboardLayout
Definition: win32.h:89
VOID FASTCALL UnregisterThreadHotKeys(PTHREADINFO pti)
Definition: hotkey.c:121
LIST_ENTRY DriverObjListHead
Definition: win32.h:281
Status
Definition: gdiplustypes.h:24
NTSTATUS UserProcessDestroy(PEPROCESS Process)
Definition: main.c:175
HANDLE hEventQueueClient
Definition: win32.h:122
ULONG_PTR Win32kSSDT[]
Definition: napi.h:9
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:88
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:255
Definition: compat.h:493
USHORT CodePage
Definition: ntuser.h:308
#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:75
LIST_ENTRY PostedMessagesListHead
Definition: win32.h:132
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:690
BOOL IntSetThreadDesktop(IN HDESK hDesktop, IN BOOL FreeOnFailure)
Definition: desktop.c:3211
#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:246
PKL W32kGetDefaultKeyLayout(VOID)
Definition: kbdlayout.c:343
VOID FASTCALL IntCleanupCurIconCache(PPROCESSINFO Win32Process)
Definition: cursoricon.c:391
#define STARTF_SCREENSAVER
Definition: undocuser.h:163
NTSTATUS FASTCALL IntResolveDesktop(IN PEPROCESS Process, IN PUNICODE_STRING DesktopPath, IN BOOL bInherit, OUT HWINSTA *phWinSta, OUT HDESK *phDesktop)
Definition: desktop.c:535
HANDLE GlobalUserHeap
Definition: usrheap.c:25
NTSTATUS FASTCALL IntValidateDesktopHandle(HDESK Desktop, KPROCESSOR_MODE AccessMode, ACCESS_MASK DesiredAccess, PDESKTOP *Object)
Definition: desktop.c:1200
#define WM_MOUSEMOVE
Definition: winuser.h:1757
HANDLE hModuleWin
Definition: main.c:16
VOID FASTCALL MsqCleanupThreadMsgs(PTHREADINFO pti)
Definition: msgqueue.c:2266
#define __drv_freesMem(kind)
Definition: driverspecs.h:254
NTSTATUS APIENTRY co_IntClientThreadSetup(VOID)
Definition: callback.c:970
INIT_FUNCTION NTSTATUS NTAPI InitInputImpl(VOID)
Definition: input.c:360
#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:215
#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
VOID NTAPI PsEstablishWin32Callouts(IN PWIN32_CALLOUTS_FPNS CalloutData)
Definition: win32.c:112
void DbgUserDumpHandleTable()
#define OUT
Definition: typedefs.h:40
#define ObReferenceObject
Definition: obfuncs.h:204
INIT_FUNCTION NTSTATUS NTAPI InitDesktopImpl(VOID)
Definition: desktop.c:236
INIT_FUNCTION NTSTATUS NTAPI InitTimerImpl(VOID)
Definition: timer.c:594
SINGLE_LIST_ENTRY ReferencesList
Definition: win32.h:152
unsigned int ULONG
Definition: retypes.h:1
#define IO_NO_INCREMENT
Definition: iotypes.h:566
PWIN32HEAP UserCreateHeap(OUT PVOID *SectionObject, IN OUT PVOID *SystemBase, IN SIZE_T HeapSize)
Definition: usrheap.c:177
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
uint32_t * PULONG_PTR
Definition: typedefs.h:64
_In_ PUNICODE_STRING RegistryPath
Definition: wmip.h:28
PTHREADINFO ptiList
Definition: win32.h:248
VOID UserDeleteW32Thread(PTHREADINFO pti)
Definition: main.c:404
HANDLE NTAPI PsGetProcessId(PEPROCESS Process)
Definition: process.c:1063
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
BOOL FASTCALL IsRemoveAttachThread(PTHREADINFO pti)
Definition: input.c:437
PKWIN32_SESSION_CALLOUT WindowStationParseProcedure
Definition: pstypes.h:1636
PKWIN32_PROCESS_CALLOUT ProcessCallout
Definition: pstypes.h:1622
FAST_MUTEX DriverObjListLock
Definition: win32.h:280
struct _DESKTOPINFO * pDeskInfo
Definition: win32.h:92
struct _PROCESSINFO * ppi
Definition: ntuser.h:314
return STATUS_SUCCESS
Definition: btrfs.c:3014
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
#define IntDereferenceProcessInfo(ppi)
Definition: win32.h:183
#define IntDereferenceThreadInfo(pti)
Definition: win32.h:168
DWORD dwTIFlags
Definition: ntuser.h:292
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 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:114
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:3312