remake refcounting
naming changes
convert internal function to page ptr and not handle
Modified: trunk/reactos/subsys/win32k/include/userfuncs.h
Modified: trunk/reactos/subsys/win32k/ntuser/accelerator.c
_____
Modified: trunk/reactos/subsys/win32k/include/userfuncs.h
--- trunk/reactos/subsys/win32k/include/userfuncs.h 2005-09-06
19:47:06 UTC (rev 17705)
+++ trunk/reactos/subsys/win32k/include/userfuncs.h 2005-09-06
22:11:37 UTC (rev 17706)
@@ -2,11 +2,14 @@
#define _WIN32K_USERFUNCS_H
//currently unused
-#define ASSERT_REFS(obj)
+#define ASSERT_REFS(obj) ASSERT(ObmGetReferenceCount(obj) >= 2)
#define UserReferenceWindowObjectCo(o) IntReferenceWindowObject(o)
#define UserDereferenceWindowObjectCo(o) IntReleaseWindowObject(o)
+#define UserReferenceAccelObjectCo(o) IntReferenceWindowObject(o)
+#define UserDereferenceAccelObjectCo(o) IntReleaseWindowObject(o)
+
extern PUSER_HANDLE_TABLE gHandleTable;
_____
Modified: trunk/reactos/subsys/win32k/ntuser/accelerator.c
--- trunk/reactos/subsys/win32k/ntuser/accelerator.c 2005-09-06
19:47:06 UTC (rev 17705)
+++ trunk/reactos/subsys/win32k/ntuser/accelerator.c 2005-09-06
22:11:37 UTC (rev 17706)
@@ -68,15 +68,38 @@
return(STATUS_SUCCESS);
}
+
+static
+PACCELERATOR_TABLE FASTCALL UserGetAccelObjectNoRef(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;
+ }
+
+ ObmDereferenceObject(Accel);
+ return Accel;
+}
+
+
+
+
int
STDCALL
NtUserCopyAcceleratorTable(
- HACCEL Table,
+ HACCEL hAccel,
LPACCEL Entries,
int EntriesCount)
{
PWINSTATION_OBJECT WindowStation;
- PACCELERATOR_TABLE AcceleratorTable;
+ PACCELERATOR_TABLE Accel;
NTSTATUS Status;
int Ret;
DECLARE_RETURN(int);
@@ -88,31 +111,25 @@
UserMode,
0,
&WindowStation);
+
if (!NT_SUCCESS(Status))
{
SetLastNtError(STATUS_ACCESS_DENIED);
RETURN(0);
}
- Status = ObmReferenceObjectByHandle(gHandleTable,
- Table,
- otAcceleratorTable,
- (PVOID*)&AcceleratorTable);
-
- if (!NT_SUCCESS(Status))
+ if (!(Accel = UserGetAccelObjectNoRef(hAccel)))
{
- SetLastWin32Error(ERROR_INVALID_ACCEL_HANDLE);
ObDereferenceObject(WindowStation);
RETURN(0);
}
if(Entries)
{
- Ret = min(EntriesCount, AcceleratorTable->Count);
- Status = MmCopyToCaller(Entries, AcceleratorTable->Table, Ret *
sizeof(ACCEL));
+ Ret = min(EntriesCount, Accel->Count);
+ Status = MmCopyToCaller(Entries, Accel->Table, Ret *
sizeof(ACCEL));
if (!NT_SUCCESS(Status))
{
- ObmDereferenceObject(AcceleratorTable);
ObDereferenceObject(WindowStation);
SetLastNtError(Status);
RETURN(0);
@@ -120,10 +137,9 @@
}
else
{
- Ret = AcceleratorTable->Count;
+ Ret = Accel->Count;
}
- ObmDereferenceObject(AcceleratorTable);
ObDereferenceObject(WindowStation);
RETURN(Ret);
@@ -141,9 +157,9 @@
SIZE_T EntriesCount)
{
PWINSTATION_OBJECT WindowStation;
- PACCELERATOR_TABLE AcceleratorTable;
+ PACCELERATOR_TABLE Accel;
NTSTATUS Status;
- HACCEL Handle;
+ HACCEL hAccel;
DECLARE_RETURN(HACCEL);
DPRINT("Enter NtUserCreateAcceleratorTable(Entries %p, EntriesCount
%d)\n",
@@ -154,47 +170,45 @@
UserMode,
0,
&WindowStation);
+
if (!NT_SUCCESS(Status))
{
SetLastNtError(STATUS_ACCESS_DENIED);
- DPRINT1("E1\n");
RETURN( FALSE );
}
- AcceleratorTable = ObmCreateObject(
+ Accel = ObmCreateObject(
gHandleTable,
- (PHANDLE)&Handle,
+ (PHANDLE)&hAccel,
otAcceleratorTable,
sizeof(ACCELERATOR_TABLE));
- if (AcceleratorTable == NULL)
+
+ if (Accel == NULL)
{
ObDereferenceObject(WindowStation);
SetLastNtError(STATUS_NO_MEMORY);
- DPRINT1("E2\n");
RETURN( (HACCEL) 0 );
}
- AcceleratorTable->Count = EntriesCount;
- if (AcceleratorTable->Count > 0)
+ Accel->Count = EntriesCount;
+ if (Accel->Count > 0)
{
- AcceleratorTable->Table = ExAllocatePoolWithTag(PagedPool,
EntriesCount * sizeof(ACCEL), TAG_ACCEL);
- if (AcceleratorTable->Table == NULL)
+ Accel->Table = ExAllocatePoolWithTag(PagedPool, EntriesCount *
sizeof(ACCEL), TAG_ACCEL);
+ if (Accel->Table == NULL)
{
- ObmCloseHandle(gHandleTable, Handle);
+ ObmCloseHandle(gHandleTable, hAccel);
ObDereferenceObject(WindowStation);
SetLastNtError(Status);
- DPRINT1("E3\n");
RETURN( (HACCEL) 0);
}
- Status = MmCopyFromCaller(AcceleratorTable->Table, Entries,
EntriesCount * sizeof(ACCEL));
+ Status = MmCopyFromCaller(Accel->Table, Entries, EntriesCount *
sizeof(ACCEL));
if (!NT_SUCCESS(Status))
{
- ExFreePool(AcceleratorTable->Table);
- ObmCloseHandle(gHandleTable, Handle);
+ ExFreePool(Accel->Table);
+ ObmCloseHandle(gHandleTable, hAccel);
ObDereferenceObject(WindowStation);
SetLastNtError(Status);
- DPRINT1("E4\n");
RETURN((HACCEL) 0);
}
}
@@ -203,7 +217,7 @@
/* FIXME: Save HandleTable in a list somewhere so we can clean it up
again */
- RETURN((HACCEL) Handle);
+ RETURN(hAccel);
CLEANUP:
DPRINT("Leave NtUserCreateAcceleratorTable(Entries %p, EntriesCount
%d) = %x\n",
@@ -212,13 +226,15 @@
END_CLEANUP;
}
+
+
BOOLEAN
STDCALL
NtUserDestroyAcceleratorTable(
- HACCEL Table)
+ HACCEL hAccel)
{
PWINSTATION_OBJECT WindowStation;
- PACCELERATOR_TABLE AcceleratorTable;
+ PACCELERATOR_TABLE Accel;
NTSTATUS Status;
DECLARE_RETURN(BOOLEAN);
@@ -227,13 +243,14 @@
FIXME: Destroy only tables created using
CreateAcceleratorTable.
*/
- DPRINT("NtUserDestroyAcceleratorTable(Table %x)\n", Table);
+ DPRINT("NtUserDestroyAcceleratorTable(Table %x)\n", hAccel);
UserEnterExclusive();
Status =
IntValidateWindowStationHandle(UserGetProcessWindowStation(),
UserMode,
0,
&WindowStation);
+
if (!NT_SUCCESS(Status))
{
SetLastNtError(STATUS_ACCESS_DENIED);
@@ -241,40 +258,33 @@
RETURN( FALSE);
}
- Status = ObmReferenceObjectByHandle(gHandleTable,
- Table,
- otAcceleratorTable,
- (PVOID*)&AcceleratorTable);
- if (!NT_SUCCESS(Status))
+ if (!(Accel = UserGetAccelObjectNoRef(hAccel)))
{
- SetLastWin32Error(ERROR_INVALID_ACCEL_HANDLE);
ObDereferenceObject(WindowStation);
- DPRINT1("E2\n");
RETURN( FALSE);
}
- ObmCloseHandle(gHandleTable, Table);
+ ObmCloseHandle(gHandleTable, hAccel);
- if (AcceleratorTable->Table != NULL)
+ if (Accel->Table != NULL)
{
- ExFreePool(AcceleratorTable->Table);
+ ExFreePool(Accel->Table);
}
ObDereferenceObject(WindowStation);
- DPRINT("NtUserDestroyAcceleratorTable(Table %x)\n",
- Table);
-
RETURN( TRUE);
CLEANUP:
- DPRINT("Leave NtUserDestroyAcceleratorTable(Table %x) = %i\n",
Table,_ret_);
+ DPRINT("Leave NtUserDestroyAcceleratorTable(Table %x) = %i\n",
hAccel,_ret_);
UserLeave();
END_CLEANUP;
}
-static BOOLEAN
-co_IntTranslateAccelerator(HWND hWnd,
+static
+BOOLEAN FASTCALL
+co_IntTranslateAccelerator(
+ PWINDOW_OBJECT Window,
UINT message,
WPARAM wParam,
LPARAM lParam,
@@ -284,9 +294,11 @@
{
UINT mesg = 0;
- DPRINT("IntTranslateAccelerator(hWnd %x, message %x, wParam %x,
lParam %x, fVirt %d, key %x, cmd %x)\n",
- hWnd, message, wParam, lParam, fVirt, key, cmd);
+ ASSERT_REFS(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);
+
if (wParam != key)
{
DPRINT("T0\n");
@@ -335,8 +347,8 @@
}
}
- DPRINT("IntTranslateAccelerator(hWnd %x, message %x, wParam %x,
lParam %x, fVirt %d, key %x, cmd %x) = FALSE\n",
- hWnd, message, wParam, lParam, fVirt, key, cmd);
+ DPRINT("IntTranslateAccelerator(hwnd %x, message %x, wParam %x,
lParam %x, fVirt %d, key %x, cmd %x) = FALSE\n",
+ Window->hSelf, message, wParam, lParam, fVirt, key, cmd);
return FALSE;
@@ -345,7 +357,7 @@
mesg = 1;
else if (IntGetCaptureWindow())
mesg = 2;
- else if (!IntIsWindowVisible(hWnd)) /* FIXME: WINE IsWindowEnabled
== IntIsWindowVisible? */
+ else if (!IntIsWindowVisible(Window->hSelf)) /* FIXME: WINE
IsWindowEnabled == IntIsWindowVisible? */
mesg = 3;
else
{
@@ -423,12 +435,12 @@
if (mesg == WM_COMMAND)
{
DPRINT(", sending WM_COMMAND, wParam=%0x\n", 0x10000 | cmd);
- co_IntSendMessage(hWnd, mesg, 0x10000 | cmd, 0L);
+ co_IntSendMessage(Window->hSelf, mesg, 0x10000 | cmd, 0L);
}
else if (mesg == WM_SYSCOMMAND)
{
DPRINT(", sending WM_SYSCOMMAND, wParam=%0x\n", cmd);
- co_IntSendMessage(hWnd, mesg, cmd, 0x00010000L);
+ co_IntSendMessage(Window->hSelf, mesg, cmd, 0x00010000L);
}
else
{
@@ -449,7 +461,7 @@
}
DPRINT("IntTranslateAccelerator(hWnd %x, message %x, wParam %x,
lParam %x, fVirt %d, key %x, cmd %x) = TRUE\n",
- hWnd, message, wParam, lParam, fVirt, key, cmd);
+ Window->hSelf, message, wParam, lParam, fVirt, key, cmd);
return TRUE;
}
@@ -458,34 +470,26 @@
STDCALL
NtUserTranslateAccelerator(
HWND hWnd,
- HACCEL Table,
+ HACCEL hAccel,
LPMSG Message)
{
- PWINSTATION_OBJECT WindowStation;
- PACCELERATOR_TABLE AcceleratorTable;
+ PWINSTATION_OBJECT WindowStation = NULL;
+ PWINDOW_OBJECT Window = NULL;
+ PACCELERATOR_TABLE Accel = NULL;
NTSTATUS Status;
ULONG i;
DECLARE_RETURN(int);
DPRINT("NtUserTranslateAccelerator(hWnd %x, Table %x, Message %p)\n",
- hWnd, Table, Message);
+ hWnd, hAccel, Message);
UserEnterShared();
- if (hWnd == NULL)
- RETURN( 0);
-
if (Message == NULL)
{
SetLastNtError(STATUS_INVALID_PARAMETER);
RETURN( 0);
}
- if (Table == NULL)
- {
- SetLastWin32Error(ERROR_INVALID_ACCEL_HANDLE);
- RETURN( 0);
- }
-
if ((Message->message != WM_KEYDOWN) &&
(Message->message != WM_SYSKEYDOWN) &&
(Message->message != WM_SYSCHAR) &&
@@ -498,49 +502,57 @@
UserMode,
0,
&WindowStation);
+
if (!NT_SUCCESS(Status))
{
SetLastNtError(STATUS_ACCESS_DENIED);
RETURN( 0);
}
- Status = ObmReferenceObjectByHandle(gHandleTable,
- Table,
- otAcceleratorTable,
- (PVOID*)&AcceleratorTable);
- if (!NT_SUCCESS(Status))
+ if (!(Accel = UserGetAccelObjectNoRef(hAccel)))
{
- SetLastWin32Error(ERROR_INVALID_ACCEL_HANDLE);
- ObDereferenceObject(WindowStation);
RETURN( 0);
}
+ UserReferenceAccelObjectCo(Accel);
+
+ if (!(Window = UserGetWindowObjectNoRef(hWnd)))
+ {
+ RETURN( 0);
+ }
+
+ UserReferenceWindowObjectCo(Window);
+
+
/* FIXME: Associate AcceleratorTable with the current thread */
- for (i = 0; i < AcceleratorTable->Count; i++)
+ for (i = 0; i < Accel->Count; i++)
{
- if (co_IntTranslateAccelerator(hWnd, Message->message,
Message->wParam, Message->lParam,
- AcceleratorTable->Table[i].fVirt,
AcceleratorTable->Table[i].key,
- AcceleratorTable->Table[i].cmd))
+ if (co_IntTranslateAccelerator(Window, Message->message,
Message->wParam, Message->lParam,
+ Accel->Table[i].fVirt, Accel->Table[i].key,
+ Accel->Table[i].cmd))
{
- ObDereferenceObject(WindowStation);
DPRINT("NtUserTranslateAccelerator(hWnd %x, Table %x, Message
%p) = %i end\n",
- hWnd, Table, Message, 1);
+ hWnd, hAccel, Message, 1);
RETURN( 1);
}
- if (((AcceleratorTable->Table[i].fVirt & 0x80) > 0))
+ if (((Accel->Table[i].fVirt & 0x80) > 0))
{
break;
}
}
- ObDereferenceObject(WindowStation);
-
RETURN( 0);
CLEANUP:
+
+ if (Window) UserReferenceWindowObjectCo(Window);
+ if (Accel) UserReferenceAccelObjectCo(Accel);
+
+ if (WindowStation) ObDereferenceObject(WindowStation);
+
DPRINT("NtUserTranslateAccelerator(hWnd %x, Table %x, Message %p) =
%i end\n",
- hWnd, Table, Message, 0);
+ hWnd, hAccel, Message, 0);
UserLeave();
END_CLEANUP;
}