15#define USE_VERSIONED_CLASSES
48 static const WCHAR classesW[][20] =
50 {
'C',
'o',
'm',
'b',
'o',
'B',
'o',
'x',
'E',
'x',
'3',
'2',0},
51 {
'm',
's',
'c',
't',
'l',
's',
'_',
'h',
'o',
't',
'k',
'e',
'y',
'3',
'2',0},
52 {
'm',
's',
'c',
't',
'l',
's',
'_',
'p',
'r',
'o',
'g',
'r',
'e',
's',
's',
'3',
'2',0},
53 {
'm',
's',
'c',
't',
'l',
's',
'_',
's',
't',
'a',
't',
'u',
's',
'b',
'a',
'r',
'3',
'2',0},
54 {
'm',
's',
'c',
't',
'l',
's',
'_',
't',
'r',
'a',
'c',
'k',
'b',
'a',
'r',
'3',
'2',0},
55 {
'm',
's',
'c',
't',
'l',
's',
'_',
'u',
'p',
'd',
'o',
'w',
'n',
'3',
'2',0},
56 {
'N',
'a',
't',
'i',
'v',
'e',
'F',
'o',
'n',
't',
'C',
't',
'l',0},
57 {
'R',
'e',
'B',
'a',
'r',
'W',
'i',
'n',
'd',
'o',
'w',
'3',
'2',0},
58 {
'S',
'y',
's',
'A',
'n',
'i',
'm',
'a',
't',
'e',
'3',
'2',0},
59 {
'S',
'y',
's',
'D',
'a',
't',
'e',
'T',
'i',
'm',
'e',
'P',
'i',
'c',
'k',
'3',
'2',0},
60 {
'S',
'y',
's',
'H',
'e',
'a',
'd',
'e',
'r',
'3',
'2',0},
61 {
'S',
'y',
's',
'I',
'P',
'A',
'd',
'd',
'r',
'e',
's',
's',
'3',
'2',0},
62 {
'S',
'y',
's',
'L',
'i',
's',
't',
'V',
'i',
'e',
'w',
'3',
'2',0},
63 {
'S',
'y',
's',
'M',
'o',
'n',
't',
'h',
'C',
'a',
'l',
'3',
'2',0},
64 {
'S',
'y',
's',
'P',
'a',
'g',
'e',
'r',0},
65 {
'S',
'y',
's',
'T',
'a',
'b',
'C',
'o',
'n',
't',
'r',
'o',
'l',
'3',
'2',0},
66 {
'S',
'y',
's',
'T',
'r',
'e',
'e',
'V',
'i',
'e',
'w',
'3',
'2',0},
67 {
'T',
'o',
'o',
'l',
'b',
'a',
'r',
'W',
'i',
'n',
'd',
'o',
'w',
'3',
'2',0},
68 {
't',
'o',
'o',
'l',
't',
'i',
'p',
's',
'_',
'c',
'l',
'a',
's',
's',
'3',
'2',0},
71 int min = 0,
max = (
sizeof(classesW) /
sizeof(classesW[0])) - 1;
86 const void* lpszClass,
93#ifdef USE_VERSIONED_CLASSES
98 ACTCTX_SECTION_KEYED_DATA KeyedData = {
sizeof(KeyedData) };
102 ERR(
"Null class given !\n");
108 RtlInitEmptyUnicodeString(&SectionName, SectionNameBuf,
sizeof(SectionNameBuf));
115 TRACE(
"ClassNameToVersion got name %wZ from atom\n", &SectionName);
123 RtlInitEmptyUnicodeString(&SectionName, SectionNameBuf,
sizeof(SectionNameBuf));
131#ifdef USE_VERSIONED_CLASSES
134 ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION,
143 if(SectionHeader && SectionHeader->
count > 0)
146 if(WindowRedirectionData && WindowRedirectionData->
module_len)
152 TRACE(
"Returning VersionedClass=%S, plpLibFileName=%S for class %S\n", VersionedClass, lpLibFileName, SectionName.
Buffer);
154 if (pContext) *pContext = KeyedData.hActCtx;
155 if (plpLibFileName) *plpLibFileName = lpLibFileName;
161 if (KeyedData.hActCtx)
165#ifndef DEFAULT_ACTIVATION_CONTEXTS_SUPPORTED
177 if (pContext) *pContext = 0;
178 if (plpLibFileName) *plpLibFileName =
L"comctl32";
187 return VersionedClass;
203 PREGISTERCLASSNAMEW pRegisterClassNameW;
206 RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame = {
sizeof(Frame), 1 };
208 ERR(
"VersionRegisterClass: Attempting to call RegisterClassNameW in %S.\n", lpLibFileName);
210 RtlActivateActivationContextUnsafeFast(&Frame, Contex);
221 RtlInitEmptyUnicodeString(&ClassName, ClassNameBuf,
sizeof(ClassNameBuf));
224 ERR(
"Error while verifying ATOM\n");
227 pszClass = ClassName.
Buffer;
229 Ret = pRegisterClassNameW(pszClass);
233 WARN(
"No RegisterClassNameW PROC\n");
239 ERR(
"Got exception while trying to call RegisterClassNameW!\n");
255 RtlDeactivateActivationContextUnsafeFast(&Frame);
280 IS_ATOM(lpszClass) ? lpszClass : 0,
294 if (lpszClass ==
NULL)
311 ConvertedString =
TRUE;
321 TRACE(
"RegisterSystemControls\n");
333 if (!lpLibFileName)
break;
341 if (ClassFound)
continue;
390 IS_ATOM(lpszClass) ? lpszClass : 0,
407 if (lpszClass ==
NULL)
429 TRACE(
"RegisterSystemControls\n");
441 if (!lpLibFileName)
break;
449 if (ClassFound)
continue;
582 return (gcpd ? gcpd : Ret);
595 if (!
Class)
return Ret;
649 return (gcpd ? gcpd : Ret);
659 if (nIndex +
sizeof(
ULONG_PTR) < nIndex ||
681 if (Ret != 0 && Ret < 0x4000)
734 if (nIndex +
sizeof(
ULONG_PTR) < nIndex ||
756 if (Ret != 0 && Ret < 0x4000)
845 WARN(
"Invalid class for hwnd 0x%p!\n",
hWnd);
901 WARN(
"Invalid class for hwnd 0x%p!\n",
hWnd);
941 WARN(
"Invalid class for hwnd 0x%p!\n",
hWnd);
980 WARN(
"Invalid class for hwnd 0x%p!\n",
hWnd);
1009 lpClassName[
len] = 0;
1011 TRACE(
"%p class/atom: %s/%04x %x\n",
hWnd,
1013 IS_ATOM(lpClassName) ? lpClassName : 0,
1033 RtlInitEmptyUnicodeString(&ClassName,
1041 TRACE(
"%p class/atom: %S/%04x %x\n",
hWnd,
1043 IS_ATOM(lpClassName) ? lpClassName : 0,
1070 if (
class ==
NULL)
return 0;
1072 if (offset <= class->cbclsExtra -
sizeof(
WORD))
1073 memcpy( &retvalue, (
char *)(
class + 1) +
offset,
sizeof(retvalue) );
1125 case -1: retvalue = (
ULONG_PTR)&wndPtr->ww;
break;
1137 ERR(
"Outside Access and Denied!\n");
1212 WARN(
"Invalid offset %d\n", nIndex );
1233 RtlInitEmptyUnicodeString(&ClassName,
1235 cchType *
sizeof(
WCHAR));
1254 if ((
INT)cchType <= 0)
return 0;
1277 if (lpwcx ==
NULL || lpwcx->
cbSize !=
sizeof(*lpwcx) ||
1281 TRACE(
"RegisterClassExWOWW Invalid Parameter Error!\n");
1302 TRACE(
"RegisterClassExWOWW User32Instance!\n");
1312 RtlInitEmptyAnsiString(&AnsiMenuName,
NULL, 0);
1337 ClassVersion = ClassName;
1359 TRACE(
"atom=%04x wndproc=%p hinst=%p bg=%p style=%08x clsExt=%d winExt=%d class=%p\n",
1406 TRACE(
"A atom=%04x wndproc=%p hinst=%p bg=%p style=%08x clsExt=%d winExt=%d class=%p\n",
1407 Atom, lpwcx->lpfnWndProc, lpwcx->hInstance, lpwcx->hbrBackground,
1408 lpwcx->style, lpwcx->cbClsExtra, lpwcx->cbWndExtra,
WndClass);
1423 TRACE(
"W atom=%04x wndproc=%p hinst=%p bg=%p style=%08x clsExt=%d winExt=%d\n",
1424 Atom, lpwcx->lpfnWndProc, lpwcx->hInstance, lpwcx->hbrBackground,
1425 lpwcx->style, lpwcx->cbClsExtra, lpwcx->cbWndExtra);
1438 if (lpWndClass ==
NULL)
1443 Class.style = lpWndClass->style;
1444 Class.lpfnWndProc = lpWndClass->lpfnWndProc;
1445 Class.cbClsExtra = lpWndClass->cbClsExtra;
1446 Class.cbWndExtra = lpWndClass->cbWndExtra;
1447 Class.hInstance = lpWndClass->hInstance;
1448 Class.hIcon = lpWndClass->hIcon;
1449 Class.hCursor = lpWndClass->hCursor;
1450 Class.hbrBackground = lpWndClass->hbrBackground;
1451 Class.lpszMenuName = lpWndClass->lpszMenuName;
1452 Class.lpszClassName = lpWndClass->lpszClassName;
1468 if (lpWndClass ==
NULL)
1473 Class.style = lpWndClass->style;
1474 Class.lpfnWndProc = lpWndClass->lpfnWndProc;
1475 Class.cbClsExtra = lpWndClass->cbClsExtra;
1476 Class.cbWndExtra = lpWndClass->cbWndExtra;
1477 Class.hInstance = lpWndClass->hInstance;
1478 Class.hIcon = lpWndClass->hIcon;
1479 Class.hCursor = lpWndClass->hCursor;
1480 Class.hbrBackground = lpWndClass->hbrBackground;
1481 Class.lpszMenuName = lpWndClass->lpszMenuName;
1482 Class.lpszClassName = lpWndClass->lpszClassName;
1571 TRACE(
"%p %d %lx\n",
hWnd, nIndex, dwNewLong);
1580 Value.Buffer = lpStr;
1589 Value.Buffer = lpStr;
1610 return NtUserSetClassLongPtr(
hWnd,
1625 return NtUserSetClassLongPtr(
hWnd,
1645 if ((nIndex < 0) && (nIndex !=
GCW_ATOM))
1667 WARN(
"Invalid offset %d\n", nIndex );
1746 TRACE(
"class/atom: %s/%04x %p\n",
1748 IS_ATOM(lpClassName) ? lpClassName : 0,
1756 else if (!
IS_ATOM(lpClassName))
1758 ConvertedString =
TRUE;
1772 if (ConvertedString)
1790 TRACE(
"class/atom: %S/%04x %p\n",
1792 IS_ATOM(lpClassName) ? lpClassName : 0,
1800 else if (!
IS_ATOM(lpClassName))
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
#define ERROR_NOT_ENOUGH_MEMORY
#define NT_SUCCESS(StatCode)
#define ERROR_INVALID_PARAMETER
#define GetProcAddress(x, y)
#define MultiByteToWideChar
#define ERROR_ACCESS_DENIED
#define ValidateHwnd(hwnd)
static PVOID FASTCALL DesktopPtrToUser(PVOID ptr)
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
IN PFCB IN VBO OUT PLBO OUT PULONG OUT PBOOLEAN Allocated
GLfloat GLfloat GLfloat GLfloat h
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
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define GETPFNCLIENTW(fnid)
#define GETPFNCLIENTA(fnid)
#define WNDS_SERVERSIDEWINDOWPROC
#define UserHMGetHandle(obj)
#define NtUserSetWindowLongPtr
#define GETPFNSERVER(fnid)
ULONG_PTR NTAPI NtUserGetCPD(HWND hWnd, GETCPD Flags, ULONG_PTR Proc)
#define CSF_SERVERSIDEPROC
LONG NTAPI NtUserSetWindowLong(HWND hWnd, DWORD Index, LONG NewValue, BOOL Ansi)
WORD NTAPI NtUserSetWindowWord(HWND hWnd, INT Index, WORD NewVal)
#define WNDS_ANSIWINDOWPROC
NTSYSAPI NTSTATUS WINAPI RtlFindActivationContextSectionString(ULONG, const GUID *, ULONG, const UNICODE_STRING *, PVOID)
NTSYSAPI void WINAPI RtlReleaseActivationContext(HANDLE)
#define EXCEPTION_EXECUTE_HANDLER
#define memcpy(s1, s2, n)
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeStringFromAsciiz(_Out_ PUNICODE_STRING Destination, _In_ PCSZ Source)
_Use_decl_annotations_ NTSTATUS NTAPI RtlUnicodeToMultiByteN(_Out_ PCHAR MbString, _In_ ULONG MbSize, _Out_opt_ PULONG ResultSize, _In_ PCWCH UnicodeString, _In_ ULONG UnicodeSize)
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToAnsiString(PANSI_STRING DestinationString, PUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString)
NTSYSAPI NTSTATUS NTAPI RtlAnsiStringToUnicodeString(PUNICODE_STRING DestinationString, PANSI_STRING SourceString, BOOLEAN AllocateDestinationString)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
NTSYSAPI VOID NTAPI RtlInitAnsiString(PANSI_STRING DestinationString, PCSZ SourceString)
#define _SEH2_EXCEPT(...)
#define _SEH2_YIELD(__stmt)
DWORD RegisterDefaultClasses
BOOL WINAPI RegisterSystemControls(VOID)
#define DECLSPEC_HOTPATCH
#define RtlCopyMemory(Destination, Source, Length)
BOOL FASTCALL TestWindowProcess(PWND)
static __inline PVOID SharedPtrToUser(PVOID Ptr)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
INT APIENTRY NtUserGetClassName(IN HWND hWnd, IN BOOL Real, OUT PUNICODE_STRING ClassName)
BOOL APIENTRY NtUserUnregisterClass(IN PUNICODE_STRING ClassNameOrAtom, IN HINSTANCE hInstance, OUT PCLSMENUNAME pClassMenuName)
RTL_ATOM APIENTRY NtUserRegisterClassExWOW(WNDCLASSEXW *lpwcx, PUNICODE_STRING ClassName, PUNICODE_STRING ClsVersion, PCLSMENUNAME pClassMenuName, DWORD fnID, DWORD Flags, LPDWORD pWow)
BOOL APIENTRY NtUserGetClassInfo(HINSTANCE hInstance, PUNICODE_STRING ClassName, LPWNDCLASSEXW lpWndClassEx, LPWSTR *ppszMenuName, BOOL bAnsi)
ULONG_PTR APIENTRY NtUserSetClassLong(_In_ HWND hWnd, _In_ INT Offset, _In_ ULONG dwNewLong, _In_ BOOL Ansi)
ULONG_PTR FASTCALL IntGetClsWndProc(PWND pWnd, PCLS Class, BOOL Ansi)
WNDPROC FASTCALL IntGetWndProc(PWND pWnd, BOOL Ansi)
UINT WINAPI RealGetWindowClassW(HWND hwnd, LPWSTR pszType, UINT cchType)
UINT WINAPI RealGetWindowClassA(HWND hwnd, LPSTR pszType, UINT cchType)
ATOM WINAPI RegisterClassExWOWW(WNDCLASSEXW *lpwcx, LPDWORD pdwWowData, WORD fnID, DWORD dwFlags, BOOL ChkRegCls)
static ULONG_PTR FASTCALL IntGetClassLongA(PWND Wnd, PCLS Class, int nIndex)
LONG WINAPI GetWindowLongA(HWND hWnd, int nIndex)
LONG WINAPI GetWindowLongW(HWND hWnd, int nIndex)
WORD WINAPI SetClassWord(HWND hWnd, int nIndex, WORD wNewWord)
WORD WINAPI SetWindowWord(HWND hWnd, int nIndex, WORD wNewWord)
LONG_PTR IntGetWindowLong(HWND hwnd, INT offset, UINT size, BOOL unicode)
LONG WINAPI DECLSPEC_HOTPATCH SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong)
WORD WINAPI GetWindowWord(HWND hWnd, int nIndex)
LPCWSTR is_comctl32_class(const WCHAR *name)
static ULONG_PTR FASTCALL IntGetClassLongW(PWND Wnd, PCLS Class, int nIndex)
DWORD WINAPI GetClassLongA(HWND hWnd, int nIndex)
WORD WINAPI GetClassWord(HWND hwnd, int offset)
BOOL FASTCALL VersionRegisterClass(PCWSTR pszClass, LPCWSTR lpLibFileName, HANDLE Contex, HMODULE *phLibModule)
LPCWSTR FASTCALL ClassNameToVersion(const void *lpszClass, LPCWSTR lpszMenuName, LPCWSTR *plpLibFileName, HANDLE *pContext, BOOL bAnsi)
LONG WINAPI SetWindowLongW(HWND hWnd, int nIndex, LONG dwNewLong)
DWORD WINAPI GetLastError(void)
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
#define ERROR_INVALID_INDEX
#define ERROR_INVALID_WINDOW_HANDLE
#define ERROR_CLASS_DOES_NOT_EXIST
#define ERROR_CANNOT_FIND_WND_CLASS
#define SetWindowLongPtrA
#define GetWindowLongPtrW
BOOL WINAPI UnregisterClassA(_In_ LPCSTR, HINSTANCE)
HBRUSH WINAPI GetSysColorBrush(_In_ int)
int WINAPI GetClassNameA(_In_ HWND hWnd, _Out_writes_to_(nMaxCount, return) LPSTR lpClassName, _In_ int nMaxCount)
#define IS_INTRESOURCE(i)
ATOM WINAPI RegisterClassW(_In_ CONST WNDCLASSW *)
BOOL WINAPI GetClassInfoExA(_In_opt_ HINSTANCE, _In_ LPCSTR, _Out_ LPWNDCLASSEXA)
#define GetWindowLongPtrA
BOOL WINAPI GetClassInfoExW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _Out_ LPWNDCLASSEXW)
HWND WINAPI GetDesktopWindow(void)
ATOM WINAPI RegisterClassA(_In_ CONST WNDCLASSA *)
ATOM WINAPI RegisterClassExA(_In_ CONST WNDCLASSEXA *)
DWORD WINAPI SetClassLongW(_In_ HWND, _In_ int, _In_ LONG)
ATOM WINAPI RegisterClassExW(_In_ CONST WNDCLASSEXW *)
#define GCL_HBRBACKGROUND
BOOL WINAPI GetClassInfoA(_In_opt_ HINSTANCE, _In_ LPCSTR, _Out_ LPWNDCLASSA)
HWND WINAPI GetWindow(_In_ HWND, _In_ UINT)
int WINAPI GetClassNameW(_In_ HWND hWnd, _Out_writes_to_(nMaxCount, return) LPWSTR lpClassName, _In_ int nMaxCount)
DWORD WINAPI SetClassLongA(_In_ HWND, _In_ int, _In_ LONG)
BOOL WINAPI UnregisterClassW(_In_ LPCWSTR, HINSTANCE)
LRESULT(CALLBACK * WNDPROC)(HWND, UINT, WPARAM, LPARAM)
DWORD WINAPI GetClassLongW(_In_ HWND, _In_ int)
BOOL WINAPI GetClassInfoW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _Out_ LPWNDCLASSW)
#define SetWindowLongPtrW
#define GCLP_HBRBACKGROUND
HWND WINAPI GetAncestor(_In_ HWND, _In_ UINT)
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO