26 L"DDEMLUnicodeClient",
28 L"DDEMLUnicodeServer",
158 RtlInitEmptyUnicodeString(pustrOut,
NULL, 0);
164 ustrCopy = *pustrUnsafe;
177 pustrOut->MaximumLength = pustrOut->Length = 0;
178 pustrOut->Buffer = ustrCopy.
Buffer;
183 pustrOut->Length = ustrCopy.
Length;
184 pustrOut->MaximumLength = pustrOut->Length +
sizeof(
WCHAR);
188 pustrOut->MaximumLength,
190 if (!pustrOut->Buffer)
198 pustrOut->Buffer[pustrOut->Length /
sizeof(
WCHAR)] =
L'\0';
204 if (pustrOut->Buffer)
222 if (
Class->lpszClientUnicodeMenuName !=
NULL &&
Class->MenuNameIsString)
244 CallProc =
Class->spcpdFirst;
245 while (CallProc !=
NULL)
252 CallProc = NextCallProc;
259 if (
Class->atomClassName)
262 if (
Class->atomNVClassName)
287 pDesk =
Class->rpdeskParent;
314 pi->pclsPrivateList =
Class->pclsNext;
326 pi->pclsPublicList =
Class->pclsNext;
341 PWSTR AtomName = szBuf;
344 if (ClassName->Length != 0)
346 if (ClassName->Length +
sizeof(
UNICODE_NULL) >
sizeof(szBuf))
352 if (AtomName ==
NULL)
367 if (AtomName != szBuf)
378 AtomName = ClassName->Buffer;
385 if (AtomName != ClassName->Buffer && AtomName != szBuf)
433 BaseClass =
Class->pclsBase;
455 if (ClassName->Length > 0)
466 if (
IS_ATOM(ClassName->Buffer))
516 Ret =
Class->lpfnWndProc;
532 if ( Ret !=
Class->lpfnWndProc ||
540 return (gcpd ? gcpd : Ret);
560 Class->CSF_flags &= ~CSF_SERVERSIDEPROC;
561 Class->Unicode = !Ansi;
575 Class->lpfnWndProc = chWndProc;
597 Class->lpfnWndProc = chWndProc;
599 Class->CSF_flags &= ~CSF_ANSIPROC;
604 Class->Unicode = !Ansi;
609 Class->CSF_flags &= ~CSF_ANSIPROC;
613 chWndProc =
Class->lpfnWndProc;
618 Class->Unicode = !Ansi;
619 Class->lpfnWndProc = chWndProc;
636 ASSERT(BaseClass->pclsBase == BaseClass);
638 if (BaseClass->rpdeskParent ==
Desktop)
646 if (BaseClass->rpdeskParent ==
NULL)
648 ASSERT(BaseClass->cWndReferenceCount == 0);
662 Class = BaseClass->pclsClone;
680 ClassSize =
sizeof(*BaseClass) + (
SIZE_T)BaseClass->cbclsExtra;
698 TRACE(
"Clone Class 0x%p hM 0x%p\n %S\n",
Class,
Class->hModule,
Class->lpszClientUnicodeMenuName);
711 Class->cWndReferenceCount = 0;
713 if (BaseClass->rpdeskParent ==
NULL)
722 Class->pclsNext = BaseClass->pclsNext;
729 BaseClass->pclsBase =
NULL;
730 BaseClass->pclsClone =
NULL;
737 Class->pclsBase = BaseClass;
738 Class->pclsNext = BaseClass->pclsClone;
757 ASSERT(BaseClass->pclsBase == BaseClass);
772 Class->cWndReferenceCount++;
794 *CloneLink =
Class->pclsNext;
795 Class->pclsClone =
Class->pclsBase->pclsClone;
799 Class->pclsNext = (*BaseClassLink)->pclsNext;
802 Clone =
Class->pclsClone;
803 while (Clone !=
NULL)
822 PCLS *PrevLink, BaseClass, CurrentClass;
826 BaseClass =
Class->pclsBase;
828 if (--
Class->cWndReferenceCount == 0)
830 if (BaseClass ==
Class)
842 PrevLink = &
pi->pclsPublicList;
844 PrevLink = &
pi->pclsPrivateList;
846 CurrentClass = *PrevLink;
847 while (CurrentClass != BaseClass)
852 CurrentClass = CurrentClass->
pclsNext;
855 ASSERT(*PrevLink == BaseClass);
877 while (CurrentClass !=
Class)
882 CurrentClass = CurrentClass->
pclsNext;
911 ClassSize =
sizeof(*Class) + (
SIZE_T)
Class->cbclsExtra;
915 if (NewClass !=
NULL)
934 *ClassLinkPtr = &NewClass->
pclsNext;
966 NextClass =
Class->pclsNext;
971 Class->cWndReferenceCount == 0)
1025 &
pi->pclsPrivateList,
1031 &
pi->pclsPublicList,
1036 ERR(
"Failed to move process classes from desktop 0x%p to the shared heap!\n",
Desktop);
1061 TRACE(
"lpwcx=%p ClassName=%wZ MenuName=%wZ dwFlags=%08x Desktop=%p pi=%p\n",
1067 ERR(
"Failed to register class atom!\n");
1074 ERR(
"Failed to register version class atom!\n");
1079 ClassSize =
sizeof(*Class) + lpwcx->cbClsExtra;
1080 if (MenuName->Length != 0)
1084 if (pszMenuName ==
NULL)
1098 TRACE(
"This CLASS has no Desktop to heap from! Atom %u\n",
Atom);
1110 Class->atomClassName = verAtom;
1122 PWSTR pszMenuNameBuffer = pszMenuName;
1128 Class->lpfnWndProc = lpwcx->lpfnWndProc;
1129 Class->style = lpwcx->style;
1130 Class->cbclsExtra = lpwcx->cbClsExtra;
1131 Class->cbwndExtra = lpwcx->cbWndExtra;
1132 Class->hModule = lpwcx->hInstance;
1137 Class->hbrBackground = lpwcx->hbrBackground;
1140 if (pszMenuNameBuffer !=
NULL)
1144 Class->lpszClientUnicodeMenuName = pszMenuNameBuffer;
1150 pszMenuNameBuffer += (MenuName->Length /
sizeof(
WCHAR)) + 1;
1153 Class->lpszClientUnicodeMenuName = MenuName->Buffer;
1156 if (pszMenuNameBuffer !=
NULL)
1160 Class->lpszClientAnsiMenuName = (
PSTR)pszMenuNameBuffer;
1168 ERR(
"Failed to convert unicode menu name to ansi!\n");
1175 Class->lpszClientAnsiMenuName = (
PSTR)MenuName->Buffer;
1178 Class->lpszMenuName =
Class->lpszClientUnicodeMenuName;
1208 Class->CSF_flags &= ~CSF_ANSIPROC;
1227 ERR(
"Failed creating the class: 0x%x\n",
Status);
1231 if (pszMenuName !=
NULL)
1245 ERR(
"Failed to allocate class on Desktop 0x%p\n",
Desktop);
1247 if (pszMenuName !=
NULL)
1256 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",
1285 PrevLink = &
Class->pclsNext;
1295IntGetAtomFromStringOrAtom(
1301 if (ClassName->Length != 0)
1304 PWSTR AtomName = szBuf;
1310 if (ClassName->Length +
sizeof(
UNICODE_NULL) >
sizeof(szBuf))
1315 if (AtomName ==
NULL)
1330 if (AtomName != szBuf)
1341 if (AtomName != szBuf)
1378 if (IntGetAtomFromStringOrAtom(ClassName, &
Atom) &&
1390 &
pi->pclsPrivateList,
1401 &
pi->pclsPublicList,
1411 &
pi->pclsPrivateList,
1421 &
pi->pclsPublicList,
1458 TRACE(
"Finding Class %wZ for hInstance 0x%p\n", ClassName,
hInstance);
1470 ERR(
"Class 0x%p not found\n", ClassName->
Buffer);
1474 ERR(
"Class \"%wZ\" not found\n", ClassName);
1480 TRACE(
"Referencing Class 0x%p with atom 0x%x\n",
Class, ClassAtom);
1486 ERR(
"Failed to reference window class!\n");
1514 if ( IntGetAtomFromStringOrAtom( ClassVersion, &ClassAtom) &&
1520 &
pi->pclsPrivateList,
1526 TRACE(
"Local Class 0x%x does already exist!\n", ClassAtom);
1535 &
pi->pclsPublicList,
1540 TRACE(
"Global Class 0x%x does already exist!\n", ClassAtom);
1562 List = &
pi->pclsPublicList;
1564 List = &
pi->pclsPrivateList;
1570 Ret =
Class->atomNVClassName;
1574 ERR(
"UserRegisterClass: Yes, that is right, you have no Class!\n");
1603 TRACE(
"UserUnregisterClass: No Class found.\n");
1609 if (
Class->cWndReferenceCount != 0 ||
1612 TRACE(
"UserUnregisterClass: Class has a Window. Ct %u : Clone 0x%p\n",
Class->cWndReferenceCount,
Class->pclsClone);
1626 TRACE(
"UserUnregisterClass: Good Exit!\n");
1627 Class->atomClassName = 0;
1632 ERR(
"UserUnregisterClass: Can not deregister Class Atom.\n");
1643 WCHAR szStaticTemp[32];
1666 Class->atomClassName,
1700 szTemp = szStaticTemp;
1723 BufLen = ClassName->MaximumLength;
1748 if (Ansi && szTemp !=
NULL && szTemp != szStaticTemp)
1765 if (MenuName->Length != 0)
1774 if (strBufW !=
NULL)
1809 Class->lpszClientUnicodeMenuName = strBufW;
1817 Class->lpszClientUnicodeMenuName = strBufW;
1826 ERR(
"Failed to copy class menu name!\n");
1839 Class->lpszClientUnicodeMenuName = MenuName->Buffer;
1840 Class->lpszClientAnsiMenuName = (
PSTR)MenuName->Buffer;
1847 Class->lpszClientUnicodeMenuName = MenuName->Buffer;
1848 Class->lpszClientAnsiMenuName = (
PSTR)MenuName->Buffer;
1877 TRACE(
"SetClassLong(%d, %x)\n",
Index, NewLong);
1927 Class->hbrBackground = (HBRUSH)NewLong;
1933 Class->hbrBackground = (HBRUSH)NewLong;
1968 Class->spcur = NewCursor;
1978 Class->spcur = NewCursor;
2027 Class->CSF_flags &= ~CSF_CACHEDSMICON;
2030 if (NewLong && !
Class->spicnSm)
2044 if (!SmallIconHandle)
2054 if (SmallIconHandle)
2062 Class->spicn = NewIcon;
2072 Class->spicn = NewIcon;
2078 Class->spicnSm = NewSmallIcon;
2114 if (!SmallIconHandle)
2124 if (SmallIconHandle)
2128 NewIconFromCache =
TRUE;
2132 ERR(
"Failed getting a small icon for the class.\n");
2155 if (NewIconFromCache)
2158 Class->CSF_flags &= ~CSF_CACHEDSMICON;
2159 Class->spicnSm = NewSmallIcon;
2169 if (NewIconFromCache)
2172 Class->CSF_flags &= ~CSF_CACHEDSMICON;
2173 Class->spicnSm = NewSmallIcon;
2199 ERR(
"Setting the class menu name failed!\n");
2259 lpwcx->style =
Class->style;
2263 lpwcx->style &= ~CS_GLOBALCLASS;
2267 lpwcx->cbClsExtra =
Class->cbclsExtra;
2268 lpwcx->cbWndExtra =
Class->cbwndExtra;
2272 lpwcx->hbrBackground =
Class->hbrBackground;
2278 lpwcx->lpszMenuName =
Class->lpszClientUnicodeMenuName;
2285 if (
Class->lpszClientUnicodeMenuName !=
NULL &&
2286 Class->MenuNameIsString)
2294 lpwcx->hInstance =
NULL;
2338 ClassName.Length = 0;
2339 ClassName.MaximumLength = 0;
2368 ERR(
"SYSTEMCUR(ARROW) == NULL, should not happen!!\n");
2377 if (hBrush <= (HBRUSH)COLOR_MENUBAR)
2404 ERR(
"!!! Registering system class failed!\n");
2436 UNICODE_STRING CapturedName = {0}, CapturedMenuName = {0}, CapturedVersion = {0};
2443 ERR(
"NtUserRegisterClassExWOW Bad Flags!\n");
2450 TRACE(
"NtUserRegisterClassExWOW ClsN %wZ\n",ClassName);
2462 ERR(
"NtUserRegisterClassExWOW Wrong cbSize!\n");
2482 if ( (CapturedName.
Length & 1) ||
2483 (CapturedMenuName.Length & 1) ||
2486 CapturedMenuName.Length +
sizeof(
CLS))
2491 ERR(
"NtUserRegisterClassExWOW Invalid Parameter Error!\n");
2495 if (CapturedName.
Length != 0)
2505 ERR(
"NtUserRegisterClassExWOW ClassName Error!\n");
2510 if (CapturedVersion.Length != 0)
2513 CapturedVersion.Length,
2518 if (!
IS_ATOM(CapturedVersion.Buffer))
2520 ERR(
"NtUserRegisterClassExWOW ClassName Error!\n");
2525 if (CapturedMenuName.Length != 0)
2528 CapturedMenuName.Length,
2531 else if (CapturedMenuName.Buffer !=
NULL &&
2534 ERR(
"NtUserRegisterClassExWOW MenuName Error!\n");
2543 ERR(
"NtUserRegisterClassExWOW WndProc is CallProc!!\n");
2546 TRACE(
"NtUserRegisterClassExWOW MnuN %wZ\n",&CapturedMenuName);
2550 ERR(
"NtUserRegisterClassExWOW Exception Error!\n");
2569 TRACE(
"NtUserRegisterClassExWOW Null Return!\n");
2619 if (
Value.Length & 1)
2624 if (
Value.Length != 0)
2656 if (Ret && Ret != dwNewLong)
2701 ERR(
"Error capturing the class name\n");
2757 ERR(
"Error capturing the class name\n");
2784 ClassAtom =
Class->atomNVClassName;
2807 Ret = (
BOOL)ClassAtom;
2850 CapturedClassName = *ClassName;
2851 if (CapturedClassName.
Length != 0)
2854 CapturedClassName.
Length,
2867 ClassName->Length = CapturedClassName.
Length;
2898 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 EXCEPTION_EXECUTE_HANDLER
#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
HGDIOBJ FASTCALL IntGetSysColorBrush(INT Object)
#define ExFreePoolWithTag(_P, _T)
#define _At_(target, annos)
#define _Must_inspect_result_
#define _When_(expr, annos)
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)
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
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_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
_Must_inspect_result_ _In_ WDFCMRESLIST List
#define W32PF_CLASSESREGISTERED
VOID FASTCALL SetLastNtError(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)
ULONG_PTR UserSetClassLongPtr(IN PCLS Class, IN INT Index, IN ULONG_PTR NewLong, 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)
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)
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)
ULONG_PTR APIENTRY NtUserSetClassLong(HWND hWnd, INT Offset, ULONG_PTR dwNewLong, BOOL Ansi)
static VOID IntDestroyClass(IN OUT PCLS Class)
BOOL APIENTRY NtUserGetClassInfo(HINSTANCE hInstance, PUNICODE_STRING ClassName, LPWNDCLASSEXW lpWndClassEx, LPWSTR *ppszMenuName, BOOL bAnsi)
BOOL FASTCALL LookupFnIdToiCls(int FnId, int *iCls)
static struct @4921 FnidToiCls[]
static WNDPROC FASTCALL IntSetClassWndProc(IN OUT PCLS Class, IN WNDPROC WndProc, 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)