mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-03 04:13:31 +00:00
more work on window classes and RegisterClass[Ex] by Jonathan Wilson
svn path=/trunk/; revision=5442
This commit is contained in:
@@ -455,7 +455,7 @@ NtUserQueryUserCounters 5
|
||||
NtUserQueryWindow 2
|
||||
NtUserRealChildWindowFromPoint 3
|
||||
NtUserRedrawWindow 4
|
||||
NtUserRegisterClassExWOW 6
|
||||
NtUserRegisterClassExWOW 5
|
||||
NtUserRegisterHotKey 4
|
||||
NtUserRegisterTasklist 1
|
||||
NtUserRegisterWindowMessage 1
|
||||
|
||||
@@ -1158,8 +1158,7 @@ NtUserRedrawWindow
|
||||
|
||||
RTL_ATOM
|
||||
STDCALL
|
||||
NtUserRegisterClassExWOW(CONST WNDCLASSEXW* lpwcxw,
|
||||
CONST WNDCLASSEXA* lpwcxa,
|
||||
NtUserRegisterClassExWOW(CONST WNDCLASSEXW* lpwcx,
|
||||
BOOL bUnicodeClass,
|
||||
DWORD Unknown3,
|
||||
DWORD Unknown4,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $Id: class.c,v 1.24 2003/08/06 16:37:28 fireball Exp $
|
||||
/* $Id: class.c,v 1.25 2003/08/06 16:47:35 weiden Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS user32.dll
|
||||
@@ -14,6 +14,25 @@
|
||||
#include <stdlib.h>
|
||||
#include <debug.h>
|
||||
|
||||
/* copied from menu.c */
|
||||
NTSTATUS
|
||||
STATIC HEAP_strdupA2W ( HANDLE hHeap, LPWSTR* ppszW, LPCSTR lpszA, UINT* NewLen )
|
||||
{
|
||||
ULONG len;
|
||||
NTSTATUS Status;
|
||||
*ppszW = NULL;
|
||||
if ( !lpszA )
|
||||
return STATUS_SUCCESS;
|
||||
len = lstrlenA(lpszA);
|
||||
*ppszW = RtlAllocateHeap ( hHeap, 0, (len+1) * sizeof(WCHAR) );
|
||||
if ( !*ppszW )
|
||||
return STATUS_NO_MEMORY;
|
||||
Status = RtlMultiByteToUnicodeN ( *ppszW, len*sizeof(WCHAR), NULL, (PCHAR)lpszA, len );
|
||||
(*ppszW)[len] = L'\0';
|
||||
if(NewLen) (*NewLen) = (UINT)len;
|
||||
return Status;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
@@ -192,7 +211,7 @@ GetWindowWord(HWND hWnd, int nIndex)
|
||||
*/
|
||||
UINT
|
||||
STDCALL
|
||||
RealGetWindowClass(
|
||||
RealGetWindowClassW(
|
||||
HWND hwnd,
|
||||
LPSTR pszType,
|
||||
UINT cchType)
|
||||
@@ -216,22 +235,6 @@ RealGetWindowClassA(
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
UINT
|
||||
STDCALL
|
||||
RealGetWindowClassW(
|
||||
HWND hwnd,
|
||||
LPWSTR pszType,
|
||||
UINT cchType)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
@@ -239,6 +242,8 @@ ATOM STDCALL
|
||||
RegisterClassA(CONST WNDCLASSA *lpWndClass)
|
||||
{
|
||||
WNDCLASSEXA Class;
|
||||
|
||||
if(!lpWndClass) return (ATOM)0;
|
||||
|
||||
RtlMoveMemory ( &Class.style, lpWndClass, sizeof(WNDCLASSA));
|
||||
Class.cbSize = sizeof(WNDCLASSEXA);
|
||||
@@ -246,7 +251,6 @@ RegisterClassA(CONST WNDCLASSA *lpWndClass)
|
||||
return RegisterClassExA(&Class);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
@@ -254,17 +258,61 @@ ATOM STDCALL
|
||||
RegisterClassExA(CONST WNDCLASSEXA *lpwcx)
|
||||
{
|
||||
RTL_ATOM Atom;
|
||||
WNDCLASSEXW wndclass;
|
||||
HANDLE hHeap;
|
||||
NTSTATUS Status;
|
||||
LPWSTR ClassName = NULL;
|
||||
LPWSTR MenuName = NULL;
|
||||
|
||||
if(!lpwcx || (lpwcx->cbSize != sizeof(WNDCLASSEXA)))
|
||||
return (ATOM)0;
|
||||
|
||||
if(!lpwcx->lpszClassName) return (ATOM)0;
|
||||
|
||||
hHeap = RtlGetProcessHeap();
|
||||
RtlMoveMemory(&wndclass, lpwcx, sizeof(WNDCLASSEXW));
|
||||
|
||||
if(HIWORD(lpwcx->lpszClassName))
|
||||
{
|
||||
Status = HEAP_strdupA2W (hHeap, &ClassName, (LPCSTR)lpwcx->lpszClassName, NULL);
|
||||
if (!NT_SUCCESS (Status))
|
||||
{
|
||||
SetLastError (RtlNtStatusToDosError(Status));
|
||||
return 0;
|
||||
}
|
||||
wndclass.lpszClassName = ClassName;
|
||||
}
|
||||
|
||||
if(HIWORD(lpwcx->lpszMenuName))
|
||||
{
|
||||
Status = HEAP_strdupA2W (hHeap, &MenuName, (LPCSTR)lpwcx->lpszMenuName, NULL);
|
||||
if (!NT_SUCCESS (Status))
|
||||
{
|
||||
if(HIWORD(lpwcx->lpszClassName))
|
||||
{
|
||||
RtlFreeHeap (hHeap, 0, ClassName);
|
||||
}
|
||||
SetLastError (RtlNtStatusToDosError(Status));
|
||||
return 0;
|
||||
}
|
||||
wndclass.lpszMenuName = MenuName;
|
||||
}
|
||||
|
||||
Atom = NtUserRegisterClassExWOW(0,(WNDCLASSEXA*)lpwcx,
|
||||
Atom = NtUserRegisterClassExWOW(&wndclass,
|
||||
FALSE,
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
|
||||
/* free strings if neccessary */
|
||||
if(MenuName) RtlFreeHeap (hHeap, 0, MenuName);
|
||||
if(ClassName) RtlFreeHeap (hHeap, 0, ClassName);
|
||||
|
||||
return (ATOM)Atom;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
@@ -272,18 +320,67 @@ ATOM STDCALL
|
||||
RegisterClassExW(CONST WNDCLASSEXW *lpwcx)
|
||||
{
|
||||
RTL_ATOM Atom;
|
||||
HANDLE hHeap;
|
||||
WNDCLASSEXW wndclass;
|
||||
LPWSTR ClassName = NULL;
|
||||
LPWSTR MenuName = NULL;
|
||||
ULONG len;
|
||||
|
||||
if(!lpwcx || (lpwcx->cbSize != sizeof(WNDCLASSEXA)))
|
||||
return (ATOM)0;
|
||||
|
||||
if(!lpwcx->lpszClassName) return (ATOM)0;
|
||||
|
||||
hHeap = RtlGetProcessHeap();
|
||||
RtlMoveMemory(&wndclass, lpwcx, sizeof(WNDCLASSEXW));
|
||||
|
||||
/* copy strings if needed */
|
||||
|
||||
if(HIWORD(lpwcx->lpszClassName))
|
||||
{
|
||||
len = lstrlenW(lpwcx->lpszClassName);
|
||||
ClassName = RtlAllocateHeap (hHeap, 0, (len + 1) * sizeof(WCHAR));
|
||||
if(!ClassName)
|
||||
{
|
||||
SetLastError(RtlNtStatusToDosError(STATUS_NO_MEMORY));
|
||||
return 0;
|
||||
}
|
||||
memcpy(&ClassName, &lpwcx->lpszClassName, len);
|
||||
|
||||
wndclass.lpszClassName = ClassName;
|
||||
}
|
||||
|
||||
if(HIWORD(lpwcx->lpszMenuName))
|
||||
{
|
||||
len = lstrlenW(lpwcx->lpszMenuName);
|
||||
MenuName = RtlAllocateHeap (hHeap, 0, (len + 1) * sizeof(WCHAR));
|
||||
if(!MenuName)
|
||||
{
|
||||
if(HIWORD(lpwcx->lpszClassName))
|
||||
{
|
||||
RtlFreeHeap (hHeap, 0, MenuName);
|
||||
}
|
||||
SetLastError(RtlNtStatusToDosError(STATUS_NO_MEMORY));
|
||||
return 0;
|
||||
}
|
||||
memcpy(&MenuName, &lpwcx->lpszMenuName, len);
|
||||
|
||||
wndclass.lpszMenuName = MenuName;
|
||||
}
|
||||
|
||||
Atom = NtUserRegisterClassExWOW((WNDCLASSEXW*)lpwcx,
|
||||
0,
|
||||
Atom = NtUserRegisterClassExWOW(&wndclass,
|
||||
TRUE,
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
|
||||
/* free strings if neccessary */
|
||||
if(MenuName) RtlFreeHeap (hHeap, 0, MenuName);
|
||||
if(ClassName) RtlFreeHeap (hHeap, 0, ClassName);
|
||||
|
||||
return (ATOM)Atom;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
@@ -291,6 +388,8 @@ ATOM STDCALL
|
||||
RegisterClassW(CONST WNDCLASSW *lpWndClass)
|
||||
{
|
||||
WNDCLASSEXW Class;
|
||||
|
||||
if(!lpWndClass) return (ATOM)0;
|
||||
|
||||
RtlMoveMemory(&Class.style, lpWndClass, sizeof(WNDCLASSW));
|
||||
Class.cbSize = sizeof(WNDCLASSEXW);
|
||||
@@ -298,7 +397,6 @@ RegisterClassW(CONST WNDCLASSW *lpWndClass)
|
||||
return RegisterClassExW(&Class);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @mplemented
|
||||
*/
|
||||
|
||||
@@ -10,8 +10,19 @@
|
||||
|
||||
typedef struct _WNDCLASS_OBJECT
|
||||
{
|
||||
WNDCLASSEXA ClassA;
|
||||
WNDCLASSEXW ClassW;
|
||||
UINT cbSize;
|
||||
UINT style;
|
||||
WNDPROC lpfnWndProcA;
|
||||
WNDPROC lpfnWndProcW;
|
||||
int cbClsExtra;
|
||||
int cbWndExtra;
|
||||
HANDLE hInstance;
|
||||
HICON hIcon;
|
||||
HCURSOR hCursor;
|
||||
HBRUSH hbrBackground;
|
||||
PUNICODE_STRING lpszMenuName;
|
||||
PUNICODE_STRING lpszClassName;
|
||||
HICON hIconSm;
|
||||
BOOL Unicode;
|
||||
LIST_ENTRY ListEntry;
|
||||
} WNDCLASS_OBJECT, *PWNDCLASS_OBJECT;
|
||||
@@ -34,8 +45,7 @@ NTSTATUS FASTCALL
|
||||
ClassReferenceClassByNameOrAtom(PWNDCLASS_OBJECT *Class,
|
||||
LPWSTR ClassNameOrAtom);
|
||||
PWNDCLASS_OBJECT FASTCALL
|
||||
W32kCreateClass(CONST WNDCLASSEXW *lpwcxw,
|
||||
CONST WNDCLASSEXA *lpwcxa,
|
||||
W32kCreateClass(CONST WNDCLASSEXW *lpwcx,
|
||||
BOOL bUnicodeClass,
|
||||
RTL_ATOM Atom);
|
||||
struct _WINDOW_OBJECT;
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
/* $Id: class.c,v 1.22 2003/08/05 15:41:03 weiden Exp $
|
||||
/* $Id: class.c,v 1.23 2003/08/06 16:47:35 weiden Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
@@ -70,7 +70,7 @@ ClassReferenceClassByAtom(PWNDCLASS_OBJECT* Class,
|
||||
{
|
||||
Current = CONTAINING_RECORD(CurrentEntry, WNDCLASS_OBJECT, ListEntry);
|
||||
|
||||
if (Current->ClassW.lpszClassName == (LPWSTR)(ULONG)Atom)
|
||||
if (Current->lpszClassName == (PUNICODE_STRING)(ULONG)Atom)
|
||||
{
|
||||
*Class = Current;
|
||||
ObmReferenceObject(Current);
|
||||
@@ -168,12 +168,24 @@ W32kGetClassName(struct _WINDOW_OBJECT *WindowObject,
|
||||
int nMaxCount)
|
||||
{
|
||||
int length;
|
||||
length = wcslen(WindowObject->Class->ClassW.lpszClassName);
|
||||
LPCWSTR name;
|
||||
if (IS_ATOM(WindowObject->Class->lpszClassName))
|
||||
{
|
||||
/* FIXME find the string from the atom */
|
||||
name = L"\0";
|
||||
length = wcslen(name);
|
||||
}
|
||||
else
|
||||
{
|
||||
name = WindowObject->Class->lpszClassName->Buffer;
|
||||
length = WindowObject->Class->lpszClassName->Length / sizeof(WCHAR);
|
||||
}
|
||||
if (length > nMaxCount)
|
||||
{
|
||||
length = nMaxCount;
|
||||
}
|
||||
wcsncpy(lpClassName,WindowObject->Class->ClassW.lpszClassName,length+1);
|
||||
*(lpClassName+length) = 0;
|
||||
wcsncpy(lpClassName,name,length);
|
||||
return length;
|
||||
}
|
||||
|
||||
@@ -205,87 +217,53 @@ NtUserGetWOWClass(DWORD Unknown0,
|
||||
}
|
||||
|
||||
PWNDCLASS_OBJECT FASTCALL
|
||||
W32kCreateClass(CONST WNDCLASSEXW *lpwcxw,
|
||||
CONST WNDCLASSEXA *lpwcxa,
|
||||
W32kCreateClass(CONST WNDCLASSEXW *lpwcx,
|
||||
BOOL bUnicodeClass,
|
||||
RTL_ATOM Atom)
|
||||
{
|
||||
PWNDCLASS_OBJECT ClassObject;
|
||||
WORD objectSize;
|
||||
LPWSTR namePtrW;
|
||||
LPSTR namePtrA;
|
||||
ULONG menulenA=1, menulenW=sizeof(WCHAR);
|
||||
PWNDCLASS_OBJECT ClassObject;
|
||||
WORD objectSize;
|
||||
objectSize = sizeof(WNDCLASS_OBJECT);
|
||||
ClassObject = ObmCreateObject(NULL, NULL, otClass, objectSize);
|
||||
if (ClassObject == 0)
|
||||
{
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
/* FIXME - how to handle INT resources? */
|
||||
/* FIXME - lpszClassName = Atom? is that right */
|
||||
if ( bUnicodeClass )
|
||||
{
|
||||
if ( lpwcxw->lpszMenuName )
|
||||
{
|
||||
menulenW = (wcslen(lpwcxw->lpszMenuName) + 1) * sizeof(WCHAR);
|
||||
RtlUnicodeToMultiByteSize ( &menulenA, lpwcxw->lpszMenuName, menulenW );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( lpwcxa->lpszMenuName )
|
||||
{
|
||||
menulenA = strlen(lpwcxa->lpszMenuName) + 1;
|
||||
RtlMultiByteToUnicodeSize ( &menulenW, lpwcxa->lpszMenuName, menulenA );
|
||||
}
|
||||
}
|
||||
objectSize = sizeof(WNDCLASS_OBJECT);
|
||||
ClassObject = ObmCreateObject(NULL, NULL, otClass, objectSize);
|
||||
if (ClassObject == 0)
|
||||
{
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
if ( bUnicodeClass )
|
||||
{
|
||||
memmove ( &ClassObject->ClassW, lpwcxw, sizeof(ClassObject->ClassW) );
|
||||
memmove ( &ClassObject->ClassA, &ClassObject->ClassW, sizeof(ClassObject->ClassA) );
|
||||
ClassObject->ClassA.lpfnWndProc = 0xCCCCCCCC; /*FIXME: figure out what the correct strange value is and what to do with it */
|
||||
namePtrW = ExAllocatePool(PagedPool, menulenW);
|
||||
if ( lpwcxw->lpszMenuName )
|
||||
memmove ( namePtrW, lpwcxw->lpszMenuName, menulenW );
|
||||
else
|
||||
*namePtrW = L'\0';
|
||||
ClassObject->ClassW.lpszMenuName = namePtrW;
|
||||
namePtrA = ExAllocatePool(PagedPool, menulenA);
|
||||
if ( *namePtrW )
|
||||
RtlUnicodeToMultiByteN ( namePtrA, menulenA, NULL, namePtrW, menulenW );
|
||||
else
|
||||
*namePtrA = '\0';
|
||||
ClassObject->ClassA.lpszMenuName = namePtrA;
|
||||
}
|
||||
else
|
||||
{
|
||||
memmove ( &ClassObject->ClassA, lpwcxa, sizeof(ClassObject->ClassA) );
|
||||
memmove ( &ClassObject->ClassW, &ClassObject->ClassA, sizeof(ClassObject->ClassW) );
|
||||
ClassObject->ClassW.lpfnWndProc = 0xCCCCCCCC; /* FIXME: figure out what the correct strange value is and what to do with it */
|
||||
namePtrA = ExAllocatePool(PagedPool, menulenA);
|
||||
if ( lpwcxa->lpszMenuName )
|
||||
memmove ( namePtrA, lpwcxa->lpszMenuName, menulenA );
|
||||
else
|
||||
*namePtrA = '\0';
|
||||
ClassObject->ClassA.lpszMenuName = namePtrA;
|
||||
namePtrW = ExAllocatePool(PagedPool, menulenW);
|
||||
if ( *namePtrA )
|
||||
RtlMultiByteToUnicodeN ( namePtrW, menulenW, NULL, namePtrA, menulenA );
|
||||
else
|
||||
*namePtrW = L'\0';
|
||||
ClassObject->ClassW.lpszMenuName = namePtrW;
|
||||
}
|
||||
ClassObject->Unicode = bUnicodeClass;
|
||||
ClassObject->ClassW.lpszClassName = (LPWSTR)(ULONG)Atom;
|
||||
ClassObject->ClassA.lpszClassName = (LPSTR)(ULONG)Atom;
|
||||
return(ClassObject);
|
||||
ClassObject->cbSize = lpwcx->cbSize;
|
||||
ClassObject->style = lpwcx->style;
|
||||
ClassObject->cbClsExtra = lpwcx->cbClsExtra;
|
||||
ClassObject->cbWndExtra = lpwcx->cbWndExtra;
|
||||
ClassObject->hInstance = lpwcx->hInstance;
|
||||
ClassObject->hIcon = lpwcx->hIcon;
|
||||
ClassObject->hCursor = lpwcx->hCursor;
|
||||
ClassObject->hbrBackground = lpwcx->hbrBackground;
|
||||
ClassObject->Unicode = bUnicodeClass;
|
||||
ClassObject->hIconSm = lpwcx->hIconSm;
|
||||
ClassObject->lpszClassName = (PUNICODE_STRING)(ULONG)Atom;
|
||||
if (bUnicodeClass)
|
||||
{
|
||||
ClassObject->lpfnWndProcW = lpwcx->lpfnWndProc;
|
||||
ClassObject->lpfnWndProcA = (WNDPROC)0xCCCCCCCC;
|
||||
}
|
||||
else
|
||||
{
|
||||
ClassObject->lpfnWndProcA = lpwcx->lpfnWndProc;
|
||||
ClassObject->lpfnWndProcW = (WNDPROC)0xCCCCCCCC;
|
||||
}
|
||||
if (HIWORD(lpwcx->lpszMenuName) == 0)
|
||||
{
|
||||
ClassObject->lpszMenuName = (PUNICODE_STRING)lpwcx->lpszMenuName;
|
||||
}
|
||||
else
|
||||
{
|
||||
RtlCreateUnicodeString(ClassObject->lpszMenuName,(LPWSTR)lpwcx->lpszMenuName);
|
||||
}
|
||||
return(ClassObject);
|
||||
}
|
||||
|
||||
RTL_ATOM STDCALL
|
||||
NtUserRegisterClassExWOW(CONST WNDCLASSEXW *lpwcxw,
|
||||
CONST WNDCLASSEXA *lpwcxa,
|
||||
NtUserRegisterClassExWOW(CONST WNDCLASSEXW *lpwcx,
|
||||
BOOL bUnicodeClass,
|
||||
DWORD Unknown3,
|
||||
DWORD Unknown4,
|
||||
@@ -295,117 +273,63 @@ NtUserRegisterClassExWOW(CONST WNDCLASSEXW *lpwcxw,
|
||||
* Registers a new class with the window manager
|
||||
* ARGUMENTS:
|
||||
* lpcxw = Win32 extended window class structure (unicode)
|
||||
* lpcxa = Win32 extended window class structure (ascii)
|
||||
* bUnicodeClass = Wether to send ANSI or unicode strings
|
||||
* to window procedures
|
||||
* RETURNS:
|
||||
* Atom identifying the new class
|
||||
*/
|
||||
{
|
||||
PWINSTATION_OBJECT WinStaObject;
|
||||
PWNDCLASS_OBJECT ClassObject;
|
||||
NTSTATUS Status;
|
||||
RTL_ATOM Atom;
|
||||
LPWSTR classname;
|
||||
int len;
|
||||
|
||||
DPRINT("About to open window station handle (0x%X)\n",
|
||||
PROCESS_WINDOW_STATION());
|
||||
|
||||
Status = ValidateWindowStationHandle(PROCESS_WINDOW_STATION(),
|
||||
KernelMode,
|
||||
0,
|
||||
&WinStaObject);
|
||||
if (!NT_SUCCESS(Status))
|
||||
PWINSTATION_OBJECT WinStaObject;
|
||||
PWNDCLASS_OBJECT ClassObject;
|
||||
NTSTATUS Status;
|
||||
RTL_ATOM Atom;
|
||||
DPRINT("About to open window station handle (0x%X)\n",
|
||||
PROCESS_WINDOW_STATION());
|
||||
Status = ValidateWindowStationHandle(PROCESS_WINDOW_STATION(),
|
||||
KernelMode,
|
||||
0,
|
||||
&WinStaObject);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT("Validation of window station handle (0x%X) failed\n",
|
||||
PROCESS_WINDOW_STATION());
|
||||
return((RTL_ATOM)0);
|
||||
}
|
||||
if (!IS_ATOM(lpwcx->lpszClassName))
|
||||
{
|
||||
DPRINT("Validation of window station handle (0x%X) failed\n",
|
||||
PROCESS_WINDOW_STATION());
|
||||
return((RTL_ATOM)0);
|
||||
}
|
||||
if (bUnicodeClass)
|
||||
{
|
||||
if (!IS_ATOM(lpwcxw->lpszClassName))
|
||||
{
|
||||
Status = RtlAddAtomToAtomTable(WinStaObject->AtomTable,
|
||||
(LPWSTR)lpwcxw->lpszClassName,
|
||||
&Atom);
|
||||
(LPWSTR)lpwcx->lpszClassName,
|
||||
&Atom);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ObDereferenceObject(WinStaObject);
|
||||
DPRINT("Failed adding class name (%wS) to atom table\n",
|
||||
lpwcxw->lpszClassName);
|
||||
SetLastNtError(Status);
|
||||
return((RTL_ATOM)0);
|
||||
}
|
||||
ObDereferenceObject(WinStaObject);
|
||||
DPRINT("Failed adding class name (%wS) to atom table\n",
|
||||
lpwcx->lpszClassName);
|
||||
SetLastNtError(Status);
|
||||
return((RTL_ATOM)0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Atom = (RTL_ATOM)(ULONG)lpwcxw->lpszClassName;
|
||||
}
|
||||
ClassObject = W32kCreateClass(lpwcxw, NULL, bUnicodeClass, Atom);
|
||||
{
|
||||
Atom = (RTL_ATOM)(ULONG)lpwcx->lpszClassName;
|
||||
}
|
||||
ClassObject = W32kCreateClass(lpwcx, bUnicodeClass, Atom);
|
||||
if (ClassObject == NULL)
|
||||
{
|
||||
if (!IS_ATOM(lpwcxw->lpszClassName))
|
||||
if (!IS_ATOM(lpwcx->lpszClassName))
|
||||
{
|
||||
RtlDeleteAtomFromAtomTable(WinStaObject->AtomTable, Atom);
|
||||
RtlDeleteAtomFromAtomTable(WinStaObject->AtomTable, Atom);
|
||||
}
|
||||
ObDereferenceObject(WinStaObject);
|
||||
DPRINT("Failed creating window class object\n");
|
||||
SetLastNtError(STATUS_INSUFFICIENT_RESOURCES);
|
||||
return((RTL_ATOM)0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!IS_ATOM(lpwcxa->lpszClassName))
|
||||
{
|
||||
len = strlen(lpwcxa->lpszClassName);
|
||||
classname = ExAllocatePool(PagedPool, ((len + 1) * sizeof(WCHAR)));
|
||||
Status = RtlMultiByteToUnicodeN (classname,
|
||||
((len + 1) * sizeof(WCHAR)),
|
||||
NULL,
|
||||
lpwcxa->lpszClassName,
|
||||
len);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
Status = RtlAddAtomToAtomTable(WinStaObject->AtomTable,
|
||||
(LPWSTR)classname,
|
||||
&Atom);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ObDereferenceObject(WinStaObject);
|
||||
DPRINT("Failed adding class name (%wS) to atom table\n",
|
||||
lpwcxa->lpszClassName);
|
||||
SetLastNtError(Status);
|
||||
return((RTL_ATOM)0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Atom = (RTL_ATOM)(ULONG)lpwcxa->lpszClassName;
|
||||
}
|
||||
ClassObject = W32kCreateClass(NULL, lpwcxa, bUnicodeClass, Atom);
|
||||
if (ClassObject == NULL)
|
||||
{
|
||||
if (!IS_ATOM(lpwcxa->lpszClassName))
|
||||
{
|
||||
RtlDeleteAtomFromAtomTable(WinStaObject->AtomTable, Atom);
|
||||
}
|
||||
ObDereferenceObject(WinStaObject);
|
||||
DPRINT("Failed creating window class object\n");
|
||||
SetLastNtError(STATUS_INSUFFICIENT_RESOURCES);
|
||||
return((RTL_ATOM)0);
|
||||
}
|
||||
}
|
||||
ExAcquireFastMutex(&PsGetWin32Process()->ClassListLock);
|
||||
InsertTailList(&PsGetWin32Process()->ClassListHead, &ClassObject->ListEntry);
|
||||
ExReleaseFastMutex(&PsGetWin32Process()->ClassListLock);
|
||||
|
||||
ObDereferenceObject(WinStaObject);
|
||||
|
||||
return(Atom);
|
||||
ExAcquireFastMutex(&PsGetWin32Process()->ClassListLock);
|
||||
InsertTailList(&PsGetWin32Process()->ClassListHead, &ClassObject->ListEntry);
|
||||
ExReleaseFastMutex(&PsGetWin32Process()->ClassListLock);
|
||||
ObDereferenceObject(WinStaObject);
|
||||
return(Atom);
|
||||
}
|
||||
|
||||
ULONG FASTCALL
|
||||
@@ -415,27 +339,27 @@ W32kGetClassLong(struct _WINDOW_OBJECT *WindowObject, ULONG Offset, BOOL Ansi)
|
||||
switch (Offset)
|
||||
{
|
||||
case GCL_CBWNDEXTRA:
|
||||
Ret = WindowObject->Class->ClassW.cbWndExtra;
|
||||
Ret = WindowObject->Class->cbWndExtra;
|
||||
break;
|
||||
case GCL_CBCLSEXTRA:
|
||||
Ret = WindowObject->Class->ClassW.cbClsExtra;
|
||||
Ret = WindowObject->Class->cbClsExtra;
|
||||
break;
|
||||
case GCL_HBRBACKGROUND:
|
||||
Ret = (ULONG)WindowObject->Class->ClassW.hbrBackground;
|
||||
Ret = (ULONG)WindowObject->Class->hbrBackground;
|
||||
break;
|
||||
case GCL_HCURSOR:
|
||||
Ret = (ULONG)WindowObject->Class->ClassW.hCursor;
|
||||
Ret = (ULONG)WindowObject->Class->hCursor;
|
||||
break;
|
||||
case GCL_HICON:
|
||||
Ret = (ULONG)WindowObject->Class->ClassW.hIcon;
|
||||
Ret = (ULONG)WindowObject->Class->hIcon;
|
||||
break;
|
||||
case GCL_HICONSM:
|
||||
Ret = (ULONG)WindowObject->Class->ClassW.hIconSm;
|
||||
Ret = (ULONG)WindowObject->Class->hIconSm;
|
||||
break;
|
||||
case GCL_HMODULE:
|
||||
Ret = (ULONG)WindowObject->Class->ClassW.hInstance;
|
||||
Ret = (ULONG)WindowObject->Class->hInstance;
|
||||
break;
|
||||
case GCL_MENUNAME:
|
||||
/*case GCL_MENUNAME:
|
||||
if (Ansi)
|
||||
{
|
||||
Ret = (ULONG)WindowObject->Class->ClassA.lpszMenuName;
|
||||
@@ -444,18 +368,18 @@ W32kGetClassLong(struct _WINDOW_OBJECT *WindowObject, ULONG Offset, BOOL Ansi)
|
||||
{
|
||||
Ret = (ULONG)WindowObject->Class->ClassW.lpszMenuName;
|
||||
}
|
||||
break;
|
||||
break;*/
|
||||
case GCL_STYLE:
|
||||
Ret = WindowObject->Class->ClassW.style;
|
||||
Ret = WindowObject->Class->style;
|
||||
break;
|
||||
case GCL_WNDPROC:
|
||||
if (WindowObject->Unicode)
|
||||
{
|
||||
Ret = (ULONG)WindowObject->Class->ClassW.lpfnWndProc;
|
||||
Ret = (ULONG)WindowObject->Class->lpfnWndProcW;
|
||||
}
|
||||
else
|
||||
{
|
||||
Ret = (ULONG)WindowObject->Class->ClassA.lpfnWndProc;
|
||||
Ret = (ULONG)WindowObject->Class->lpfnWndProcA;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@@ -487,39 +411,31 @@ W32kSetClassLong(PWINDOW_OBJECT WindowObject, ULONG Offset, LONG dwNewLong, BOOL
|
||||
switch (Offset)
|
||||
{
|
||||
case GCL_CBWNDEXTRA:
|
||||
WindowObject->Class->ClassW.cbWndExtra = dwNewLong;
|
||||
WindowObject->Class->ClassA.cbWndExtra = dwNewLong;
|
||||
WindowObject->Class->cbWndExtra = dwNewLong;
|
||||
break;
|
||||
case GCL_CBCLSEXTRA:
|
||||
WindowObject->Class->ClassW.cbClsExtra = dwNewLong;
|
||||
WindowObject->Class->ClassA.cbClsExtra = dwNewLong;
|
||||
WindowObject->Class->cbClsExtra = dwNewLong;
|
||||
break;
|
||||
case GCL_HBRBACKGROUND:
|
||||
WindowObject->Class->ClassW.hbrBackground = (HBRUSH)dwNewLong;
|
||||
WindowObject->Class->ClassA.hbrBackground = (HBRUSH)dwNewLong;
|
||||
WindowObject->Class->hbrBackground = (HBRUSH)dwNewLong;
|
||||
break;
|
||||
case GCL_HCURSOR:
|
||||
WindowObject->Class->ClassW.hCursor = (HCURSOR)dwNewLong;
|
||||
WindowObject->Class->ClassA.hCursor = (HCURSOR)dwNewLong;
|
||||
WindowObject->Class->hCursor = (HCURSOR)dwNewLong;
|
||||
break;
|
||||
case GCL_HICON:
|
||||
WindowObject->Class->ClassW.hIcon = (HICON)dwNewLong;
|
||||
WindowObject->Class->ClassA.hIcon = (HICON)dwNewLong;
|
||||
WindowObject->Class->hIcon = (HICON)dwNewLong;
|
||||
break;
|
||||
case GCL_HICONSM:
|
||||
WindowObject->Class->ClassW.hIconSm = (HICON)dwNewLong;
|
||||
WindowObject->Class->ClassA.hIconSm = (HICON)dwNewLong;
|
||||
WindowObject->Class->hIconSm = (HICON)dwNewLong;
|
||||
break;
|
||||
case GCL_HMODULE:
|
||||
WindowObject->Class->ClassW.hInstance = (HINSTANCE)dwNewLong;
|
||||
WindowObject->Class->ClassA.hInstance = (HINSTANCE)dwNewLong;
|
||||
WindowObject->Class->hInstance = (HINSTANCE)dwNewLong;
|
||||
break;
|
||||
/*case GCL_MENUNAME:
|
||||
WindowObject->Class->Class.lpszMenuName = (LPCWSTR)dwNewLong;
|
||||
break;*/
|
||||
case GCL_STYLE:
|
||||
WindowObject->Class->ClassW.style = dwNewLong;
|
||||
WindowObject->Class->ClassA.style = dwNewLong;
|
||||
WindowObject->Class->style = dwNewLong;
|
||||
break;
|
||||
/*case GCL_WNDPROC:
|
||||
WindowObject->Class->Class.lpfnWndProc = (WNDPROC)dwNewLong;
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
/* $Id: windc.c,v 1.17 2003/08/05 15:41:03 weiden Exp $
|
||||
/* $Id: windc.c,v 1.18 2003/08/06 16:47:35 weiden Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
@@ -250,7 +250,7 @@ NtUserGetDCEx(HWND hWnd, HANDLE ClipRegion, ULONG Flags)
|
||||
|
||||
if (!(Flags & DCX_WINDOW))
|
||||
{
|
||||
if (Window->Class->ClassW.style & CS_PARENTDC)
|
||||
if (Window->Class->style & CS_PARENTDC)
|
||||
{
|
||||
Flags |= DCX_PARENTCLIP;
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
/* $Id: window.c,v 1.78 2003/08/06 13:17:44 weiden Exp $
|
||||
/* $Id: window.c,v 1.79 2003/08/06 16:47:35 weiden Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
@@ -493,8 +493,8 @@ W32kCreateDesktopWindow(PWINSTATION_OBJECT WindowStation,
|
||||
WindowObject->ClientRect = WindowObject->WindowRect;
|
||||
WindowObject->UserData = 0;
|
||||
/*FIXME: figure out what the correct strange value is and what to do with it (and how to set the wndproc values correctly) */
|
||||
WindowObject->WndProcA = DesktopClass->ClassA.lpfnWndProc;
|
||||
WindowObject->WndProcW = DesktopClass->ClassW.lpfnWndProc;
|
||||
WindowObject->WndProcA = DesktopClass->lpfnWndProcA;
|
||||
WindowObject->WndProcW = DesktopClass->lpfnWndProcW;
|
||||
WindowObject->OwnerThread = PsGetCurrentThread();
|
||||
|
||||
InitializeListHead(&WindowObject->ChildrenListHead);
|
||||
@@ -605,7 +605,7 @@ NtUserCreateWindowEx(DWORD dwExStyle,
|
||||
/* Create the window object. */
|
||||
WindowObject = (PWINDOW_OBJECT)
|
||||
ObmCreateObject(PsGetWin32Process()->WindowStation->HandleTable, &Handle,
|
||||
otWindow, sizeof(WINDOW_OBJECT) + ClassObject->ClassW.cbWndExtra
|
||||
otWindow, sizeof(WINDOW_OBJECT) + ClassObject->cbWndExtra
|
||||
);
|
||||
|
||||
DPRINT("Created object with handle %X\n", Handle);
|
||||
@@ -639,15 +639,15 @@ NtUserCreateWindowEx(DWORD dwExStyle,
|
||||
WindowObject->Parent = ParentWindow;
|
||||
WindowObject->UserData = 0;
|
||||
WindowObject->Unicode = ClassObject->Unicode;
|
||||
WindowObject->WndProcA = ClassObject->ClassA.lpfnWndProc;
|
||||
WindowObject->WndProcW = ClassObject->ClassW.lpfnWndProc;
|
||||
WindowObject->WndProcA = ClassObject->lpfnWndProcA;
|
||||
WindowObject->WndProcW = ClassObject->lpfnWndProcW;
|
||||
WindowObject->OwnerThread = PsGetCurrentThread();
|
||||
|
||||
/* extra window data */
|
||||
if (ClassObject->ClassW.cbWndExtra != 0)
|
||||
if (ClassObject->cbWndExtra != 0)
|
||||
{
|
||||
WindowObject->ExtraData = (PULONG)(WindowObject + 1);
|
||||
WindowObject->ExtraDataSize = ClassObject->ClassW.cbWndExtra;
|
||||
WindowObject->ExtraDataSize = ClassObject->cbWndExtra;
|
||||
RtlZeroMemory(WindowObject->ExtraData, WindowObject->ExtraDataSize);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
/* $Id: winsta.c,v 1.23 2003/08/05 15:41:03 weiden Exp $
|
||||
/* $Id: winsta.c,v 1.24 2003/08/06 16:47:35 weiden Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
@@ -203,7 +203,7 @@ InitWindowStationImpl(VOID)
|
||||
wcx.hbrBackground = NULL;
|
||||
wcx.lpszMenuName = NULL;
|
||||
wcx.lpszClassName = L"DesktopWindowClass";
|
||||
DesktopWindowClass = W32kCreateClass(&wcx, 0, TRUE, (RTL_ATOM)32880);
|
||||
DesktopWindowClass = W32kCreateClass(&wcx, TRUE, (RTL_ATOM)32880);
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user