28 L"DDEMLUnicodeClient",
30 L"DDEMLUnicodeServer",
160 RtlInitEmptyUnicodeString(pustrOut,
NULL, 0);
166 ustrCopy = *pustrUnsafe;
179 pustrOut->MaximumLength = pustrOut->Length = 0;
180 pustrOut->Buffer = ustrCopy.
Buffer;
185 pustrOut->Length = ustrCopy.
Length;
186 pustrOut->MaximumLength = pustrOut->Length +
sizeof(
WCHAR);
190 pustrOut->MaximumLength,
192 if (!pustrOut->Buffer)
200 pustrOut->Buffer[pustrOut->Length /
sizeof(
WCHAR)] =
L'\0';
206 if (pustrOut->Buffer)
224 if (
Class->lpszClientUnicodeMenuName !=
NULL &&
Class->MenuNameIsString)
246 CallProc =
Class->spcpdFirst;
247 while (CallProc !=
NULL)
254 CallProc = NextCallProc;
261 if (
Class->atomClassName)
264 if (
Class->atomNVClassName)
289 pDesk =
Class->rpdeskParent;
316 pi->pclsPrivateList =
Class->pclsNext;
328 pi->pclsPublicList =
Class->pclsNext;
343 PWSTR AtomName = szBuf;
346 if (ClassName->Length != 0)
348 if (ClassName->Length +
sizeof(
UNICODE_NULL) >
sizeof(szBuf))
354 if (AtomName ==
NULL)
369 if (AtomName != szBuf)
380 AtomName = ClassName->Buffer;
387 if (AtomName != ClassName->Buffer && AtomName != szBuf)
435 BaseClass =
Class->pclsBase;
457 if (ClassName->Length > 0)
468 if (
IS_ATOM(ClassName->Buffer))
518 Ret =
Class->lpfnWndProc;
534 if ( Ret !=
Class->lpfnWndProc ||
542 return (gcpd ? gcpd : Ret);
562 Class->CSF_flags &= ~CSF_SERVERSIDEPROC;
563 Class->Unicode = !Ansi;
577 Class->lpfnWndProc = chWndProc;
599 Class->lpfnWndProc = chWndProc;
601 Class->CSF_flags &= ~CSF_ANSIPROC;
606 Class->Unicode = !Ansi;
611 Class->CSF_flags &= ~CSF_ANSIPROC;
615 chWndProc =
Class->lpfnWndProc;
620 Class->Unicode = !Ansi;
621 Class->lpfnWndProc = chWndProc;
638 ASSERT(BaseClass->pclsBase == BaseClass);
640 if (BaseClass->rpdeskParent ==
Desktop)
648 if (BaseClass->rpdeskParent ==
NULL)
650 ASSERT(BaseClass->cWndReferenceCount == 0);
664 Class = BaseClass->pclsClone;
682 ClassSize =
sizeof(*BaseClass) + (
SIZE_T)BaseClass->cbclsExtra;
700 TRACE(
"Clone Class 0x%p hM 0x%p\n %S\n",
Class,
Class->hModule,
Class->lpszClientUnicodeMenuName);
713 Class->cWndReferenceCount = 0;
715 if (BaseClass->rpdeskParent ==
NULL)
724 Class->pclsNext = BaseClass->pclsNext;
731 BaseClass->pclsBase =
NULL;
732 BaseClass->pclsClone =
NULL;
739 Class->pclsBase = BaseClass;
740 Class->pclsNext = BaseClass->pclsClone;
759 ASSERT(BaseClass->pclsBase == BaseClass);
774 Class->cWndReferenceCount++;
796 *CloneLink =
Class->pclsNext;
797 Class->pclsClone =
Class->pclsBase->pclsClone;
801 Class->pclsNext = (*BaseClassLink)->pclsNext;
804 Clone =
Class->pclsClone;
805 while (Clone !=
NULL)
824 PCLS *PrevLink, BaseClass, CurrentClass;
828 BaseClass =
Class->pclsBase;
830 if (--
Class->cWndReferenceCount == 0)
832 if (BaseClass ==
Class)
844 PrevLink = &
pi->pclsPublicList;
846 PrevLink = &
pi->pclsPrivateList;
848 CurrentClass = *PrevLink;
849 while (CurrentClass != BaseClass)
854 CurrentClass = CurrentClass->
pclsNext;
857 ASSERT(*PrevLink == BaseClass);
879 while (CurrentClass !=
Class)
884 CurrentClass = CurrentClass->
pclsNext;
913 ClassSize =
sizeof(*Class) + (
SIZE_T)
Class->cbclsExtra;
917 if (NewClass !=
NULL)
936 *ClassLinkPtr = &NewClass->
pclsNext;
968 NextClass =
Class->pclsNext;
973 Class->cWndReferenceCount == 0)
1027 &
pi->pclsPrivateList,
1033 &
pi->pclsPublicList,
1038 ERR(
"Failed to move process classes from desktop 0x%p to the shared heap!\n",
Desktop);
1063 TRACE(
"lpwcx=%p ClassName=%wZ MenuName=%wZ dwFlags=%08x Desktop=%p pi=%p\n",
1069 ERR(
"Failed to register class atom!\n");
1076 ERR(
"Failed to register version class atom!\n");
1081 ClassSize =
sizeof(*Class) + lpwcx->cbClsExtra;
1082 if (MenuName->Length != 0)
1086 if (pszMenuName ==
NULL)
1100 TRACE(
"This CLASS has no Desktop to heap from! Atom %u\n",
Atom);
1112 Class->atomClassName = verAtom;
1124 PWSTR pszMenuNameBuffer = pszMenuName;
1130 Class->lpfnWndProc = lpwcx->lpfnWndProc;
1131 Class->style = lpwcx->style;
1132 Class->cbclsExtra = lpwcx->cbClsExtra;
1133 Class->cbwndExtra = lpwcx->cbWndExtra;
1134 Class->hModule = lpwcx->hInstance;
1139 Class->hbrBackground = lpwcx->hbrBackground;
1142 if (pszMenuNameBuffer !=
NULL)
1146 Class->lpszClientUnicodeMenuName = pszMenuNameBuffer;
1152 pszMenuNameBuffer += (MenuName->Length /
sizeof(
WCHAR)) + 1;
1155 Class->lpszClientUnicodeMenuName = MenuName->Buffer;
1158 if (pszMenuNameBuffer !=
NULL)
1162 Class->lpszClientAnsiMenuName = (
PSTR)pszMenuNameBuffer;
1170 ERR(
"Failed to convert unicode menu name to ansi!\n");
1177 Class->lpszClientAnsiMenuName = (
PSTR)MenuName->Buffer;
1180 Class->lpszMenuName =
Class->lpszClientUnicodeMenuName;
1210 Class->CSF_flags &= ~CSF_ANSIPROC;
1229 ERR(
"Failed creating the class: 0x%x\n",
Status);
1233 if (pszMenuName !=
NULL)
1247 ERR(
"Failed to allocate class on Desktop 0x%p\n",
Desktop);
1249 if (pszMenuName !=
NULL)
1258 TRACE(
"Created class 0x%p with name %wZ and proc 0x%p for atom 0x%x and version atom 0x%x and hInstance 0x%p, global %u\n",
1287 PrevLink = &
Class->pclsNext;
1297IntGetAtomFromStringOrAtom(
1303 if (ClassName->Length != 0)
1306 PWSTR AtomName = szBuf;
1312 if (ClassName->Length +
sizeof(
UNICODE_NULL) >
sizeof(szBuf))
1317 if (AtomName ==
NULL)
1332 if (AtomName != szBuf)
1343 if (AtomName != szBuf)
1360 if (ClassName->Buffer)
1388 if (IntGetAtomFromStringOrAtom(ClassName, &
Atom) &&
1400 &
pi->pclsPrivateList,
1411 &
pi->pclsPublicList,
1421 &
pi->pclsPrivateList,
1431 &
pi->pclsPublicList,
1468 TRACE(
"Finding Class %wZ for hInstance 0x%p\n", ClassName,
hInstance);
1480 ERR(
"Class 0x%p not found\n", ClassName->
Buffer);
1484 ERR(
"Class \"%wZ\" not found\n", ClassName);
1490 TRACE(
"Referencing Class 0x%p with atom 0x%x\n",
Class, ClassAtom);
1496 ERR(
"Failed to reference window class!\n");
1524 if ( IntGetAtomFromStringOrAtom( ClassVersion, &ClassAtom) &&
1530 &
pi->pclsPrivateList,
1536 TRACE(
"Local Class 0x%x does already exist!\n", ClassAtom);
1545 &
pi->pclsPublicList,
1550 TRACE(
"Global Class 0x%x does already exist!\n", ClassAtom);
1572 List = &
pi->pclsPublicList;
1574 List = &
pi->pclsPrivateList;
1580 Ret =
Class->atomNVClassName;
1584 ERR(
"UserRegisterClass: Yes, that is right, you have no Class!\n");
1613 TRACE(
"UserUnregisterClass: No Class found.\n");
1619 if (
Class->cWndReferenceCount != 0 ||
1622 TRACE(
"UserUnregisterClass: Class has a Window. Ct %u : Clone 0x%p\n",
Class->cWndReferenceCount,
Class->pclsClone);
1636 TRACE(
"UserUnregisterClass: Good Exit!\n");
1637 Class->atomClassName = 0;
1642 ERR(
"UserUnregisterClass: Can not deregister Class Atom.\n");
1653 WCHAR szStaticTemp[32];
1676 Class->atomClassName,
1710 szTemp = szStaticTemp;
1733 BufLen = ClassName->MaximumLength;
1758 if (Ansi && szTemp !=
NULL && szTemp != szStaticTemp)
1775 if (MenuName->Length != 0)
1784 if (strBufW !=
NULL)
1819 Class->lpszClientUnicodeMenuName = strBufW;
1827 Class->lpszClientUnicodeMenuName = strBufW;
1836 ERR(
"Failed to copy class menu name!\n");
1849 Class->lpszClientUnicodeMenuName = MenuName->Buffer;
1850 Class->lpszClientAnsiMenuName = (
PSTR)MenuName->Buffer;
1857 Class->lpszClientUnicodeMenuName = MenuName->Buffer;
1858 Class->lpszClientAnsiMenuName = (
PSTR)MenuName->Buffer;
1911 TRACE(
"SetClassLong(%d, %x)\n",
Index, NewLong);
1955 Class->hbrBackground = (HBRUSH)NewLong;
1961 Class->hbrBackground = (HBRUSH)NewLong;
1996 Class->spcur = NewCursor;
2006 Class->spcur = NewCursor;
2055 Class->CSF_flags &= ~CSF_CACHEDSMICON;
2058 if (NewLong && !
Class->spicnSm)
2072 if (!SmallIconHandle)
2082 if (SmallIconHandle)
2090 Class->spicn = NewIcon;
2100 Class->spicn = NewIcon;
2106 Class->spicnSm = NewSmallIcon;
2142 if (!SmallIconHandle)
2152 if (SmallIconHandle)
2156 NewIconFromCache =
TRUE;
2160 ERR(
"Failed getting a small icon for the class.\n");
2183 if (NewIconFromCache)
2186 Class->CSF_flags &= ~CSF_CACHEDSMICON;
2187 Class->spicnSm = NewSmallIcon;
2197 if (NewIconFromCache)
2200 Class->CSF_flags &= ~CSF_CACHEDSMICON;
2201 Class->spicnSm = NewSmallIcon;
2227 ERR(
"Setting the class menu name failed!\n");
2287 lpwcx->style =
Class->style;
2291 lpwcx->style &= ~CS_GLOBALCLASS;
2295 lpwcx->cbClsExtra =
Class->cbclsExtra;
2296 lpwcx->cbWndExtra =
Class->cbwndExtra;
2300 lpwcx->hbrBackground =
Class->hbrBackground;
2306 lpwcx->lpszMenuName =
Class->lpszClientUnicodeMenuName;
2313 if (
Class->lpszClientUnicodeMenuName !=
NULL &&
2314 Class->MenuNameIsString)
2322 lpwcx->hInstance =
NULL;
2366 ClassName.Length = 0;
2367 ClassName.MaximumLength = 0;
2396 ERR(
"SYSTEMCUR(ARROW) == NULL, should not happen!!\n");
2405 if (hBrush <= (HBRUSH)COLOR_MENUBAR)
2432 ERR(
"!!! Registering system class failed!\n");
2464 UNICODE_STRING CapturedName = {0}, CapturedMenuName = {0}, CapturedVersion = {0};
2471 ERR(
"NtUserRegisterClassExWOW Bad Flags!\n");
2478 TRACE(
"NtUserRegisterClassExWOW ClsN %wZ\n",ClassName);
2490 ERR(
"NtUserRegisterClassExWOW Wrong cbSize!\n");
2510 if ( (CapturedName.
Length & 1) ||
2511 (CapturedMenuName.Length & 1) ||
2514 CapturedMenuName.Length +
sizeof(
CLS))
2519 ERR(
"NtUserRegisterClassExWOW Invalid Parameter Error!\n");
2523 if (CapturedName.
Length != 0)
2533 ERR(
"NtUserRegisterClassExWOW ClassName Error!\n");
2538 if (CapturedVersion.Length != 0)
2541 CapturedVersion.Length,
2546 if (!
IS_ATOM(CapturedVersion.Buffer))
2548 ERR(
"NtUserRegisterClassExWOW ClassName Error!\n");
2553 if (CapturedMenuName.Length != 0)
2556 CapturedMenuName.Length,
2559 else if (CapturedMenuName.Buffer !=
NULL &&
2562 ERR(
"NtUserRegisterClassExWOW MenuName Error!\n");
2571 ERR(
"NtUserRegisterClassExWOW WndProc is CallProc!!\n");
2574 TRACE(
"NtUserRegisterClassExWOW MnuN %wZ\n",&CapturedMenuName);
2578 ERR(
"NtUserRegisterClassExWOW Exception Error!\n");
2597 TRACE(
"NtUserRegisterClassExWOW Null Return!\n");
2648 if (
Value.Length & 1)
2653 if (
Value.Length != 0)
2686 if (Ret && Ret != dwNewLong)
2719NtUserSetClassLongPtr(
2757 ERR(
"Error capturing the class name\n");
2813 ERR(
"Error capturing the class name\n");
2840 ClassAtom =
Class->atomNVClassName;
2863 Ret = (
BOOL)ClassAtom;
2906 CapturedClassName = *ClassName;
2907 if (CapturedClassName.
Length != 0)
2910 CapturedClassName.
Length,
2923 ClassName->Length = CapturedClassName.
Length;
2954 ERR(
"Error capturing the class name\n");
#define DBG_DEFAULT_CHANNEL(ch)
ULONG_PTR FASTCALL UserGetCPD(PVOID pvClsWnd, GETCPD Flags, ULONG_PTR ProcIn)
BOOLEAN DestroyCallProc(_Inout_ PVOID Object)
while(CdLookupNextInitialFileDirent(IrpContext, Fcb, FileContext))
static __inline BOOL IsCallProcHandle(IN WNDPROC lpWndProc)
void FASTCALL DceFreeClassDCE(PDCE)
#define ERROR_NOT_ENOUGH_MEMORY
#define NT_SUCCESS(StatCode)
#define ERROR_INVALID_PARAMETER
#define ERROR_ACCESS_DENIED
static const WCHAR Cleanup[]
#define InterlockedExchangePointer(Target, Value)
UNICODE_STRING * PUNICODE_STRING
#define ExAllocatePoolWithTag(hernya, size, tag)
ANSI_STRING * PANSI_STRING
VOID NTAPI ProbeForRead(IN CONST VOID *Address, IN SIZE_T Length, IN ULONG Alignment)
VOID NTAPI ProbeForWrite(IN PVOID Address, IN SIZE_T Length, IN ULONG Alignment)
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
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 ICLASS_TO_MASK(iCls)
struct _PROCESSINFO * GetW32ProcessInfo(VOID)
#define GETPFNCLIENTW(fnid)
#define GETPFNCLIENTA(fnid)
#define UserHMGetHandle(obj)
struct _THREADINFO * GetW32ThreadInfo(VOID)
#define GETPFNSERVER(fnid)
#define CURSORF_FROMRESOURCE
#define CSF_SERVERSIDEPROC
#define CSF_WOWDEFERDESTROY
#define EXCEPTION_EXECUTE_HANDLER
HGDIOBJ FASTCALL IntGetSysColorBrush(INT Object)
#define ExFreePoolWithTag(_P, _T)
NTSYSAPI NTSTATUS NTAPI RtlAddAtomToAtomTable(_In_ PRTL_ATOM_TABLE AtomTable, _In_ PWSTR AtomName, _Out_ PRTL_ATOM Atom)
NTSYSAPI NTSTATUS NTAPI RtlLookupAtomInAtomTable(_In_ PRTL_ATOM_TABLE AtomTable, _In_ PWSTR AtomName, _Out_ PRTL_ATOM Atom)
NTSYSAPI NTSTATUS NTAPI RtlDeleteAtomFromAtomTable(_In_ PRTL_ATOM_TABLE AtomTable, _In_ RTL_ATOM Atom)
NTSYSAPI NTSTATUS NTAPI RtlQueryAtomInAtomTable(_In_ PRTL_ATOM_TABLE AtomTable, _In_ RTL_ATOM Atom, _Out_opt_ PULONG RefCount, _Out_opt_ PULONG PinCount, _Out_opt_z_bytecap_(*NameLength) PWSTR AtomName, _Inout_opt_ PULONG NameLength)
#define _Must_inspect_result_
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToAnsiString(PANSI_STRING DestinationString, PUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
_In_ ULONG _In_ ULONG Offset
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
BOOL UserPaintCaption(PWND pWnd, INT Flags)
VOID FASTCALL UserLeave(VOID)
VOID FASTCALL UserEnterShared(VOID)
VOID FASTCALL UserEnterExclusive(VOID)
struct _PROCESSINFO * PPROCESSINFO
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
#define _SEH2_YIELD(__stmt)
#define ProbeForWriteUnicodeString(Ptr)
#define ProbeForReadUint(Ptr)
#define ProbeForReadUnicodeString(Ptr)
#define STATUS_BUFFER_TOO_SMALL
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
#define __in_data_source(src_sym)
PULONG MinorVersion OPTIONAL
WNDPROC pfnClientPrevious
struct _CALLPROCDATA * spcpdNext
struct _CURICON_OBJECT * spcur
struct _DESKTOP * rpdeskParent
struct _CURICON_OBJECT * spicn
struct _CURICON_OBJECT * spicnSm
DWORD dwRegisteredClasses
struct _CLS * pclsPublicList
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define STATUS_INVALID_PARAMETER
#define STATUS_INSUFFICIENT_RESOURCES
#define STATUS_OBJECT_NAME_NOT_FOUND
#define WriteUnalignedUlongPtr
__forceinline unsigned long ReadUnalignedU32(const unsigned long *p)
#define ReadUnalignedUlongPtr
__forceinline void WriteUnalignedU32(unsigned long *p, unsigned long val)
PWND FASTCALL UserGetWindowObject(HWND hWnd)
static __inline PVOID UserHeapAlloc(SIZE_T Bytes)
static __inline PVOID UserHeapAddressToUser(PVOID lpMem)
static __inline BOOL UserHeapFree(PVOID lpMem)
static int Link(const char **args)
_In_ WDFCOLLECTION _In_ ULONG Index
_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
_Must_inspect_result_ _In_ WDFCMRESLIST List
#define W32PF_CLASSESREGISTERED
VOID FASTCALL SetLastNtError(_In_ NTSTATUS Status)
HANDLE FASTCALL co_IntCopyImage(HANDLE hnd, UINT type, INT desiredx, INT desiredy, UINT flags)
static VOID IntFreeClassMenuName(IN OUT PCLS Class)
INT UserGetClassName(IN PCLS Class, IN OUT PUNICODE_STRING ClassName, IN RTL_ATOM Atom, IN BOOL Ansi)
static VOID IntMakeCloneBaseClass(IN OUT PCLS Class, IN OUT PCLS *BaseClassLink, IN OUT PCLS *CloneLink)
static BOOL IntMoveClassToSharedHeap(IN OUT PCLS Class, IN OUT PCLS **ClassLinkPtr)
static PCLS IntFindClass(IN RTL_ATOM Atom, IN HINSTANCE hInstance, IN PCLS *ClassList, OUT PCLS **Link OPTIONAL)
RTL_ATOM UserRegisterClass(IN CONST WNDCLASSEXW *lpwcx, IN PUNICODE_STRING ClassName, IN PUNICODE_STRING ClassVersion, IN PUNICODE_STRING MenuName, IN DWORD fnID, IN DWORD dwFlags)
REGISTER_SYSCLASS DefaultServerClasses[]
INT APIENTRY NtUserGetClassName(IN HWND hWnd, IN BOOL Real, OUT PUNICODE_STRING ClassName)
VOID UserAddCallProcToClass(IN OUT PCLS Class, IN PCALLPROCDATA CallProc)
ULONG_PTR UserSetClassLongPtr(IN PCLS Class, IN INT Index, IN ULONG_PTR NewLong, IN BOOL Ansi, IN ULONG Size)
WORD APIENTRY NtUserSetClassWord(HWND hWnd, INT nIndex, WORD wNewWord)
PCLS IntReferenceClass(IN OUT PCLS BaseClass, IN OUT PCLS *ClassLink, IN PDESKTOP Desktop)
static PCLS IntGetClassForDesktop(IN OUT PCLS BaseClass, IN OUT PCLS *ClassLink, IN PDESKTOP Desktop)
BOOL IntCheckProcessDesktopClasses(IN PDESKTOP Desktop, IN BOOL FreeOnFailure)
BOOL FASTCALL RegisterControlAtoms(VOID)
void FASTCALL DestroyProcessClasses(PPROCESSINFO Process)
VOID IntDereferenceClass(IN OUT PCLS Class, IN PDESKTOPINFO Desktop, IN PPROCESSINFO pi)
static BOOL UserGetClassInfo(IN PCLS Class, OUT PWNDCLASSEXW lpwcx, IN BOOL Ansi, HINSTANCE hInstance)
static PWSTR ControlsList[]
static BOOL IntRegisterClassAtom(IN PUNICODE_STRING ClassName, OUT RTL_ATOM *pAtom)
PCLS APIENTRY NtUserGetWOWClass(HINSTANCE hInstance, PUNICODE_STRING ClassName)
ULONG_PTR APIENTRY IntNtUserSetClassLongPtr(HWND hWnd, INT Offset, ULONG_PTR dwNewLong, BOOL Ansi, ULONG Size)
RTL_ATOM IntGetClassAtom(_In_ PUNICODE_STRING ClassName, IN HINSTANCE hInstance OPTIONAL, IN PPROCESSINFO pi OPTIONAL, OUT PCLS *BaseClass OPTIONAL, OUT PCLS **Link OPTIONAL)
static BOOL IntSetClassMenuName(IN PCLS Class, IN PUNICODE_STRING MenuName)
_Must_inspect_result_ NTSTATUS NTAPI ProbeAndCaptureUnicodeStringOrAtom(_Out_ _When_(return >=0, _At_(pustrOut->Buffer, _Post_ _Notnull_)) PUNICODE_STRING pustrOut, __in_data_source(USER_MODE) _In_ PUNICODE_STRING pustrUnsafe)
WNDPROC FASTCALL IntGetClassWndProc(PCLS Class, BOOL Ansi)
BOOL APIENTRY NtUserUnregisterClass(IN PUNICODE_STRING ClassNameOrAtom, IN HINSTANCE hInstance, OUT PCLSMENUNAME pClassMenuName)
PCLS IntGetAndReferenceClass(PUNICODE_STRING ClassName, HINSTANCE hInstance, BOOL bDesktopThread)
static BOOL IntSetClassAtom(IN OUT PCLS Class, IN PUNICODE_STRING ClassName)
static VOID IntCheckDesktopClasses(IN PDESKTOP Desktop, IN OUT PCLS *ClassList, IN BOOL FreeOnFailure, OUT BOOL *Ret)
PCLS FASTCALL IntCreateClass(IN CONST WNDCLASSEXW *lpwcx, IN PUNICODE_STRING ClassName, IN PUNICODE_STRING ClassVersion, IN PUNICODE_STRING MenuName, IN DWORD fnID, IN DWORD dwFlags, IN PDESKTOP Desktop, IN PPROCESSINFO pi)
RTL_ATOM APIENTRY NtUserRegisterClassExWOW(WNDCLASSEXW *lpwcx, PUNICODE_STRING ClassName, PUNICODE_STRING ClsVersion, PCLSMENUNAME pClassMenuName, DWORD fnID, DWORD Flags, LPDWORD pWow)
BOOL FASTCALL UserRegisterSystemClasses(VOID)
BOOL UserUnregisterClass(IN PUNICODE_STRING ClassName, IN HINSTANCE hInstance, OUT PCLSMENUNAME pClassMenuName)
static NTSTATUS IntDeregisterClassAtom(IN RTL_ATOM Atom)
static struct @5131 FnidToiCls[]
static VOID IntDestroyClass(IN OUT PCLS Class)
static ULONG_PTR IntGetSetClassLongPtr(PCLS Class, ULONG Index, ULONG_PTR NewValue, ULONG Size)
BOOL APIENTRY NtUserGetClassInfo(HINSTANCE hInstance, PUNICODE_STRING ClassName, LPWNDCLASSEXW lpWndClassEx, LPWSTR *ppszMenuName, BOOL bAnsi)
BOOL FASTCALL LookupFnIdToiCls(int FnId, int *iCls)
static WNDPROC FASTCALL IntSetClassWndProc(IN OUT PCLS Class, IN WNDPROC WndProc, IN BOOL Ansi)
ULONG_PTR APIENTRY NtUserSetClassLong(_In_ HWND hWnd, _In_ INT Offset, _In_ ULONG dwNewLong, _In_ BOOL Ansi)
PCURICON_OBJECT FASTCALL UserGetCurIconObject(HCURSOR hCurIcon)
BOOLEAN IntDestroyCurIconObject(_In_ PVOID Object)
PTHREADINFO gptiDesktopThread
static __inline PVOID DesktopHeapAlloc(IN PDESKTOP Desktop, IN SIZE_T Bytes)
static __inline BOOL DesktopHeapFree(IN PDESKTOP Desktop, IN PVOID lpMem)
LONG NTAPI UserGetSystemMetrics(ULONG Index)
PVOID UserGetObject(PUSER_HANDLE_TABLE ht, HANDLE handle, HANDLE_TYPE type)
BOOL FASTCALL UserDereferenceObject(PVOID Object)
PUSER_HANDLE_TABLE gHandleTable
BOOL FASTCALL UserObjectInDestroy(HANDLE h)
VOID FASTCALL UserReferenceObject(PVOID obj)
PRTL_ATOM_TABLE gAtomTable
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
ENGAPI ULONG APIENTRY EngGetLastError(VOID)
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
#define ERROR_CLASS_HAS_WINDOWS
#define ERROR_CLASS_ALREADY_EXISTS
#define ERROR_INVALID_INDEX
#define ERROR_INVALID_CURSOR_HANDLE
#define ERROR_CLASS_DOES_NOT_EXIST
#define ERROR_INVALID_FLAGS
#define ERROR_INVALID_ICON_HANDLE
#define LR_COPYFROMRESOURCE
#define IS_INTRESOURCE(i)
struct _WNDCLASSEXA * PWNDCLASSEXA
LRESULT(CALLBACK * WNDPROC)(HWND, UINT, WPARAM, LPARAM)
#define GCLP_HBRBACKGROUND
_Must_inspect_result_ _In_ ULONG Flags
#define RtlUnicodeStringToAnsiSize(String)