ReactOS 0.4.16-dev-456-ga97fcf1
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
27PSERVERINFO gpsi = NULL; // Global User Server Information.
28
31
32extern ULONG_PTR Win32kSSDT[];
33extern UCHAR Win32kSSPT[];
35
36#if DBG
37void
39DbgPreServiceHook(ULONG ulSyscallId, PULONG_PTR pulArguments)
40{
41 GdiDbgPreServiceHook(ulSyscallId, pulArguments);
42 UserDbgPreServiceHook(ulSyscallId, pulArguments);
43}
44
47DbgPostServiceHook(ULONG ulSyscallId, ULONG_PTR ulResult)
48{
49 ulResult = GdiDbgPostServiceHook(ulSyscallId, ulResult);
50 ulResult = UserDbgPostServiceHook(ulSyscallId, ulResult);
51 return ulResult;
52}
53#endif
54
55
58 OUT PPROCESSINFO* W32Process)
59{
60 PPROCESSINFO ppiCurrent;
61
62 TRACE_CH(UserProcess, "In AllocW32Process(0x%p)\n", Process);
63
64 /* Check that we were not called with an already existing Win32 process info */
66 if (ppiCurrent) return STATUS_SUCCESS;
67
68 /* Allocate a new Win32 process info */
70 sizeof(*ppiCurrent),
72 if (ppiCurrent == NULL)
73 {
74 ERR_CH(UserProcess, "Failed to allocate ppi for PID:0x%lx\n",
75 HandleToUlong(Process->UniqueProcessId));
76 return STATUS_NO_MEMORY;
77 }
78
79 TRACE_CH(UserProcess, "Allocated ppi 0x%p for PID:0x%lx\n",
80 ppiCurrent, HandleToUlong(Process->UniqueProcessId));
81
82 RtlZeroMemory(ppiCurrent, sizeof(*ppiCurrent));
83
85 IntReferenceProcessInfo(ppiCurrent);
86
87 *W32Process = ppiCurrent;
88 return STATUS_SUCCESS;
89}
90
91/*
92 * Called from IntDereferenceProcessInfo
93 */
94VOID
97{
98 if (ppiCurrent->InputIdleEvent)
99 {
100 /* Free the allocated memory */
101 ExFreePoolWithTag(ppiCurrent->InputIdleEvent, USERTAG_EVENT);
102 }
103
104 /* Close the startup desktop */
105 if (ppiCurrent->rpdeskStartup)
106 ObDereferenceObject(ppiCurrent->rpdeskStartup);
107
108#if DBG
109 if (DBG_IS_CHANNEL_ENABLED(ppiCurrent, DbgChUserObj, WARN_LEVEL))
110 {
111 TRACE_PPI(ppiCurrent, UserObj, "Dumping user handles now that process info %p is gets freed.\n", ppiCurrent);
113 }
114#endif
115
116 /* Free the PROCESSINFO */
118}
119
122{
124 ASSERT(ppiCurrent);
125
128
129 {
131
132 /* Allocate memory for the event structure */
134 sizeof(*Event),
136 if (Event)
137 {
138 /* Initialize the kernel event */
141 FALSE);
142 }
143 else
144 {
145 /* Out of memory */
146 DPRINT("CreateEvent() failed\n");
147 KeBugCheck(0);
148 }
149
150 /* Set the event */
151 ppiCurrent->InputIdleEvent = Event;
152 KeInitializeEvent(ppiCurrent->InputIdleEvent, NotificationEvent, FALSE);
153 }
154
155 ppiCurrent->peProcess = Process;
156 ppiCurrent->W32Pid = HandleToUlong(PsGetProcessId(Process));
157
158 /* Setup process flags */
159 ppiCurrent->W32PF_flags |= W32PF_PROCESSCONNECTED;
160 if (Process->Peb->ProcessParameters &&
161 (Process->Peb->ProcessParameters->WindowFlags & STARTF_SCREENSAVER))
162 {
163 ppiScrnSaver = ppiCurrent;
164 ppiCurrent->W32PF_flags |= W32PF_SCREENSAVER;
165 }
166
167 // FIXME: check if this process is allowed.
168 ppiCurrent->W32PF_flags |= W32PF_ALLOWFOREGROUNDACTIVATE; // Starting application will get it toggled off.
169
170 return STATUS_SUCCESS;
171}
172
175{
177 ASSERT(ppiCurrent);
178
179 if (ppiScrnSaver == ppiCurrent)
181
183
184 if (gpwlCache)
185 {
187 gpwlCache = NULL;
188 }
189
190 /* Destroy user objects */
192
193 TRACE_CH(UserProcess, "Freeing ppi 0x%p\n", ppiCurrent);
194#if DBG
195 if (DBG_IS_CHANNEL_ENABLED(ppiCurrent, DbgChUserObj, WARN_LEVEL))
196 {
197 TRACE_CH(UserObj, "Dumping user handles at the end of the process %s (Info %p).\n",
198 ppiCurrent->peProcess->ImageFileName, ppiCurrent);
200 }
201#endif
202
203 /* Remove it from the list of GUI apps */
205
206 /*
207 * Deregister logon application automatically
208 */
209 if (gpidLogon == ppiCurrent->peProcess->UniqueProcessId)
210 gpidLogon = 0;
211
212 /* Close the current window station */
214
215 if (gppiInputProvider == ppiCurrent) gppiInputProvider = NULL;
216
217 if (ppiCurrent->hdeskStartup)
218 {
219 ZwClose(ppiCurrent->hdeskStartup);
220 ppiCurrent->hdeskStartup = NULL;
221 }
222
223 /* Clean up the process icon cache */
224 IntCleanupCurIconCache(ppiCurrent);
225
226 return STATUS_SUCCESS;
227}
228
231{
233 PPROCESSINFO ppiCurrent;
234 PVOID KernelMapping = NULL, UserMapping = NULL;
235
236 /* We might be called with an already allocated win32 process */
237 ppiCurrent = PsGetProcessWin32Process(Process);
238 if (ppiCurrent != NULL)
239 {
240 /* There is no more to do for us (this is a success code!) */
242 }
243 // if (ppiCurrent->W32PF_flags & W32PF_PROCESSCONNECTED)
244 // return STATUS_ALREADY_WIN32;
245
246 /* Allocate a new Win32 process info */
247 Status = AllocW32Process(Process, &ppiCurrent);
248 if (!NT_SUCCESS(Status))
249 {
250 ERR_CH(UserProcess, "Failed to allocate ppi for PID:0x%lx\n",
251 HandleToUlong(Process->UniqueProcessId));
252 return Status;
253 }
254
255#if DBG
257#if defined(KDBG)
258 KdRosRegisterCliCallback(DbgGdiKdbgCliCallback);
259#endif
260#endif
261
262 /* Map the global user heap into the process */
263 Status = MapGlobalUserHeap(Process, &KernelMapping, &UserMapping);
264 if (!NT_SUCCESS(Status))
265 {
266 TRACE_CH(UserProcess, "Failed to map the global heap! 0x%x\n", Status);
267 goto error;
268 }
269
270 TRACE_CH(UserProcess, "InitProcessCallback -- We have KernelMapping 0x%p and UserMapping 0x%p with delta = 0x%x\n",
271 KernelMapping, UserMapping, (ULONG_PTR)KernelMapping - (ULONG_PTR)UserMapping);
272
273 /* Initialize USER process info */
275 if (!NT_SUCCESS(Status))
276 {
277 ERR_CH(UserProcess, "UserProcessCreate failed, Status 0x%08lx\n", Status);
278 goto error;
279 }
280
281 /* Initialize GDI process info */
283 if (!NT_SUCCESS(Status))
284 {
285 ERR_CH(UserProcess, "GdiProcessCreate failed, Status 0x%08lx\n", Status);
286 goto error;
287 }
288
289 /* Add the process to the global list */
290 ppiCurrent->ppiNext = gppiList;
291 gppiList = ppiCurrent;
292
293 return STATUS_SUCCESS;
294
295error:
296 ERR_CH(UserProcess, "InitProcessCallback failed! Freeing ppi 0x%p for PID:0x%lx\n",
297 ppiCurrent, HandleToUlong(Process->UniqueProcessId));
299 return Status;
300}
301
304{
305 PPROCESSINFO ppiCurrent, *pppi;
306
307 /* Get the Win32 Process */
308 ppiCurrent = PsGetProcessWin32Process(Process);
309 ASSERT(ppiCurrent);
310 ASSERT(ppiCurrent->peProcess == Process);
311
312 TRACE_CH(UserProcess, "Destroying ppi 0x%p\n", ppiCurrent);
313 ppiCurrent->W32PF_flags |= W32PF_TERMINATED;
314
315 /* Remove it from the list */
316 pppi = &gppiList;
317 while (*pppi != NULL && *pppi != ppiCurrent)
318 {
319 pppi = &(*pppi)->ppiNext;
320 }
321 ASSERT(*pppi == ppiCurrent);
322 *pppi = ppiCurrent->ppiNext;
323
324 /* Cleanup GDI info */
326
327 /* Cleanup USER info */
329
330 /* The process is dying */
332 ppiCurrent->peProcess = NULL;
333
334 /* Finally, dereference */
335 IntDereferenceProcessInfo(ppiCurrent);
336
337 return STATUS_SUCCESS;
338}
339
344{
346
347 ASSERT(Process->Peb);
348
349 TRACE_CH(UserProcess, "Win32kProcessCallback -->\n");
350
352
353 if (Initialize)
354 {
356 }
357 else
358 {
360 }
361
362 UserLeave();
363
364 TRACE_CH(UserProcess, "<-- Win32kProcessCallback\n");
365
366 return Status;
367}
368
369
370
373 OUT PTHREADINFO* W32Thread)
374{
375 PTHREADINFO ptiCurrent;
376
377 TRACE_CH(UserThread, "In AllocW32Thread(0x%p)\n", Thread);
378
379 /* Check that we were not called with an already existing Win32 thread info */
380 ptiCurrent = PsGetThreadWin32Thread(Thread);
381 NT_ASSERT(ptiCurrent == NULL);
382
383 /* Allocate a new Win32 thread info */
385 sizeof(*ptiCurrent),
387 if (ptiCurrent == NULL)
388 {
389 ERR_CH(UserThread, "Failed to allocate pti for TID:0x%lx\n",
391 return STATUS_NO_MEMORY;
392 }
393
394 TRACE_CH(UserThread, "Allocated pti 0x%p for TID:0x%lx\n",
395 ptiCurrent, HandleToUlong(Thread->Cid.UniqueThread));
396
397 RtlZeroMemory(ptiCurrent, sizeof(*ptiCurrent));
398
399 PsSetThreadWin32Thread(Thread, ptiCurrent, NULL);
401 IntReferenceThreadInfo(ptiCurrent);
402
403 *W32Thread = ptiCurrent;
404 return STATUS_SUCCESS;
405}
406
407/*
408 * Called from IntDereferenceThreadInfo
409 */
410VOID
412{
413 PPROCESSINFO ppi = pti->ppi;
414
415 TRACE_CH(UserThread, "UserDeleteW32Thread pti 0x%p\n",pti);
416
417 /* Free the message queue */
418 if (pti->MessageQueue)
419 {
421 }
422
424
425 ObDereferenceObject(pti->pEThread);
426
428
430
431 {
432 // Find another queue for mouse cursor.
433 MSG msg;
434 msg.message = WM_MOUSEMOVE;
435 msg.wParam = UserGetMouseButtonsState();
436 msg.lParam = MAKELPARAM(gpsi->ptCursor.x, gpsi->ptCursor.y);
437 msg.pt = gpsi->ptCursor;
439 }
440}
441
444{
445 return STATUS_SUCCESS;
446}
447
450{
451 return STATUS_SUCCESS;
452}
453
456{
458 PCLIENTINFO pci;
459 PTHREADINFO ptiCurrent;
460 int i;
462 PTEB pTeb;
463 PRTL_USER_PROCESS_PARAMETERS ProcessParams;
464 PKL pDefKL;
465
466 Process = Thread->ThreadsProcess;
467
468 pTeb = NtCurrentTeb();
469 ASSERT(pTeb);
470
471 ProcessParams = pTeb->ProcessEnvironmentBlock->ProcessParameters;
472
473 /* Allocate a new Win32 thread info */
474 Status = AllocW32Thread(Thread, &ptiCurrent);
475 if (!NT_SUCCESS(Status))
476 {
477 ERR_CH(UserThread, "Failed to allocate pti for TID:0x%lx\n",
479 return Status;
480 }
481
482 /* Initialize the THREADINFO */
483 ptiCurrent->pEThread = Thread;
484 ptiCurrent->ppi = PsGetProcessWin32Process(Process);
485 IntReferenceProcessInfo(ptiCurrent->ppi);
486 pTeb->Win32ThreadInfo = ptiCurrent;
487 ptiCurrent->pClientInfo = (PCLIENTINFO)pTeb->Win32ClientInfo;
488 ptiCurrent->pcti = &ptiCurrent->cti;
489
490 /* Mark the process as having threads */
491 ptiCurrent->ppi->W32PF_flags |= W32PF_THREADCONNECTED;
492
497 InitializeListHead(&ptiCurrent->PtiLink);
498 for (i = 0; i < NB_HOOKS; i++)
499 {
500 InitializeListHead(&ptiCurrent->aphkStart[i]);
501 }
502 ptiCurrent->ptiSibling = ptiCurrent->ppi->ptiList;
503 ptiCurrent->ppi->ptiList = ptiCurrent;
504 ptiCurrent->ppi->cThreads++;
505
506 ptiCurrent->hEventQueueClient = NULL;
507 Status = ZwCreateEvent(&ptiCurrent->hEventQueueClient, EVENT_ALL_ACCESS,
509 if (!NT_SUCCESS(Status))
510 {
511 ERR_CH(UserThread, "Event creation failed, Status 0x%08x.\n", Status);
512 goto error;
513 }
516 (PVOID*)&ptiCurrent->pEventQueueServer, NULL);
517 if (!NT_SUCCESS(Status))
518 {
519 ERR_CH(UserThread, "Failed referencing the event object, Status 0x%08x.\n", Status);
521 ptiCurrent->hEventQueueClient = NULL;
522 goto error;
523 }
524
525 ptiCurrent->pcti->timeLastRead = EngGetTickCount32();
526
527 ptiCurrent->MessageQueue = MsqCreateMessageQueue(ptiCurrent);
528 if (ptiCurrent->MessageQueue == NULL)
529 {
530 ERR_CH(UserThread, "Failed to allocate message loop\n");
532 goto error;
533 }
534
535 pDefKL = W32kGetDefaultKeyLayout();
536 UserAssignmentLock((PVOID*)&(ptiCurrent->KeyboardLayout), pDefKL);
537
538 ptiCurrent->TIF_flags &= ~TIF_INCLEANUP;
539
540 // FIXME: Flag SYSTEM threads with... TIF_SYSTEMTHREAD !!
541
542 /* CSRSS threads have some special features */
543 if (Process == gpepCSRSS || !gpepCSRSS)
545
546 /* Initialize the CLIENTINFO */
547 pci = (PCLIENTINFO)pTeb->Win32ClientInfo;
548 RtlZeroMemory(pci, sizeof(*pci));
549 pci->ppi = ptiCurrent->ppi;
550 pci->fsHooks = ptiCurrent->fsHooks;
551 pci->dwTIFlags = ptiCurrent->TIF_flags;
552 if (pDefKL)
553 {
554 pci->hKL = pDefKL->hkl;
555 pci->CodePage = pDefKL->CodePage;
556 }
557
558 /* Populate dwExpWinVer */
559 if (Process->Peb)
560 ptiCurrent->dwExpWinVer = RtlGetExpWinVer(Process->SectionBaseAddress);
561 else
562 ptiCurrent->dwExpWinVer = WINVER_WINNT4;
563 pci->dwExpWinVer = ptiCurrent->dwExpWinVer;
564
565 /* Need to pass the user Startup Information to the current process. */
566 if ( ProcessParams )
567 {
568 if ( ptiCurrent->ppi->usi.cb == 0 ) // Not initialized yet.
569 {
570 if ( ProcessParams->WindowFlags != 0 ) // Need window flags set.
571 {
572 ptiCurrent->ppi->usi.cb = sizeof(USERSTARTUPINFO);
573 ptiCurrent->ppi->usi.dwX = ProcessParams->StartingX;
574 ptiCurrent->ppi->usi.dwY = ProcessParams->StartingY;
575 ptiCurrent->ppi->usi.dwXSize = ProcessParams->CountX;
576 ptiCurrent->ppi->usi.dwYSize = ProcessParams->CountY;
577 ptiCurrent->ppi->usi.dwFlags = ProcessParams->WindowFlags;
578 ptiCurrent->ppi->usi.wShowWindow = (WORD)ProcessParams->ShowWindowFlags;
579 }
580 }
581 }
582
583 /*
584 * Assign a default window station and desktop to the process.
585 * Do not try to open a desktop or window station before the very first
586 * (interactive) window station has been created by Winlogon.
587 */
588 if (!(ptiCurrent->TIF_flags & (TIF_SYSTEMTHREAD | TIF_CSRSSTHREAD)) &&
589 ptiCurrent->ppi->hdeskStartup == NULL &&
591 {
592 HWINSTA hWinSta = NULL;
593 HDESK hDesk = NULL;
594 UNICODE_STRING DesktopPath;
595 PDESKTOP pdesk;
596
597 /*
598 * Inherit the thread desktop and process window station (if not yet inherited)
599 * from the process startup info structure. See documentation of CreateProcess().
600 */
602 if (ProcessParams && ProcessParams->DesktopInfo.Length > 0)
603 {
604 Status = IntSafeCopyUnicodeStringTerminateNULL(&DesktopPath, &ProcessParams->DesktopInfo);
605 }
606 if (!NT_SUCCESS(Status))
607 {
608 RtlInitUnicodeString(&DesktopPath, NULL);
609 }
610
612 &DesktopPath,
613 !!(ProcessParams->WindowFlags & STARTF_INHERITDESKTOP),
614 &hWinSta,
615 &hDesk);
616
617 if (DesktopPath.Buffer)
618 ExFreePoolWithTag(DesktopPath.Buffer, TAG_STRING);
619
620 if (!NT_SUCCESS(Status))
621 {
622 ERR_CH(UserThread, "Failed to assign default desktop and winsta to process\n");
623 goto error;
624 }
625
626 if (!UserSetProcessWindowStation(hWinSta))
627 {
629 ERR_CH(UserThread, "Failed to set initial process winsta\n");
630 goto error;
631 }
632
633 /* Validate the new desktop */
634 Status = IntValidateDesktopHandle(hDesk, UserMode, 0, &pdesk);
635 if (!NT_SUCCESS(Status))
636 {
637 ERR_CH(UserThread, "Failed to validate initial desktop handle\n");
638 goto error;
639 }
640
641 /* Store the parsed desktop as the initial desktop */
642 ASSERT(ptiCurrent->ppi->hdeskStartup == NULL);
643 ASSERT(Process->UniqueProcessId != gpidLogon);
644 ptiCurrent->ppi->hdeskStartup = hDesk;
645 ptiCurrent->ppi->rpdeskStartup = pdesk;
646 }
647
648 if (ptiCurrent->ppi->hdeskStartup != NULL)
649 {
650 if (!IntSetThreadDesktop(ptiCurrent->ppi->hdeskStartup, FALSE))
651 {
652 ERR_CH(UserThread, "Failed to set thread desktop\n");
654 goto error;
655 }
656 }
657
658 /* Mark the thread as fully initialized */
659 ptiCurrent->TIF_flags |= TIF_GUITHREADINITIALIZED;
660
661 if (!(ptiCurrent->ppi->W32PF_flags & (W32PF_ALLOWFOREGROUNDACTIVATE | W32PF_APPSTARTING)) &&
662 (gptiForeground && gptiForeground->ppi == ptiCurrent->ppi ))
663 {
665 }
666 ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
667
668 /* Create the default input context */
669 if (IS_IMM_MODE())
670 {
672 }
673
674 /* Last things to do only if we are not a SYSTEM or CSRSS thread */
675 if (!(ptiCurrent->TIF_flags & (TIF_SYSTEMTHREAD | TIF_CSRSSTHREAD)))
676 {
677 /* Callback to User32 Client Thread Setup */
678 TRACE_CH(UserThread, "Call co_IntClientThreadSetup...\n");
680 if (!NT_SUCCESS(Status))
681 {
682 ERR_CH(UserThread, "ClientThreadSetup failed with Status 0x%08lx\n", Status);
683 goto error;
684 }
685 TRACE_CH(UserThread, "co_IntClientThreadSetup succeeded!\n");
686 }
687 else
688 {
689 TRACE_CH(UserThread, "co_IntClientThreadSetup cannot be called...\n");
690 }
691
692 TRACE_CH(UserThread, "UserCreateW32Thread pti 0x%p\n", ptiCurrent);
693 return STATUS_SUCCESS;
694
695error:
696 ERR_CH(UserThread, "InitThreadCallback failed! Freeing pti 0x%p for TID:0x%lx\n",
697 ptiCurrent, HandleToUlong(Thread->Cid.UniqueThread));
699 return Status;
700}
701
702VOID
704
705// Win: xxxDestroyThreadInfo
707NTAPI
709{
710 PTHREADINFO *ppti;
712 PPROCESSINFO ppiCurrent;
714 PTHREADINFO ptiCurrent;
715 PWINDOWLIST pwl, pwlNext;
716
717 Process = Thread->ThreadsProcess;
718
719 /* Get the Win32 Thread */
720 ptiCurrent = PsGetThreadWin32Thread(Thread);
721 ASSERT(ptiCurrent);
722
723 TRACE_CH(UserThread, "Destroying pti 0x%p eThread 0x%p\n", ptiCurrent, Thread);
724
725 ptiCurrent->TIF_flags |= TIF_INCLEANUP;
726 ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
727
728 ppiCurrent = ptiCurrent->ppi;
729 ASSERT(ppiCurrent);
730
731 IsRemoveAttachThread(ptiCurrent);
732
733 if (gpwlList)
734 {
735 for (pwl = gpwlList; pwl; pwl = pwlNext)
736 {
737 pwlNext = pwl->pNextList;
738 if (pwl->pti == ptiCurrent)
739 IntFreeHwndList(pwl);
740 }
741 }
742
743 ptiCurrent->TIF_flags |= TIF_DONTATTACHQUEUE;
744 ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
745
747
748 /* Decrement thread count and check if its 0 */
749 ppiCurrent->cThreads--;
750
751 if (ptiCurrent->TIF_flags & TIF_GUITHREADINITIALIZED)
752 {
753 /* Do now some process cleanup that requires a valid win32 thread */
754 if (ptiCurrent->ppi->cThreads == 0)
755 {
756 /* Check if we have registered the user api hook */
757 if (ptiCurrent->ppi == ppiUahServer)
758 {
759 /* Unregister the api hook */
761 }
762
763 /* Notify logon application to restart shell if needed */
764 if (ptiCurrent->pDeskInfo)
765 {
766 if (ptiCurrent->pDeskInfo->ppiShellProcess == ppiCurrent)
767 {
769
770 TRACE_CH(UserProcess, "Shell process is exiting (%lu)\n", ExitCode);
771
775 ExitCode);
776
777 ptiCurrent->pDeskInfo->ppiShellProcess = NULL;
778 }
779 }
780 }
781
782 DceFreeThreadDCE(ptiCurrent);
783 DestroyTimersForThread(ptiCurrent);
785 UnregisterThreadHotKeys(ptiCurrent);
786
788 {
789 DPRINT1("Failed to delete objects belonging to thread %p. This is VERY BAD!.\n", ptiCurrent);
790 ASSERT(FALSE);
791 return STATUS_UNSUCCESSFUL;
792 }
794
795 if (ppiCurrent && ppiCurrent->ptiList == ptiCurrent && !ptiCurrent->ptiSibling &&
796 ppiCurrent->W32PF_flags & W32PF_CLASSESREGISTERED)
797 {
798 TRACE_CH(UserThread, "DestroyProcessClasses\n");
799 /* no process windows should exist at this point, or the function will assert! */
800 DestroyProcessClasses(ppiCurrent);
801 ppiCurrent->W32PF_flags &= ~W32PF_CLASSESREGISTERED;
802 }
803
804 IntBlockInput(ptiCurrent, FALSE);
805 IntCleanupThreadCallbacks(ptiCurrent);
806
807 /* cleanup user object references stack */
808 psle = PopEntryList(&ptiCurrent->ReferencesList);
809 while (psle)
810 {
812 TRACE_CH(UserThread, "thread clean: remove reference obj 0x%p\n",ref->obj);
814
815 psle = PopEntryList(&ptiCurrent->ReferencesList);
816#if DBG
817 ptiCurrent->cRefObjectCo--;
818#endif
819 }
820 }
821
822 if (ptiCurrent->cEnterCount)
823 {
825 ptiCurrent->cEnterCount = 0;
826 }
827
828 /* Find the THREADINFO in the PROCESSINFO's list */
829 ppti = &ppiCurrent->ptiList;
830 while (*ppti != NULL && *ppti != ptiCurrent)
831 {
832 ppti = &((*ppti)->ptiSibling);
833 }
834
835 /* we must have found it */
836 ASSERT(*ppti == ptiCurrent);
837
838 /* Remove it from the list */
839 *ppti = ptiCurrent->ptiSibling;
840
841 if (!UserAssignmentUnlock((PVOID*)&(ptiCurrent->KeyboardLayout)))
842 ptiCurrent->pClientInfo->hKL = NULL;
843
844 if (gptiForeground == ptiCurrent)
845 {
846// IntNotifyWinEvent(EVENT_OBJECT_FOCUS, NULL, OBJID_CLIENT, CHILDID_SELF, 0);
847// IntNotifyWinEvent(EVENT_SYSTEM_FOREGROUND, NULL, OBJID_WINDOW, CHILDID_SELF, 0);
848
850 }
851
852 /* Restore display mode when we are the last thread, and we changed the display mode */
853 if (ppiCurrent->cThreads == 0)
854 UserDisplayNotifyShutdown(ppiCurrent);
855
856
857 // Fixes CORE-6384 & CORE-7030.
858/* if (ptiLastInput == ptiCurrent)
859 {
860 if (!ppiCurrent->ptiList)
861 ptiLastInput = gptiForeground;
862 else
863 ptiLastInput = ppiCurrent->ptiList;
864 ERR_CH(UserThread, "DTI: ptiLastInput is Cleared!!\n");
865 }
866*/
867 TRACE_CH(UserThread, "Freeing pti 0x%p\n", ptiCurrent);
868
870
871 if (ptiCurrent->hEventQueueClient != NULL)
872 {
875 }
876 ptiCurrent->hEventQueueClient = NULL;
877
878 ASSERT(ptiCurrent->cRefObjectCo == 0);
879
880 /* The thread is dying */
881 PsSetThreadWin32Thread(Thread /*ptiCurrent->pEThread*/, NULL, ptiCurrent);
882
883 /* Dereference the THREADINFO */
884 IntDereferenceThreadInfo(ptiCurrent);
885
886 return STATUS_SUCCESS;
887}
888
893{
895
897
899
901 {
904 }
905 else // if (Type == PsW32ThreadCalloutExit)
906 {
909 }
910
911 UserLeave();
912
913 return Status;
914}
915
916_Function_class_(DRIVER_UNLOAD)
919{
920 // TODO: Do more cleanup!
921
926}
927
928// Return on failure
929#define NT_ROF(x) \
930{ \
931 Status = (x); \
932 if (!NT_SUCCESS(Status)) \
933 { \
934 DPRINT1("Failed '%s' (0x%lx)\n", #x, Status); \
935 return Status; \
936 } \
937}
938
939// Lock & return on failure
940#define USERLOCK_AND_ROF(x) \
941{ \
942 UserEnterExclusive(); \
943 Status = (x); \
944 UserLeave(); \
945 if (!NT_SUCCESS(Status)) \
946 { \
947 DPRINT1("Failed '%s' (0x%lx)\n", #x, Status); \
948 return Status; \
949 } \
950}
951
952
953
954/*
955 * This definition doesn't work
956 */
957CODE_SEG("INIT")
963{
966 WIN32_CALLOUTS_FPNS CalloutData = {0};
967 PVOID GlobalUserHeapBase = NULL;
968
969 /*
970 * Register user mode call interface
971 * (system service table index = 1)
972 */
974 NULL,
977 1);
978 if (Result == FALSE)
979 {
980 DPRINT1("Adding system services failed!\n");
981 return STATUS_UNSUCCESSFUL;
982 }
983
985 DPRINT("Win32k hInstance 0x%p!\n", hModuleWin);
986
987 DriverObject->DriverUnload = DriverUnload;
988
989 /* Register Object Manager Callbacks */
992 // CalloutData.GlobalAtomTableCallout = NULL;
995 // CalloutData.JobCallout = NULL;
1002 // CalloutData.WindowStationCloseProcedure = NULL;
1005 // CalloutData.WindowStationOpenProcedure = NULL;
1006
1007 /* Register our per-process and per-thread structures. */
1008 PsEstablishWin32Callouts(&CalloutData);
1009
1010 /* Register service hook callbacks */
1011#if DBG && defined(KDBG)
1012 KdSystemDebugControl('CsoR', DbgPreServiceHook, ID_Win32PreServiceHook, 0, 0, 0, 0);
1013 KdSystemDebugControl('CsoR', DbgPostServiceHook, ID_Win32PostServiceHook, 0, 0, 0, 0);
1014#endif
1015
1016 /* Create the global USER heap */
1018 &GlobalUserHeapBase,
1019 1 * 1024 * 1024); /* FIXME: 1 MB for now... */
1020 if (GlobalUserHeap == NULL)
1021 {
1022 DPRINT1("Failed to initialize the global heap!\n");
1023 return STATUS_UNSUCCESSFUL;
1024 }
1025
1026 /* Init the global user lock */
1028
1029 /* Lock while we use the heap (UserHeapAlloc asserts on this) */
1031
1032 /* Allocate global server info structure */
1033 gpsi = UserHeapAlloc(sizeof(*gpsi));
1034 UserLeave();
1035 if (!gpsi)
1036 {
1037 DPRINT1("Failed allocate server info structure!\n");
1038 return STATUS_UNSUCCESSFUL;
1039 }
1040
1041 RtlZeroMemory(gpsi, sizeof(*gpsi));
1042 DPRINT("Global Server Data -> %p\n", gpsi);
1043
1046
1047 /* Create stock objects, ie. precreated objects commonly
1048 used by win32 applications */
1051
1056 NT_ROF(InitDcImpl());
1065
1066 return STATUS_SUCCESS;
1067}
1068
1069/* 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
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:1062
_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:1209
#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_ PVOID InputBuffer, _In_ ULONG InputBufferLength, _Out_ PVOID OutputBuffer, _In_ ULONG OutputBufferLength, _Inout_ PULONG ReturnLength, _In_ KPROCESSOR_MODE PreviousMode)
Definition: kdapi.c:2184
NTSTATUS NTAPI InitLDEVImpl(VOID)
Definition: ldevobj.c:30
#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
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:1382
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
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
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
UNICODE_STRING DesktopInfo
Definition: rtltypes.h:1555
Definition: ntbasedef.h:636
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:3557
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:116
#define STARTF_SCREENSAVER
Definition: undocuser.h:165
#define WM_LOGONNOTIFY
Definition: undocuser.h:37
#define STARTF_INHERITDESKTOP
Definition: undocuser.h:164
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:3296
PTHREADINFO gptiForeground
Definition: focus.c:15
VOID FASTCALL UnregisterThreadHotKeys(PTHREADINFO pti)
Definition: hotkey.c:121
VOID FASTCALL IntFreeImeHotKeys(VOID)
Definition: ime.c:326
PIMC FASTCALL UserCreateInputContext(ULONG_PTR dwClientImcData)
Definition: ime.c:1558
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:303
VOID UserDeleteW32Thread(PTHREADINFO pti)
Definition: main.c:411
VOID UserDisplayNotifyShutdown(PPROCESSINFO ppiCurrent)
Definition: display.c:917
PPROCESSINFO gppiList
Definition: main.c:30
#define USERLOCK_AND_ROF(x)
Definition: main.c:940
NTSTATUS UserThreadCreate(PETHREAD Thread)
Definition: main.c:443
NTSTATUS InitProcessCallback(PEPROCESS Process)
Definition: main.c:230
VOID UserDeleteW32Process(_Pre_notnull_ __drv_freesMem(Mem) PPROCESSINFO ppiCurrent)
Definition: main.c:95
NTSTATUS UserThreadDestroy(PETHREAD Thread)
Definition: main.c:449
HANDLE hModuleWin
Definition: main.c:16
NTSTATUS APIENTRY Win32kProcessCallback(PEPROCESS Process, BOOLEAN Initialize)
Definition: main.c:342
NTSTATUS GdiThreadDestroy(PETHREAD Thread)
Definition: init.c:73
PPROCESSINFO ppiScrnSaver
Definition: main.c:29
NTSTATUS APIENTRY Win32kThreadCallback(PETHREAD Thread, PSW32THREADCALLOUTTYPE Type)
Definition: main.c:891
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:929
NTSTATUS NTAPI ExitThreadCallback(PETHREAD Thread)
Definition: main.c:708
NTSTATUS GdiProcessDestroy(PEPROCESS Process)
Definition: init.c:46
NTSTATUS NTAPI InitThreadCallback(PETHREAD Thread)
Definition: main.c:455
NTSTATUS AllocW32Thread(IN PETHREAD Thread, OUT PTHREADINFO *W32Thread)
Definition: main.c:372
PSERVERINFO gpsi
Definition: main.c:27
NTSTATUS UserProcessDestroy(PEPROCESS Process)
Definition: main.c:174
NTSTATUS AllocW32Process(IN PEPROCESS Process, OUT PPROCESSINFO *W32Process)
Definition: main.c:57
NTSTATUS UserProcessCreate(PEPROCESS Process)
Definition: main.c:121
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
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:4011
#define WM_MOUSEMOVE
Definition: winuser.h:1778
_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