26 L"DDEMLUnicodeClient",
28 L"DDEMLUnicodeServer",
157 pustrOut->Buffer =
NULL;
164 if ((pustrUnsafe->Length & 1) || (pustrUnsafe->Buffer ==
NULL))
171 if (
IS_ATOM(pustrUnsafe->Buffer))
174 pustrOut->MaximumLength = pustrOut->Length = 0;
175 pustrOut->Buffer = pustrUnsafe->Buffer;
180 pustrOut->Length = pustrUnsafe->Length;
181 pustrOut->MaximumLength = pustrOut->Length +
sizeof(
WCHAR);
185 pustrOut->MaximumLength,
187 if (!pustrOut->Buffer)
194 RtlCopyMemory(pustrOut->Buffer, pustrUnsafe->Buffer, pustrOut->Length);
195 pustrOut->Buffer[pustrOut->Length /
sizeof(
WCHAR)] =
L'\0';
201 if (pustrOut->Buffer)
219 if (
Class->lpszClientUnicodeMenuName !=
NULL &&
Class->MenuNameIsString)
241 CallProc =
Class->spcpdFirst;
242 while (CallProc !=
NULL)
249 CallProc = NextCallProc;
256 if (
Class->atomClassName)
259 if (
Class->atomNVClassName)
284 pDesk =
Class->rpdeskParent;
311 pi->pclsPrivateList =
Class->pclsNext;
323 pi->pclsPublicList =
Class->pclsNext;
338 PWSTR AtomName = szBuf;
341 if (ClassName->Length != 0)
343 if (ClassName->Length +
sizeof(
UNICODE_NULL) >
sizeof(szBuf))
349 if (AtomName ==
NULL)
364 if (AtomName != szBuf)
375 AtomName = ClassName->Buffer;
382 if (AtomName != ClassName->Buffer && AtomName != szBuf)
430 BaseClass =
Class->pclsBase;
452 if (ClassName->Length > 0)
463 if (
IS_ATOM(ClassName->Buffer))
513 Ret =
Class->lpfnWndProc;
529 if ( Ret !=
Class->lpfnWndProc ||
537 return (gcpd ? gcpd : Ret);
557 Class->CSF_flags &= ~CSF_SERVERSIDEPROC;
558 Class->Unicode = !Ansi;
572 Class->lpfnWndProc = chWndProc;
594 Class->lpfnWndProc = chWndProc;
596 Class->CSF_flags &= ~CSF_ANSIPROC;
601 Class->Unicode = !Ansi;
606 Class->CSF_flags &= ~CSF_ANSIPROC;
610 chWndProc =
Class->lpfnWndProc;
615 Class->Unicode = !Ansi;
616 Class->lpfnWndProc = chWndProc;
633 ASSERT(BaseClass->pclsBase == BaseClass);
635 if (BaseClass->rpdeskParent ==
Desktop)
643 if (BaseClass->rpdeskParent ==
NULL)
645 ASSERT(BaseClass->cWndReferenceCount == 0);
659 Class = BaseClass->pclsClone;
677 ClassSize =
sizeof(*BaseClass) + (
SIZE_T)BaseClass->cbclsExtra;
695 TRACE(
"Clone Class 0x%p hM 0x%p\n %S\n",
Class,
Class->hModule,
Class->lpszClientUnicodeMenuName);
708 Class->cWndReferenceCount = 0;
710 if (BaseClass->rpdeskParent ==
NULL)
719 Class->pclsNext = BaseClass->pclsNext;
726 BaseClass->pclsBase =
NULL;
727 BaseClass->pclsClone =
NULL;
734 Class->pclsBase = BaseClass;
735 Class->pclsNext = BaseClass->pclsClone;
754 ASSERT(BaseClass->pclsBase == BaseClass);
769 Class->cWndReferenceCount++;
791 *CloneLink =
Class->pclsNext;
792 Class->pclsClone =
Class->pclsBase->pclsClone;
796 Class->pclsNext = (*BaseClassLink)->pclsNext;
799 Clone =
Class->pclsClone;
800 while (Clone !=
NULL)
819 PCLS *PrevLink, BaseClass, CurrentClass;
823 BaseClass =
Class->pclsBase;
825 if (--
Class->cWndReferenceCount == 0)
827 if (BaseClass ==
Class)
839 PrevLink = &
pi->pclsPublicList;
841 PrevLink = &
pi->pclsPrivateList;
843 CurrentClass = *PrevLink;
844 while (CurrentClass != BaseClass)
849 CurrentClass = CurrentClass->
pclsNext;
852 ASSERT(*PrevLink == BaseClass);
874 while (CurrentClass !=
Class)
879 CurrentClass = CurrentClass->
pclsNext;
908 ClassSize =
sizeof(*Class) + (
SIZE_T)
Class->cbclsExtra;
912 if (NewClass !=
NULL)
931 *ClassLinkPtr = &NewClass->
pclsNext;
963 NextClass =
Class->pclsNext;
968 Class->cWndReferenceCount == 0)
1022 &
pi->pclsPrivateList,
1028 &
pi->pclsPublicList,
1033 ERR(
"Failed to move process classes from desktop 0x%p to the shared heap!\n",
Desktop);
1058 TRACE(
"lpwcx=%p ClassName=%wZ MenuName=%wZ dwFlags=%08x Desktop=%p pi=%p\n",
1064 ERR(
"Failed to register class atom!\n");
1071 ERR(
"Failed to register version class atom!\n");
1076 ClassSize =
sizeof(*Class) + lpwcx->cbClsExtra;
1077 if (MenuName->Length != 0)
1081 if (pszMenuName ==
NULL)
1095 TRACE(
"This CLASS has no Desktop to heap from! Atom %u\n",
Atom);
1107 Class->atomClassName = verAtom;
1119 PWSTR pszMenuNameBuffer = pszMenuName;
1125 Class->lpfnWndProc = lpwcx->lpfnWndProc;
1126 Class->style = lpwcx->style;
1127 Class->cbclsExtra = lpwcx->cbClsExtra;
1128 Class->cbwndExtra = lpwcx->cbWndExtra;
1129 Class->hModule = lpwcx->hInstance;
1134 Class->hbrBackground = lpwcx->hbrBackground;
1137 if (pszMenuNameBuffer !=
NULL)
1141 Class->lpszClientUnicodeMenuName = pszMenuNameBuffer;
1147 pszMenuNameBuffer += (MenuName->Length /
sizeof(
WCHAR)) + 1;
1150 Class->lpszClientUnicodeMenuName = MenuName->Buffer;
1153 if (pszMenuNameBuffer !=
NULL)
1157 Class->lpszClientAnsiMenuName = (
PSTR)pszMenuNameBuffer;
1165 ERR(
"Failed to convert unicode menu name to ansi!\n");
1172 Class->lpszClientAnsiMenuName = (
PSTR)MenuName->Buffer;
1175 Class->lpszMenuName =
Class->lpszClientUnicodeMenuName;
1205 Class->CSF_flags &= ~CSF_ANSIPROC;
1224 ERR(
"Failed creating the class: 0x%x\n",
Status);
1228 if (pszMenuName !=
NULL)
1242 ERR(
"Failed to allocate class on Desktop 0x%p\n",
Desktop);
1244 if (pszMenuName !=
NULL)
1253 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",
1282 PrevLink = &
Class->pclsNext;
1292IntGetAtomFromStringOrAtom(
1298 if (ClassName->Length != 0)
1301 PWSTR AtomName = szBuf;
1307 if (ClassName->Length +
sizeof(
UNICODE_NULL) >
sizeof(szBuf))
1312 if (AtomName ==
NULL)
1327 if (AtomName != szBuf)
1338 if (AtomName != szBuf)
1375 if (IntGetAtomFromStringOrAtom(ClassName, &
Atom) &&
1387 &
pi->pclsPrivateList,
1398 &
pi->pclsPublicList,
1408 &
pi->pclsPrivateList,
1418 &
pi->pclsPublicList,
1455 TRACE(
"Finding Class %wZ for hInstance 0x%p\n", ClassName,
hInstance);
1467 ERR(
"Class 0x%p not found\n", ClassName->
Buffer);
1471 ERR(
"Class \"%wZ\" not found\n", ClassName);
1477 TRACE(
"Referencing Class 0x%p with atom 0x%x\n",
Class, ClassAtom);
1483 ERR(
"Failed to reference window class!\n");
1511 if ( IntGetAtomFromStringOrAtom( ClassVersion, &ClassAtom) &&
1517 &
pi->pclsPrivateList,
1523 TRACE(
"Local Class 0x%x does already exist!\n", ClassAtom);
1532 &
pi->pclsPublicList,
1537 TRACE(
"Global Class 0x%x does already exist!\n", ClassAtom);
1559 List = &
pi->pclsPublicList;
1561 List = &
pi->pclsPrivateList;
1567 Ret =
Class->atomNVClassName;
1571 ERR(
"UserRegisterClass: Yes, that is right, you have no Class!\n");
1600 TRACE(
"UserUnregisterClass: No Class found.\n");
1606 if (
Class->cWndReferenceCount != 0 ||
1609 TRACE(
"UserUnregisterClass: Class has a Window. Ct %u : Clone 0x%p\n",
Class->cWndReferenceCount,
Class->pclsClone);
1623 TRACE(
"UserUnregisterClass: Good Exit!\n");
1624 Class->atomClassName = 0;
1629 ERR(
"UserUnregisterClass: Can not deregister Class Atom.\n");
1640 WCHAR szStaticTemp[32];
1663 Class->atomClassName,
1697 szTemp = szStaticTemp;
1720 BufLen = ClassName->MaximumLength;
1745 if (Ansi && szTemp !=
NULL && szTemp != szStaticTemp)
1762 if (MenuName->Length != 0)
1771 if (strBufW !=
NULL)
1806 Class->lpszClientUnicodeMenuName = strBufW;
1814 Class->lpszClientUnicodeMenuName = strBufW;
1823 ERR(
"Failed to copy class menu name!\n");
1836 Class->lpszClientUnicodeMenuName = MenuName->Buffer;
1837 Class->lpszClientAnsiMenuName = (
PSTR)MenuName->Buffer;
1844 Class->lpszClientUnicodeMenuName = MenuName->Buffer;
1845 Class->lpszClientAnsiMenuName = (
PSTR)MenuName->Buffer;
1874 TRACE(
"SetClassLong(%d, %x)\n",
Index, NewLong);
1924 Class->hbrBackground = (HBRUSH)NewLong;
1930 Class->hbrBackground = (HBRUSH)NewLong;
1965 Class->spcur = NewCursor;
1975 Class->spcur = NewCursor;
2024 Class->CSF_flags &= ~CSF_CACHEDSMICON;
2027 if (NewLong && !
Class->spicnSm)
2041 if (!SmallIconHandle)
2051 if (SmallIconHandle)
2059 Class->spicn = NewIcon;
2069 Class->spicn = NewIcon;
2075 Class->spicnSm = NewSmallIcon;
2111 if (!SmallIconHandle)
2121 if (SmallIconHandle)
2125 NewIconFromCache =
TRUE;
2129 ERR(
"Failed getting a small icon for the class.\n");
2152 if (NewIconFromCache)
2155 Class->CSF_flags &= ~CSF_CACHEDSMICON;
2156 Class->spicnSm = NewSmallIcon;
2166 if (NewIconFromCache)
2169 Class->CSF_flags &= ~CSF_CACHEDSMICON;
2170 Class->spicnSm = NewSmallIcon;
2196 ERR(
"Setting the class menu name failed!\n");
2256 lpwcx->style =
Class->style;
2260 lpwcx->style &= ~CS_GLOBALCLASS;
2264 lpwcx->cbClsExtra =
Class->cbclsExtra;
2265 lpwcx->cbWndExtra =
Class->cbwndExtra;
2269 lpwcx->hbrBackground =
Class->hbrBackground;
2275 lpwcx->lpszMenuName =
Class->lpszClientUnicodeMenuName;
2282 if (
Class->lpszClientUnicodeMenuName !=
NULL &&
2283 Class->MenuNameIsString)
2291 lpwcx->hInstance =
NULL;
2335 ClassName.Length = 0;
2336 ClassName.MaximumLength = 0;
2365 ERR(
"SYSTEMCUR(ARROW) == NULL, should not happen!!\n");
2374 if (hBrush <= (HBRUSH)COLOR_MENUBAR)
2401 ERR(
"!!! Registering system class failed!\n");
2433 UNICODE_STRING CapturedName = {0}, CapturedMenuName = {0}, CapturedVersion = {0};
2440 ERR(
"NtUserRegisterClassExWOW Bad Flags!\n");
2447 TRACE(
"NtUserRegisterClassExWOW ClsN %wZ\n",ClassName);
2459 ERR(
"NtUserRegisterClassExWOW Wrong cbSize!\n");
2479 if ( (CapturedName.
Length & 1) ||
2480 (CapturedMenuName.Length & 1) ||
2483 CapturedMenuName.Length +
sizeof(
CLS))
2488 ERR(
"NtUserRegisterClassExWOW Invalid Parameter Error!\n");
2492 if (CapturedName.
Length != 0)
2502 ERR(
"NtUserRegisterClassExWOW ClassName Error!\n");
2507 if (CapturedVersion.Length != 0)
2510 CapturedVersion.Length,
2515 if (!
IS_ATOM(CapturedVersion.Buffer))
2517 ERR(
"NtUserRegisterClassExWOW ClassName Error!\n");
2522 if (CapturedMenuName.Length != 0)
2525 CapturedMenuName.Length,
2528 else if (CapturedMenuName.Buffer !=
NULL &&
2531 ERR(
"NtUserRegisterClassExWOW MenuName Error!\n");
2540 ERR(
"NtUserRegisterClassExWOW WndProc is CallProc!!\n");
2543 TRACE(
"NtUserRegisterClassExWOW MnuN %wZ\n",&CapturedMenuName);
2547 ERR(
"NtUserRegisterClassExWOW Exception Error!\n");
2566 TRACE(
"NtUserRegisterClassExWOW Null Return!\n");
2616 if (
Value.Length & 1)
2621 if (
Value.Length != 0)
2653 if (Ret && Ret != dwNewLong)
2698 ERR(
"Error capturing the class name\n");
2754 ERR(
"Error capturing the class name\n");
2781 ClassAtom =
Class->atomNVClassName;
2804 Ret = (
BOOL)ClassAtom;
2847 CapturedClassName = *ClassName;
2848 if (CapturedClassName.
Length != 0)
2851 CapturedClassName.
Length,
2864 ClassName->Length = CapturedClassName.
Length;
2895 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 struct @4913 FnidToiCls[]
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 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)