ReactOS 0.4.16-dev-1204-gb627a42
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#include <winbase_undoc.h>
12
13#define NDEBUG
14#include <debug.h>
15#include <kdros.h>
16
18
21
22// TODO: Should be moved to some GDI header
27
28PSERVERINFO gpsi = NULL; // Global User Server Information.
29
32
33extern ULONG_PTR Win32kSSDT[];
34extern UCHAR Win32kSSPT[];
36
37#if DBG
38void
40DbgPreServiceHook(ULONG ulSyscallId, PULONG_PTR pulArguments)
41{
42 GdiDbgPreServiceHook(ulSyscallId, pulArguments);
43 UserDbgPreServiceHook(ulSyscallId, pulArguments);
44}
45
48DbgPostServiceHook(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 */
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 */
95VOID
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
123{
125 ASSERT(ppiCurrent);
126
129
130 {
132
133 /* Allocate memory for the event structure */
135 sizeof(*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
176{
178 ASSERT(ppiCurrent);
179
180 if (ppiScrnSaver == ppiCurrent)
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
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!) */
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
296error:
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
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 */
333 ppiCurrent->peProcess = NULL;
334
335 /* Finally, dereference */
336 IntDereferenceProcessInfo(ppiCurrent);
337
338 return STATUS_SUCCESS;
339}
340
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
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 */
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 */
411VOID
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
445{
446 return STATUS_SUCCESS;
447}
448
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 BOOLEAN bFirstThread;
467
468 Process = Thread->ThreadsProcess;
469
470 pTeb = NtCurrentTeb();
471 ASSERT(pTeb);
472
473 ProcessParams = pTeb->ProcessEnvironmentBlock->ProcessParameters;
474
475 /* Allocate a new Win32 thread info */
476 Status = AllocW32Thread(Thread, &ptiCurrent);
477 if (!NT_SUCCESS(Status))
478 {
479 ERR_CH(UserThread, "Failed to allocate pti for TID:0x%lx\n",
481 return Status;
482 }
483
484 /* Initialize the THREADINFO */
485 ptiCurrent->pEThread = Thread;
486 ptiCurrent->ppi = PsGetProcessWin32Process(Process);
487 IntReferenceProcessInfo(ptiCurrent->ppi);
488 pTeb->Win32ThreadInfo = ptiCurrent;
489 ptiCurrent->pClientInfo = (PCLIENTINFO)pTeb->Win32ClientInfo;
490 ptiCurrent->pcti = &ptiCurrent->cti;
491 bFirstThread = !(ptiCurrent->ppi->W32PF_flags & W32PF_THREADCONNECTED);
492
493 /* Mark the process as having threads */
494 ptiCurrent->ppi->W32PF_flags |= W32PF_THREADCONNECTED;
495
500 InitializeListHead(&ptiCurrent->PtiLink);
501 for (i = 0; i < NB_HOOKS; i++)
502 {
503 InitializeListHead(&ptiCurrent->aphkStart[i]);
504 }
505 ptiCurrent->ptiSibling = ptiCurrent->ppi->ptiList;
506 ptiCurrent->ppi->ptiList = ptiCurrent;
507 ptiCurrent->ppi->cThreads++;
508
509 ptiCurrent->hEventQueueClient = NULL;
510 Status = ZwCreateEvent(&ptiCurrent->hEventQueueClient, EVENT_ALL_ACCESS,
512 if (!NT_SUCCESS(Status))
513 {
514 ERR_CH(UserThread, "Event creation failed, Status 0x%08x.\n", Status);
515 goto error;
516 }
519 (PVOID*)&ptiCurrent->pEventQueueServer, NULL);
520 if (!NT_SUCCESS(Status))
521 {
522 ERR_CH(UserThread, "Failed referencing the event object, Status 0x%08x.\n", Status);
524 ptiCurrent->hEventQueueClient = NULL;
525 goto error;
526 }
527
528 ptiCurrent->pcti->timeLastRead = EngGetTickCount32();
529
530 ptiCurrent->MessageQueue = MsqCreateMessageQueue(ptiCurrent);
531 if (ptiCurrent->MessageQueue == NULL)
532 {
533 ERR_CH(UserThread, "Failed to allocate message loop\n");
535 goto error;
536 }
537
538 pDefKL = W32kGetDefaultKeyLayout();
539 UserAssignmentLock((PVOID*)&(ptiCurrent->KeyboardLayout), pDefKL);
540
541 ptiCurrent->TIF_flags &= ~TIF_INCLEANUP;
542
543 // FIXME: Flag SYSTEM threads with... TIF_SYSTEMTHREAD !!
544
545 /* CSRSS threads have some special features */
546 if (Process == gpepCSRSS || !gpepCSRSS)
548
549 /* Initialize the CLIENTINFO */
550 pci = (PCLIENTINFO)pTeb->Win32ClientInfo;
551 RtlZeroMemory(pci, sizeof(*pci));
552 pci->ppi = ptiCurrent->ppi;
553 pci->fsHooks = ptiCurrent->fsHooks;
554 pci->dwTIFlags = ptiCurrent->TIF_flags;
555 if (pDefKL)
556 {
557 pci->hKL = pDefKL->hkl;
558 pci->CodePage = pDefKL->CodePage;
559 }
560
561 /* Populate dwExpWinVer */
562 if (Process->Peb)
563 ptiCurrent->dwExpWinVer = RtlGetExpWinVer(Process->SectionBaseAddress);
564 else
565 ptiCurrent->dwExpWinVer = WINVER_WINNT4;
566 pci->dwExpWinVer = ptiCurrent->dwExpWinVer;
567
568 /* Need to pass the user Startup Information to the current process. */
569 if ( ProcessParams )
570 {
571 if ( ptiCurrent->ppi->usi.cb == 0 ) // Not initialized yet.
572 {
573 if ( ProcessParams->WindowFlags != 0 ) // Need window flags set.
574 {
575 ptiCurrent->ppi->usi.cb = sizeof(USERSTARTUPINFO);
576 ptiCurrent->ppi->usi.dwX = ProcessParams->StartingX;
577 ptiCurrent->ppi->usi.dwY = ProcessParams->StartingY;
578 ptiCurrent->ppi->usi.dwXSize = ProcessParams->CountX;
579 ptiCurrent->ppi->usi.dwYSize = ProcessParams->CountY;
580 ptiCurrent->ppi->usi.dwFlags = ProcessParams->WindowFlags;
581 ptiCurrent->ppi->usi.wShowWindow = (WORD)ProcessParams->ShowWindowFlags;
582 }
583 }
584
585 if (bFirstThread)
586 {
587 /* Note: Only initialize once so it can be set back to 0 after being used */
588 if (ProcessParams->WindowFlags & STARTF_USEHOTKEY)
589 ptiCurrent->ppi->dwHotkey = HandleToUlong(ProcessParams->StandardInput);
590 /* TODO:
591 else if (ProcessParams->ShellInfo.Buffer)
592 ..->dwHotkey = ParseShellInfo(ProcessParams->ShellInfo.Buffer, L"hotkey.");
593 */
594
595 if (ProcessParams->WindowFlags & STARTF_SHELLPRIVATE)
596 {
597 /* We need to validate this handle because it can also be a HICON */
598 HMONITOR hMonitor = (HMONITOR)ProcessParams->StandardOutput;
599 if (hMonitor && UserGetMonitorObject(hMonitor))
600 ptiCurrent->ppi->hMonitor = hMonitor;
601 }
602 }
603 }
604
605 /*
606 * Assign a default window station and desktop to the process.
607 * Do not try to open a desktop or window station before the very first
608 * (interactive) window station has been created by Winlogon.
609 */
610 if (!(ptiCurrent->TIF_flags & (TIF_SYSTEMTHREAD | TIF_CSRSSTHREAD)) &&
611 ptiCurrent->ppi->hdeskStartup == NULL &&
613 {
614 HWINSTA hWinSta = NULL;
615 HDESK hDesk = NULL;
616 UNICODE_STRING DesktopPath;
617 PDESKTOP pdesk;
618
619 /*
620 * Inherit the thread desktop and process window station (if not yet inherited)
621 * from the process startup info structure. See documentation of CreateProcess().
622 */
624 if (ProcessParams && ProcessParams->DesktopInfo.Length > 0)
625 {
626 Status = IntSafeCopyUnicodeStringTerminateNULL(&DesktopPath, &ProcessParams->DesktopInfo);
627 }
628 if (!NT_SUCCESS(Status))
629 {
630 RtlInitUnicodeString(&DesktopPath, NULL);
631 }
632
634 &DesktopPath,
635 !!(ProcessParams->WindowFlags & STARTF_INHERITDESKTOP),
636 &hWinSta,
637 &hDesk);
638
639 if (DesktopPath.Buffer)
640 ExFreePoolWithTag(DesktopPath.Buffer, TAG_STRING);
641
642 if (!NT_SUCCESS(Status))
643 {
644 ERR_CH(UserThread, "Failed to assign default desktop and winsta to process\n");
645 goto error;
646 }
647
648 if (!UserSetProcessWindowStation(hWinSta))
649 {
651 ERR_CH(UserThread, "Failed to set initial process winsta\n");
652 goto error;
653 }
654
655 /* Validate the new desktop */
656 Status = IntValidateDesktopHandle(hDesk, UserMode, 0, &pdesk);
657 if (!NT_SUCCESS(Status))
658 {
659 ERR_CH(UserThread, "Failed to validate initial desktop handle\n");
660 goto error;
661 }
662
663 /* Store the parsed desktop as the initial desktop */
664 ASSERT(ptiCurrent->ppi->hdeskStartup == NULL);
665 ASSERT(Process->UniqueProcessId != gpidLogon);
666 ptiCurrent->ppi->hdeskStartup = hDesk;
667 ptiCurrent->ppi->rpdeskStartup = pdesk;
668 }
669
670 if (ptiCurrent->ppi->hdeskStartup != NULL)
671 {
672 if (!IntSetThreadDesktop(ptiCurrent->ppi->hdeskStartup, FALSE))
673 {
674 ERR_CH(UserThread, "Failed to set thread desktop\n");
676 goto error;
677 }
678 }
679
680 /* Mark the thread as fully initialized */
681 ptiCurrent->TIF_flags |= TIF_GUITHREADINITIALIZED;
682
683 if (!(ptiCurrent->ppi->W32PF_flags & (W32PF_ALLOWFOREGROUNDACTIVATE | W32PF_APPSTARTING)) &&
684 (gptiForeground && gptiForeground->ppi == ptiCurrent->ppi ))
685 {
687 }
688 ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
689
690 /* Create the default input context */
691 if (IS_IMM_MODE())
692 {
694 }
695
696 /* Last things to do only if we are not a SYSTEM or CSRSS thread */
697 if (!(ptiCurrent->TIF_flags & (TIF_SYSTEMTHREAD | TIF_CSRSSTHREAD)))
698 {
699 /* Callback to User32 Client Thread Setup */
700 TRACE_CH(UserThread, "Call co_IntClientThreadSetup...\n");
702 if (!NT_SUCCESS(Status))
703 {
704 ERR_CH(UserThread, "ClientThreadSetup failed with Status 0x%08lx\n", Status);
705 goto error;
706 }
707 TRACE_CH(UserThread, "co_IntClientThreadSetup succeeded!\n");
708 }
709 else
710 {
711 TRACE_CH(UserThread, "co_IntClientThreadSetup cannot be called...\n");
712 }
713
714 TRACE_CH(UserThread, "UserCreateW32Thread pti 0x%p\n", ptiCurrent);
715 return STATUS_SUCCESS;
716
717error:
718 ERR_CH(UserThread, "InitThreadCallback failed! Freeing pti 0x%p for TID:0x%lx\n",
719 ptiCurrent, HandleToUlong(Thread->Cid.UniqueThread));
721 return Status;
722}
723
724VOID
726
727// Win: xxxDestroyThreadInfo
729NTAPI
731{
732 PTHREADINFO *ppti;
734 PPROCESSINFO ppiCurrent;
736 PTHREADINFO ptiCurrent;
737 PWINDOWLIST pwl, pwlNext;
738
739 Process = Thread->ThreadsProcess;
740
741 /* Get the Win32 Thread */
742 ptiCurrent = PsGetThreadWin32Thread(Thread);
743 ASSERT(ptiCurrent);
744
745 TRACE_CH(UserThread, "Destroying pti 0x%p eThread 0x%p\n", ptiCurrent, Thread);
746
747 ptiCurrent->TIF_flags |= TIF_INCLEANUP;
748 ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
749
750 ppiCurrent = ptiCurrent->ppi;
751 ASSERT(ppiCurrent);
752
753 IsRemoveAttachThread(ptiCurrent);
754
755 if (gpwlList)
756 {
757 for (pwl = gpwlList; pwl; pwl = pwlNext)
758 {
759 pwlNext = pwl->pNextList;
760 if (pwl->pti == ptiCurrent)
761 IntFreeHwndList(pwl);
762 }
763 }
764
765 ptiCurrent->TIF_flags |= TIF_DONTATTACHQUEUE;
766 ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
767
769
770 /* Decrement thread count and check if its 0 */
771 ppiCurrent->cThreads--;
772
773 if (ptiCurrent->TIF_flags & TIF_GUITHREADINITIALIZED)
774 {
775 /* Do now some process cleanup that requires a valid win32 thread */
776 if (ptiCurrent->ppi->cThreads == 0)
777 {
778 /* Check if we have registered the user api hook */
779 if (ptiCurrent->ppi == ppiUahServer)
780 {
781 /* Unregister the api hook */
783 }
784
785 /* Notify logon application to restart shell if needed */
786 if (ptiCurrent->pDeskInfo)
787 {
788 if (ptiCurrent->pDeskInfo->ppiShellProcess == ppiCurrent)
789 {
791
792 TRACE_CH(UserProcess, "Shell process is exiting (%lu)\n", ExitCode);
793
797 ExitCode);
798
799 ptiCurrent->pDeskInfo->ppiShellProcess = NULL;
800 }
801 }
802 }
803
804 DceFreeThreadDCE(ptiCurrent);
805 DestroyTimersForThread(ptiCurrent);
807 UnregisterThreadHotKeys(ptiCurrent);
808
810 {
811 DPRINT1("Failed to delete objects belonging to thread %p. This is VERY BAD!.\n", ptiCurrent);
812 ASSERT(FALSE);
813 return STATUS_UNSUCCESSFUL;
814 }
816
817 if (ppiCurrent && ppiCurrent->ptiList == ptiCurrent && !ptiCurrent->ptiSibling &&
818 ppiCurrent->W32PF_flags & W32PF_CLASSESREGISTERED)
819 {
820 TRACE_CH(UserThread, "DestroyProcessClasses\n");
821 /* no process windows should exist at this point, or the function will assert! */
822 DestroyProcessClasses(ppiCurrent);
823 ppiCurrent->W32PF_flags &= ~W32PF_CLASSESREGISTERED;
824 }
825
826 IntBlockInput(ptiCurrent, FALSE);
827 IntCleanupThreadCallbacks(ptiCurrent);
828
829 /* cleanup user object references stack */
830 psle = PopEntryList(&ptiCurrent->ReferencesList);
831 while (psle)
832 {
834 TRACE_CH(UserThread, "thread clean: remove reference obj 0x%p\n",ref->obj);
836
837 psle = PopEntryList(&ptiCurrent->ReferencesList);
838#if DBG
839 ptiCurrent->cRefObjectCo--;
840#endif
841 }
842 }
843
844 if (ptiCurrent->cEnterCount)
845 {
847 ptiCurrent->cEnterCount = 0;
848 }
849
850 /* Find the THREADINFO in the PROCESSINFO's list */
851 ppti = &ppiCurrent->ptiList;
852 while (*ppti != NULL && *ppti != ptiCurrent)
853 {
854 ppti = &((*ppti)->ptiSibling);
855 }
856
857 /* we must have found it */
858 ASSERT(*ppti == ptiCurrent);
859
860 /* Remove it from the list */
861 *ppti = ptiCurrent->ptiSibling;
862
863 if (!UserAssignmentUnlock((PVOID*)&(ptiCurrent->KeyboardLayout)))
864 ptiCurrent->pClientInfo->hKL = NULL;
865
866 if (gptiForeground == ptiCurrent)
867 {
868// IntNotifyWinEvent(EVENT_OBJECT_FOCUS, NULL, OBJID_CLIENT, CHILDID_SELF, 0);
869// IntNotifyWinEvent(EVENT_SYSTEM_FOREGROUND, NULL, OBJID_WINDOW, CHILDID_SELF, 0);
870
872 }
873
874 /* Restore display mode when we are the last thread, and we changed the display mode */
875 if (ppiCurrent->cThreads == 0)
876 UserDisplayNotifyShutdown(ppiCurrent);
877
878
879 // Fixes CORE-6384 & CORE-7030.
880/* if (ptiLastInput == ptiCurrent)
881 {
882 if (!ppiCurrent->ptiList)
883 ptiLastInput = gptiForeground;
884 else
885 ptiLastInput = ppiCurrent->ptiList;
886 ERR_CH(UserThread, "DTI: ptiLastInput is Cleared!!\n");
887 }
888*/
889 TRACE_CH(UserThread, "Freeing pti 0x%p\n", ptiCurrent);
890
892
893 if (ptiCurrent->hEventQueueClient != NULL)
894 {
897 }
898 ptiCurrent->hEventQueueClient = NULL;
899
900 ASSERT(ptiCurrent->cRefObjectCo == 0);
901
902 /* The thread is dying */
903 PsSetThreadWin32Thread(Thread /*ptiCurrent->pEThread*/, NULL, ptiCurrent);
904
905 /* Dereference the THREADINFO */
906 IntDereferenceThreadInfo(ptiCurrent);
907
908 return STATUS_SUCCESS;
909}
910
915{
917
919
921
923 {
926 }
927 else // if (Type == PsW32ThreadCalloutExit)
928 {
931 }
932
933 UserLeave();
934
935 return Status;
936}
937
938_Function_class_(DRIVER_UNLOAD)
941{
942 // TODO: Do more cleanup!
943
948}
949
950// Return on failure
951#define NT_ROF(x) \
952{ \
953 Status = (x); \
954 if (!NT_SUCCESS(Status)) \
955 { \
956 DPRINT1("Failed '%s' (0x%lx)\n", #x, Status); \
957 return Status; \
958 } \
959}
960
961// Lock & return on failure
962#define USERLOCK_AND_ROF(x) \
963{ \
964 UserEnterExclusive(); \
965 Status = (x); \
966 UserLeave(); \
967 if (!NT_SUCCESS(Status)) \
968 { \
969 DPRINT1("Failed '%s' (0x%lx)\n", #x, Status); \
970 return Status; \
971 } \
972}
973
974
975
976/*
977 * This definition doesn't work
978 */
979CODE_SEG("INIT")
985{
988 WIN32_CALLOUTS_FPNS CalloutData = {0};
989 PVOID GlobalUserHeapBase = NULL;
990
991 /*
992 * Register user mode call interface
993 * (system service table index = 1)
994 */
996 NULL,
999 1);
1000 if (Result == FALSE)
1001 {
1002 DPRINT1("Adding system services failed!\n");
1003 return STATUS_UNSUCCESSFUL;
1004 }
1005
1007 DPRINT("Win32k hInstance 0x%p!\n", hModuleWin);
1008
1009 DriverObject->DriverUnload = DriverUnload;
1010
1011 /* Register Object Manager Callbacks */
1013 CalloutData.ThreadCallout = Win32kThreadCallback;
1014 // CalloutData.GlobalAtomTableCallout = NULL;
1017 // CalloutData.JobCallout = NULL;
1024 // CalloutData.WindowStationCloseProcedure = NULL;
1027 // CalloutData.WindowStationOpenProcedure = NULL;
1028
1029 /* Register our per-process and per-thread structures. */
1030 PsEstablishWin32Callouts(&CalloutData);
1031
1032 /* Register service hook callbacks */
1033#if DBG && defined(KDBG)
1034 KdSystemDebugControl('CsoR', DbgPreServiceHook, ID_Win32PreServiceHook, 0, 0, 0, 0);
1035 KdSystemDebugControl('CsoR', DbgPostServiceHook, ID_Win32PostServiceHook, 0, 0, 0, 0);
1036#endif
1037
1038 /* Create the global USER heap */
1040 &GlobalUserHeapBase,
1041 1 * 1024 * 1024); /* FIXME: 1 MB for now... */
1042 if (GlobalUserHeap == NULL)
1043 {
1044 DPRINT1("Failed to initialize the global heap!\n");
1045 return STATUS_UNSUCCESSFUL;
1046 }
1047
1048 /* Init the global user lock */
1050
1051 /* Lock while we use the heap (UserHeapAlloc asserts on this) */
1053
1054 /* Allocate global server info structure */
1055 gpsi = UserHeapAlloc(sizeof(*gpsi));
1056 UserLeave();
1057 if (!gpsi)
1058 {
1059 DPRINT1("Failed allocate server info structure!\n");
1060 return STATUS_UNSUCCESSFUL;
1061 }
1062
1063 RtlZeroMemory(gpsi, sizeof(*gpsi));
1064 DPRINT("Global Server Data -> %p\n", gpsi);
1065
1068
1069 /* Create stock objects, ie. precreated objects commonly
1070 used by win32 applications */
1073
1078 NT_ROF(InitDcImpl());
1087
1088 return STATUS_SUCCESS;
1089}
1090
1091/* EOF */
#define CODE_SEG(...)
unsigned char BOOLEAN
Type
Definition: Type.h:7
#define VOID
Definition: acefi.h:82
#define msg(x)
Definition: auth_time.c:54
HANDLE HMONITOR
Definition: axextend.idl:431
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
#define HandleToUlong(h)
Definition: basetsd.h:79
#define ERR_CH(ch, fmt,...)
Definition: debug.h:108
#define TRACE_CH(ch, fmt,...)
Definition: debug.h:111
DECLSPEC_NORETURN VOID NTAPI KeBugCheck(ULONG BugCheckCode)
Definition: bug.c:1434
VOID ResetCsrProcess(VOID)
Definition: csr.c:29
PEPROCESS gpepCSRSS
Definition: csr.c:15
VOID ResetCsrApiPort(VOID)
Definition: csr.c:58
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
void FASTCALL DceFreeThreadDCE(PTHREADINFO)
Definition: windc.c:780
NTSTATUS NTAPI InitDcImpl(VOID)
Definition: dclife.c:53
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define APIENTRY
Definition: api.h:79
DRIVER_INITIALIZE DriverEntry
Definition: main.c:9
#define __drv_freesMem(kind)
Definition: driverspecs.h:272
#define EngGetTickCount32()
Definition: eng.h:43
NTSTATUS NTAPI InitBrushImpl(VOID)
Definition: engbrush.c:31
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
NTSTATUS ExInitializeResourceLite(PULONG res)
Definition: env_spec_w32.h:641
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
#define NonPagedPool
Definition: env_spec_w32.h:307
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
VOID FASTCALL FreeFontSupport(VOID)
Definition: freetype.c:1063
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:223
NTSTATUS APIENTRY NtGdiFlushUserBatch(VOID)
Definition: gdibatch.c:487
BOOLEAN NTAPI DbgGdiKdbgCliCallback(IN PCHAR pszCommand, IN ULONG argc, IN PCH argv[])
Definition: gdikdbgext.c:324
Status
Definition: gdiplustypes.h:25
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
BOOL FASTCALL co_IntGraphicsCheck(BOOL Create)
Definition: guicheck.c:52
enum _PSW32THREADCALLOUTTYPE PSW32THREADCALLOUTTYPE
@ PsW32ThreadCalloutInitialize
Definition: pstypes.h:500
#define TIF_CSRSSTHREAD
Definition: ntuser.h:266
#define TIF_INCLEANUP
Definition: ntuser.h:263
#define TIF_DONTATTACHQUEUE
Definition: ntuser.h:269
#define TIF_GUITHREADINITIALIZED
Definition: ntuser.h:287
ULONG RtlGetExpWinVer(_In_ PVOID BaseAddress)
Definition: image.c:20
#define IS_IMM_MODE()
Definition: ntuser.h:1212
#define TIF_SYSTEMTHREAD
Definition: ntuser.h:265
struct _CLIENTINFO * PCLIENTINFO
#define NB_HOOKS
Definition: ntuser.h:127
#define TIF_ALLOWFOREGROUNDACTIVATE
Definition: ntuser.h:268
VOID FASTCALL CreateStockObjects(VOID)
Definition: stockobj.c:247
VOID FASTCALL CreateSysColorObjects(VOID)
Definition: stockobj.c:329
#define NtCurrentTeb
#define EVENT_ALL_ACCESS
Definition: isotest.c:82
static DRIVER_UNLOAD DriverUnload
Definition: kbdclass.c:17
NTSTATUS NTAPI KdSystemDebugControl(_In_ SYSDBG_COMMAND Command, _In_reads_bytes_(InputBufferLength) PVOID InputBuffer, _In_ ULONG InputBufferLength, _Out_writes_bytes_(OutputBufferLength) PVOID OutputBuffer, _In_ ULONG OutputBufferLength, _Out_opt_ PULONG ReturnLength, _In_ KPROCESSOR_MODE PreviousMode)
Perform various queries to the kernel debugger.
Definition: kdapi.c:2217
NTSTATUS NTAPI InitLDEVImpl(VOID)
Definition: ldevobj.c:30
if(dx< 0)
Definition: linetemp.h:194
#define error(str)
Definition: mkdosfs.c:1605
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
VOID FASTCALL co_MsqInsertMouseMessage(MSG *Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: msgqueue.c:580
VOID FASTCALL MsqDestroyMessageQueue(_In_ PTHREADINFO pti)
Definition: msgqueue.c:2423
VOID FASTCALL MsqCleanupThreadMsgs(PTHREADINFO pti)
Definition: msgqueue.c:2221
NTSTATUS NTAPI MsqInitializeImpl(VOID)
Definition: msgqueue.c:30
PUSER_MESSAGE_QUEUE FASTCALL MsqCreateMessageQueue(PTHREADINFO pti)
Definition: msgqueue.c:2396
#define UserMode
Definition: asm.h:39
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define _Pre_notnull_
Definition: no_sal2.h:516
#define _Function_class_(n)
Definition: no_sal2.h:398
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
@ NotificationEvent
@ SynchronizationEvent
POBJECT_TYPE ExEventObjectType
Definition: event.c:18
PVOID NTAPI PsGetProcessWin32Process(PEPROCESS Process)
Definition: process.c:1193
NTSTATUS NTAPI PsSetProcessWin32Process(_Inout_ PEPROCESS Process, _In_opt_ PVOID Win32Process, _In_opt_ PVOID OldWin32Process)
Definition: process.c:1257
NTSTATUS NTAPI PsGetProcessExitStatus(PEPROCESS Process)
Definition: process.c:1053
HANDLE NTAPI PsGetProcessId(PEPROCESS Process)
Definition: process.c:1063
PVOID NTAPI PsSetThreadWin32Thread(_Inout_ PETHREAD Thread, _In_ PVOID Win32Thread, _In_ PVOID OldWin32Thread)
Definition: thread.c:909
PVOID NTAPI PsGetThreadWin32Thread(IN PETHREAD Thread)
Definition: thread.c:795
VOID NTAPI PsEstablishWin32Callouts(IN PWIN32_CALLOUTS_FPNS CalloutData)
Definition: win32.c:112
#define STATUS_ALREADY_WIN32
Definition: ntstatus.h:141
BOOL FASTCALL UserUnregisterUserApiHook(VOID)
Definition: hook.c:206
PPROCESSINFO ppiUahServer
Definition: hook.c:24
VOID FASTCALL IntFreeImeHotKeys(VOID)
Definition: ime.c:326
PIMC FASTCALL UserCreateInputContext(ULONG_PTR dwClientImcData)
Definition: ime.c:1558
NTSTATUS NTAPI IntWinStaObjectDelete(_In_ PVOID Parameters)
Definition: winsta.c:106
PWINSTATION_OBJECT InputWindowStation
Definition: winsta.c:21
NTSTATUS NTAPI IntWinStaOkToClose(_In_ PVOID Parameters)
Definition: winsta.c:203
NTSTATUS NTAPI InitWindowStationImpl(VOID)
Definition: winsta.c:34
HWND hwndSAS
Definition: winsta.c:24
NTSTATUS NTAPI IntWinStaObjectParse(_In_ PVOID Parameters)
Definition: winsta.c:138
BOOL FASTCALL UserSetProcessWindowStation(HWINSTA hWindowStation)
Definition: winsta.c:1393
PPROCESSINFO gppiInputProvider
Definition: ntuser.c:16
NTSTATUS NTAPI InitUserImpl(VOID)
Definition: ntuser.c:79
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:258
ERESOURCE UserLock
Definition: ntuser.c:18
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:249
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: obhandle.c:3379
void DbgUserDumpHandleTable()
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
#define TAG_STRING
Definition: oslist.h:22
#define STARTF_USEHOTKEY
Definition: pch.h:41
NTSTATUS NTAPI InitPDEVImpl(VOID)
Definition: pdevobj.c:31
BOOLEAN NTAPI KeAddSystemServiceTable(IN PULONG_PTR Base, IN PULONG Count OPTIONAL, IN ULONG Limit, IN PUCHAR Number, IN ULONG Index)
Definition: procobj.c:908
static GENERIC_MAPPING UserMapping
Definition: samrpc.c:48
#define STATUS_SUCCESS
Definition: shellext.h:65
HANDLE gpidLogon
Definition: simplecall.c:15
#define DPRINT
Definition: sndvol32.h:73
base of all file and directory entries
Definition: entries.h:83
USHORT CodePage
Definition: ntuser.h:340
HKL hKL
Definition: ntuser.h:339
ULONG fsHooks
Definition: ntuser.h:328
DWORD dwTIFlags
Definition: ntuser.h:324
DWORD dwExpWinVer
Definition: ntuser.h:321
struct _PROCESSINFO * ppi
Definition: ntuser.h:346
HANDLE UniqueThread
Definition: compat.h:826
CLIENT_ID Cid
Definition: pstypes.h:1129
PRTL_USER_PROCESS_PARAMETERS ProcessParameters
Definition: btrfs_drv.h:1913
INT cThreads
Definition: win32.h:263
PPROCESSINFO ppiNext
Definition: win32.h:262
USERSTARTUPINFO usi
Definition: win32.h:279
HDESK hdeskStartup
Definition: win32.h:264
HMONITOR hMonitor
Definition: win32.h:271
LIST_ENTRY DriverObjListHead
Definition: win32.h:290
PTHREADINFO ptiList
Definition: win32.h:257
struct _DESKTOP * rpdeskStartup
Definition: win32.h:259
FAST_MUTEX DriverObjListLock
Definition: win32.h:289
DWORD dwHotkey
Definition: win32.h:270
UNICODE_STRING DesktopInfo
Definition: rtltypes.h:1574
Definition: ntbasedef.h:640
Definition: compat.h:836
ULONG Win32ClientInfo[31]
Definition: compat.h:847
PVOID Win32ThreadInfo
Definition: compat.h:846
PPEB ProcessEnvironmentBlock
Definition: ntddk_ex.h:337
PPROCESSINFO ppi
Definition: win32.h:88
struct _DESKTOPINFO * pDeskInfo
Definition: win32.h:93
DWORD dwExpWinVer
Definition: win32.h:112
INT cEnterCount
Definition: win32.h:135
PTHREADINFO ptiSibling
Definition: win32.h:116
ULONG fsHooks
Definition: win32.h:117
LIST_ENTRY PostedMessagesListHead
Definition: win32.h:137
CLIENTTHREADINFO cti
Definition: win32.h:144
struct _CLIENTINFO * pClientInfo
Definition: win32.h:94
PKEVENT pEventQueueServer
Definition: win32.h:125
LIST_ENTRY W32CallbackListHead
Definition: win32.h:156
struct tagIMC * spDefaultImc
Definition: win32.h:132
struct tagKL * KeyboardLayout
Definition: win32.h:90
LIST_ENTRY aphkStart[NB_HOOKS]
FIXME!
Definition: win32.h:143
struct _CLIENTTHREADINFO * pcti
Definition: win32.h:91
HANDLE hEventQueueClient
Definition: win32.h:123
FLONG TIF_flags
Definition: win32.h:95
SINGLE_LIST_ENTRY ReferencesList
Definition: win32.h:157
LIST_ENTRY SentMessagesListHead
Definition: win32.h:100
LIST_ENTRY WindowListHead
Definition: win32.h:155
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:89
LIST_ENTRY PtiLink
Definition: win32.h:126
Definition: object.h:4
PKWIN32_POWEREVENT_CALLOUT PowerEventCallout
Definition: pstypes.h:1687
PKWIN32_SESSION_CALLOUT WindowStationOkToCloseProcedure
Definition: pstypes.h:1695
PKWIN32_PROCESS_CALLOUT ProcessCallout
Definition: pstypes.h:1684
PKWIN32_SESSION_CALLOUT WindowStationDeleteProcedure
Definition: pstypes.h:1697
PKWIN32_SESSION_CALLOUT WindowStationParseProcedure
Definition: pstypes.h:1698
PKWIN32_SESSION_CALLOUT DesktopOkToCloseProcedure
Definition: pstypes.h:1692
PKWIN32_POWERSTATE_CALLOUT PowerStateCallout
Definition: pstypes.h:1688
PKWIN32_SESSION_CALLOUT DesktopOpenProcedure
Definition: pstypes.h:1691
PKWIN32_SESSION_CALLOUT DesktopDeleteProcedure
Definition: pstypes.h:1694
PKWIN32_SESSION_CALLOUT DesktopCloseProcedure
Definition: pstypes.h:1693
PKWIN32_THREAD_CALLOUT ThreadCallout
Definition: pstypes.h:1685
PGDI_BATCHFLUSH_ROUTINE BatchFlushRoutine
Definition: pstypes.h:1690
Definition: send.c:48
Definition: input.h:27
USHORT CodePage
Definition: input.h:36
HKL hkl
Definition: input.h:32
WORD wShowWindow
Definition: win32.h:220
struct tagWINDOWLIST * pNextList
Definition: window.h:87
PTHREADINFO pti
Definition: window.h:90
PVOID NTAPI MmPageEntireDriver(IN PVOID AddressWithinSection)
Definition: sysldr.c:3568
BOOLEAN NTAPI KeSetKernelStackSwapEnable(IN BOOLEAN Enable)
Definition: thrdobj.c:988
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
uint32_t * PULONG_PTR
Definition: typedefs.h:65
#define NTAPI
Definition: typedefs.h:36
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define LN_SHELL_EXITED
Definition: undocuser.h:118
#define STARTF_SCREENSAVER
Definition: undocuser.h:168
#define WM_LOGONNOTIFY
Definition: undocuser.h:39
#define STARTF_INHERITDESKTOP
Definition: undocuser.h:167
PWIN32HEAP UserCreateHeap(OUT PVOID *SectionObject, IN OUT PVOID *SystemBase, IN SIZE_T HeapSize)
Definition: usrheap.c:181
NTSTATUS MapGlobalUserHeap(IN PEPROCESS Process, OUT PVOID *KernelMapping, OUT PVOID *UserMapping)
Definition: usrheap.c:266
HANDLE GlobalUserHeap
Definition: usrheap.c:25
PVOID GlobalUserHeapSection
Definition: usrheap.c:26
static __inline PVOID UserHeapAlloc(SIZE_T Bytes)
Definition: usrheap.h:34
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:215
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
#define IntDereferenceThreadInfo(pti)
Definition: win32.h:172
#define W32PF_APPSTARTING
Definition: win32.h:10
#define W32PF_TERMINATED
Definition: win32.h:16
#define IntReferenceProcessInfo(ppi)
Definition: win32.h:182
#define W32PF_ALLOWFOREGROUNDACTIVATE
Definition: win32.h:12
#define IntReferenceThreadInfo(pti)
Definition: win32.h:167
#define IntDereferenceProcessInfo(ppi)
Definition: win32.h:187
struct tagUSERSTARTUPINFO USERSTARTUPINFO
#define W32PF_CLASSESREGISTERED
Definition: win32.h:17
#define W32PF_SCREENSAVER
Definition: win32.h:26
#define W32PF_PROCESSCONNECTED
Definition: win32.h:19
#define W32PF_THREADCONNECTED
Definition: win32.h:18
#define DBG_IS_CHANNEL_ENABLED(ppi, ch, level)
Definition: win32kdebug.h:167
BOOL DbgInitDebugChannels()
#define TRACE_PPI(ppi, ch, fmt,...)
Definition: win32kdebug.h:184
NTSTATUS NTAPI InitDeviceImpl(VOID)
Definition: device.c:26
NTSTATUS NTAPI InitGdiHandleTable(void)
Definition: gdiobj.c:259
NTSTATUS FASTCALL IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest, PUNICODE_STRING Source)
Definition: misc.c:685
NTSTATUS NTAPI InitPaletteImpl(VOID)
Definition: palette.c:66
VOID FASTCALL IntCleanupThreadCallbacks(PTHREADINFO W32Thread)
Definition: callback.c:76
NTSTATUS APIENTRY co_IntClientThreadSetup(VOID)
Definition: callback.c:959
void FASTCALL DestroyProcessClasses(PPROCESSINFO Process)
Definition: class.c:305
BOOL NTAPI UserCloseClipboard(VOID)
Definition: clipboard.c:545
VOID FASTCALL IntCleanupCurIconCache(PPROCESSINFO Win32Process)
Definition: cursoricon.c:395
NTSTATUS NTAPI IntDesktopOkToClose(_In_ PVOID Parameters)
Definition: desktop.c:203
NTSTATUS NTAPI InitDesktopImpl(VOID)
Definition: desktop.c:269
NTSTATUS NTAPI IntDesktopObjectClose(_In_ PVOID Parameters)
Definition: desktop.c:244
NTSTATUS FASTCALL IntValidateDesktopHandle(HDESK Desktop, KPROCESSOR_MODE AccessMode, ACCESS_MASK DesiredAccess, PDESKTOP *Object)
Definition: desktop.c:1254
NTSTATUS FASTCALL IntResolveDesktop(IN PEPROCESS Process, IN PUNICODE_STRING DesktopPath, IN BOOL bInherit, OUT HWINSTA *phWinSta, OUT HDESK *phDesktop)
Definition: desktop.c:568
NTSTATUS NTAPI IntDesktopObjectOpen(_In_ PVOID Parameters)
Definition: desktop.c:227
NTSTATUS NTAPI IntDesktopObjectDelete(_In_ PVOID Parameters)
Definition: desktop.c:172
BOOL IntSetThreadDesktop(IN HDESK hDesktop, IN BOOL FreeOnFailure)
Definition: desktop.c:3298
PTHREADINFO gptiForeground
Definition: focus.c:15
VOID FASTCALL UnregisterThreadHotKeys(PTHREADINFO pti)
Definition: hotkey.c:135
BOOL FASTCALL IsRemoveAttachThread(PTHREADINFO pti)
Definition: input.c:437
BOOL FASTCALL IntBlockInput(PTHREADINFO pti, BOOL BlockIt)
Definition: input.c:375
NTSTATUS NTAPI InitInputImpl(VOID)
Definition: input.c:360
WORD FASTCALL UserGetMouseButtonsState(VOID)
Definition: mouse.c:22
PKL W32kGetDefaultKeyLayout(VOID)
Definition: kbdlayout.c:512
NTSTATUS NTAPI InitKeyboardImpl(VOID)
Definition: keyboard.c:33
ULONG_PTR Win32kSSDT[]
Definition: napi.h:9
ULONG Win32kNumberOfSysCalls
Definition: napi.h:30
NTSTATUS ExitProcessCallback(PEPROCESS Process)
Definition: main.c:304
VOID UserDeleteW32Thread(PTHREADINFO pti)
Definition: main.c:412
VOID UserDisplayNotifyShutdown(PPROCESSINFO ppiCurrent)
Definition: display.c:940
PPROCESSINFO gppiList
Definition: main.c:31
#define USERLOCK_AND_ROF(x)
Definition: main.c:962
NTSTATUS UserThreadCreate(PETHREAD Thread)
Definition: main.c:444
NTSTATUS InitProcessCallback(PEPROCESS Process)
Definition: main.c:231
VOID UserDeleteW32Process(_Pre_notnull_ __drv_freesMem(Mem) PPROCESSINFO ppiCurrent)
Definition: main.c:96
NTSTATUS UserThreadDestroy(PETHREAD Thread)
Definition: main.c:450
HANDLE hModuleWin
Definition: main.c:17
NTSTATUS APIENTRY Win32kProcessCallback(PEPROCESS Process, BOOLEAN Initialize)
Definition: main.c:343
NTSTATUS GdiThreadDestroy(PETHREAD Thread)
Definition: init.c:73
PPROCESSINFO ppiScrnSaver
Definition: main.c:30
NTSTATUS APIENTRY Win32kThreadCallback(PETHREAD Thread, PSW32THREADCALLOUTTYPE Type)
Definition: main.c:913
UCHAR Win32kSSPT[]
Definition: napi.h:19
NTSTATUS GdiProcessCreate(PEPROCESS Process)
Definition: init.c:17
NTSTATUS GdiThreadCreate(PETHREAD Thread)
Definition: init.c:67
#define NT_ROF(x)
Definition: main.c:951
NTSTATUS NTAPI ExitThreadCallback(PETHREAD Thread)
Definition: main.c:730
NTSTATUS GdiProcessDestroy(PEPROCESS Process)
Definition: init.c:46
NTSTATUS NTAPI InitThreadCallback(PETHREAD Thread)
Definition: main.c:456
NTSTATUS AllocW32Thread(IN PETHREAD Thread, OUT PTHREADINFO *W32Thread)
Definition: main.c:373
PSERVERINFO gpsi
Definition: main.c:28
NTSTATUS UserProcessDestroy(PEPROCESS Process)
Definition: main.c:175
NTSTATUS AllocW32Process(IN PEPROCESS Process, OUT PPROCESSINFO *W32Process)
Definition: main.c:58
NTSTATUS UserProcessCreate(PEPROCESS Process)
Definition: main.c:122
BOOL FASTCALL UserPostMessage(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1395
void NTAPI UserDbgPreServiceHook(ULONG ulSyscallId, PULONG_PTR pulArguments)
Definition: misc.c:781
ULONG_PTR NTAPI UserDbgPostServiceHook(ULONG ulSyscallId, ULONG_PTR ulResult)
Definition: misc.c:788
PMONITOR NTAPI UserGetMonitorObject(IN HMONITOR hMonitor)
Definition: monitor.c:74
BOOLEAN UserDestroyObjectsForOwner(PUSER_HANDLE_TABLE Table, PVOID Owner)
Definition: object.c:754
PVOID FASTCALL UserAssignmentLock(PVOID *ppvObj, PVOID pvNew)
Definition: object.c:839
BOOL FASTCALL UserDereferenceObject(PVOID Object)
Definition: object.c:644
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
PVOID FASTCALL UserAssignmentUnlock(PVOID *ppvObj)
Definition: object.c:860
NTSTATUS NTAPI IntWin32PowerManagementCleanup(VOID)
Cleanup procedure that frees all the allocated resources by the power manager. It is triggered during...
Definition: power.c:315
NTSTATUS NTAPI IntHandlePowerState(_In_ PWIN32_POWERSTATE_PARAMETERS pWin32PwrStateParams)
Handles an incoming power state callout from the NT power manager.
Definition: power.c:419
NTSTATUS NTAPI IntHandlePowerEvent(_In_ PWIN32_POWEREVENT_PARAMETERS pWin32PwrEventParams)
Handles an incoming power event callout from the NT power manager.
Definition: power.c:362
#define USERTAG_PROCESSINFO
Definition: tags.h:260
#define USERTAG_THREADINFO
Definition: tags.h:284
#define USERTAG_EVENT
Definition: tags.h:230
#define USERTAG_WINDOWLIST
Definition: tags.h:298
NTSTATUS NTAPI InitTimerImpl(VOID)
Definition: timer.c:600
BOOL FASTCALL DestroyTimersForThread(PTHREADINFO pti)
Definition: timer.c:555
VOID FASTCALL IntFreeHwndList(PWINDOWLIST pwlTarget)
Definition: window.c:1473
PWINDOWLIST gpwlCache
Definition: window.c:19
PWINDOWLIST gpwlList
Definition: window.c:18
#define WINVER_WINNT4
Definition: window.h:57
NTSTATUS NTAPI InitDCEImpl(VOID)
Definition: windc.c:30
#define MAKELPARAM(l, h)
Definition: winuser.h:4084
#define WM_MOUSEMOVE
Definition: winuser.h:1794
_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:409
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
Definition: exfuncs.h:274
#define IO_NO_INCREMENT
Definition: iotypes.h:598
#define ObDereferenceObject
Definition: obfuncs.h:203
#define ObReferenceObject
Definition: obfuncs.h:204
#define NT_ASSERT
Definition: rtlfuncs.h:3327
FORCEINLINE PSINGLE_LIST_ENTRY PopEntryList(_Inout_ PSINGLE_LIST_ENTRY ListHead)
Definition: rtlfuncs.h:243
static void Initialize()
Definition: xlate.c:212
unsigned char UCHAR
Definition: xmlstorage.h:181