-replace user object/handle manager with the one from wine. its simpler,
faster and more correct.
-convert dozens of functions to take pointers as args, not handles
-attempt to simplify/correct refcounting
-remove much useless refcounting
-make callout refcounts auto undoable (ei. if the thread crash in umode
during callback)
-misc formatting/naming changes
Modified: trunk/reactos/subsys/win32k/eng/window.c
Modified: trunk/reactos/subsys/win32k/include/cursoricon.h
Modified: trunk/reactos/subsys/win32k/include/object.h
Modified: trunk/reactos/subsys/win32k/include/userfuncs.h
Modified: trunk/reactos/subsys/win32k/include/win32.h
Modified: trunk/reactos/subsys/win32k/include/window.h
Modified: trunk/reactos/subsys/win32k/include/winpos.h
Modified: trunk/reactos/subsys/win32k/main/dllmain.c
Modified: trunk/reactos/subsys/win32k/ntuser/accelerator.c
Modified: trunk/reactos/subsys/win32k/ntuser/class.c
Modified: trunk/reactos/subsys/win32k/ntuser/cursoricon.c
Modified: trunk/reactos/subsys/win32k/ntuser/focus.c
Modified: trunk/reactos/subsys/win32k/ntuser/hook.c
Modified: trunk/reactos/subsys/win32k/ntuser/input.c
Modified: trunk/reactos/subsys/win32k/ntuser/menu.c
Modified: trunk/reactos/subsys/win32k/ntuser/misc.c
Modified: trunk/reactos/subsys/win32k/ntuser/monitor.c
Modified: trunk/reactos/subsys/win32k/ntuser/msgqueue.c
Modified: trunk/reactos/subsys/win32k/ntuser/ntuser.c
Modified: trunk/reactos/subsys/win32k/ntuser/object.c
Modified: trunk/reactos/subsys/win32k/ntuser/painting.c
Modified: trunk/reactos/subsys/win32k/ntuser/scrollbar.c
Modified: trunk/reactos/subsys/win32k/ntuser/vis.c
Modified: trunk/reactos/subsys/win32k/ntuser/window.c
Modified: trunk/reactos/subsys/win32k/ntuser/winpos.c
_____
Modified: trunk/reactos/subsys/win32k/eng/window.c
--- trunk/reactos/subsys/win32k/eng/window.c 2005-09-07 19:37:28 UTC
(rev 17727)
+++ trunk/reactos/subsys/win32k/eng/window.c 2005-09-07 20:59:26 UTC
(rev 17728)
@@ -197,7 +197,7 @@
STDCALL
EngCreateWnd(
SURFOBJ *pso,
- HWND hwnd,
+ HWND hWnd,
WNDOBJCHANGEPROC pfn,
FLONG fl,
int iPixelFormat)
@@ -209,7 +209,7 @@
DECLARE_RETURN(WNDOBJ*);
DPRINT("EngCreateWnd: pso = 0x%x, hwnd = 0x%x, pfn = 0x%x, fl = 0x%x,
pixfmt = %d\n",
- pso, hwnd, pfn, fl, iPixelFormat);
+ pso, hWnd, pfn, fl, iPixelFormat);
calledFromUser = UserIsEntered();
if (!calledFromUser){
@@ -217,7 +217,7 @@
}
/* Get window object */
- Window = IntGetWindowObject(hwnd);
+ Window = UserGetWindowObject(hWnd);
if (Window == NULL)
{
RETURN( NULL);
@@ -227,7 +227,6 @@
WndObjInt = EngAllocMem(0, sizeof (WNDGDI), TAG_WNDOBJ);
if (WndObjInt == NULL)
{
- IntReleaseWindowObject(Window);
DPRINT1("Failed to allocate memory for a WND structure!\n");
RETURN( NULL);
}
@@ -236,7 +235,6 @@
WndObjInt->ClientClipObj = NULL;
if (!IntEngWndUpdateClipObj(WndObjInt, Window))
{
- IntReleaseWindowObject(Window);
EngFreeMem(WndObjInt);
RETURN( NULL);
}
@@ -247,7 +245,7 @@
WndObjUser->pvConsumer = NULL;
/* Fill internal object */
- WndObjInt->Hwnd = hwnd;
+ WndObjInt->Hwnd = hWnd;
WndObjInt->ChangeProc = pfn;
WndObjInt->Flags = fl;
WndObjInt->PixelFormat = iPixelFormat;
@@ -255,9 +253,6 @@
/* associate object with window */
InsertTailList(&Window->WndObjListHead, &WndObjInt->ListEntry);
- /* release resources */
- IntReleaseWindowObject(Window);
-
DPRINT("EngCreateWnd: SUCCESS!\n");
RETURN( WndObjUser);
_____
Modified: trunk/reactos/subsys/win32k/include/cursoricon.h
--- trunk/reactos/subsys/win32k/include/cursoricon.h 2005-09-07
19:37:28 UTC (rev 17727)
+++ trunk/reactos/subsys/win32k/include/cursoricon.h 2005-09-07
20:59:26 UTC (rev 17728)
@@ -50,7 +50,7 @@
HCURSOR FASTCALL IntSetCursor(PWINSTATION_OBJECT WinStaObject,
PCURICON_OBJECT NewCursor, BOOL ForceChange);
BOOL FASTCALL IntSetupCurIconHandles(PWINSTATION_OBJECT WinStaObject);
-PCURICON_OBJECT FASTCALL IntGetCurIconObject(PWINSTATION_OBJECT
WinStaObject, HANDLE Handle);
+PCURICON_OBJECT FASTCALL IntGetCurIconObject(HANDLE Handle);
PCURICON_OBJECT FASTCALL IntCreateCurIconHandle(PWINSTATION_OBJECT
WinStaObject);
VOID FASTCALL IntCleanupCurIcons(struct _EPROCESS *Process, PW32PROCESS
Win32Process);
_____
Modified: trunk/reactos/subsys/win32k/include/object.h
--- trunk/reactos/subsys/win32k/include/object.h 2005-09-07
19:37:28 UTC (rev 17727)
+++ trunk/reactos/subsys/win32k/include/object.h 2005-09-07
20:59:26 UTC (rev 17728)
@@ -5,106 +5,128 @@
#include <win32k/bitmaps.h>
#include <win32k/pen.h>
-typedef enum {
- otUnknown = 0,
- otClass,
- otWindow,
- otMenu,
- otAcceleratorTable,
- otCursorIcon,
- otHookProc,
- otMonitor
-} USER_OBJECT_TYPE;
+#define FIRST_USER_HANDLE 0x0020 /* first possible value for low word
of user handle */
+#define LAST_USER_HANDLE 0xffef /* last possible value for low word
of user handle */
-typedef struct _USER_OBJECT_HEADER
-/*
- * Header for user object
- */
-{
- USER_OBJECT_TYPE Type;
- LONG HandleCount;
- LONG RefCount;
- CSHORT Size;
-} USER_OBJECT_HEADER, *PUSER_OBJECT_HEADER;
-typedef struct _USER_HANDLE
-{
- PVOID ObjectBody;
-} USER_HANDLE, *PUSER_HANDLE;
+#define USER_HEADER_TO_BODY(ObjectHeader) \
+ ((PVOID)(((PUSER_OBJECT_HEADER)ObjectHeader) + 1))
-#define HANDLE_BLOCK_ENTRIES
((PAGE_SIZE-sizeof(LIST_ENTRY))/sizeof(USER_HANDLE))
+#define USER_BODY_TO_HEADER(ObjectBody) \
+ ((PUSER_OBJECT_HEADER)(((PUSER_OBJECT_HEADER)ObjectBody) - 1))
-typedef struct _USER_HANDLE_BLOCK
+
+
+typedef struct _USER_HANDLE_ENTRY
{
- LIST_ENTRY ListEntry;
- USER_HANDLE Handles[HANDLE_BLOCK_ENTRIES];
-} USER_HANDLE_BLOCK, *PUSER_HANDLE_BLOCK;
+ void *ptr; /* pointer to object */
+ unsigned short type; /* object type (0 if free) */
+ unsigned short generation; /* generation counter */
+} USER_HANDLE_ENTRY, * PUSER_HANDLE_ENTRY;
+
+
typedef struct _USER_HANDLE_TABLE
{
- LIST_ENTRY ListHead;
-} USER_HANDLE_TABLE, *PUSER_HANDLE_TABLE;
+ PUSER_HANDLE_ENTRY handles;
+ PUSER_HANDLE_ENTRY freelist;
+ int nb_handles;
+ int allocated_handles;
+} USER_HANDLE_TABLE, * PUSER_HANDLE_TABLE;
-ULONG FASTCALL
-ObmGetReferenceCount(
- PVOID ObjectBody);
-ULONG FASTCALL
-ObmGetHandleCount(
- PVOID ObjectBody);
+typedef enum _USER_OBJECT_TYPE
+{
+ otFree = 0,
+ otWindow,
+ otMenu,
+ otAccel,
+ otCursor,
+ otHook,
+ otMonitor,
+ otClass //fixme: remove
+
+} USER_OBJECT_TYPE;
-VOID FASTCALL
-ObmReferenceObject(
- PVOID ObjectBody);
-VOID FASTCALL
-ObmDereferenceObject(
- PVOID ObjectBody);
+typedef struct _USER_OBJECT_HEADER
+/*
+ * Header for user object
+ */
+{
+// USER_OBJECT_TYPE Type;
+ LONG RefCount;
+ BOOL destroyed;
+ HANDLE hSelf;
+// CSHORT Size;
+} USER_OBJECT_HEADER, *PUSER_OBJECT_HEADER;
-NTSTATUS FASTCALL
-ObmReferenceObjectByPointer(
- PVOID ObjectBody,
- USER_OBJECT_TYPE ObjectType);
-PVOID FASTCALL
-ObmCreateObject(
- PUSER_HANDLE_TABLE HandleTable,
- PHANDLE Handle,
- USER_OBJECT_TYPE ObjectType,
- ULONG ObjectSize);
+typedef struct _USER_REFERENCE_ENTRY
+{
+ SINGLE_LIST_ENTRY Entry;
+ PVOID obj;
+} USER_REFERENCE_ENTRY, *PUSER_REFERENCE_ENTRY;
-NTSTATUS FASTCALL
-ObmCreateHandle(
- PUSER_HANDLE_TABLE HandleTable,
- PVOID ObjectBody,
- PHANDLE HandleReturn);
-NTSTATUS FASTCALL
-ObmReferenceObjectByHandle(
- PUSER_HANDLE_TABLE HandleTable,
- HANDLE Handle,
- USER_OBJECT_TYPE ObjectType,
- PVOID* Object);
-NTSTATUS FASTCALL
-ObmCloseHandle(
- PUSER_HANDLE_TABLE HandleTable,
- HANDLE Handle);
+#include <malloc.h>
-VOID FASTCALL
-ObmInitializeHandleTable(
- PUSER_HANDLE_TABLE HandleTable);
+#define ASSERT_LAST_REF(_obj_) \
+{ \
+ PW32THREAD t; \
+ PSINGLE_LIST_ENTRY e; \
+ PUSER_REFERENCE_ENTRY ref; \
+ \
+ ASSERT(_obj_); \
+ t = PsGetWin32Thread(); \
+ ASSERT(t); \
+ e = t->ReferencesList.Next; \
+ ASSERT(e); \
+ ref = CONTAINING_RECORD(e, USER_REFERENCE_ENTRY, Entry); \
+ ASSERT(ref); \
+ \
+ ASSERT(_obj_ == ref->obj); \
+ \
+}
+#define UserRefObjectCo(_obj_) \
+{ \
+ PW32THREAD t; \
+ PUSER_REFERENCE_ENTRY ref; \
+ \
+ ASSERT(_obj_); \
+ t = PsGetWin32Thread(); \
+ ASSERT(t); \
+ ref = (PUSER_REFERENCE_ENTRY)_alloca(sizeof(USER_REFERENCE_ENTRY));
\
+ ASSERT(ref); \
+ ref->obj = _obj_; \
+ ObmReferenceObject(_obj_); \
+ \
+ PushEntryList(&t->ReferencesList, &ref->Entry); \
+ \
+}
-VOID FASTCALL
-ObmFreeHandleTable(
- PUSER_HANDLE_TABLE HandleTable);
-PUSER_HANDLE_TABLE FASTCALL
-ObmCreateHandleTable(VOID);
+#define UserDerefObjectCo(_obj_) \
+{ \
+ PW32THREAD t; \
+ PSINGLE_LIST_ENTRY e; \
+ PUSER_REFERENCE_ENTRY ref; \
+ \
+ ASSERT(_obj_); \
+ t = PsGetWin32Thread(); \
+ ASSERT(t); \
+ e = PopEntryList(&t->ReferencesList); \
+ ASSERT(e); \
+ ref = CONTAINING_RECORD(e, USER_REFERENCE_ENTRY, Entry); \
+ ASSERT(ref); \
+ \
+ ASSERT(_obj_ == ref->obj); \
+ ObmDereferenceObject(_obj_); \
+ \
+}
-VOID FASTCALL ObmDestroyHandleTable (PUSER_HANDLE_TABLE HandleTable);
-
VOID INTERNAL_CALL InitGdiObjectHandleTable (VOID);
VOID FASTCALL CreateStockObjects (VOID);
_____
Modified: trunk/reactos/subsys/win32k/include/userfuncs.h
--- trunk/reactos/subsys/win32k/include/userfuncs.h 2005-09-07
19:37:28 UTC (rev 17727)
+++ trunk/reactos/subsys/win32k/include/userfuncs.h 2005-09-07
20:59:26 UTC (rev 17728)
@@ -1,18 +1,52 @@
#ifndef _WIN32K_USERFUNCS_H
#define _WIN32K_USERFUNCS_H
-//currently unused
-#define ASSERT_REFS(obj) ASSERT(ObmGetReferenceCount(obj) >= 2)
-#define UserReferenceWindowObjectCo(o) IntReferenceWindowObject(o)
-#define UserDereferenceWindowObjectCo(o) IntReleaseWindowObject(o)
+#define ASSERT_REFS_CO(obj) \
+{ \
+ LONG ref = USER_BODY_TO_HEADER(obj)->RefCount;\
+ if (!(ref >= 1)){ \
+ DPRINT1("obj 0x%x, refs %i\n", obj, ref); \
+ ASSERT(FALSE); \
+ } \
+}
-#define UserReferenceAccelObjectCo(o) IntReferenceWindowObject(o)
-#define UserDereferenceAccelObjectCo(o) IntReleaseWindowObject(o)
+#define DUMP_REFS(obj) DPRINT1("obj 0x%x, refs %i\n",obj,
USER_BODY_TO_HEADER(obj)->RefCount)
-extern PUSER_HANDLE_TABLE gHandleTable;
+
+VOID FASTCALL ObmReferenceObject(PVOID obj);
+BOOL FASTCALL ObmDereferenceObject(PVOID obj);
+
+#define IntReferenceWindowObject(o) ObmReferenceObject(o)
+
+VOID FASTCALL IntReleaseWindowObject(PWINDOW_OBJECT Window);
+PWINDOW_OBJECT FASTCALL IntGetWindowObject(HWND hWnd);
+PVOID FASTCALL
+ObmCreateObject(PUSER_HANDLE_TABLE ht, HANDLE* h,USER_OBJECT_TYPE type
, ULONG size);
+
+BOOL FASTCALL
+ObmDeleteObject(HANDLE h, USER_OBJECT_TYPE type );
+
+//#define UserRefObjectCo(o) ObmReferenceObject(o)
+//#define UserDerefObjectCo(o) ObmDereferenceObject(o)
+BOOL FASTCALL ObmCreateHandleTable();
+
+
+extern USER_HANDLE_TABLE gHandleTable;
+
+
+/******************** HANDLE.C ***************/
+
+
+PUSER_HANDLE_ENTRY handle_to_entry(PUSER_HANDLE_TABLE ht, HANDLE handle
);
+VOID UserInitHandleTable(PUSER_HANDLE_TABLE ht, PVOID mem, ULONG
bytes);
+HANDLE UserAllocHandle(PUSER_HANDLE_TABLE ht, PVOID object,
USER_OBJECT_TYPE type );
+PVOID UserGetObject(PUSER_HANDLE_TABLE ht, HANDLE handle,
USER_OBJECT_TYPE type );
+PVOID UserFreeHandle(PUSER_HANDLE_TABLE ht, HANDLE handle );
+PVOID UserGetNextHandle(PUSER_HANDLE_TABLE ht, HANDLE* handle,
USER_OBJECT_TYPE type );
+
/*************** WINSTA.C ***************/
HWINSTA FASTCALL UserGetProcessWindowStation(VOID);
@@ -25,7 +59,7 @@
/*************** WINPOS.C ***************/
BOOL FASTCALL
-UserGetClientOrigin(HWND hWnd, LPPOINT Point);
+UserGetClientOrigin(PWINDOW_OBJECT Window, LPPOINT Point);
/*************** FOCUS.C ***************/
@@ -81,7 +115,7 @@
/*************** PAINTING.C ***************/
-BOOL FASTCALL UserValidateRgn(HWND hWnd, HRGN hRgn);
+BOOL FASTCALL co_UserValidateRgn(PWINDOW_OBJECT Window, HRGN hRgn);
/*************** WINDOW.C ***************/
_____
Modified: trunk/reactos/subsys/win32k/include/win32.h
--- trunk/reactos/subsys/win32k/include/win32.h 2005-09-07 19:37:28 UTC
(rev 17727)
+++ trunk/reactos/subsys/win32k/include/win32.h 2005-09-07 20:59:26 UTC
(rev 17728)
@@ -13,6 +13,8 @@
HANDLE hDesktop;
DWORD MessagePumpHookValue;
BOOLEAN IsExiting;
+ SINGLE_LIST_ENTRY ReferencesList;
+
} W32THREAD, *PW32THREAD;
#include <poppack.h>
_____
Modified: trunk/reactos/subsys/win32k/include/window.h
--- trunk/reactos/subsys/win32k/include/window.h 2005-09-07
19:37:28 UTC (rev 17727)
+++ trunk/reactos/subsys/win32k/include/window.h 2005-09-07
20:59:26 UTC (rev 17728)
@@ -123,15 +123,7 @@
#define IntIsBroadcastHwnd(hWnd) \
(hWnd == HWND_BROADCAST || hWnd == HWND_TOPMOST)
-#define IntGetWindowObject(hWnd) \
- IntGetProcessWindowObject(PsGetWin32Thread(), hWnd)
-#define IntReferenceWindowObject(WndObj) \
- ObmReferenceObjectByPointer(WndObj, otWindow)
-
-#define IntReleaseWindowObject(WndObj) \
- ObmDereferenceObject(WndObj)
-
#define IntWndBelongsToThread(WndObj, W32Thread) \
(((WndObj->OwnerThread && WndObj->OwnerThread->Tcb.Win32Thread))
&& \
(WndObj->OwnerThread->Tcb.Win32Thread == W32Thread))
@@ -143,9 +135,6 @@
WndObj->OwnerThread->ThreadsProcess->UniqueProcessId
-PWINDOW_OBJECT FASTCALL
-IntGetProcessWindowObject(PW32THREAD Thread, HWND hWnd);
-
BOOL FASTCALL
IntIsWindow(HWND hWnd);
_____
Modified: trunk/reactos/subsys/win32k/include/winpos.h
--- trunk/reactos/subsys/win32k/include/winpos.h 2005-09-07
19:37:28 UTC (rev 17727)
+++ trunk/reactos/subsys/win32k/include/winpos.h 2005-09-07
20:59:26 UTC (rev 17728)
@@ -17,7 +17,7 @@
UINT
FASTCALL co_WinPosArrangeIconicWindows(PWINDOW_OBJECT parent);
BOOL FASTCALL
-IntGetClientOrigin(HWND hWnd, LPPOINT Point);
+IntGetClientOrigin(PWINDOW_OBJECT Window, LPPOINT Point);
LRESULT FASTCALL
co_WinPosGetNonClientSize(HWND Wnd, RECT* WindowRect, RECT*
ClientRect);
UINT FASTCALL
@@ -26,7 +26,7 @@
UINT FASTCALL
co_WinPosMinMaximize(PWINDOW_OBJECT WindowObject, UINT ShowFlag, RECT*
NewPos);
BOOLEAN FASTCALL
-co_WinPosSetWindowPos(HWND Wnd, HWND WndInsertAfter, INT x, INT y, INT
cx,
+co_WinPosSetWindowPos(PWINDOW_OBJECT Wnd, HWND WndInsertAfter, INT x,
INT y, INT cx,
INT cy, UINT flags);
BOOLEAN FASTCALL
co_WinPosShowWindow(PWINDOW_OBJECT Window, INT Cmd);
_____
Modified: trunk/reactos/subsys/win32k/main/dllmain.c
--- trunk/reactos/subsys/win32k/main/dllmain.c 2005-09-07 19:37:28 UTC
(rev 17727)
+++ trunk/reactos/subsys/win32k/main/dllmain.c 2005-09-07 20:59:26 UTC
(rev 17728)
@@ -219,11 +219,14 @@
}
else
{
+ PSINGLE_LIST_ENTRY e;
+
DPRINT("Destroying W32 thread TID:%d at IRQ level: %lu\n",
Thread->Cid.UniqueThread, KeGetCurrentIrql());
Win32Thread->IsExiting = TRUE;
HOOK_DestroyThreadHooks(Thread);
UnregisterThreadHotKeys(Thread);
+ /* what if this co_ func crash in umode? what will clean us up
then? */
co_DestroyThreadWindows(Thread);
IntBlockInput(Win32Thread, FALSE);
MsqDestroyMessageQueue(Win32Thread->MessageQueue);
@@ -232,6 +235,17 @@
{
ObDereferenceObject(Win32Thread->Desktop);
}
+
+ /* cleanup user object references stack */
+ e = PopEntryList(&Win32Thread->ReferencesList);
+ while (e)
+ {
+ PUSER_REFERENCE_ENTRY ref = CONTAINING_RECORD(e,
USER_REFERENCE_ENTRY, Entry);
+ DPRINT1("thread clean: remove reference obj 0x%x\n",ref->obj);
+ ObmDereferenceObject(ref->obj);
+
+ e = PopEntryList(&Win32Thread->ReferencesList);
+ }
}
RETURN( STATUS_SUCCESS);
_____
Modified: trunk/reactos/subsys/win32k/ntuser/accelerator.c
--- trunk/reactos/subsys/win32k/ntuser/accelerator.c 2005-09-07
19:37:28 UTC (rev 17727)
+++ trunk/reactos/subsys/win32k/ntuser/accelerator.c 2005-09-07
20:59:26 UTC (rev 17728)
@@ -70,21 +70,19 @@
static
-PACCELERATOR_TABLE FASTCALL UserGetAccelObjectNoRef(HACCEL hAccel)
+PACCELERATOR_TABLE FASTCALL UserGetAccelObject(HACCEL hAccel)
{
- PACCELERATOR_TABLE Accel=NULL;
- NTSTATUS Status = ObmReferenceObjectByHandle(gHandleTable,
- hAccel,
- otAcceleratorTable,
- (PVOID*)&Accel);
-
- if (!NT_SUCCESS(Status))
- {
- SetLastWin32Error(ERROR_INVALID_ACCEL_HANDLE);
- return NULL;
- }
+ PACCELERATOR_TABLE Accel= UserGetObject(&gHandleTable, hAccel,
otAccel);
- ObmDereferenceObject(Accel);
+ if (Accel)
+ {
+ ASSERT(USER_BODY_TO_HEADER(Accel)->RefCount >= 0);
+ }
+ else
+ {
+ SetLastWin32Error(ERROR_INVALID_ACCEL_HANDLE);
+ }
+
return Accel;
}
@@ -118,7 +116,7 @@
RETURN(0);
}
- if (!(Accel = UserGetAccelObjectNoRef(hAccel)))
+ if (!(Accel = UserGetAccelObject(hAccel)))
{
ObDereferenceObject(WindowStation);
RETURN(0);
@@ -177,11 +175,7 @@
RETURN( FALSE );
}
- Accel = ObmCreateObject(
- gHandleTable,
- (PHANDLE)&hAccel,
- otAcceleratorTable,
- sizeof(ACCELERATOR_TABLE));
+ Accel = ObmCreateObject(&gHandleTable, (PHANDLE)&hAccel, otAccel,
sizeof(ACCELERATOR_TABLE));
if (Accel == NULL)
{
@@ -196,7 +190,7 @@
Accel->Table = ExAllocatePoolWithTag(PagedPool, EntriesCount *
sizeof(ACCEL), TAG_ACCEL);
if (Accel->Table == NULL)
{
- ObmCloseHandle(gHandleTable, hAccel);
+ ObmDeleteObject(hAccel, otAccel);
ObDereferenceObject(WindowStation);
SetLastNtError(Status);
RETURN( (HACCEL) 0);
@@ -206,7 +200,7 @@
if (!NT_SUCCESS(Status))
{
ExFreePool(Accel->Table);
- ObmCloseHandle(gHandleTable, hAccel);
+ ObmDeleteObject(hAccel, otAccel);
ObDereferenceObject(WindowStation);
SetLastNtError(Status);
RETURN((HACCEL) 0);
@@ -258,13 +252,13 @@
RETURN( FALSE);
}
- if (!(Accel = UserGetAccelObjectNoRef(hAccel)))
+ if (!(Accel = UserGetAccelObject(hAccel)))
{
ObDereferenceObject(WindowStation);
RETURN( FALSE);
}
- ObmCloseHandle(gHandleTable, hAccel);
+ ObmDeleteObject(hAccel, otAccel);
if (Accel->Table != NULL)
{
@@ -294,7 +288,7 @@
{
UINT mesg = 0;
- ASSERT_REFS(Window);
+ ASSERT_REFS_CO(Window);
DPRINT("IntTranslateAccelerator(hwnd %x, message %x, wParam %x,
lParam %x, fVirt %d, key %x, cmd %x)\n",
Window->hSelf, message, wParam, lParam, fVirt, key, cmd);
@@ -509,19 +503,19 @@
RETURN( 0);
}
- if (!(Accel = UserGetAccelObjectNoRef(hAccel)))
+ if (!(Accel = UserGetAccelObject(hAccel)))
{
RETURN( 0);
}
- UserReferenceAccelObjectCo(Accel);
+ UserRefObjectCo(Accel);
if (!(Window = UserGetWindowObject(hWnd)))
{
RETURN( 0);
}
- UserReferenceWindowObjectCo(Window);
+ UserRefObjectCo(Window);
/* FIXME: Associate AcceleratorTable with the current thread */
@@ -546,8 +540,8 @@
CLEANUP:
- if (Window) UserReferenceWindowObjectCo(Window);
- if (Accel) UserReferenceAccelObjectCo(Accel);
+ if (Window) UserDerefObjectCo(Window);
+ if (Accel) UserDerefObjectCo(Accel);
if (WindowStation) ObDereferenceObject(WindowStation);
_____
Modified: trunk/reactos/subsys/win32k/ntuser/class.c
--- trunk/reactos/subsys/win32k/ntuser/class.c 2005-09-07 19:37:28 UTC
(rev 17727)
+++ trunk/reactos/subsys/win32k/ntuser/class.c 2005-09-07 20:59:26 UTC
(rev 17728)
@@ -299,7 +299,7 @@
}
objectSize = sizeof(WNDCLASS_OBJECT) + lpwcx->cbClsExtra;
- ClassObject = ObmCreateObject(NULL, NULL, otClass, objectSize);
+ ClassObject = ObmCreateObject(&gHandleTable, NULL, otClass,
objectSize);
if (ClassObject == 0)
{
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
@@ -538,22 +538,18 @@
NtUserGetClassLong(HWND hWnd, DWORD Offset, BOOL Ansi)
{
PWINDOW_OBJECT Window;
- LONG Ret;
DECLARE_RETURN(DWORD);
DPRINT("Enter NtUserGetClassLong\n");
UserEnterExclusive();
- Window = IntGetWindowObject(hWnd);
- if (Window == NULL)
+ if (!(Window = UserGetWindowObject(hWnd)))
{
- SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE);
RETURN(0);
}
- Ret = IntGetClassLong(Window, Offset, Ansi);
- IntReleaseWindowObject(Window);
- RETURN(Ret);
+ RETURN(IntGetClassLong(Window, Offset, Ansi));
+
CLEANUP:
DPRINT("Leave NtUserGetClassLong, ret=%i\n",_ret_);
UserLeave();
@@ -565,6 +561,8 @@
{
PWINDOW_OBJECT Parent, Owner;
+ ASSERT_REFS_CO(Window);
+
if ((int)Offset >= 0)
{
DPRINT("SetClassLong(%x, %d, %x)\n", Window->hSelf, Offset,
dwNewLong);
@@ -669,14 +667,18 @@
DPRINT("Enter NtUserSetClassLong\n");
UserEnterExclusive();
- if (!(Window = IntGetWindowObject(hWnd)))
+ if (!(Window = UserGetWindowObject(hWnd)))
{
- SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE);
RETURN(0);
}
+
+ UserRefObjectCo(Window);
+
Ret = IntGetClassLong(Window, Offset, Ansi);
co_IntSetClassLong(Window, Offset, dwNewLong, Ansi);
- IntReleaseWindowObject(Window);
+
+ UserDerefObjectCo(Window);
+
RETURN(Ret);
CLEANUP:
_____
Modified: trunk/reactos/subsys/win32k/ntuser/cursoricon.c
--- trunk/reactos/subsys/win32k/ntuser/cursoricon.c 2005-09-07
19:37:28 UTC (rev 17727)
+++ trunk/reactos/subsys/win32k/ntuser/cursoricon.c 2005-09-07
20:59:26 UTC (rev 17728)
@@ -71,21 +71,36 @@
return TRUE;
}
-PCURICON_OBJECT FASTCALL
-IntGetCurIconObject(PWINSTATION_OBJECT WinStaObject, HANDLE Handle)
+
+
+
+/* temp hack */
+PCURICON_OBJECT FASTCALL UserGetCurIconObject(HANDLE hWnd)
{
- PCURICON_OBJECT Object;
- NTSTATUS Status;
-
- Status = ObmReferenceObjectByHandle(gHandleTable,
- Handle, otCursorIcon, (PVOID*)&Object);
- if (!NT_SUCCESS(Status))
+ PCURICON_OBJECT Window =
(PCURICON_OBJECT)UserGetObject(&gHandleTable, hWnd, otCursor);
+ if (!Window)
{
+ SetLastWin32Error(ERROR_INVALID_CURSOR_HANDLE);
return NULL;
}
- return Object;
+
+ ASSERT(USER_BODY_TO_HEADER(Window)->RefCount >= 0);
+ return Window;
}
+PCURICON_OBJECT FASTCALL
+IntGetCurIconObject(HANDLE Handle)
+{
+ PCURICON_OBJECT ci = UserGetCurIconObject(Handle);
+ if (ci)
+ {
+ ASSERT(USER_BODY_TO_HEADER(ci)->RefCount >= 0);
+
+ USER_BODY_TO_HEADER(ci)->RefCount++;
+ }
+ return ci;
+}
+
#define COLORCURSORS_ALLOWED FALSE
HCURSOR FASTCALL
IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT
NewCursor,
@@ -362,7 +377,9 @@
{
Object = CONTAINING_RECORD(CurrentEntry, CURICON_OBJECT,
ListEntry);
CurrentEntry = CurrentEntry->Flink;
- if(NT_SUCCESS(ObmReferenceObjectByPointer(Object, otCursorIcon)))
+
+// if(NT_SUCCESS(ObmReferenceObjectByPointer(Object, otCursorIcon)))
//<- huh????
+ ObmReferenceObject( Object);
{
if((Object->hModule == hModule) && (Object->hRsrc == hRsrc))
{
@@ -380,6 +397,7 @@
}
}
ObmDereferenceObject(Object);
+
}
return NULL;
@@ -391,7 +409,7 @@
PCURICON_OBJECT Object;
HANDLE Handle;
- Object = ObmCreateObject(gHandleTable, &Handle, otCursorIcon,
sizeof(CURICON_OBJECT));
+ Object = ObmCreateObject(&gHandleTable, &Handle, otCursor,
sizeof(CURICON_OBJECT));
if(!Object)
{
@@ -405,7 +423,7 @@
if (! ReferenceCurIconByProcess(Object))
{
DPRINT1("Failed to add process\n");
- ObmCloseHandle(gHandleTable, Handle);
+ ObmDeleteObject(Handle, otCursor);
ObmDereferenceObject(Object);
return NULL;
}
@@ -483,7 +501,7 @@
bmpMask = Object->IconInfo.hbmMask;
bmpColor = Object->IconInfo.hbmColor;
- Ret = NT_SUCCESS(ObmCloseHandle(gHandleTable, Object->Self));
+ Ret = ObmDeleteObject(Object->Self, otCursor);
/* delete bitmaps */
if(bmpMask)
@@ -520,7 +538,10 @@
{
Object = CONTAINING_RECORD(CurrentEntry, CURICON_OBJECT,
ListEntry);
CurrentEntry = CurrentEntry->Flink;
- if(NT_SUCCESS(ObmReferenceObjectByPointer(Object, otCursorIcon)))
+
+
+ ObmReferenceObject(Object);
+// if(NT_SUCCESS(ObmReferenceObjectByPointer(Object, otCursorIcon)))
{
ProcessEntry = Object->ProcessList.Flink;
while (ProcessEntry != &Object->ProcessList)
@@ -537,6 +558,8 @@
ObmDereferenceObject(Object);
}
+
+
}
ObDereferenceObject(WinStaObject);
@@ -646,7 +669,7 @@
RETURN( FALSE);
}
- CurIconObject = IntGetCurIconObject(WinStaObject, Handle);
+ CurIconObject = IntGetCurIconObject(Handle);
if(CurIconObject)
{
if(IconInfo)
@@ -712,7 +735,7 @@
RETURN( FALSE);
}
- CurIconObject = IntGetCurIconObject(WinStaObject, Handle);
+ CurIconObject = IntGetCurIconObject(Handle);
if(CurIconObject)
{
/* Copy fields */
@@ -929,7 +952,6 @@
{
PWINSTATION_OBJECT WinStaObject;
PCURICON_OBJECT Object;
- NTSTATUS Status;
DECLARE_RETURN(BOOL);
DPRINT("Enter NtUserDestroyCursorIcon\n");
@@ -941,13 +963,18 @@
RETURN( FALSE);
}
- Status = ObmReferenceObjectByHandle(gHandleTable, Handle,
otCursorIcon, (PVOID*)&Object);
- if(!NT_SUCCESS(Status))
+ if (!(Object = IntGetCurIconObject(Handle)))
{
- ObDereferenceObject(WinStaObject);
- SetLastNtError(Status);
- RETURN( FALSE);
+ ObDereferenceObject(WinStaObject);
+ RETURN(FALSE);
}
+// Status = ObmReferenceObjectByHandle(gHandleTable, Handle,
otCursorIcon, (PVOID*)&Object);
+// if(!NT_SUCCESS(Status))
+// {
+// ObDereferenceObject(WinStaObject);
+// SetLastNtError(Status);
+// RETURN( FALSE);
+// }
if(IntDestroyCurIconObject(WinStaObject, Object, FALSE))
{
@@ -1098,7 +1125,7 @@
RETURN( (HCURSOR)0);
}
- CurIconObject = IntGetCurIconObject(WinStaObject, hCursor);
+ CurIconObject = IntGetCurIconObject(hCursor);
if(CurIconObject)
{
OldCursor = IntSetCursor(WinStaObject, CurIconObject, FALSE);
@@ -1142,7 +1169,7 @@
RETURN( FALSE);
}
- CurIconObject = IntGetCurIconObject(WinStaObject, Handle);
+ CurIconObject = IntGetCurIconObject(Handle);
if(CurIconObject)
{
/* Copy fields */
@@ -1222,7 +1249,7 @@
RETURN( FALSE);
}
- CurIconObject = IntGetCurIconObject(WinStaObject, Handle);
+ CurIconObject = IntGetCurIconObject(Handle);
if(CurIconObject)
{
CurIconObject->hModule = hModule;
@@ -1338,7 +1365,7 @@
RETURN( FALSE);
}
- CurIconObject = IntGetCurIconObject(WinStaObject, hIcon);
+ CurIconObject = IntGetCurIconObject(hIcon);
if(CurIconObject)
{
hbmMask = CurIconObject->IconInfo.hbmMask;
_____
Modified: trunk/reactos/subsys/win32k/ntuser/focus.c
--- trunk/reactos/subsys/win32k/ntuser/focus.c 2005-09-07 19:37:28 UTC
(rev 17727)
+++ trunk/reactos/subsys/win32k/ntuser/focus.c 2005-09-07 20:59:26 UTC
(rev 17728)
@@ -63,7 +63,7 @@
{
PWINDOW_OBJECT Window, Owner, Parent;
- if (hWnd)
+ if (hWnd && (Window = IntGetWindowObject(hWnd)))
{
/* Send palette messages */
if (co_IntPostOrSendMessage(hWnd, WM_QUERYNEWPALETTE, 0, 0))
@@ -73,25 +73,26 @@
}
if (UserGetWindow(hWnd, GW_HWNDPREV) != NULL)
- co_WinPosSetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0,
+ co_WinPosSetWindowPos(Window, HWND_TOP, 0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE |
SWP_NOSENDCHANGING);
- Window = IntGetWindowObject(hWnd);
- if (Window) {
- Owner = IntGetOwner(Window);
- if (!Owner) {
- Parent = IntGetParent(Window);
- if (!Parent)
+
+ Owner = IntGetOwner(Window);
+ if (!Owner)
+ {
+ Parent = IntGetParent(Window);
+ if (!Parent)
co_IntShellHookNotify(HSHELL_WINDOWACTIVATED, (LPARAM)
hWnd);
- else
+ else
IntReleaseWindowObject(Parent);
- } else {
- IntReleaseWindowObject(Owner);
- }
-
- IntReleaseWindowObject(Window);
+ }
+ else
+ {
+ IntReleaseWindowObject(Owner);
}
+ IntReleaseWindowObject(Window);
+
/* FIXME: IntIsWindow */
co_IntPostOrSendMessage(hWnd, WM_NCACTIVATE, (WPARAM)(hWnd ==
UserGetForegroundWindow()), 0);
@@ -154,6 +155,8 @@
HWND hWndFocusPrev = NULL;
PUSER_MESSAGE_QUEUE PrevForegroundQueue;
+ ASSERT_REFS_CO(Window);
+
DPRINT("IntSetForegroundAndFocusWindow(%x, %x, %s)\n", hWnd,
hWndFocus, MouseActivate ? "TRUE" : "FALSE");
DPRINT("(%wZ)\n", &Window->WindowName);
@@ -214,6 +217,8 @@
BOOL FASTCALL
co_IntSetForegroundWindow(PWINDOW_OBJECT Window)
{
+ ASSERT_REFS_CO(Window);
+
return co_IntSetForegroundAndFocusWindow(Window, Window, FALSE);
}
@@ -223,6 +228,8 @@
HWND Top;
PWINDOW_OBJECT TopWindow;
+ ASSERT_REFS_CO(Window);
+
if(Window->Style & WS_DISABLED)
{
BOOL Ret;
@@ -269,12 +276,14 @@
}
HWND FASTCALL
-co_IntSetActiveWindow(PWINDOW_OBJECT Window)
+co_IntSetActiveWindow(PWINDOW_OBJECT Window OPTIONAL)
{
PUSER_MESSAGE_QUEUE ThreadQueue;
HWND hWndPrev;
HWND hWnd = 0;
+ if (Window) ASSERT_REFS_CO(Window);
+
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue;
ASSERT(ThreadQueue != 0);
@@ -404,10 +413,8 @@
PUSER_MESSAGE_QUEUE ThreadQueue;
HWND hWndPrev;
- Window = IntGetWindowObject(hWnd);
- if (Window == NULL)
+ if (!(Window = UserGetWindowObject(hWnd)))
{
- SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE);
RETURN( 0);
}
@@ -417,13 +424,13 @@
if (Window->MessageQueue != ThreadQueue)
{
- IntReleaseWindowObject(Window);
SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE);
RETURN( 0);
}
[truncated at 1000 lines; 2443 more skipped]