14#include <reactos/buildno.h>
87 NextEntry = ListHead->
Flink;
88 while (NextEntry != ListHead)
130 NextEntry = NextEntry->
Flink;
185 TRACE(
"Deleting desktop object 0x%p\n", pdesk);
294 ERR(
"Failed to allocate event!\n");
337 WCHAR BuildLabBuffer[256];
338 WCHAR VersionBuffer[256];
356 RtlInitEmptyUnicodeString(&BuildLabString,
358 sizeof(BuildLabBuffer));
360 RtlInitEmptyUnicodeString(&CSDVersionString,
365 VersionConfigurationTable,
371 BuildLabString.
Length = 0;
372 CSDVersionString.
Length = 0;
378 EndBuffer = VersionBuffer;
379 if ( CSDVersionString.
Length)
383 sizeof(VersionBuffer),
406 L"ReactOS Version %S %wZ (NT %u.%u Build %u%s)\n",
417 sizeof(VersionBuffer),
423 EndBuffer =
wcsrchr(pwszzVersion,
L'\n');
433 if (EndBuffer) *EndBuffer =
L'\n';
446 L"ReactOS Version %S\n"
448 L"Reporting NT %u.%u (Build %u%s)\n",
459 sizeof(VersionBuffer),
479 L"ReactOS Version %S %wZ\n",
493 while (*pwszzVersion)
495 EndBuffer =
wcschr(pwszzVersion,
L'\n');
496 if (!EndBuffer)
break;
497 pwszzVersion = EndBuffer;
579 OUT HWINSTA* phWinSta,
580 OUT HDESK* phDesktop)
583 HWINSTA hWinSta =
NULL, hWinStaDup =
NULL;
584 HDESK hDesktop =
NULL, hDesktopDup =
NULL;
596 HWINSTA hTempWinSta =
NULL;
612 if (!ppi)
TRACE(
"IntResolveDesktop: ppi is NULL!\n");
636 ERR(
"IntResolveDesktop: Could not reference window station 0x%p\n", ppi->
prpwinsta);
650 ERR(
"IntResolveDesktop: Could not reference desktop 0x%p\n", ppi->
rpdeskStartup);
658 *phDesktop = hDesktop;
663 RtlInitEmptyUnicodeString(&WinStaName,
NULL, 0);
664 RtlInitEmptyUnicodeString(&DesktopName,
NULL, 0);
671 if (DesktopPath->Buffer !=
NULL && DesktopPath->Length >
sizeof(
WCHAR))
673 DesktopName = *DesktopPath;
683 if (DesktopName.
Length > 0)
685 RtlInitEmptyUnicodeString(&WinStaName, DesktopPath->
Buffer,
686 DesktopPath->Length - DesktopName.
Length);
697 RtlInitEmptyUnicodeString(&WinStaName,
NULL, 0);
698 DesktopName = *DesktopPath;
702 TRACE(
"IntResolveDesktop: WinStaName:'%wZ' ; DesktopName:'%wZ'\n", &WinStaName, &DesktopName);
708 ERR(
"IntResolveDesktop: Failed to retrieve the process LUID, Status 0x%08lx\n",
Status);
728 ERR(
"IntResolveDesktop: Failed to obtain a handle to process 0x%p, Status 0x%08lx\n",
Process,
Status);
752 bUseDefaultWinSta =
TRUE;
759 WinStaName = WinSta0Name;
767 TRACE(
"IntResolveDesktop: Inherited window station is: 0x%p\n", hWinSta);
788 TRACE(
"IntResolveDesktop: Inherited desktop is: 0x%p\n", hDesktop);
814 ERR(
"IntResolveDesktop: Window station name length is too long.\n");
840 ERR(
"ZwAllocateVirtualMemory() failed, Status 0x%08lx\n",
Status);
856 ASSERT(bUseDefaultWinSta);
871 ERR(
"IntResolveDesktop: Failed to duplicate the window station handle, Status 0x%08lx\n",
Status);
877 hWinSta = hWinStaDup;
888 ASSERT(bUseDefaultWinSta);
895 (
PVOID*)&WinStaObject,
899 ERR(
"Failed to reference the inherited window station, Status 0x%08lx\n",
Status);
903 ASSERT(hWinSta == hWinStaDup);
911 ERR(
"Process LUID is: 0x%x-%x, inherited window station LUID is: 0x%x-%x\n",
913 WinStaObject->luidUser.HighPart, WinStaObject->luidUser.LowPart);
916 bInteractive = !(WinStaObject->Flags &
WSS_NOIO);
931 ERR(
"Impossible to build a valid window station name, Status 0x%08lx\n",
Status);
981 if (((!bUseDefaultWinSta || bInherit) &&
RtlEqualLuid(&ProcessLuid, &SystemLuid)) ||
985 bAccessAllowed =
TRUE;
992 bAccessAllowed =
TRUE;
1001 if ( bInteractive || !bAccessAllowed)
1010 if (bInteractive == bAccessAllowed)
1023 ASSERT(hWinSta == hWinStaDup);
1027 hWinSta = hTempWinSta;
1030 if (bUseDefaultWinSta)
1032 if (hWinSta ==
NULL && !bInteractive)
1037 L"%wZ\\Service-0x%x-%x$",
1043 ERR(
"Impossible to build a valid window station name, Status 0x%08lx\n",
Status);
1057 ERR(
"Failed to create a security descriptor for service window station, Status 0x%08lx\n",
Status);
1083 ERR(
"Failed to create or open the non-interactive window station '%wZ', Status 0x%08lx\n",
1100 ERR(
"Impossible to build a valid desktop name, Status 0x%08lx\n",
Status);
1126 ERR(
"Failed to create or open the desktop '%wZ' on window station 0x%p, Status 0x%08lx\n",
1145 if (hDesktop !=
NULL)
1160 ERR(
"IntResolveDesktop: Failed to duplicate the desktop handle, Status 0x%08lx\n",
Status);
1166 hDesktop = hDesktopDup;
1171 if ((hWinSta !=
NULL) && (hDesktop ==
NULL))
1179 ERR(
"Impossible to build a valid desktop name, Status 0x%08lx\n",
Status);
1208 ERR(
"Failed to open the desktop '%wZ' on window station 0x%p, Status 0x%08lx\n",
1231 *phWinSta = hWinSta;
1232 *phDesktop = hDesktop;
1237 ERR(
"IntResolveDesktop(%wZ) failed, Status 0x%08lx\n", DesktopPath,
Status);
1280 TRACE(
"IntValidateDesktopHandle: handle:0x%p obj:0x%p access:0x%x Status:0x%lx\n",
1322 ERR(
"Unable to create a desktop handle\n");
1328 TRACE(
"Got handle: 0x%p\n", hDesk);
1340 TRACE(
"No active desktop\n");
1353 TRACE(
"No active desktop\n");
1356 if (NewQueue !=
NULL)
1360 TRACE(
"Message Queue already attached to another desktop!\n");
1381 ERR(
"ptiLastInput is CLEARED!!\n");
1407 TRACE(
"No active desktop\n");
1418 TRACE(
"No active desktop\n");
1430 TRACE(
"No active desktop\n");
1441 TRACE(
"No active desktop\n");
1453 ERR(
"Thread doesn't have a desktop\n");
1487 case WM_DISPLAYCHANGE:
1537 TRACE(
"DWP calling IDWP Msg %d\n",
Msg);
1559 ERR(
"UMWP calling IDWP\n");
1596 PWND DesktopObject = 0;
1664 DesktopWnd->
style &= ~WS_VISIBLE;
1679 ListEntry =
Desktop->ShellHookWindows.Flink;
1680 while (ListEntry != &
Desktop->ShellHookWindows)
1682 ListEntry = ListEntry->
Flink;
1686 if (!entries)
return NULL;
1693 ListEntry =
Desktop->ShellHookWindows.Flink;
1694 while (ListEntry != &
Desktop->ShellHookWindows)
1697 ListEntry = ListEntry->
Flink;
1728 TRACE(
"IntShellHookNotify: No desktop!\n");
1746 TRACE(
"Sending notify\n");
1780 TRACE(
"IntRegisterShellHookWindow\n");
1821 ListEntry =
Desktop->ShellHookWindows.Flink;
1822 while (ListEntry != &
Desktop->ShellHookWindows)
1825 ListEntry = ListEntry->
Flink;
1859 static WCHAR s_wszSafeMode[] =
L"Safe Mode";
1862 HBRUSH DesktopBrush, PreviousBrush;
1891 int scaledWidth, scaledHeight;
1892 int wallpaperX, wallpaperY, wallpaperWidth, wallpaperHeight;
1901 int scaleNum, scaleDen;
1937 wallpaperY = (((scaledHeight - sz.
cy) *
gspv.
cyWallpaper) / (2 * scaledHeight));
1953 x = (sz.
cx - scaledWidth) / 2;
1954 y = (sz.
cy - scaledHeight) / 2;
1964 if (hWallpaperDC !=
NULL)
2096 static WCHAR wszzVersion[1024] =
L"\0";
2100 static POLYTEXTW VerStrs[4] = {{0},{0},{0},{0}};
2141 crText = pdc->eboFill.ulRGBColor;
2146 crText =
RGB(0, 0, 0);
2152 crText =
RGB(0, 0, 0);
2154 crText =
RGB(255, 255, 255);
2159 crText =
RGB(255, 255, 255);
2175 PWCHAR pstr = wszzVersion;
2180 pstr += (VerStrs[
i].
n + 1);
2193 LONG TotalHeight = 0;
2202 if (!VerStrs[
i].lpstr || !*VerStrs[
i].lpstr || (VerStrs[
i].
n == 0))
2207 TotalHeight +=
Size.cy;
2213 TotalHeight =
min(TotalHeight,
Rect.bottom);
2219 if (!VerStrs[
i].lpstr || !*VerStrs[
i].lpstr || (VerStrs[
i].
n == 0))
2222 TotalHeight -= VerStrs[
i].
y;
2225 Rect.bottom - TotalHeight - 5,
2290 TRACE(
"UserInitializeDesktop desktop 0x%p with name %wZ\n", pdesk, DesktopName);
2318 &DesktopHeapSystemBase,
2322 ERR(
"Failed to create desktop heap!\n");
2333 ERR(
"Failed to create the DESKTOP structure!\n");
2392 OUT HDESK* phDesktop,
2412 TRACE(
"Enter IntCreateDesktop\n");
2440 ERR(
"ObOpenObjectByName failed to open/create desktop\n");
2461 ERR(
"Failed to reference desktop object\n");
2494 ERR(
"Failed to create desktop window for the new desktop\n");
2516 Cs.
cx = Cs.
cy = 100;
2524 ERR(
"Failed to create message window for the new desktop\n");
2555 ptiCurrent->
TIF_flags &= ~TIF_DISABLEHOOKS;
2559 TRACE(
"Leave IntCreateDesktop, Status 0x%08lx\n",
Status);
2580 TRACE(
"Enter NtUserCreateDesktop\n");
2592 ERR(
"IntCreateDesktop failed, Status 0x%08lx\n",
Status);
2600 TRACE(
"Leave NtUserCreateDesktop, ret=0x%p\n", Ret);
2647 ERR(
"Failed to open desktop\n");
2673 ERR(
"Tried to open input desktop from non interactive winsta!\n");
2692 ERR(
"Failed to open input desktop object\n");
2734 TRACE(
"NtUserOpenInputDesktop returning 0x%p\n", hdesk);
2768 TRACE(
"NtUserCloseDesktop(0x%p) called\n", hDesktop);
2773 ERR(
"Attempted to close thread desktop\n");
2781 ERR(
"Validation of desktop handle 0x%p failed\n", hDesktop);
2790 ERR(
"Failed to close desktop handle 0x%p\n", hDesktop);
2798 TRACE(
"Leave NtUserCloseDesktop, ret=%i\n", Ret);
2824 TRACE(
"Enter NtUserPaintDesktop\n");
2828 TRACE(
"Leave NtUserPaintDesktop, ret=%i\n", Ret);
2873 OUT HWINSTA* phWinSta)
2877 HWINSTA hWinSta =
NULL;
2878 HDESK hDesktop =
NULL;
2919 &CapturedDesktopPath,
2925 ERR(
"IntResolveDesktop failed, Status 0x%08lx\n",
Status);
2933 *phWinSta = hWinSta;
2980 BOOL bRedrawDesktop;
2984 TRACE(
"Enter NtUserSwitchDesktop(0x%p)\n", hdesk);
2989 ERR(
"Validation of desktop handle 0x%p failed\n", hdesk);
2996 ERR(
"NtUserSwitchDesktop called for a desktop of a different session\n");
3003 WARN(
"NtUserSwitchDesktop called for active desktop\n");
3016 ERR(
"Switching desktop 0x%p denied because the window station is locked!\n", hdesk);
3023 ERR(
"Switching desktop 0x%p denied because desktop doesn't belong to the interactive winsta!\n", hdesk);
3033 bRedrawDesktop =
FALSE;
3039 bRedrawDesktop =
TRUE;
3060#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
3070 TRACE(
"Leave NtUserSwitchDesktop, ret=%i\n", Ret);
3093 TRACE(
"Enter NtUserGetThreadDesktop\n");
3110 else if (hConsoleDesktop)
3117 hDesk = hConsoleDesktop;
3129 ERR(
"Desktop information of thread 0x%x broken!?\n",
dwThreadId);
3157 (
PVOID*)&DesktopObject,
3181 ERR(
"Could not retrieve or access desktop for thread 0x%x\n",
dwThreadId);
3186 TRACE(
"Leave NtUserGetThreadDesktop, hDesk = 0x%p\n", hDesk);
3198 TRACE(
"IntUnmapDesktopView called for desktop object %p\n", pdesk);
3208 HeapMapping = *PrevLink;
3209 while (HeapMapping !=
NULL)
3213 if (--HeapMapping->
Count == 0)
3215 *PrevLink = HeapMapping->
Next;
3217 TRACE(
"ppi 0x%p unmapped heap of desktop 0x%p\n", ppi, pdesk);
3228 PrevLink = &HeapMapping->
Next;
3229 HeapMapping = HeapMapping->
Next;
3245 TRACE(
"IntMapDesktopView called for desktop object 0x%p\n", pdesk);
3255 HeapMapping = *PrevLink;
3256 while (HeapMapping !=
NULL)
3260 HeapMapping->
Count++;
3264 PrevLink = &HeapMapping->
Next;
3265 HeapMapping = HeapMapping->
Next;
3282 ERR(
"Failed to map desktop\n");
3286 TRACE(
"ppi 0x%p mapped heap of desktop 0x%p\n", ppi, pdesk);
3290 if (HeapMapping ==
NULL)
3293 ERR(
"UserHeapAlloc() failed!\n");
3301 HeapMapping->
Count = 1;
3302 *PrevLink = HeapMapping;
3321 TRACE(
"IntSetThreadDesktop hDesktop:0x%p, FOF:%i\n",hDesktop, FreeOnFailure);
3327 if (hDesktop !=
NULL)
3333 ERR(
"Validation of desktop handle 0x%p failed\n", hDesktop);
3337 if (pti->
rpdesk == pdesk)
3350 ERR(
"Attempted to change thread desktop although the thread has windows!\n");
3368 ERR(
"Failed to map desktop heap!\n");
3375 if (pctiNew ==
NULL)
3377 ERR(
"Failed to allocate new pcti\n");
3411 ERR(
"The process 0x%p '%s' didn't have an assigned startup desktop before, assigning it now!\n",
3412 pti->
ppi->peProcess, pti->
ppi->peProcess->ImageFileName);
3423 ERR(
"Failed to move process classes to shared heap!\n");
3436 pctiOld = pti->
pcti;
3444 pti->
hdesk = hDesktop;
3446 pti->
pcti = pctiNew;
3453 if (pctiOld !=
NULL)
3476 if (pdeskOld !=
NULL)
3489 TRACE(
"IntSetThreadDesktop: pti 0x%p ppi 0x%p switched from object 0x%p to 0x%p\n", pti, pti->
ppi, pdeskOld, pdesk);
NTSTATUS NTAPI MmUnmapViewInSessionSpace(IN PVOID MappedBase)
NTSTATUS NTAPI MmUnmapViewOfSection(IN PEPROCESS Process, IN PVOID BaseAddress)
#define OBJ_NAME_PATH_SEPARATOR
#define UlongToHandle(ul)
#define DBG_DEFAULT_CHANNEL(ch)
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
_Inout_ PFCB _Inout_ PUNICODE_STRING RemainingName
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
FORCEINLINE VOID DC_UnlockDc(PDC pdc)
COLORREF FASTCALL IntGdiSetTextColor(HDC hDC, COLORREF color)
UINT FASTCALL IntGdiSetTextAlign(HDC hDC, UINT Mode)
INT FASTCALL IntGdiSetBkMode(HDC hDC, INT backgroundMode)
HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC)
FORCEINLINE PDC DC_LockDc(HDC hdc)
#define ERROR_NOT_ENOUGH_MEMORY
#define ERROR_INVALID_FUNCTION
static CHAR Desktop[MAX_PATH]
struct _DESKTOP * PDESKTOP
static __inline ULONG_PTR DesktopHeapGetUserDelta(VOID)
static __inline PVOID DesktopHeapAlloc(IN PDESKTOP Desktop, IN SIZE_T Bytes)
static __inline BOOL DesktopHeapFree(IN PDESKTOP Desktop, IN PVOID lpMem)
_In_ HANDLE _In_ CONST PDXGKMDT_OPM_GET_INFO_PARAMETERS Parameters
_Check_return_ _In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ PDXGKARG_SYSTEM_DISPLAY_ENABLE_FLAGS _Out_ UINT _Out_ UINT * Height
_Check_return_ _In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ PDXGKARG_SYSTEM_DISPLAY_ENABLE_FLAGS _Out_ UINT * Width
#define NT_SUCCESS(StatCode)
NTSTATUS NTAPI RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation)
#define RTL_CONSTANT_STRING(s)
#define ERROR_INVALID_PARAMETER
#define ERROR_ACCESS_DENIED
_ACRTIMP int __cdecl _scwprintf(const wchar_t *,...)
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
static const WCHAR Message[]
#define InterlockedExchangePointer(Target, Value)
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
UNICODE_STRING * PUNICODE_STRING
#define ExAllocatePoolWithTag(hernya, size, tag)
#define IsListEmpty(ListHead)
#define KeInitializeEvent(pEvt, foo, foo2)
#define KeSetEvent(pEvt, foo, foo2)
#define InitializeListHead(ListHead)
LONG NTAPI KePulseEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
VOID NTAPI ProbeForWrite(IN PVOID Address, IN SIZE_T Length, IN ULONG Alignment)
PUSER_MESSAGE_QUEUE gpqForeground
PUSER_MESSAGE_QUEUE gpqForegroundPrev
BOOL APIENTRY GreExtTextOutW(_In_ HDC hDC, _In_ INT XStart, _In_ INT YStart, _In_ UINT fuOptions, _In_opt_ PRECTL lprc, _In_reads_opt_(Count) PCWCH String, _In_ INT Count, _In_opt_ const INT *Dx, _In_ DWORD dwCodePage)
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
GLint GLint GLint GLint GLint x
GLint GLint GLint GLint GLint GLint y
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
#define ISITHOOKED(HookId)
#define PROCESS_QUERY_INFORMATION
#define UserHMGetHandle(obj)
struct _DESKTOPINFO DESKTOPINFO
#define EXCEPTION_EXECUTE_HANDLER
_In_ BOOL _In_ HANDLE hProcess
#define ExFreePoolWithTag(_P, _T)
#define DESKTOP_ALL_ACCESS
#define InitializeObjectAttributes(p, n, a, r, s)
PCURICON_OBJECT FASTCALL UserSetCursor(PCURICON_OBJECT NewCursor, BOOL ForceChange)
#define IntReferenceMessageQueue(MsgQueue)
#define IntDereferenceMessageQueue(MsgQueue)
struct _USER_MESSAGE_QUEUE * PUSER_MESSAGE_QUEUE
_In_ HANDLE ProcessHandle
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize _Pre_valid_ PVOID _In_ ULONG_PTR _In_ SIZE_T _Inout_opt_ PLARGE_INTEGER _Inout_ PSIZE_T ViewSize
_In_ HANDLE _In_opt_ HANDLE _Out_opt_ PHANDLE _In_ ACCESS_MASK _In_ ULONG HandleAttributes
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
#define RTL_REGISTRY_WINDOWS_NT
#define RTL_QUERY_REGISTRY_DIRECT
#define HEAP_NO_SERIALIZE
_In_ ULONG _In_ ULONG Offset
PVOID NTAPI PsGetProcessWin32Process(PEPROCESS Process)
POBJECT_TYPE PsProcessType
PVOID NTAPI PsGetCurrentProcessWin32Process(VOID)
HANDLE NTAPI PsGetCurrentProcessId(VOID)
ULONG NTAPI PsGetCurrentProcessSessionId(VOID)
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
#define STATUS_OBJECT_NAME_EXISTS
#define STATUS_NAME_TOO_LONG
NTSTRSAFEAPI RtlStringCbCopyW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ NTSTRSAFE_PCWSTR pszSrc)
NTSTRSAFEAPI RtlStringCchCatW(_Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cchDest, _In_ NTSTRSAFE_PCWSTR pszSrc)
NTSTRSAFEVAPI RtlStringCbPrintfExW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, _Out_opt_ size_t *pcbRemaining, _In_ STRSAFE_DWORD dwFlags, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
NTSTRSAFEVAPI RtlStringCbPrintfW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
NTSTRSAFEVAPI RtlStringCchPrintfW(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cchDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
NTSTRSAFEAPI RtlStringCbCopyNW(_Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_reads_bytes_(cbToCopy) STRSAFE_LPCWSTR pszSrc, _In_ size_t cbToCopy)
LRESULT FASTCALL IntDefWindowProc(PWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam, BOOL Ansi)
LRESULT APIENTRY co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
BOOLEAN FASTCALL co_WinPosSetWindowPos(PWND Window, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
PWINSTATION_OBJECT InputWindowStation
UNICODE_STRING gustrWindowStationsDir
NTSTATUS FASTCALL IntCreateWindowStation(OUT HWINSTA *phWinSta, IN POBJECT_ATTRIBUTES ObjectAttributes, IN KPROCESSOR_MODE AccessMode, IN KPROCESSOR_MODE OwnerMode, IN ACCESS_MASK dwDesiredAccess, DWORD Unknown2, DWORD Unknown3, DWORD Unknown4, DWORD Unknown5, DWORD Unknown6)
BOOL g_AlwaysDisplayVersion
VOID FASTCALL UserLeave(VOID)
VOID FASTCALL UserEnterExclusive(VOID)
BOOL FASTCALL UserIsEnteredExclusive(VOID)
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
BOOLEAN NTAPI ObFindHandleForObject(IN PEPROCESS Process, IN PVOID Object, IN POBJECT_TYPE ObjectType, IN POBJECT_HANDLE_INFORMATION HandleInformation, OUT PHANDLE Handle)
NTSTATUS NTAPI ObOpenObjectByPointer(IN PVOID Object, IN ULONG HandleAttributes, IN PACCESS_STATE PassedAccessState, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PHANDLE Handle)
NTSTATUS NTAPI ObOpenObjectByName(IN POBJECT_ATTRIBUTES ObjectAttributes, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, IN PACCESS_STATE PassedAccessState, IN ACCESS_MASK DesiredAccess, IN OUT PVOID ParseContext, OUT PHANDLE Handle)
NTSTATUS NTAPI ObCreateObject(IN KPROCESSOR_MODE ProbeMode OPTIONAL, IN POBJECT_TYPE Type, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN KPROCESSOR_MODE AccessMode, IN OUT PVOID ParseContext OPTIONAL, IN ULONG ObjectSize, IN ULONG PagedPoolCharge OPTIONAL, IN ULONG NonPagedPoolCharge OPTIONAL, OUT PVOID *Object)
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)
VOID NTAPI KeDetachProcess(VOID)
VOID NTAPI KeAttachProcess(IN PKPROCESS Process)
__kernel_entry W32KAPI HDC APIENTRY NtGdiCreateCompatibleDC(_In_opt_ HDC hdc)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiBitBlt(_In_ HDC hdcDst, _In_ INT x, _In_ INT y, _In_ INT cx, _In_ INT cy, _In_opt_ HDC hdcSrc, _In_ INT xSrc, _In_ INT ySrc, _In_ DWORD rop4, _In_ DWORD crBackColor, _In_ FLONG fl)
__kernel_entry W32KAPI HBRUSH APIENTRY NtGdiSelectBrush(_In_ HDC hdc, _In_ HBRUSH hbrush)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiStretchBlt(_In_ HDC hdcDst, _In_ INT xDst, _In_ INT yDst, _In_ INT cxDst, _In_ INT cyDst, _In_opt_ HDC hdcSrc, _In_ INT xSrc, _In_ INT ySrc, _In_ INT cxSrc, _In_ INT cySrc, _In_ DWORD dwRop, _In_ DWORD dwBackColor)
__kernel_entry W32KAPI HBITMAP APIENTRY NtGdiSelectBitmap(_In_ HDC hdc, _In_ HBITMAP hbm)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiPatBlt(_In_ HDC hdcDest, _In_ INT x, _In_ INT y, _In_ INT cx, _In_ INT cy, _In_ DWORD dwRop)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiDeleteObjectApp(_In_ HANDLE hobj)
__kernel_entry W32KAPI HFONT APIENTRY NtGdiSelectFont(_In_ HDC hdc, _In_ HFONT hf)
#define OBJ_KERNEL_HANDLE
#define OBJ_CASE_INSENSITIVE
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
#define _SEH2_YIELD(__stmt)
#define IntSysCreateRectpRgnIndirect(prc)
static __inline NTSTATUS ProbeAndCaptureUnicodeString(OUT PUNICODE_STRING Dest, IN KPROCESSOR_MODE CurrentMode, IN const UNICODE_STRING *UnsafeSrc)
static __inline VOID ReleaseCapturedUnicodeString(IN PUNICODE_STRING CapturedString, IN KPROCESSOR_MODE CurrentMode)
NTSTATUS NTAPI MmMapViewOfSection(_In_ PVOID SectionObject, _In_ PEPROCESS Process, _Outptr_result_bytebuffer_(*ViewSize) _Pre_opt_valid_ PVOID *BaseAddress, _In_ ULONG_PTR ZeroBits, _In_ SIZE_T CommitSize, _Inout_opt_ PLARGE_INTEGER SectionOffset, _Inout_ PSIZE_T ViewSize, _In_range_(ViewShare, ViewUnmap) SECTION_INHERIT InheritDisposition, _In_ ULONG AllocationType, _In_ ULONG Protect)
PULONG MinorVersion OPTIONAL
PCLIENTTHREADINFO pClientThreadInfo
LIST_ENTRY aphkStart[NB_HOOKS]
struct _USER_MESSAGE_QUEUE * ActiveMessageQueue
struct _WINSTATION_OBJECT * rpwinstaParent
LIST_ENTRY ShellHookWindows
struct _LIST_ENTRY * Flink
GENERIC_MAPPING GenericMapping
ULONG DefaultNonPagedPoolCharge
OBJECT_TYPE_INITIALIZER TypeInfo
ULONG dwOSVersionInfoSize
W32HEAP_USER_MAPPING HeapMappings
struct _DESKTOP * rpdeskStartup
struct _WINSTATION_OBJECT * prpwinsta
WALLPAPER_MODE WallpaperMode
struct _DESKTOPINFO * pDeskInfo
struct _CLIENTINFO * pClientInfo
struct _CLIENTTHREADINFO * pcti
LIST_ENTRY WindowListHead
struct _USER_MESSAGE_QUEUE * MessageQueue
struct _DESKTOP * Desktop
struct _W32HEAP_USER_MAPPING * Next
struct _DESKTOP * ActiveDesktop
LIST_ENTRY DesktopListHead
TW_UINT32 TW_UINT16 TW_UINT16 MSG
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_ACCESS_DENIED
#define STATUS_UNSUCCESSFUL
#define STATUS_OBJECT_NAME_COLLISION
#define STATUS_OBJECT_NAME_NOT_FOUND
#define ALIGN_UP(size, type)
HDC FASTCALL IntBeginPaint(PWND Window, PPAINTSTRUCT Ps)
BOOL FASTCALL co_UserRedrawWindow(PWND Window, const RECTL *UpdateRect, PREGION UpdateRgn, ULONG Flags)
BOOL FASTCALL IntEndPaint(PWND Wnd, PPAINTSTRUCT Ps)
VOID FASTCALL IntInvalidateWindows(PWND Wnd, PREGION Rgn, ULONG Flags)
RTL_ATOM FASTCALL IntAddAtom(LPWSTR AtomName)
PWND FASTCALL UserGetWindowObject(HWND hWnd)
PWND FASTCALL IntGetWindowObject(HWND hWnd)
HDC FASTCALL UserGetWindowDC(PWND Wnd)
BOOLEAN co_UserDestroyWindow(PVOID Object)
PWIN32HEAP UserCreateHeap(OUT PVOID *SectionObject, IN OUT PVOID *SystemBase, IN SIZE_T HeapSize)
static __inline PVOID UserHeapAlloc(SIZE_T Bytes)
static __inline BOOL UserHeapFree(PVOID lpMem)
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK DesiredAccess
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
POBJECT_TYPE ExDesktopObjectType
POBJECT_TYPE ExWindowStationObjectType
VOID FASTCALL SetLastNtError(_In_ NTSTATUS Status)
HFONT FASTCALL GreCreateFontIndirectW(_In_ const LOGFONTW *lplf)
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
FORCEINLINE VOID RECTL_vOffsetRect(_Inout_ RECTL *prcl, _In_ INT cx, _In_ INT cy)
VOID FASTCALL REGION_Delete(PREGION pRgn)
BOOL FASTCALL GreGetTextExtentW(_In_ HDC hDC, _In_reads_(cwc) PCWCH lpwsz, _In_ INT cwc, _Out_ PSIZE psize, _In_ UINT flOpts)
BOOL IntCheckProcessDesktopClasses(IN PDESKTOP Desktop, IN BOOL FreeOnFailure)
PCLS IntGetAndReferenceClass(PUNICODE_STRING ClassName, HINSTANCE hInstance, BOOL bDesktopThread)
BOOL FASTCALL UserRegisterSystemClasses(VOID)
PCURICON_OBJECT FASTCALL UserGetCurIconObject(HCURSOR hCurIcon)
static NTSTATUS IntMapDesktopView(IN PDESKTOP pdesk)
HDESK APIENTRY NtUserOpenInputDesktop(DWORD dwFlags, BOOL fInherit, ACCESS_MASK dwDesiredAccess)
BOOL APIENTRY NtUserCloseDesktop(HDESK hDesktop)
PDESKTOP FASTCALL IntGetActiveDesktop(VOID)
DWORD gdwDesktopSectionSize
PTHREADINFO gptiDesktopThread
BOOL APIENTRY NtUserSetThreadDesktop(HDESK hDesktop)
PKEVENT gpDesktopSwitchEvent
WinSta0_DesktopSwitch legacy (NT 3.5+) event.
HDESK APIENTRY NtUserOpenDesktop(POBJECT_ATTRIBUTES ObjectAttributes, DWORD dwFlags, ACCESS_MASK dwDesiredAccess)
NTSTATUS FASTCALL IntCreateDesktop(OUT HDESK *phDesktop, IN POBJECT_ATTRIBUTES ObjectAttributes, IN KPROCESSOR_MODE AccessMode, IN PUNICODE_STRING lpszDesktopDevice OPTIONAL, IN LPDEVMODEW lpdmw OPTIONAL, IN DWORD dwFlags, IN ACCESS_MASK dwDesiredAccess)
HWND FASTCALL IntGetCurrentThreadDesktopWindow(VOID)
NTSTATUS NTAPI IntDesktopOkToClose(_In_ PVOID Parameters)
NTSTATUS NTAPI InitDesktopImpl(VOID)
VOID APIENTRY UserRedrawDesktop(VOID)
PKEVENT gpDesktopThreadStartedEvent
PWND FASTCALL UserGetDesktopWindow(VOID)
BOOL IntDeRegisterShellHookWindow(HWND hWnd)
HWND FASTCALL IntGetMessageWindow(VOID)
NTSTATUS FASTCALL IntHideDesktop(PDESKTOP Desktop)
VOID NTAPI DesktopThreadMain(VOID)
HDESK UserOpenInputDesktop(DWORD dwFlags, BOOL fInherit, ACCESS_MASK dwDesiredAccess)
HDESK FASTCALL IntGetDesktopObjectHandle(PDESKTOP DesktopObject)
HDESK APIENTRY NtUserGetThreadDesktop(DWORD dwThreadId, HDESK hConsoleDesktop)
VOID FASTCALL IntSetFocusMessageQueue(PUSER_MESSAGE_QUEUE NewQueue)
NTSTATUS FASTCALL co_IntShowDesktop(PDESKTOP Desktop, ULONG Width, ULONG Height, BOOL bRedraw)
HWND FASTCALL IntGetDesktopWindow(VOID)
NTSTATUS NTAPI IntDesktopObjectClose(_In_ PVOID Parameters)
BOOL IntRegisterShellHookWindow(HWND hWnd)
NTSTATUS FASTCALL IntValidateDesktopHandle(HDESK Desktop, KPROCESSOR_MODE AccessMode, ACCESS_MASK DesiredAccess, PDESKTOP *Object)
static VOID IntFreeDesktopHeap(IN PDESKTOP pdesk)
PUSER_MESSAGE_QUEUE FASTCALL IntGetFocusMessageQueue(VOID)
HDESK NTAPI NtUserResolveDesktop(IN HANDLE ProcessHandle, IN PUNICODE_STRING DesktopPath, IN BOOL bInherit, OUT HWINSTA *phWinSta)
NTSTATUS APIENTRY IntDesktopObjectParse(IN PVOID ParseObject, IN PVOID ObjectType, IN OUT PACCESS_STATE AccessState, IN KPROCESSOR_MODE AccessMode, IN ULONG Attributes, IN OUT PUNICODE_STRING CompleteName, IN OUT PUNICODE_STRING RemainingName, IN OUT PVOID Context OPTIONAL, IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, OUT PVOID *Object)
BOOL APIENTRY NtUserPaintDesktop(HDC hDC)
BOOL FASTCALL DesktopWindowProc(PWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *lResult)
VOID co_IntShellHookNotify(WPARAM Message, WPARAM wParam, LPARAM lParam)
BOOL APIENTRY NtUserSwitchDesktop(HDESK hdesk)
NTSTATUS FASTCALL IntResolveDesktop(IN PEPROCESS Process, IN PUNICODE_STRING DesktopPath, IN BOOL bInherit, OUT HWINSTA *phWinSta, OUT HDESK *phDesktop)
BOOL FASTCALL IntPaintDesktop(HDC hDC)
PWND FASTCALL IntGetThreadDesktopWindow(PTHREADINFO pti)
static NTSTATUS GetSystemVersionString(OUT PWSTR pwszzVersion, IN SIZE_T cchDest, IN BOOLEAN InSafeMode, IN BOOLEAN AppendNtSystemRoot)
BOOL FASTCALL UserMessageWindowProc(PWND pwnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *lResult)
HANDLE ghDesktopSwitchEvent
WinSta0_DesktopSwitch handle in the CSRSS process.
NTSTATUS NTAPI IntDesktopObjectOpen(_In_ PVOID Parameters)
DWORD gdwWinlogonSectionSize
HDC FASTCALL UserGetDesktopDC(ULONG DcType, BOOL bAltDc, BOOL ValidatehWnd)
NTSTATUS NTAPI IntDesktopObjectDelete(_In_ PVOID Parameters)
HDESK APIENTRY NtUserCreateDesktop(POBJECT_ATTRIBUTES ObjectAttributes, PUNICODE_STRING lpszDesktopDevice, LPDEVMODEW lpdmw, DWORD dwFlags, ACCESS_MASK dwDesiredAccess)
PDESKTOP gpdeskInputDesktop
Currently active desktop.
BOOL IntSetThreadDesktop(IN HDESK hDesktop, IN BOOL FreeOnFailure)
static HWND *FASTCALL UserBuildShellHookHwndList(PDESKTOP Desktop)
PWND FASTCALL UserGetMessageWindow(VOID)
static NTSTATUS IntUnmapDesktopView(IN PDESKTOP pdesk)
static NTSTATUS UserInitializeDesktop(PDESKTOP pdesk, PUNICODE_STRING DesktopName, PWINSTATION_OBJECT pwinsta)
PWND FASTCALL co_GetDesktopWindow(PWND pWnd)
VOID FASTCALL IntNotifyWinEvent(DWORD Event, PWND pWnd, LONG idObject, LONG idChild, DWORD flags)
LRESULT FASTCALL IntDispatchMessage(PMSG pMsg)
BOOL FASTCALL UserPostMessage(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
BOOL APIENTRY co_IntGetPeekMessage(PMSG pMsg, HWND hWnd, UINT MsgFilterMin, UINT MsgFilterMax, UINT RemoveMsg, BOOL bGMSG)
LONG NTAPI UserGetSystemMetrics(ULONG Index)
NTSTATUS GetProcessLuid(IN PETHREAD Thread OPTIONAL, IN PEPROCESS Process OPTIONAL, OUT PLUID Luid)
PTHREADINFO FASTCALL IntTID2PTI(HANDLE id)
PMONITOR NTAPI UserGetPrimaryMonitor(VOID)
BOOL FASTCALL UserDereferenceObject(PVOID Object)
NTSTATUS NTAPI IntAssignDesktopSecurityOnParse(_In_ PWINSTATION_OBJECT WinSta, _In_ PDESKTOP Desktop, _In_ PACCESS_STATE AccessState)
Assigns a security descriptor to the desktop object during a desktop object parse procedure.
NTSTATUS NTAPI IntCreateServiceSecurity(_Out_ PSECURITY_DESCRIPTOR *ServiceSd)
Creates a security descriptor for the service.
VOID IntFreeSecurityBuffer(_In_ PVOID Buffer)
Frees an allocated security buffer from UM memory that is been previously allocated by IntAllocateSec...
BOOL g_PaintDesktopVersion
BOOL FASTCALL UserSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
LONG FASTCALL co_UserSetWindowLong(HWND hWnd, DWORD Index, LONG NewValue, BOOL Ansi)
PWND FASTCALL IntCreateWindow(CREATESTRUCTW *Cs, PLARGE_STRING WindowName, PCLS Class, PWND ParentWindow, PWND OwnerWindow, PVOID acbiBuffer, PDESKTOP pdeskCreated, DWORD dwVer)
struct _WINSTATION_OBJECT * PWINSTATION_OBJECT
SIZE_T WINAPI HeapSize(HANDLE, DWORD, LPCVOID)
ENGAPI ULONG APIENTRY EngGetLastError(VOID)
ENGAPI INT APIENTRY EngMulDiv(_In_ INT a, _In_ INT b, _In_ INT c)
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
#define ERROR_INVALID_WINDOW_HANDLE
#define SM_CYVIRTUALSCREEN
#define WM_WINDOWPOSCHANGING
#define WM_SYSCOLORCHANGE
#define SM_CXVIRTUALSCREEN
struct _WINDOWPOS * PWINDOWPOS
#define SM_XVIRTUALSCREEN
#define SM_YVIRTUALSCREEN
_In_ PVOID _Out_opt_ PULONG_PTR _Outptr_opt_ PCUNICODE_STRING * ObjectName
_In_ PEPROCESS _In_ KPROCESSOR_MODE AccessMode
_In_ ACCESS_MASK _In_opt_ POBJECT_TYPE _In_ KPROCESSOR_MODE _Out_ PVOID _Out_opt_ POBJECT_HANDLE_INFORMATION HandleInformation
#define ObDereferenceObject
#define ObReferenceObject
#define DUPLICATE_SAME_ACCESS
#define PsGetCurrentProcess
#define RtlEqualLuid(Luid1, Luid2)
_In_opt_ PVOID _In_opt_ PUNICODE_STRING _In_ PSECURITY_DESCRIPTOR _In_ PACCESS_STATE AccessState
#define ZwCurrentProcess()