- [Win32k] More work on classes. ReactOS seems to return the opposite WinProc and sometimes it is a CallProcData handle. This is confusing the class wine tests. The last thing it should do is return CallProcData handle after attempting to find the right proc. Fixed message class bits. Moved CallProc to CallProcData and updated related code. Started alternate function to replace NtUserGetClassLong and NtUserGetWindowLong.

- Tested wine, Firefox 1.15.xx and AbiWord 2.6.8.

svn path=/trunk/; revision=42185
This commit is contained in:
James Tabor 2009-07-25 00:41:22 +00:00
parent f9fe2ff6a8
commit 3ac2563fbb
13 changed files with 192 additions and 143 deletions

View file

@ -108,7 +108,7 @@ GetThreadDesktopInfo(VOID)
return di;
}
PCALLPROC FASTCALL ValidateCallProc(HANDLE hCallProc);
PCALLPROCDATA FASTCALL ValidateCallProc(HANDLE hCallProc);
PWND FASTCALL ValidateHwnd(HWND hwnd);
PWND FASTCALL ValidateHwndOrDesk(HWND hwnd);
PWND FASTCALL GetThreadDesktopWnd(VOID);

View file

@ -270,7 +270,7 @@ BOOL
FASTCALL
TestWindowProcess(PWND Wnd)
{
if (Wnd->ti == (PW32THREADINFO)NtCurrentTeb()->Win32ThreadInfo)
if (Wnd->pti == (PW32THREADINFO)NtCurrentTeb()->Win32ThreadInfo)
return TRUE;
else
return (NtUserQueryWindow(Wnd->hdr.Handle, QUERY_WINDOW_UNIQUE_PROCESS_ID) ==
@ -426,15 +426,20 @@ ValidateHandleNoErr(HANDLE handle, UINT uType)
//
// Validate a callproc handle and return the pointer to the object.
//
PCALLPROC
PCALLPROCDATA
FASTCALL
ValidateCallProc(HANDLE hCallProc)
{
PCALLPROC CallProc = ValidateHandle(hCallProc, VALIDATE_TYPE_CALLPROC);
if (CallProc != NULL && CallProc->pi == g_ppi)
return CallProc;
PUSER_HANDLE_ENTRY pEntry;
return NULL;
PCALLPROCDATA CallProc = ValidateHandle(hCallProc, VALIDATE_TYPE_CALLPROC);
pEntry = GetUser32Handle(hCallProc);
if (CallProc != NULL && pEntry->ppi == g_ppi)
return CallProc;
return NULL;
}
//

View file

@ -1238,7 +1238,7 @@ CallWindowProcA(WNDPROC lpPrevWndFunc,
WPARAM wParam,
LPARAM lParam)
{
PCALLPROC CallProc;
PCALLPROCDATA CallProc;
if (lpPrevWndFunc == NULL)
{
@ -1253,7 +1253,7 @@ CallWindowProcA(WNDPROC lpPrevWndFunc,
CallProc = ValidateCallProc((HANDLE)lpPrevWndFunc);
if (CallProc != NULL)
{
return IntCallWindowProcA(!CallProc->Unicode, CallProc->WndProc,
return IntCallWindowProcA(!CallProc->Unicode, CallProc->pfnClientPrevious,
hWnd, Msg, wParam, lParam);
}
else
@ -1275,7 +1275,7 @@ CallWindowProcW(WNDPROC lpPrevWndFunc,
WPARAM wParam,
LPARAM lParam)
{
PCALLPROC CallProc;
PCALLPROCDATA CallProc;
/* FIXME - can the first parameter be NULL? */
if (lpPrevWndFunc == NULL)
@ -1291,7 +1291,7 @@ CallWindowProcW(WNDPROC lpPrevWndFunc,
CallProc = ValidateCallProc((HANDLE)lpPrevWndFunc);
if (CallProc != NULL)
{
return IntCallWindowProcW(!CallProc->Unicode, CallProc->WndProc,
return IntCallWindowProcW(!CallProc->Unicode, CallProc->pfnClientPrevious,
hWnd, Msg, wParam, lParam);
}
else
@ -1340,7 +1340,7 @@ DispatchMessageA(CONST MSG *lpmsg)
if (lpmsg->hwnd != NULL)
{
Wnd = ValidateHwnd(lpmsg->hwnd);
if (!Wnd || SharedPtrToUser(Wnd->ti) != GetW32ThreadInfo())
if (!Wnd || SharedPtrToUser(Wnd->pti) != GetW32ThreadInfo())
return 0;
}
else
@ -1401,7 +1401,7 @@ DispatchMessageW(CONST MSG *lpmsg)
if (lpmsg->hwnd != NULL)
{
Wnd = ValidateHwnd(lpmsg->hwnd);
if (!Wnd || SharedPtrToUser(Wnd->ti) != GetW32ThreadInfo())
if (!Wnd || SharedPtrToUser(Wnd->pti) != GetW32ThreadInfo())
return 0;
}
else
@ -1801,7 +1801,7 @@ SendMessageW(HWND Wnd,
PW32THREADINFO ti = GetW32ThreadInfo();
Window = ValidateHwnd(Wnd);
if (Window != NULL && SharedPtrToUser(Window->ti) == ti && !IsThreadHooked(GetWin32ClientInfo()))
if (Window != NULL && SharedPtrToUser(Window->pti) == ti && !IsThreadHooked(GetWin32ClientInfo()))
{
/* NOTE: We can directly send messages to the window procedure
if *all* the following conditions are met:
@ -1865,7 +1865,7 @@ SendMessageA(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
PW32THREADINFO ti = GetW32ThreadInfo();
Window = ValidateHwnd(Wnd);
if (Window != NULL && SharedPtrToUser(Window->ti) == ti && !IsThreadHooked(GetWin32ClientInfo()))
if (Window != NULL && SharedPtrToUser(Window->pti) == ti && !IsThreadHooked(GetWin32ClientInfo()))
{
/* NOTE: We can directly send messages to the window procedure
if *all* the following conditions are met:

View file

@ -1268,7 +1268,7 @@ GetWindowThreadProcessId(HWND hWnd,
if (!pWnd) return Ret;
ti = SharedPtrToUser(pWnd->ti);
ti = SharedPtrToUser(pWnd->pti);
if (ti)
{

View file

@ -3,6 +3,7 @@
typedef struct _PROCESSINFO *PPROCESSINFO;
struct _W32THREADINFO;
struct _DESKTOP;
struct _WND;
typedef struct _LARGE_UNICODE_STRING
@ -89,14 +90,29 @@ typedef struct _DESKTOPINFO
WCHAR szDesktopName[1];
} DESKTOPINFO, *PDESKTOPINFO;
typedef struct _CALLPROC
typedef enum _GETCPD
{
UserGetCPDU2A = 0x01,
UserGetCPDA2U = 0X02,
UserGetCPDClass = 0X10,
UserGetCPDWindow = 0X20,
UserGetCPDDialog = 0X40,
UserGetCPDWndtoCls = 0X80
} GETCPD, *PGETCPD;
typedef struct _CALLPROCDATA
{
// PROCDESKHEAD head; // Use this once new handle manager is implemented!!!
USER_OBJHDR hdr; /* FIXME: Move out of the structure once new handle manager is implemented */
struct _PROCESSINFO *pi;
WNDPROC WndProc;
struct _CALLPROC *Next;
UINT Unicode : 1;
} CALLPROC, *PCALLPROC;
//
struct _CALLPROCDATA *spcpdNext;
WNDPROC pfnClientPrevious;
union
{
GETCPD wType;
UINT Unicode : 1;
};
} CALLPROCDATA, *PCALLPROCDATA;
#define CSF_SERVERSIDEPROC 0x0001
#define CSF_ANSIPROC 0x0002
@ -118,7 +134,7 @@ typedef struct _CLS
DWORD CSF_flags;
PSTR lpszClientAnsiMenuName; // For client use
PWSTR lpszClientUnicodeMenuName; // " " "
PCALLPROC spcpdFirst;
PCALLPROCDATA spcpdFirst;
struct _CLS *pclsBase;
struct _CLS *pclsClone;
ULONG cWndReferenceCount;
@ -127,7 +143,7 @@ typedef struct _CLS
union
{
WNDPROC WndProcExtra;
PCALLPROC CallProc;
PCALLPROCDATA CallProc;
};
INT cbclsExtra;
INT cbwndExtra;
@ -241,14 +257,15 @@ typedef struct _CLS
typedef struct _WND
{
//THRDESKHEAD head; // head.h == handle
USER_OBJHDR hdr; /* FIXME: Move out of the structure once new handle manager is implemented */
/* NOTE: This structure is located in the desktop heap and will
eventually replace WINDOW_OBJECT. Right now WINDOW_OBJECT
keeps a reference to this structure until all the information
is moved to this structure */
struct _PROCESSINFO *pi; /* FIXME: Move to object header some day */
struct _W32THREADINFO *ti;
struct _DESKTOP *pdesktop;
struct _PROCESSINFO *pi; // head.pti->ppi
struct _W32THREADINFO *pti; // head.pti
struct _DESKTOP *rpdesk; // head.rpdesk
DWORD state;
DWORD state2;
@ -270,7 +287,7 @@ typedef struct _WND
union
{
/* Pointer to a call procedure handle */
PCALLPROC CallProc;
PCALLPROCDATA CallProc;
/* Extra Wnd proc (windows of system classes) */
WNDPROC WndProcExtra;
};
@ -545,7 +562,7 @@ typedef struct _CLIENTTHREADINFO
WORD fsWakeBits;
WORD fsWakeBitsJournal;
WORD fsWakeMask;
LONG timeLastRead;
ULONG tickLastMsgChecked;
DWORD dwcPumpHook;
} CLIENTTHREADINFO, *PCLIENTTHREADINFO;
@ -1379,14 +1396,16 @@ NtUserDdeSetQualityOfService(
OUT PSECURITY_QUALITY_OF_SERVICE pqosPrev);
HDWP NTAPI
NtUserDeferWindowPos(HDWP WinPosInfo,
HWND Wnd,
HWND WndInsertAfter,
int x,
int y,
int cx,
int cy,
UINT Flags);
NtUserDeferWindowPos(
HDWP WinPosInfo,
HWND Wnd,
HWND WndInsertAfter,
int x,
int y,
int cx,
int cy,
UINT Flags);
BOOL NTAPI
NtUserDefSetText(HWND WindowHandle, PLARGE_STRING WindowText);
@ -1680,12 +1699,12 @@ NtUserGetControlColor(
HDC hdc,
UINT CtlMsg);
DWORD
ULONG_PTR
NTAPI
NtUserGetCPD(
DWORD Unknown0,
DWORD Unknown1,
DWORD Unknown2);
HWND hWnd,
GETCPD Flags,
ULONG_PTR Proc);
DWORD
NTAPI
@ -3025,7 +3044,7 @@ NtUserCreateCursorIconHandle(
BOOL Indirect);
/* Should be done in usermode */
/* Should be done in usermode and use NtUserGetCPD. */
ULONG_PTR
NTAPI
NtUserGetClassLong(HWND hWnd, INT Offset, BOOL Ansi);
@ -3067,7 +3086,7 @@ HWND
NTAPI
NtUserGetWindow(HWND hWnd, UINT Relationship);
/* Should be done in usermode */
/* Should be done in usermode and use NtUserGetCPD. */
LONG
NTAPI
NtUserGetWindowLong(HWND hWnd, DWORD Index, BOOL Ansi);

View file

@ -21,17 +21,17 @@ IsCallProcHandle(IN WNDPROC lpWndProc)
}
WNDPROC
GetCallProcHandle(IN PCALLPROC CallProc);
GetCallProcHandle(IN PCALLPROCDATA CallProc);
VOID
DestroyCallProc(IN PDESKTOPINFO Desktop,
IN OUT PCALLPROC CallProc);
IN OUT PCALLPROCDATA CallProc);
PCALLPROC
PCALLPROCDATA
CloneCallProc(IN PDESKTOPINFO Desktop,
IN PCALLPROC CallProc);
IN PCALLPROCDATA CallProc);
PCALLPROC
PCALLPROCDATA
CreateCallProc(IN PDESKTOPINFO Desktop,
IN WNDPROC WndProc,
IN BOOL Unicode,
@ -87,7 +87,7 @@ IntCreateClass(IN CONST WNDCLASSEXW* lpwcx,
IN PDESKTOP Desktop,
IN PPROCESSINFO pi);
PCALLPROC
PCALLPROCDATA
UserFindCallProc(IN PCLS Class,
IN WNDPROC WndProc,
IN BOOL bUnicode);
@ -98,7 +98,7 @@ UserRegisterSystemClasses(IN ULONG Count,
VOID
UserAddCallProcToClass(IN OUT PCLS Class,
IN PCALLPROC CallProc);
IN PCALLPROCDATA CallProc);
BOOL
IntGetAtomFromStringOrAtom(IN PUNICODE_STRING ClassName,

View file

@ -1,27 +1,8 @@
/*
* ReactOS W32 Subsystem
* Copyright (C) 1998 - 2006 ReactOS Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: class.c 21596 2006-04-15 10:41:58Z greatlrd $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* PURPOSE: Window classes
* FILE: subsys/win32k/ntuser/class.c
* FILE: subsystems/win32/win32k/ntuser/class.c
* PROGRAMER: Thomas Weidenmueller <w3seek@reactos.com>
* REVISION HISTORY:
* 06-06-2001 CSH Created
@ -36,7 +17,7 @@
/* CALLPROC ******************************************************************/
WNDPROC
GetCallProcHandle(IN PCALLPROC CallProc)
GetCallProcHandle(IN PCALLPROCDATA CallProc)
{
/* FIXME - check for 64 bit architectures... */
return (WNDPROC)((ULONG_PTR)UserObjectToHandle(CallProc) | 0xFFFF0000);
@ -44,7 +25,7 @@ GetCallProcHandle(IN PCALLPROC CallProc)
VOID
DestroyCallProc(IN PDESKTOPINFO Desktop,
IN OUT PCALLPROC CallProc)
IN OUT PCALLPROCDATA CallProc)
{
/* FIXME - use new object manager! */
HANDLE Handle = UserObjectToHandle(CallProc);
@ -53,51 +34,49 @@ DestroyCallProc(IN PDESKTOPINFO Desktop,
otCallProc);
}
PCALLPROC
PCALLPROCDATA
CloneCallProc(IN PDESKTOPINFO Desktop,
IN PCALLPROC CallProc)
IN PCALLPROCDATA CallProc)
{
PCALLPROC NewCallProc;
PCALLPROCDATA NewCallProc;
HANDLE Handle;
/* FIXME - use new object manager! */
NewCallProc = (PCALLPROC)UserCreateObject(gHandleTable,
NewCallProc = (PCALLPROCDATA)UserCreateObject(gHandleTable,
&Handle,
otCallProc,
sizeof(CALLPROC));
sizeof(CALLPROCDATA));
if (NewCallProc != NULL)
{
NewCallProc->hdr.Handle = Handle; /* FIXME: Remove hack */
NewCallProc->pi = CallProc->pi;
NewCallProc->WndProc = CallProc->WndProc;
NewCallProc->pfnClientPrevious = CallProc->pfnClientPrevious;
NewCallProc->Unicode = CallProc->Unicode;
NewCallProc->Next = NULL;
NewCallProc->spcpdNext = NULL;
}
return NewCallProc;
}
PCALLPROC
PCALLPROCDATA
CreateCallProc(IN PDESKTOPINFO Desktop,
IN WNDPROC WndProc,
IN BOOL Unicode,
IN PPROCESSINFO pi)
{
PCALLPROC NewCallProc;
PCALLPROCDATA NewCallProc;
HANDLE Handle;
/* FIXME - use new object manager! */
NewCallProc = (PCALLPROC)UserCreateObject(gHandleTable,
NewCallProc = (PCALLPROCDATA)UserCreateObject(gHandleTable,
&Handle,
otCallProc,
sizeof(CALLPROC));
sizeof(CALLPROCDATA));
if (NewCallProc != NULL)
{
NewCallProc->hdr.Handle = Handle; /* FIXME: Remove hack */
NewCallProc->pi = pi;
NewCallProc->WndProc = WndProc;
NewCallProc->pfnClientPrevious = WndProc;
NewCallProc->Unicode = Unicode;
NewCallProc->Next = NULL;
NewCallProc->spcpdNext = NULL;
}
return NewCallProc;
@ -107,7 +86,7 @@ BOOL
UserGetCallProcInfo(IN HANDLE hCallProc,
OUT PWNDPROC_INFO wpInfo)
{
PCALLPROC CallProc;
PCALLPROCDATA CallProc;
/* NOTE: Accessing the WNDPROC_INFO structure may raise an exception! */
@ -120,13 +99,70 @@ UserGetCallProcInfo(IN HANDLE hCallProc,
return FALSE;
}
/* Use Handle pEntry->ppi!
if (CallProc->pi != GetW32ProcessInfo())
{
return FALSE;
}
}*/
wpInfo->WindowProc = CallProc->WndProc;
wpInfo->WindowProc = CallProc->pfnClientPrevious;
wpInfo->IsUnicode = CallProc->Unicode;
return TRUE;
}
/* SYSCALLS *****************************************************************/
/*
Retrieve the WinProcA/W or CallProcData handle for Class, Dialog or Window.
This Function called from user space uses Window handle for class, window
and dialog procs only.
Note:
ProcIn is the default proc from pCls/pDlg/pWnd->lpfnXxyz, caller is
looking for another type of proc if the original lpfnXxyz proc is preset
to Ansi or Unicode.
Example:
If pWnd is created from Ansi and lpfnXxyz is assumed to be Ansi, caller
will ask for Unicode Proc return Proc or CallProcData handle.
This function should replaced NtUserGetClassLong and NtUserGetWindowLong.
*/
ULONG_PTR
APIENTRY
NtUserGetCPD(
HWND hWnd,
GETCPD Flags,
ULONG_PTR ProcIn)
{
PWINDOW_OBJECT Window;
PWND Wnd;
PCLS Class;
ULONG_PTR Result = 0;
BOOL Ansi;
UserEnterExclusive();
if (!(Window = UserGetWindowObject(hWnd)) || !Window->Wnd)
{
goto Cleanup;
}
Wnd = Window->Wnd;
Class = Wnd->pcls;
/* Ex: Retrieve the Unicode Proc since the default is Ansi. */
Ansi = (Flags & UserGetCPDA2U); // Ansi to Unicode request from user.
if ( Flags & (UserGetCPDWindow|UserGetCPDDialog))
{
Result = UserGetWindowLong( hWnd, GWL_WNDPROC, Ansi);
}
else if (Flags & (UserGetCPDClass|UserGetCPDWndtoCls))
{
Result = UserGetClassLongPtr( Class, GCLP_WNDPROC, Ansi);
}
Cleanup:
UserLeave();
return Result;
}

View file

@ -80,15 +80,15 @@ IntDestroyClass(IN OUT PCLS Class)
if (Class->pclsBase == Class)
{
PCALLPROC CallProc, NextCallProc;
PCALLPROCDATA CallProc, NextCallProc;
/* Destroy allocated callproc handles */
CallProc = Class->spcpdFirst;
while (CallProc != NULL)
{
NextCallProc = CallProc->Next;
NextCallProc = CallProc->spcpdNext;
CallProc->Next = NULL;
CallProc->spcpdNext = NULL;
DestroyCallProc(NULL,
CallProc);
@ -211,23 +211,23 @@ IntDeregisterClassAtom(IN RTL_ATOM Atom)
Atom);
}
PCALLPROC
PCALLPROCDATA
UserFindCallProc(IN PCLS Class,
IN WNDPROC WndProc,
IN BOOL bUnicode)
{
PCALLPROC CallProc;
PCALLPROCDATA CallProc;
CallProc = Class->spcpdFirst;
while (CallProc != NULL)
{
if (CallProc->WndProc == WndProc &&
if (CallProc->pfnClientPrevious == WndProc &&
CallProc->Unicode == (UINT)bUnicode)
{
return CallProc;
}
CallProc = CallProc->Next;
CallProc = CallProc->spcpdNext;
}
return NULL;
@ -235,15 +235,15 @@ UserFindCallProc(IN PCLS Class,
VOID
UserAddCallProcToClass(IN OUT PCLS Class,
IN PCALLPROC CallProc)
IN PCALLPROCDATA CallProc)
{
PCLS BaseClass;
ASSERT(CallProc->Next == NULL);
ASSERT(CallProc->spcpdNext == NULL);
BaseClass = Class->pclsBase;
ASSERT(CallProc->Next == NULL);
CallProc->Next = BaseClass->spcpdFirst;
ASSERT(CallProc->spcpdNext == NULL);
CallProc->spcpdNext = BaseClass->spcpdFirst;
BaseClass->spcpdFirst = CallProc;
/* Update all clones */
@ -289,21 +289,22 @@ IntSetClassAtom(IN OUT PCLS Class,
static WNDPROC
IntGetClassWndProc(IN PCLS Class,
IN PPROCESSINFO pi,
IN BOOL Ansi)
IN BOOL Ansi) // This is what we are looking for?!?
{
ASSERT(UserIsEnteredExclusive() == TRUE);
/* System Classes */
if (Class->System)
{
// FIXME! System class have gpsi->apfnClientA/W to pick from.
return (Ansi ? Class->WndProcExtra : Class->lpfnWndProc);
}
else
{
else
{ /* Unicode Proc */
if (!Ansi == Class->Unicode)
{
return Class->lpfnWndProc;
}
else
else // Ansi?
{
PCLS BaseClass;
@ -318,7 +319,7 @@ IntGetClassWndProc(IN PCLS Class,
}
else
{
PCALLPROC NewCallProc;
PCALLPROCDATA NewCallProc;
if (pi == NULL)
return NULL;

View file

@ -1118,8 +1118,8 @@ NtUserCreateDesktop(
RtlZeroMemory(&WindowName, sizeof(WindowName));
wc.cbSize = sizeof(wc);
wc.style = CS_DBLCLKS|CS_PARENTDC;
wc.lpfnWndProc = gpsi->apfnClientW.pfnDesktopWndProc; // Use User32 Desktop Proc.
wc.style = 0;
wc.lpfnWndProc = gpsi->apfnClientW.pfnDesktopWndProc; // Use pfnMessageWindowProc
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hModClient;

View file

@ -270,18 +270,6 @@ NtUserGetControlColor(
return 0;
}
DWORD
APIENTRY
NtUserGetCPD(
DWORD Unknown0,
DWORD Unknown1,
DWORD Unknown2)
{
UNIMPLEMENTED
return 0;
}
DWORD
APIENTRY
NtUserGetImeHotKey(

View file

@ -27,7 +27,7 @@
#define NDEBUG
#include <debug.h>
int usedHandles=0;
//int usedHandles=0;
PUSER_HANDLE_TABLE gHandleTable = NULL;
@ -55,14 +55,14 @@ __inline static PUSER_HANDLE_ENTRY alloc_user_entry(PUSER_HANDLE_TABLE ht)
{
PUSER_HANDLE_ENTRY entry;
DPRINT("handles used %i\n",usedHandles);
DPRINT("handles used %i\n",gpsi->cHandleEntries);
if (ht->freelist)
{
entry = ht->freelist;
ht->freelist = entry->ptr;
usedHandles++;
gpsi->cHandleEntries++;
return entry;
}
@ -72,7 +72,7 @@ __inline static PUSER_HANDLE_ENTRY alloc_user_entry(PUSER_HANDLE_TABLE ht)
int i, iFree = 0, iWindow = 0, iMenu = 0, iCursorIcon = 0,
iHook = 0, iCallProc = 0, iAccel = 0, iMonitor = 0, iTimer = 0;
/**/
DPRINT1("Out of user handles! Used -> %i, NM_Handle -> %d\n", usedHandles, ht->nb_handles);
DPRINT1("Out of user handles! Used -> %i, NM_Handle -> %d\n", gpsi->cHandleEntries, ht->nb_handles);
//#if 0
for(i = 0; i < ht->nb_handles; i++)
{
@ -131,7 +131,7 @@ __inline static PUSER_HANDLE_ENTRY alloc_user_entry(PUSER_HANDLE_TABLE ht)
entry->generation = 1;
usedHandles++;
gpsi->cHandleEntries++;
return entry;
}
@ -154,7 +154,7 @@ __inline static void *free_user_entry(PUSER_HANDLE_TABLE ht, PUSER_HANDLE_ENTRY
entry->pi = NULL;
ht->freelist = entry;
usedHandles--;
gpsi->cHandleEntries--;
return ret;
}
@ -387,7 +387,7 @@ BOOL FASTCALL UserDereferenceObject(PVOID obj)
if (hdr->RefCount == 0 && hdr->destroyed)
{
// DPRINT1("info: something destroyed bcaise of deref, in use=%i\n",usedHandles);
// DPRINT1("info: something destroyed bcaise of deref, in use=%i\n",gpsi->cHandleEntries);
memset(hdr, 0x55, sizeof(USER_OBJECT_HEADER));

View file

@ -418,7 +418,7 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
// Window nz, check to see if we still own this or it is just cheap wine tonight.
if (!(Flags & DCX_CACHE))
{
if ( Wnd->ti != GetW32ThreadInfo())
if ( Wnd->pti != GetW32ThreadInfo())
Flags |= DCX_CACHE; // Ah~ Not Powned! Forced to be cheap~
}

View file

@ -329,12 +329,12 @@ UserFreeWindowInfo(PW32THREADINFO ti, PWINDOW_OBJECT WindowObject)
{
Wnd->strName.Length = 0;
Wnd->strName.MaximumLength = 0;
DesktopHeapFree(Wnd->pdesktop,
DesktopHeapFree(Wnd->rpdesk,
Wnd->strName.Buffer);
Wnd->strName.Buffer = NULL;
}
DesktopHeapFree(Wnd->pdesktop, Wnd);
DesktopHeapFree(Wnd->rpdesk, Wnd);
WindowObject->Wnd = NULL;
}
@ -562,17 +562,17 @@ IntGetWindowProc(IN PWINDOW_OBJECT Window,
on a function that I thought is only suppose to return the current Windows Proc? */
else
{
PCALLPROC NewCallProc, CallProc;
PCALLPROCDATA NewCallProc, CallProc;
NewCallProc = UserFindCallProc(Wnd->pcls,
Wnd->lpfnWndProc,
Wnd->Unicode);
if (NewCallProc == NULL)
{
NewCallProc = CreateCallProc(Wnd->ti->pDeskInfo,
NewCallProc = CreateCallProc(Wnd->pti->pDeskInfo,
Wnd->lpfnWndProc,
Wnd->Unicode,
Wnd->ti->ppi);
Wnd->pti->ppi);
if (NewCallProc == NULL)
{
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
@ -1672,9 +1672,9 @@ co_IntCreateWindowEx(DWORD dwExStyle,
Window->Wnd->hdr.Handle = hWnd; /* FIXME: Remove hack , are you sure?*/
Wnd = Window->Wnd;
Wnd->ti = ti;
Wnd->pti = ti;
Wnd->pi = ti->ppi;
Wnd->pdesktop = pti->Desktop;
Wnd->rpdesk = pti->Desktop;
Wnd->hWndLastActive = hWnd;
}
@ -1770,7 +1770,7 @@ AllocErr:
if ( NULL != WindowName->Buffer && WindowName->Length > 0 )
{
Wnd->strName.Buffer = DesktopHeapAlloc(Wnd->pdesktop,
Wnd->strName.Buffer = DesktopHeapAlloc(Wnd->rpdesk,
WindowName->Length + sizeof(UNICODE_NULL));
if (Wnd->strName.Buffer == NULL)
{
@ -2239,9 +2239,9 @@ AllocErr:
Dont understand why it does this. */
if (ClassAtom == gpsi->atomSysClass[ICLS_EDIT])
{
PCALLPROC CallProc;
PCALLPROCDATA CallProc;
//CallProc = CreateCallProc(NULL, Wnd->lpfnWndProc, bUnicodeWindow, Wnd->ti->ppi);
CallProc = CreateCallProc(NULL, Wnd->lpfnWndProc, Wnd->Unicode , Wnd->ti->ppi);
CallProc = CreateCallProc(NULL, Wnd->lpfnWndProc, Wnd->Unicode , Wnd->pti->ppi);
if (!CallProc)
{
@ -3693,7 +3693,7 @@ IntSetWindowProc(PWINDOW_OBJECT Window,
BOOL Ansi)
{
WNDPROC Ret;
PCALLPROC CallProc;
PCALLPROCDATA CallProc;
PWND Wnd = Window->Wnd;
/* resolve any callproc handle if possible */
@ -3730,7 +3730,7 @@ IntSetWindowProc(PWINDOW_OBJECT Window,
CallProc = CreateCallProc(NULL,
Wnd->lpfnWndProc,
Wnd->Unicode,
Wnd->ti->ppi);
Wnd->pti->ppi);
if (CallProc == NULL)
{
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
@ -4820,10 +4820,10 @@ NtUserDefSetText(HWND hWnd, PLARGE_STRING WindowText)
Wnd->strName.Buffer = NULL;
if (buf != NULL)
{
DesktopHeapFree(Wnd->pdesktop, buf);
DesktopHeapFree(Wnd->rpdesk, buf);
}
Wnd->strName.Buffer = DesktopHeapAlloc(Wnd->pdesktop,
Wnd->strName.Buffer = DesktopHeapAlloc(Wnd->rpdesk,
UnicodeString.Length + sizeof(UNICODE_NULL));
if (Wnd->strName.Buffer != NULL)
{