ReactOS  0.4.15-dev-5089-g555bec6
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 
184 
185  if (gpwlCache)
186  {
188  gpwlCache = NULL;
189  }
190 
191  /* Destroy user objects */
193 
194  TRACE_CH(UserProcess, "Freeing ppi 0x%p\n", ppiCurrent);
195 #if DBG
196  if (DBG_IS_CHANNEL_ENABLED(ppiCurrent, DbgChUserObj, WARN_LEVEL))
197  {
198  TRACE_CH(UserObj, "Dumping user handles at the end of the process %s (Info %p).\n",
199  ppiCurrent->peProcess->ImageFileName, ppiCurrent);
201  }
202 #endif
203 
204  /* Remove it from the list of GUI apps */
206 
207  /*
208  * Deregister logon application automatically
209  */
210  if (gpidLogon == ppiCurrent->peProcess->UniqueProcessId)
211  gpidLogon = 0;
212 
213  /* Close the current window station */
215 
216  if (gppiInputProvider == ppiCurrent) gppiInputProvider = NULL;
217 
218  if (ppiCurrent->hdeskStartup)
219  {
220  ZwClose(ppiCurrent->hdeskStartup);
221  ppiCurrent->hdeskStartup = NULL;
222  }
223 
224  /* Clean up the process icon cache */
225  IntCleanupCurIconCache(ppiCurrent);
226 
227  return STATUS_SUCCESS;
228 }
229 
230 NTSTATUS
232 {
234  PPROCESSINFO ppiCurrent;
235  PVOID KernelMapping = NULL, UserMapping = NULL;
236 
237  /* We might be called with an already allocated win32 process */
238  ppiCurrent = PsGetProcessWin32Process(Process);
239  if (ppiCurrent != NULL)
240  {
241  /* There is no more to do for us (this is a success code!) */
242  return STATUS_ALREADY_WIN32;
243  }
244  // if (ppiCurrent->W32PF_flags & W32PF_PROCESSCONNECTED)
245  // return STATUS_ALREADY_WIN32;
246 
247  /* Allocate a new Win32 process info */
248  Status = AllocW32Process(Process, &ppiCurrent);
249  if (!NT_SUCCESS(Status))
250  {
251  ERR_CH(UserProcess, "Failed to allocate ppi for PID:0x%lx\n",
252  HandleToUlong(Process->UniqueProcessId));
253  return Status;
254  }
255 
256 #if DBG
258 #if defined(KDBG)
259  KdRosRegisterCliCallback(DbgGdiKdbgCliCallback);
260 #endif
261 #endif
262 
263  /* Map the global user heap into the process */
264  Status = MapGlobalUserHeap(Process, &KernelMapping, &UserMapping);
265  if (!NT_SUCCESS(Status))
266  {
267  TRACE_CH(UserProcess, "Failed to map the global heap! 0x%x\n", Status);
268  goto error;
269  }
270 
271  TRACE_CH(UserProcess, "InitProcessCallback -- We have KernelMapping 0x%p and UserMapping 0x%p with delta = 0x%x\n",
272  KernelMapping, UserMapping, (ULONG_PTR)KernelMapping - (ULONG_PTR)UserMapping);
273 
274  /* Initialize USER process info */
276  if (!NT_SUCCESS(Status))
277  {
278  ERR_CH(UserProcess, "UserProcessCreate failed, Status 0x%08lx\n", Status);
279  goto error;
280  }
281 
282  /* Initialize GDI process info */
284  if (!NT_SUCCESS(Status))
285  {
286  ERR_CH(UserProcess, "GdiProcessCreate failed, Status 0x%08lx\n", Status);
287  goto error;
288  }
289 
290  /* Add the process to the global list */
291  ppiCurrent->ppiNext = gppiList;
292  gppiList = ppiCurrent;
293 
294  return STATUS_SUCCESS;
295 
296 error:
297  ERR_CH(UserProcess, "InitProcessCallback failed! Freeing ppi 0x%p for PID:0x%lx\n",
298  ppiCurrent, HandleToUlong(Process->UniqueProcessId));
300  return Status;
301 }
302 
303 NTSTATUS
305 {
306  PPROCESSINFO ppiCurrent, *pppi;
307 
308  /* Get the Win32 Process */
309  ppiCurrent = PsGetProcessWin32Process(Process);
310  ASSERT(ppiCurrent);
311  ASSERT(ppiCurrent->peProcess == Process);
312 
313  TRACE_CH(UserProcess, "Destroying ppi 0x%p\n", ppiCurrent);
314  ppiCurrent->W32PF_flags |= W32PF_TERMINATED;
315 
316  /* Remove it from the list */
317  pppi = &gppiList;
318  while (*pppi != NULL && *pppi != ppiCurrent)
319  {
320  pppi = &(*pppi)->ppiNext;
321  }
322  ASSERT(*pppi == ppiCurrent);
323  *pppi = ppiCurrent->ppiNext;
324 
325  /* Cleanup GDI info */
327 
328  /* Cleanup USER info */
330 
331  /* The process is dying */
332  PsSetProcessWin32Process(Process, NULL, ppiCurrent);
333  ppiCurrent->peProcess = NULL;
334 
335  /* Finally, dereference */
336  IntDereferenceProcessInfo(ppiCurrent);
337 
338  return STATUS_SUCCESS;
339 }
340 
341 NTSTATUS
342 APIENTRY
345 {
347 
348  ASSERT(Process->Peb);
349 
350  TRACE_CH(UserProcess, "Win32kProcessCallback -->\n");
351 
353 
354  if (Initialize)
355  {
357  }
358  else
359  {
361  }
362 
363  UserLeave();
364 
365  TRACE_CH(UserProcess, "<-- Win32kProcessCallback\n");
366 
367  return Status;
368 }
369 
370 
371 
372 NTSTATUS
374  OUT PTHREADINFO* W32Thread)
375 {
376  PTHREADINFO ptiCurrent;
377 
378  TRACE_CH(UserThread, "In AllocW32Thread(0x%p)\n", Thread);
379 
380  /* Check that we were not called with an already existing Win32 thread info */
381  ptiCurrent = PsGetThreadWin32Thread(Thread);
382  NT_ASSERT(ptiCurrent == NULL);
383 
384  /* Allocate a new Win32 thread info */
385  ptiCurrent = ExAllocatePoolWithTag(NonPagedPool,
386  sizeof(*ptiCurrent),
388  if (ptiCurrent == NULL)
389  {
390  ERR_CH(UserThread, "Failed to allocate pti for TID:0x%lx\n",
392  return STATUS_NO_MEMORY;
393  }
394 
395  TRACE_CH(UserThread, "Allocated pti 0x%p for TID:0x%lx\n",
396  ptiCurrent, HandleToUlong(Thread->Cid.UniqueThread));
397 
398  RtlZeroMemory(ptiCurrent, sizeof(*ptiCurrent));
399 
400  PsSetThreadWin32Thread(Thread, ptiCurrent, NULL);
402  IntReferenceThreadInfo(ptiCurrent);
403 
404  *W32Thread = ptiCurrent;
405  return STATUS_SUCCESS;
406 }
407 
408 /*
409  * Called from IntDereferenceThreadInfo
410  */
411 VOID
413 {
414  PPROCESSINFO ppi = pti->ppi;
415 
416  TRACE_CH(UserThread, "UserDeleteW32Thread pti 0x%p\n",pti);
417 
418  /* Free the message queue */
419  if (pti->MessageQueue)
420  {
422  }
423 
425 
426  ObDereferenceObject(pti->pEThread);
427 
429 
431 
432  {
433  // Find another queue for mouse cursor.
434  MSG msg;
435  msg.message = WM_MOUSEMOVE;
436  msg.wParam = UserGetMouseButtonsState();
437  msg.lParam = MAKELPARAM(gpsi->ptCursor.x, gpsi->ptCursor.y);
438  msg.pt = gpsi->ptCursor;
440  }
441 }
442 
443 NTSTATUS
445 {
446  return STATUS_SUCCESS;
447 }
448 
449 NTSTATUS
451 {
452  return STATUS_SUCCESS;
453 }
454 
457 {
459  PCLIENTINFO pci;
460  PTHREADINFO ptiCurrent;
461  int i;
463  PTEB pTeb;
464  PRTL_USER_PROCESS_PARAMETERS ProcessParams;
465  PKL pDefKL;
466 
467  Process = Thread->ThreadsProcess;
468 
469  pTeb = NtCurrentTeb();
470  ASSERT(pTeb);
471 
472  ProcessParams = pTeb->ProcessEnvironmentBlock->ProcessParameters;
473 
474  /* Allocate a new Win32 thread info */
475  Status = AllocW32Thread(Thread, &ptiCurrent);
476  if (!NT_SUCCESS(Status))
477  {
478  ERR_CH(UserThread, "Failed to allocate pti for TID:0x%lx\n",
480  return Status;
481  }
482 
483  /* Initialize the THREADINFO */
484  ptiCurrent->pEThread = Thread;
485  ptiCurrent->ppi = PsGetProcessWin32Process(Process);
486  IntReferenceProcessInfo(ptiCurrent->ppi);
487  pTeb->Win32ThreadInfo = ptiCurrent;
488  ptiCurrent->pClientInfo = (PCLIENTINFO)pTeb->Win32ClientInfo;
489  ptiCurrent->pcti = &ptiCurrent->cti;
490 
491  /* Mark the process as having threads */
492  ptiCurrent->ppi->W32PF_flags |= W32PF_THREADCONNECTED;
493 
494  InitializeListHead(&ptiCurrent->WindowListHead);
498  InitializeListHead(&ptiCurrent->PtiLink);
499  for (i = 0; i < NB_HOOKS; i++)
500  {
501  InitializeListHead(&ptiCurrent->aphkStart[i]);
502  }
503  ptiCurrent->ptiSibling = ptiCurrent->ppi->ptiList;
504  ptiCurrent->ppi->ptiList = ptiCurrent;
505  ptiCurrent->ppi->cThreads++;
506 
507  ptiCurrent->hEventQueueClient = NULL;
508  Status = ZwCreateEvent(&ptiCurrent->hEventQueueClient, EVENT_ALL_ACCESS,
510  if (!NT_SUCCESS(Status))
511  {
512  ERR_CH(UserThread, "Event creation failed, Status 0x%08x.\n", Status);
513  goto error;
514  }
517  (PVOID*)&ptiCurrent->pEventQueueServer, NULL);
518  if (!NT_SUCCESS(Status))
519  {
520  ERR_CH(UserThread, "Failed referencing the event object, Status 0x%08x.\n", Status);
522  ptiCurrent->hEventQueueClient = NULL;
523  goto error;
524  }
525 
526  ptiCurrent->pcti->timeLastRead = EngGetTickCount32();
527 
528  ptiCurrent->MessageQueue = MsqCreateMessageQueue(ptiCurrent);
529  if (ptiCurrent->MessageQueue == NULL)
530  {
531  ERR_CH(UserThread, "Failed to allocate message loop\n");
533  goto error;
534  }
535 
536  pDefKL = W32kGetDefaultKeyLayout();
537  UserAssignmentLock((PVOID*)&(ptiCurrent->KeyboardLayout), pDefKL);
538 
539  ptiCurrent->TIF_flags &= ~TIF_INCLEANUP;
540 
541  // FIXME: Flag SYSTEM threads with... TIF_SYSTEMTHREAD !!
542 
543  /* CSRSS threads have some special features */
544  if (Process == gpepCSRSS || !gpepCSRSS)
546 
547  /* Initialize the CLIENTINFO */
548  pci = (PCLIENTINFO)pTeb->Win32ClientInfo;
549  RtlZeroMemory(pci, sizeof(*pci));
550  pci->ppi = ptiCurrent->ppi;
551  pci->fsHooks = ptiCurrent->fsHooks;
552  pci->dwTIFlags = ptiCurrent->TIF_flags;
553  if (pDefKL)
554  {
555  pci->hKL = pDefKL->hkl;
556  pci->CodePage = pDefKL->CodePage;
557  }
558 
559  /* Need to pass the user Startup Information to the current process. */
560  if ( ProcessParams )
561  {
562  if ( ptiCurrent->ppi->usi.cb == 0 ) // Not initialized yet.
563  {
564  if ( ProcessParams->WindowFlags != 0 ) // Need window flags set.
565  {
566  ptiCurrent->ppi->usi.cb = sizeof(USERSTARTUPINFO);
567  ptiCurrent->ppi->usi.dwX = ProcessParams->StartingX;
568  ptiCurrent->ppi->usi.dwY = ProcessParams->StartingY;
569  ptiCurrent->ppi->usi.dwXSize = ProcessParams->CountX;
570  ptiCurrent->ppi->usi.dwYSize = ProcessParams->CountY;
571  ptiCurrent->ppi->usi.dwFlags = ProcessParams->WindowFlags;
572  ptiCurrent->ppi->usi.wShowWindow = (WORD)ProcessParams->ShowWindowFlags;
573  }
574  }
575  }
576 
577  /*
578  * Assign a default window station and desktop to the process.
579  * Do not try to open a desktop or window station before the very first
580  * (interactive) window station has been created by Winlogon.
581  */
582  if (!(ptiCurrent->TIF_flags & (TIF_SYSTEMTHREAD | TIF_CSRSSTHREAD)) &&
583  ptiCurrent->ppi->hdeskStartup == NULL &&
585  {
586  HWINSTA hWinSta = NULL;
587  HDESK hDesk = NULL;
588  UNICODE_STRING DesktopPath;
589  PDESKTOP pdesk;
590 
591  /*
592  * Inherit the thread desktop and process window station (if not yet inherited)
593  * from the process startup info structure. See documentation of CreateProcess().
594  */
596  if (ProcessParams && ProcessParams->DesktopInfo.Length > 0)
597  {
598  Status = IntSafeCopyUnicodeStringTerminateNULL(&DesktopPath, &ProcessParams->DesktopInfo);
599  }
600  if (!NT_SUCCESS(Status))
601  {
602  RtlInitUnicodeString(&DesktopPath, NULL);
603  }
604 
606  &DesktopPath,
607  !!(ProcessParams->WindowFlags & STARTF_INHERITDESKTOP),
608  &hWinSta,
609  &hDesk);
610 
611  if (DesktopPath.Buffer)
612  ExFreePoolWithTag(DesktopPath.Buffer, TAG_STRING);
613 
614  if (!NT_SUCCESS(Status))
615  {
616  ERR_CH(UserThread, "Failed to assign default desktop and winsta to process\n");
617  goto error;
618  }
619 
620  if (!UserSetProcessWindowStation(hWinSta))
621  {
623  ERR_CH(UserThread, "Failed to set initial process winsta\n");
624  goto error;
625  }
626 
627  /* Validate the new desktop */
628  Status = IntValidateDesktopHandle(hDesk, UserMode, 0, &pdesk);
629  if (!NT_SUCCESS(Status))
630  {
631  ERR_CH(UserThread, "Failed to validate initial desktop handle\n");
632  goto error;
633  }
634 
635  /* Store the parsed desktop as the initial desktop */
636  ASSERT(ptiCurrent->ppi->hdeskStartup == NULL);
637  ASSERT(Process->UniqueProcessId != gpidLogon);
638  ptiCurrent->ppi->hdeskStartup = hDesk;
639  ptiCurrent->ppi->rpdeskStartup = pdesk;
640  }
641 
642  if (ptiCurrent->ppi->hdeskStartup != NULL)
643  {
644  if (!IntSetThreadDesktop(ptiCurrent->ppi->hdeskStartup, FALSE))
645  {
646  ERR_CH(UserThread, "Failed to set thread desktop\n");
648  goto error;
649  }
650  }
651 
652  /* Mark the thread as fully initialized */
653  ptiCurrent->TIF_flags |= TIF_GUITHREADINITIALIZED;
654 
655  if (!(ptiCurrent->ppi->W32PF_flags & (W32PF_ALLOWFOREGROUNDACTIVATE | W32PF_APPSTARTING)) &&
656  (gptiForeground && gptiForeground->ppi == ptiCurrent->ppi ))
657  {
658  ptiCurrent->TIF_flags |= TIF_ALLOWFOREGROUNDACTIVATE;
659  }
660  ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
661 
662  /* Create the default input context */
663  if (IS_IMM_MODE())
664  {
666  }
667 
668  /* Last things to do only if we are not a SYSTEM or CSRSS thread */
669  if (!(ptiCurrent->TIF_flags & (TIF_SYSTEMTHREAD | TIF_CSRSSTHREAD)))
670  {
671  /* Callback to User32 Client Thread Setup */
672  TRACE_CH(UserThread, "Call co_IntClientThreadSetup...\n");
674  if (!NT_SUCCESS(Status))
675  {
676  ERR_CH(UserThread, "ClientThreadSetup failed with Status 0x%08lx\n", Status);
677  goto error;
678  }
679  TRACE_CH(UserThread, "co_IntClientThreadSetup succeeded!\n");
680  }
681  else
682  {
683  TRACE_CH(UserThread, "co_IntClientThreadSetup cannot be called...\n");
684  }
685 
686  TRACE_CH(UserThread, "UserCreateW32Thread pti 0x%p\n", ptiCurrent);
687  return STATUS_SUCCESS;
688 
689 error:
690  ERR_CH(UserThread, "InitThreadCallback failed! Freeing pti 0x%p for TID:0x%lx\n",
691  ptiCurrent, HandleToUlong(Thread->Cid.UniqueThread));
693  return Status;
694 }
695 
696 VOID
698 
699 // Win: xxxDestroyThreadInfo
700 NTSTATUS
701 NTAPI
703 {
704  PTHREADINFO *ppti;
705  PSINGLE_LIST_ENTRY psle;
706  PPROCESSINFO ppiCurrent;
708  PTHREADINFO ptiCurrent;
709  PWINDOWLIST pwl, pwlNext;
710 
711  Process = Thread->ThreadsProcess;
712 
713  /* Get the Win32 Thread */
714  ptiCurrent = PsGetThreadWin32Thread(Thread);
715  ASSERT(ptiCurrent);
716 
717  TRACE_CH(UserThread, "Destroying pti 0x%p eThread 0x%p\n", ptiCurrent, Thread);
718 
719  ptiCurrent->TIF_flags |= TIF_INCLEANUP;
720  ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
721 
722  ppiCurrent = ptiCurrent->ppi;
723  ASSERT(ppiCurrent);
724 
725  IsRemoveAttachThread(ptiCurrent);
726 
727  if (gpwlList)
728  {
729  for (pwl = gpwlList; pwl; pwl = pwlNext)
730  {
731  pwlNext = pwl->pNextList;
732  if (pwl->pti == ptiCurrent)
733  IntFreeHwndList(pwl);
734  }
735  }
736 
737  ptiCurrent->TIF_flags |= TIF_DONTATTACHQUEUE;
738  ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
739 
741 
742  /* Decrement thread count and check if its 0 */
743  ppiCurrent->cThreads--;
744 
745  if (ptiCurrent->TIF_flags & TIF_GUITHREADINITIALIZED)
746  {
747  /* Do now some process cleanup that requires a valid win32 thread */
748  if (ptiCurrent->ppi->cThreads == 0)
749  {
750  /* Check if we have registered the user api hook */
751  if (ptiCurrent->ppi == ppiUahServer)
752  {
753  /* Unregister the api hook */
755  }
756 
757  /* Notify logon application to restart shell if needed */
758  if (ptiCurrent->pDeskInfo)
759  {
760  if (ptiCurrent->pDeskInfo->ppiShellProcess == ppiCurrent)
761  {
763 
764  TRACE_CH(UserProcess, "Shell process is exiting (%lu)\n", ExitCode);
765 
769  ExitCode);
770 
771  ptiCurrent->pDeskInfo->ppiShellProcess = NULL;
772  }
773  }
774  }
775 
776  DceFreeThreadDCE(ptiCurrent);
777  DestroyTimersForThread(ptiCurrent);
779  UnregisterThreadHotKeys(ptiCurrent);
780 
781  if (!UserDestroyObjectsForOwner(gHandleTable, ptiCurrent))
782  {
783  DPRINT1("Failed to delete objects belonging to thread %p. This is VERY BAD!.\n", ptiCurrent);
784  ASSERT(FALSE);
785  return STATUS_UNSUCCESSFUL;
786  }
787  UserAssignmentUnlock((PVOID*)&ptiCurrent->spDefaultImc);
788 
789  if (ppiCurrent && ppiCurrent->ptiList == ptiCurrent && !ptiCurrent->ptiSibling &&
790  ppiCurrent->W32PF_flags & W32PF_CLASSESREGISTERED)
791  {
792  TRACE_CH(UserThread, "DestroyProcessClasses\n");
793  /* no process windows should exist at this point, or the function will assert! */
794  DestroyProcessClasses(ppiCurrent);
795  ppiCurrent->W32PF_flags &= ~W32PF_CLASSESREGISTERED;
796  }
797 
798  IntBlockInput(ptiCurrent, FALSE);
799  IntCleanupThreadCallbacks(ptiCurrent);
800 
801  /* cleanup user object references stack */
802  psle = PopEntryList(&ptiCurrent->ReferencesList);
803  while (psle)
804  {
806  TRACE_CH(UserThread, "thread clean: remove reference obj 0x%p\n",ref->obj);
808 
809  psle = PopEntryList(&ptiCurrent->ReferencesList);
810  }
811  }
812 
813  if (ptiCurrent->cEnterCount)
814  {
816  ptiCurrent->cEnterCount = 0;
817  }
818 
819  /* Find the THREADINFO in the PROCESSINFO's list */
820  ppti = &ppiCurrent->ptiList;
821  while (*ppti != NULL && *ppti != ptiCurrent)
822  {
823  ppti = &((*ppti)->ptiSibling);
824  }
825 
826  /* we must have found it */
827  ASSERT(*ppti == ptiCurrent);
828 
829  /* Remove it from the list */
830  *ppti = ptiCurrent->ptiSibling;
831 
832  if (!UserAssignmentUnlock((PVOID*)&(ptiCurrent->KeyboardLayout)))
833  ptiCurrent->pClientInfo->hKL = NULL;
834 
835  if (gptiForeground == ptiCurrent)
836  {
837 // IntNotifyWinEvent(EVENT_OBJECT_FOCUS, NULL, OBJID_CLIENT, CHILDID_SELF, 0);
838 // IntNotifyWinEvent(EVENT_SYSTEM_FOREGROUND, NULL, OBJID_WINDOW, CHILDID_SELF, 0);
839 
841  }
842 
843  /* Restore display mode when we are the last thread, and we changed the display mode */
844  if (ppiCurrent->cThreads == 0)
845  UserDisplayNotifyShutdown(ppiCurrent);
846 
847 
848  // Fixes CORE-6384 & CORE-7030.
849 /* if (ptiLastInput == ptiCurrent)
850  {
851  if (!ppiCurrent->ptiList)
852  ptiLastInput = gptiForeground;
853  else
854  ptiLastInput = ppiCurrent->ptiList;
855  ERR_CH(UserThread, "DTI: ptiLastInput is Cleared!!\n");
856  }
857 */
858  TRACE_CH(UserThread, "Freeing pti 0x%p\n", ptiCurrent);
859 
861 
862  if (ptiCurrent->hEventQueueClient != NULL)
863  {
866  }
867  ptiCurrent->hEventQueueClient = NULL;
868 
869  /* The thread is dying */
870  PsSetThreadWin32Thread(Thread /*ptiCurrent->pEThread*/, NULL, ptiCurrent);
871 
872  /* Dereference the THREADINFO */
873  IntDereferenceThreadInfo(ptiCurrent);
874 
875  return STATUS_SUCCESS;
876 }
877 
878 NTSTATUS
879 APIENTRY
882 {
884 
885  ASSERT(NtCurrentTeb());
886 
888 
890  {
893  }
894  else // if (Type == PsW32ThreadCalloutExit)
895  {
898  }
899 
900  UserLeave();
901 
902  return Status;
903 }
904 
905 _Function_class_(DRIVER_UNLOAD)
906 VOID NTAPI
908 {
909  // TODO: Do more cleanup!
910 
911  ResetCsrApiPort();
912  ResetCsrProcess();
913 }
914 
915 // Return on failure
916 #define NT_ROF(x) \
917 { \
918  Status = (x); \
919  if (!NT_SUCCESS(Status)) \
920  { \
921  DPRINT1("Failed '%s' (0x%lx)\n", #x, Status); \
922  return Status; \
923  } \
924 }
925 
926 // Lock & return on failure
927 #define USERLOCK_AND_ROF(x) \
928 { \
929  UserEnterExclusive(); \
930  Status = (x); \
931  UserLeave(); \
932  if (!NT_SUCCESS(Status)) \
933  { \
934  DPRINT1("Failed '%s' (0x%lx)\n", #x, Status); \
935  return Status; \
936  } \
937 }
938 
939 
940 
941 /*
942  * This definition doesn't work
943  */
944 CODE_SEG("INIT")
945 NTSTATUS
946 APIENTRY
950 {
952  BOOLEAN Result;
953  WIN32_CALLOUTS_FPNS CalloutData = {0};
954  PVOID GlobalUserHeapBase = NULL;
955 
956  /*
957  * Register user mode call interface
958  * (system service table index = 1)
959  */
961  NULL,
963  Win32kSSPT,
964  1);
965  if (Result == FALSE)
966  {
967  DPRINT1("Adding system services failed!\n");
968  return STATUS_UNSUCCESSFUL;
969  }
970 
972  DPRINT("Win32k hInstance 0x%p!\n", hModuleWin);
973 
974  DriverObject->DriverUnload = DriverUnload;
975 
976  /* Register Object Manager Callbacks */
978  CalloutData.ThreadCallout = Win32kThreadCallback;
979  // CalloutData.GlobalAtomTableCallout = NULL;
980  // CalloutData.PowerEventCallout = NULL;
981  // CalloutData.PowerStateCallout = NULL;
982  // CalloutData.JobCallout = NULL;
989  // CalloutData.WindowStationCloseProcedure = NULL;
992  // CalloutData.WindowStationOpenProcedure = NULL;
993 
994  /* Register our per-process and per-thread structures. */
995  PsEstablishWin32Callouts(&CalloutData);
996 
997  /* Register service hook callbacks */
998 #if DBG && defined(KDBG)
999  KdSystemDebugControl('CsoR', DbgPreServiceHook, ID_Win32PreServiceHook, 0, 0, 0, 0);
1000  KdSystemDebugControl('CsoR', DbgPostServiceHook, ID_Win32PostServiceHook, 0, 0, 0, 0);
1001 #endif
1002 
1003  /* Create the global USER heap */
1005  &GlobalUserHeapBase,
1006  1 * 1024 * 1024); /* FIXME: 1 MB for now... */
1007  if (GlobalUserHeap == NULL)
1008  {
1009  DPRINT1("Failed to initialize the global heap!\n");
1010  return STATUS_UNSUCCESSFUL;
1011  }
1012 
1013  /* Init the global user lock */
1015 
1016  /* Lock while we use the heap (UserHeapAlloc asserts on this) */
1018 
1019  /* Allocate global server info structure */
1020  gpsi = UserHeapAlloc(sizeof(*gpsi));
1021  UserLeave();
1022  if (!gpsi)
1023  {
1024  DPRINT1("Failed allocate server info structure!\n");
1025  return STATUS_UNSUCCESSFUL;
1026  }
1027 
1028  RtlZeroMemory(gpsi, sizeof(*gpsi));
1029  DPRINT("Global Server Data -> %p\n", gpsi);
1030 
1033 
1034  /* Create stock objects, ie. precreated objects commonly
1035  used by win32 applications */
1038 
1039  NT_ROF(InitBrushImpl());
1040  NT_ROF(InitPDEVImpl());
1041  NT_ROF(InitLDEVImpl());
1043  NT_ROF(InitDcImpl());
1047  NT_ROF(InitInputImpl());
1050  NT_ROF(InitTimerImpl());
1051  NT_ROF(InitDCEImpl());
1052 
1054 
1055  /* Initialize FreeType library */
1056  if (!InitFontSupport())
1057  {
1058  DPRINT1("Unable to initialize font support\n");
1059  return Status;
1060  }
1061 
1062  return STATUS_SUCCESS;
1063 }
1064 
1065 /* EOF */
NTSTATUS APIENTRY Win32kThreadCallback(PETHREAD Thread, PSW32THREADCALLOUTTYPE Type)
Definition: main.c:880
ULONG fsHooks
Definition: ntuser.h:311
USERSTARTUPINFO usi
Definition: win32.h:269
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:210
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:231
PPEB ProcessEnvironmentBlock
Definition: ntddk_ex.h:337
void FASTCALL DestroyProcessClasses(PPROCESSINFO Process)
Definition: class.c:300
struct tagIMC * spDefaultImc
Definition: win32.h:128
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:252
Definition: ntbasedef.h:628
NTSTATUS AllocW32Process(IN PEPROCESS Process, OUT PPROCESSINFO *W32Process)
Definition: main.c:58
PVOID FASTCALL UserAssignmentLock(PVOID *ppvObj, PVOID pvNew)
Definition: object.c:840
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:151
PTHREADINFO ptiSibling
Definition: win32.h:112
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define IS_IMM_MODE()
Definition: ntuser.h:1204
#define TIF_DONTATTACHQUEUE
Definition: ntuser.h:260
#define EngGetTickCount32()
Definition: eng.h:43
NTSTATUS NTAPI InitPDEVImpl(VOID)
Definition: pdevobj.c:30
NTSTATUS NTAPI InitInputImpl(VOID)
Definition: input.c:360
struct tagWINDOWLIST * pNextList
Definition: window.h:86
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:91
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:3998
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:916
NTSTATUS NTAPI IntDesktopOkToClose(_In_ PVOID Parameters)
Definition: desktop.c:186
NTSTATUS ExInitializeResourceLite(PULONG res)
Definition: env_spec_w32.h:641
ERESOURCE UserLock
Definition: ntuser.c:18
BOOL FASTCALL DestroyTimersForThread(PTHREADINFO pti)
Definition: timer.c:549
USHORT FASTCALL UserGetLanguageID(VOID)
Definition: misc.c:97
NTSTATUS ExitProcessCallback(PEPROCESS Process)
Definition: main.c:304
BOOL FASTCALL UserDereferenceObject(PVOID Object)
Definition: object.c:644
LIST_ENTRY PtiLink
Definition: win32.h:122
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:1903
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:230
UNICODE_STRING DesktopInfo
Definition: rtltypes.h:1555
#define USERTAG_THREADINFO
Definition: tags.h:284
LONG NTAPI KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
Definition: eventobj.c:159
#define TIF_SYSTEMTHREAD
Definition: ntuser.h:256
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:84
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define USERTAG_PROCESSINFO
Definition: tags.h:260
NTSTATUS MapGlobalUserHeap(IN PEPROCESS Process, OUT PVOID *KernelMapping, OUT PVOID *UserMapping)
Definition: usrheap.c:266
NTSTATUS NTAPI IntWinStaObjectParse(_In_ PVOID Parameters)
Definition: winsta.c:138
static GENERIC_MAPPING UserMapping
Definition: samrpc.c:48
PTHREADINFO gptiForeground
Definition: focus.c:15
#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:254
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:679
NTSTATUS NTAPI PsGetProcessExitStatus(PEPROCESS Process)
Definition: process.c:1053
#define FALSE
Definition: types.h:117
#define TIF_CSRSSTHREAD
Definition: ntuser.h:257
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:252
LIST_ENTRY SentMessagesListHead
Definition: win32.h:96
#define EVENT_ALL_ACCESS
Definition: isotest.c:82
void FASTCALL DceFreeThreadDCE(PTHREADINFO)
Definition: windc.c:780
VOID FASTCALL CreateStockObjects(VOID)
Definition: stockobj.c:247
NTSTATUS AllocW32Thread(IN PETHREAD Thread, OUT PTHREADINFO *W32Thread)
Definition: main.c:373
_Function_class_(DRIVER_UNLOAD)
Definition: main.c:905
#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:927
NTSTATUS NTAPI IntWinStaObjectDelete(_In_ PVOID Parameters)
Definition: winsta.c:106
PPROCESSINFO gppiList
Definition: main.c:31
Definition: object.h:3
unsigned char BOOLEAN
PWINDOWLIST gpwlCache
Definition: window.c:17
VOID FASTCALL IntFreeHwndList(PWINDOWLIST pwlTarget)
Definition: window.c:1456
NTSTATUS GdiProcessDestroy(PEPROCESS Process)
Definition: init.c:47
PPROCESSINFO gppiInputProvider
Definition: ntuser.c:16
#define IntReferenceProcessInfo(ppi)
Definition: win32.h:177
Definition: input.h:26
LIST_ENTRY W32CallbackListHead
Definition: win32.h:152
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:278
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:343
enum _PSW32THREADCALLOUTTYPE PSW32THREADCALLOUTTYPE
struct _CLIENTTHREADINFO * pcti
Definition: win32.h:87
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:259
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
INT cThreads
Definition: win32.h:253
#define IntReferenceThreadInfo(pti)
Definition: win32.h:162
void NTAPI UserDbgPreServiceHook(ULONG ulSyscallId, PULONG_PTR pulArguments)
Definition: misc.c:775
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:249
Status
Definition: gdiplustypes.h:24
HWND hwndSAS
Definition: winsta.c:24
ULONG fsHooks
Definition: win32.h:113
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:2467
#define ASSERT(a)
Definition: mode.c:44
NTSTATUS UserThreadDestroy(PETHREAD Thread)
Definition: main.c:450
USHORT CodePage
Definition: input.h:36
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
PUSER_MESSAGE_QUEUE FASTCALL MsqCreateMessageQueue(PTHREADINFO pti)
Definition: msgqueue.c:2440
NTSTATUS NTAPI InitGdiHandleTable(void)
Definition: gdiobj.c:259
CLIENT_ID Cid
Definition: pstypes.h:1128
struct _DESKTOP * rpdeskStartup
Definition: win32.h:249
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
Definition: exfuncs.h:274
PKEVENT pEventQueueServer
Definition: win32.h:121
HKL hkl
Definition: input.h:32
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:90
HKL hKL
Definition: ntuser.h:322
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:3379
struct _CLIENTINFO * PCLIENTINFO
BOOL FASTCALL UserSetProcessWindowStation(HWINSTA hWindowStation)
Definition: winsta.c:1382
ULONG_PTR NTAPI UserDbgPostServiceHook(ULONG ulSyscallId, ULONG_PTR ulResult)
Definition: misc.c:782
#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:139
NTSTATUS UserThreadCreate(PETHREAD Thread)
Definition: main.c:444
#define VOID
Definition: acefi.h:82
NTSTATUS NTAPI InitThreadCallback(PETHREAD Thread)
Definition: main.c:456
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:203
#define WM_LOGONNOTIFY
Definition: undocuser.h:37
CLIENTTHREADINFO cti
Definition: win32.h:140
VOID ResetCsrApiPort(VOID)
Definition: csr.c:58
PVOID GlobalUserHeapSection
Definition: usrheap.c:26
NTSTATUS NTAPI ExitThreadCallback(PETHREAD Thread)
Definition: main.c:702
struct tagKL * KeyboardLayout
Definition: win32.h:86
VOID FASTCALL UnregisterThreadHotKeys(PTHREADINFO pti)
Definition: hotkey.c:121
NTSTATUS NTAPI InitDcImpl(VOID)
Definition: dclife.c:53
LIST_ENTRY DriverObjListHead
Definition: win32.h:280
NTSTATUS UserProcessDestroy(PEPROCESS Process)
Definition: main.c:175
HANDLE hEventQueueClient
Definition: win32.h:119
ULONG_PTR Win32kSSDT[]
Definition: napi.h:9
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:85
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:258
Definition: compat.h:694
USHORT CodePage
Definition: ntuser.h:323
#define TRACE_CH(ch, fmt,...)
Definition: debug.h:108
#define DBG_IS_CHANNEL_ENABLED(ppi, ch, level)
Definition: win32kdebug.h:166
#define TRACE_PPI(ppi, ch, fmt,...)
Definition: win32kdebug.h:183
#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:133
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:3252
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
NTSTATUS NTAPI IntDesktopObjectDelete(_In_ PVOID Parameters)
Definition: desktop.c:155
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:514
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:551
PWINDOWLIST gpwlList
Definition: window.c:16
HANDLE GlobalUserHeap
Definition: usrheap.c:25
NTSTATUS FASTCALL IntValidateDesktopHandle(HDESK Desktop, KPROCESSOR_MODE AccessMode, ACCESS_MASK DesiredAccess, PDESKTOP *Object)
Definition: desktop.c:1237
#define WM_MOUSEMOVE
Definition: winuser.h:1765
#define NULL
Definition: types.h:112
HANDLE hModuleWin
Definition: main.c:16
VOID FASTCALL MsqCleanupThreadMsgs(PTHREADINFO pti)
Definition: msgqueue.c:2265
#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:227
#define ERR_CH(ch, fmt,...)
Definition: debug.h:105
WORD wShowWindow
Definition: win32.h:214
#define msg(x)
Definition: auth_time.c:54
BOOLEAN UserDestroyObjectsForOwner(PUSER_HANDLE_TABLE Table, PVOID Owner)
Definition: object.c:754
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
NTSTATUS NTAPI InitUserImpl(VOID)
Definition: ntuser.c:79
VOID NTAPI PsEstablishWin32Callouts(IN PWIN32_CALLOUTS_FPNS CalloutData)
Definition: win32.c:112
void DbgUserDumpHandleTable()
PVOID FASTCALL UserAssignmentUnlock(PVOID *ppvObj)
Definition: object.c:861
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:153
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:247
VOID UserDeleteW32Thread(PTHREADINFO pti)
Definition: main.c:412
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
#define USERTAG_WINDOWLIST
Definition: tags.h:298
NTSTATUS NTAPI InitDCEImpl(VOID)
Definition: windc.c:30
FAST_MUTEX DriverObjListLock
Definition: win32.h:279
struct _DESKTOPINFO * pDeskInfo
Definition: win32.h:89
struct _PROCESSINFO * ppi
Definition: ntuser.h:329
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
PTHREADINFO pti
Definition: window.h:89
#define IntDereferenceProcessInfo(ppi)
Definition: win32.h:182
#define IntDereferenceThreadInfo(pti)
Definition: win32.h:167
DWORD dwTIFlags
Definition: ntuser.h:307
static CODE_SEG("PAGE")
Definition: isapnp.c:1482
VOID FASTCALL IntFreeImeHotKeys(VOID)
Definition: ime.c:340
INT cEnterCount
Definition: win32.h:131
PIMC FASTCALL UserCreateInputContext(ULONG_PTR dwClientImcData)
Definition: ime.c:1561
VOID UserDisplayNotifyShutdown(PPROCESSINFO ppiCurrent)
Definition: display.c:933
#define TIF_INCLEANUP
Definition: ntuser.h:254
base of all file and directory entries
Definition: entries.h:82
#define 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
#define W32PF_SCREENSAVER
Definition: win32.h:26
#define NT_ASSERT
Definition: rtlfuncs.h:3310