-added better LIST_FOR_EACH macros (ripped from wine) and fix their usage -make hotkeys session global (they dont belong in winsta) Modified: trunk/reactos/include/reactos/helper.h Modified: trunk/reactos/ntoskrnl/fs/filelock.c Modified: trunk/reactos/ntoskrnl/fs/notify.c Modified: trunk/reactos/subsys/win32k/include/hotkey.h Modified: trunk/reactos/subsys/win32k/include/winsta.h Modified: trunk/reactos/subsys/win32k/main/dllmain.c Modified: trunk/reactos/subsys/win32k/ntuser/hotkey.c Modified: trunk/reactos/subsys/win32k/ntuser/input.c Modified: trunk/reactos/subsys/win32k/ntuser/winsta.c _____
Modified: trunk/reactos/include/reactos/helper.h --- trunk/reactos/include/reactos/helper.h 2005-09-18 21:48:56 UTC (rev 17922) +++ trunk/reactos/include/reactos/helper.h 2005-09-18 23:06:15 UTC (rev 17923) @@ -17,12 +17,21 @@
#endif #define EXPORTED __declspec(dllexport) #define IMPORTED __declspec(dllimport) -#define LIST_FOR_EACH(entry, head) \ - for(entry = (head)->Flink; entry != (head); entry = entry->Flink) -#define LIST_FOR_EACH_SAFE(tmp_entry, head, ptr, type, field) \ - for ((tmp_entry)=(head)->Flink; (tmp_entry)!=(head) && \ - ((ptr) = CONTAINING_RECORD(tmp_entry,type,field)) && \ - ((tmp_entry) = (tmp_entry)->Flink); ) + +/* iterate through the list using a list entry */ +#define LIST_FOR_EACH(elem, list, type, field) \ + for ((elem) = CONTAINING_RECORD((list)->Flink, type, field); \ + &(elem)->field != (list); \ + (elem) = CONTAINING_RECORD((elem)->field.Flink, type, field)) + +/* iterate through the list using a list entry, with safety against removal */ +#define LIST_FOR_EACH_SAFE(cursor, cursor2, list, type, field) \ + for ((cursor) = CONTAINING_RECORD((list)->Flink, type, field), \ + (cursor2) = CONTAINING_RECORD((cursor)->field.Flink, type, field); \ + &(cursor)->field != (list); \ + (cursor) = (cursor2), \ + (cursor2) = CONTAINING_RECORD((cursor)->field.Flink, type, field)) + #define OPTHDROFFSET(a) ((LPVOID)((BYTE *)a + \ ((PIMAGE_DOS_HEADER)a)->e_lfanew + \ sizeof (IMAGE_NT_SIGNATURE) + \ _____
Modified: trunk/reactos/ntoskrnl/fs/filelock.c --- trunk/reactos/ntoskrnl/fs/filelock.c 2005-09-18 21:48:56 UTC (rev 17922) +++ trunk/reactos/ntoskrnl/fs/filelock.c 2005-09-18 23:06:15 UTC (rev 17923) @@ -161,7 +161,6 @@
KIRQL oldirql; PFILE_LOCK_TOC LockToc; PFILE_LOCK_GRANTED Granted; - PLIST_ENTRY EnumEntry; LARGE_INTEGER EndOffset;
ASSERT(FileLock); @@ -177,10 +176,8 @@
KeAcquireSpinLock(&LockToc->SpinLock, &oldirql);
- LIST_FOR_EACH(EnumEntry, &LockToc->GrantedListHead) + LIST_FOR_EACH(Granted, &LockToc->GrantedListHead, FILE_LOCK_GRANTED, ListEntry) { - Granted = CONTAINING_RECORD(EnumEntry, FILE_LOCK_GRANTED, ListEntry); - //if overlapping if(IsOverlappingLock(&Granted->Lock, FileOffset, &EndOffset)) { @@ -358,12 +355,12 @@ { KIRQL oldirql; PFILE_LOCK_TOC LockToc; - PLIST_ENTRY EnumEntry; - PFILE_LOCK_GRANTED Granted; + PFILE_LOCK_GRANTED Granted, tmp; BOOLEAN Unlock = FALSE; //must make local copy since FILE_LOCK struct is allowed to be paged BOOLEAN GotUnlockRoutine; LIST_ENTRY UnlockedListHead; + PLIST_ENTRY EnumEntry;
ASSERT(FileLock); LockToc = FileLock->LockInformation; @@ -377,7 +374,7 @@ GotUnlockRoutine = FileLock->UnlockRoutine != NULL; KeAcquireSpinLock(&LockToc->SpinLock, &oldirql);
- LIST_FOR_EACH_SAFE(EnumEntry, &LockToc->GrantedListHead, Granted, FILE_LOCK_GRANTED, ListEntry) + LIST_FOR_EACH_SAFE(Granted, tmp, &LockToc->GrantedListHead, FILE_LOCK_GRANTED, ListEntry) {
if (Granted->Lock.Process == Process && @@ -506,17 +503,14 @@ IN PVOID Context ) { - PLIST_ENTRY EnumEntry; PFILE_LOCK_GRANTED Granted; LARGE_INTEGER EndOffset;
EndOffset.QuadPart = FileOffset->QuadPart + Length->QuadPart - 1;
//loop and try to find conflicking locks - LIST_FOR_EACH(EnumEntry, &LockToc->GrantedListHead) + LIST_FOR_EACH(Granted, &LockToc->GrantedListHead, FILE_LOCK_GRANTED, ListEntry) { - Granted = CONTAINING_RECORD(EnumEntry,FILE_LOCK_GRANTED, ListEntry); - if (IsOverlappingLock(&Granted->Lock, FileOffset, &EndOffset)) { //we found a locks that overlap with the new lock @@ -578,13 +572,13 @@ { //walk pending list, FIFO order, try 2 complete locks PLIST_ENTRY EnumEntry; - PIRP Irp; + PIRP Irp, tmp; PIO_STACK_LOCATION Stack; LIST_ENTRY CompletedListHead;
InitializeListHead(&CompletedListHead);
- LIST_FOR_EACH_SAFE(EnumEntry, &LockToc->PendingListHead, Irp, IRP, Tail.Overlay.ListEntry) + LIST_FOR_EACH_SAFE(Irp, tmp, &LockToc->PendingListHead, IRP, Tail.Overlay.ListEntry) { Stack = IoGetCurrentIrpStackLocation(Irp); if (FsRtlpAddLock(LockToc, @@ -676,8 +670,7 @@ { KIRQL oldirql; PFILE_LOCK_TOC LockToc; - PFILE_LOCK_GRANTED Granted; - PLIST_ENTRY EnumEntry; + PFILE_LOCK_GRANTED Granted, tmp;
ASSERT(FileLock); LockToc = FileLock->LockInformation; @@ -689,7 +682,7 @@
KeAcquireSpinLock(&LockToc->SpinLock, &oldirql );
- LIST_FOR_EACH_SAFE(EnumEntry, &LockToc->GrantedListHead, Granted,FILE_LOCK_GRANTED,ListEntry) + LIST_FOR_EACH_SAFE(Granted, tmp, &LockToc->GrantedListHead, FILE_LOCK_GRANTED,ListEntry) {
//must be exact match @@ -778,7 +771,6 @@ PFILE_LOCK_TOC LockToc; PFILE_LOCK_GRANTED Granted; PIRP Irp; - PLIST_ENTRY EnumEntry; PIO_STACK_LOCATION Stack;
ASSERT(FileLock); @@ -794,10 +786,8 @@
KeAcquireSpinLock(&LockToc->SpinLock, &oldirql);
- LIST_FOR_EACH(EnumEntry, &LockToc->GrantedListHead) + LIST_FOR_EACH(Granted, &LockToc->GrantedListHead, FILE_LOCK_GRANTED , ListEntry) { - Granted = CONTAINING_RECORD(EnumEntry, FILE_LOCK_GRANTED , ListEntry); - DPRINT1("%s, start: %I64x, len: %I64x, end: %I64x, key: %i, proc: 0x%p, fob: 0x%p\n", Granted->Lock.ExclusiveLock ? "EXCL" : "SHRD", Granted->Lock.StartingByte.QuadPart, @@ -812,9 +802,8 @@
DPRINT1("Dumping pending file locks, FIFO order\n");
- LIST_FOR_EACH(EnumEntry, &LockToc->PendingListHead) + LIST_FOR_EACH(Irp, &LockToc->PendingListHead, IRP , Tail.Overlay.ListEntry) { - Irp = CONTAINING_RECORD(EnumEntry, IRP , Tail.Overlay.ListEntry); Stack = IoGetCurrentIrpStackLocation(Irp);
DPRINT1("%s, start: %I64x, len: %I64x, end: %I64x, key: %i, proc: 0x%p, fob: 0x%p\n", _____
Modified: trunk/reactos/ntoskrnl/fs/notify.c --- trunk/reactos/ntoskrnl/fs/notify.c 2005-09-18 21:48:56 UTC (rev 17922) +++ trunk/reactos/ntoskrnl/fs/notify.c 2005-09-18 23:06:15 UTC (rev 17923) @@ -120,13 +120,10 @@
PVOID FsContext ) { - PLIST_ENTRY EnumEntry; PNOTIFY_ENTRY NotifyEntry;
- LIST_FOR_EACH(EnumEntry, NotifyList) + LIST_FOR_EACH(NotifyEntry, NotifyList, NOTIFY_ENTRY, ListEntry) { - NotifyEntry = CONTAINING_RECORD(EnumEntry, NOTIFY_ENTRY, ListEntry); - if (NotifyEntry->FsContext == FsContext) { return NotifyEntry; @@ -310,15 +307,15 @@ ) { LIST_ENTRY CompletedListHead; - PLIST_ENTRY EnumEntry, TmpEntry; - PNOTIFY_ENTRY NotifyEntry; + PLIST_ENTRY TmpEntry; + PNOTIFY_ENTRY NotifyEntry, tmp; PIRP Irp;
InitializeListHead(&CompletedListHead);
ExAcquireFastMutex((PFAST_MUTEX)NotifySync);
- LIST_FOR_EACH_SAFE(EnumEntry, NotifyList, NotifyEntry, NOTIFY_ENTRY, ListEntry ) + LIST_FOR_EACH_SAFE(NotifyEntry, tmp, NotifyList, NOTIFY_ENTRY, ListEntry ) { if (NotifyEntry->Fcb == Fcb) { @@ -654,8 +651,8 @@ { USHORT FullDirLen; STRING RelativeName; + PNOTIFY_ENTRY NotifyEntry, tmp; PLIST_ENTRY EnumEntry; - PNOTIFY_ENTRY NotifyEntry; PIRP Irp; LIST_ENTRY CompletedListHead; USHORT NameLenU; @@ -676,7 +673,7 @@
ExAcquireFastMutex((PFAST_MUTEX)NotifySync);
- LIST_FOR_EACH_SAFE(EnumEntry, NotifyList, NotifyEntry, NOTIFY_ENTRY, ListEntry ) + LIST_FOR_EACH_SAFE(NotifyEntry, tmp, NotifyList, NOTIFY_ENTRY, ListEntry ) { ASSERT(NotifyEntry->Unicode == FsRtlpIsUnicodePath(FullTargetName));
_____
Modified: trunk/reactos/subsys/win32k/include/hotkey.h --- trunk/reactos/subsys/win32k/include/hotkey.h 2005-09-18 21:48:56 UTC (rev 17922) +++ trunk/reactos/subsys/win32k/include/hotkey.h 2005-09-18 23:06:15 UTC (rev 17923) @@ -15,23 +15,22 @@
} HOT_KEY_ITEM, *PHOT_KEY_ITEM;
NTSTATUS FASTCALL -InitHotKeys(PWINSTATION_OBJECT WinStaObject); +InitHotkeyImpl();
-NTSTATUS FASTCALL -CleanupHotKeys(PWINSTATION_OBJECT WinStaObject); +//NTSTATUS FASTCALL +//CleanupHotKeys(PWINSTATION_OBJECT WinStaObject);
-BOOL -GetHotKey (PWINSTATION_OBJECT WinStaObject, - UINT fsModifiers, +BOOL FASTCALL +GetHotKey (UINT fsModifiers, UINT vk, struct _ETHREAD **Thread, HWND *hWnd, int *id);
-VOID +VOID FASTCALL UnregisterWindowHotKeys(PWINDOW_OBJECT Window);
-VOID +VOID FASTCALL UnregisterThreadHotKeys(struct _ETHREAD *Thread);
#endif /* _WIN32K_HOTKEY_H */ _____
Modified: trunk/reactos/subsys/win32k/include/winsta.h --- trunk/reactos/subsys/win32k/include/winsta.h 2005-09-18 21:48:56 UTC (rev 17922) +++ trunk/reactos/subsys/win32k/include/winsta.h 2005-09-18 23:06:15 UTC (rev 17923) @@ -41,7 +41,6 @@
ULONG Flags; struct _DESKTOP_OBJECT* ActiveDesktop; /* FIXME: Clipboard */ - LIST_ENTRY HotKeyListHead; } WINSTATION_OBJECT, *PWINSTATION_OBJECT;
extern WINSTATION_OBJECT *InputWindowStation; _____
Modified: trunk/reactos/subsys/win32k/main/dllmain.c --- trunk/reactos/subsys/win32k/main/dllmain.c 2005-09-18 21:48:56 UTC (rev 17922) +++ trunk/reactos/subsys/win32k/main/dllmain.c 2005-09-18 23:06:15 UTC (rev 17923) @@ -352,6 +352,13 @@
return STATUS_UNSUCCESSFUL; }
+ Status = InitHotkeyImpl(); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to initialize hotkey implementation!\n"); + return STATUS_UNSUCCESSFUL; + } + Status = InitWindowStationImpl(); if (!NT_SUCCESS(Status)) { _____
Modified: trunk/reactos/subsys/win32k/ntuser/hotkey.c --- trunk/reactos/subsys/win32k/ntuser/hotkey.c 2005-09-18 21:48:56 UTC (rev 17922) +++ trunk/reactos/subsys/win32k/ntuser/hotkey.c 2005-09-18 23:06:15 UTC (rev 17923) @@ -27,6 +27,18 @@
* 02-11-2003 EK Created */
+ + +/* + +FIXME: Hotkey notifications are triggered by keyboard input (physical or programatically) +and since only desktops on WinSta0 can recieve input in seems very wrong to allow +windows/threads on destops not belonging to WinSta0 to set hotkeys (recieve notifications). + +-Gunnar +*/ + + /* INCLUDES ******************************************************************/
#include <w32k.h> @@ -36,47 +48,40 @@
/* GLOBALS *******************************************************************/
+LIST_ENTRY gHotkeyList; + /* FUNCTIONS *****************************************************************/
NTSTATUS FASTCALL -InitHotKeys(PWINSTATION_OBJECT WinStaObject) +InitHotkeyImpl() { - InitializeListHead(&WinStaObject->HotKeyListHead); + InitializeListHead(&gHotkeyList);
return STATUS_SUCCESS; }
+#if 0 //not used NTSTATUS FASTCALL -CleanupHotKeys(PWINSTATION_OBJECT WinStaObject) +CleanupHotKeys() {
return STATUS_SUCCESS; } +#endif
-BOOL -GetHotKey (PWINSTATION_OBJECT WinStaObject, - UINT fsModifiers, +BOOL FASTCALL +GetHotKey (UINT fsModifiers, UINT vk, struct _ETHREAD **Thread, HWND *hWnd, int *id) { - PLIST_ENTRY Entry; PHOT_KEY_ITEM HotKeyItem;
- if(!WinStaObject) + LIST_FOR_EACH(HotKeyItem, &gHotkeyList, HOT_KEY_ITEM, ListEntry) { - return FALSE; - } - - Entry = WinStaObject->HotKeyListHead.Flink; - while (Entry != &WinStaObject->HotKeyListHead) - { - HotKeyItem = (PHOT_KEY_ITEM) CONTAINING_RECORD(Entry, - HOT_KEY_ITEM, - ListEntry); if (HotKeyItem->fsModifiers == fsModifiers && HotKeyItem->vk == vk) { @@ -89,37 +94,21 @@ if (id != NULL) *id = HotKeyItem->id;
- return TRUE; } - - Entry = Entry->Flink; }
return FALSE; }
-VOID +VOID FASTCALL UnregisterWindowHotKeys(PWINDOW_OBJECT Window) { - PLIST_ENTRY Entry; - PHOT_KEY_ITEM HotKeyItem; - PWINSTATION_OBJECT WinStaObject = NULL; - - if(Window->OwnerThread && Window->OwnerThread->ThreadsProcess) - WinStaObject = Window->OwnerThread->Tcb.Win32Thread->Desktop->WindowStation; - - if(!WinStaObject) - return; - - Entry = WinStaObject->HotKeyListHead.Flink; - while (Entry != &WinStaObject->HotKeyListHead) + PHOT_KEY_ITEM HotKeyItem, tmp; + + LIST_FOR_EACH_SAFE(HotKeyItem, tmp, &gHotkeyList, HOT_KEY_ITEM, ListEntry) { - HotKeyItem = (PHOT_KEY_ITEM) CONTAINING_RECORD (Entry, - HOT_KEY_ITEM, - ListEntry); - Entry = Entry->Flink; if (HotKeyItem->hWnd == Window->hSelf) { RemoveEntryList (&HotKeyItem->ListEntry); @@ -130,26 +119,13 @@ }
-VOID +VOID FASTCALL UnregisterThreadHotKeys(struct _ETHREAD *Thread) { - PLIST_ENTRY Entry; - PHOT_KEY_ITEM HotKeyItem; - PWINSTATION_OBJECT WinStaObject = NULL; + PHOT_KEY_ITEM HotKeyItem, tmp;
- if(Thread->Tcb.Win32Thread && Thread->Tcb.Win32Thread->Desktop) - WinStaObject = Thread->Tcb.Win32Thread->Desktop->WindowStation; - - if(!WinStaObject) - return; - - Entry = WinStaObject->HotKeyListHead.Flink; - while (Entry != &WinStaObject->HotKeyListHead) + LIST_FOR_EACH_SAFE(HotKeyItem, tmp, &gHotkeyList, HOT_KEY_ITEM, ListEntry) { - HotKeyItem = (PHOT_KEY_ITEM) CONTAINING_RECORD (Entry, - HOT_KEY_ITEM, - ListEntry); - Entry = Entry->Flink; if (HotKeyItem->Thread == Thread) { RemoveEntryList (&HotKeyItem->ListEntry); @@ -160,27 +136,18 @@ }
-static BOOL -IsHotKey (PWINSTATION_OBJECT WinStaObject, - UINT fsModifiers, - UINT vk) +static +BOOL FASTCALL +IsHotKey (UINT fsModifiers, UINT vk) { - PLIST_ENTRY Entry; PHOT_KEY_ITEM HotKeyItem;
- Entry = WinStaObject->HotKeyListHead.Flink; - while (Entry != &WinStaObject->HotKeyListHead) + LIST_FOR_EACH(HotKeyItem, &gHotkeyList, HOT_KEY_ITEM, ListEntry) { - HotKeyItem = (PHOT_KEY_ITEM) CONTAINING_RECORD (Entry, - HOT_KEY_ITEM, - ListEntry); - if (HotKeyItem->fsModifiers == fsModifiers && - HotKeyItem->vk == vk) + if (HotKeyItem->fsModifiers == fsModifiers && HotKeyItem->vk == vk) { return TRUE; } - - Entry = Entry->Flink; }
return FALSE; @@ -195,7 +162,6 @@ { PHOT_KEY_ITEM HotKeyItem; PWINDOW_OBJECT Window; - PWINSTATION_OBJECT WinStaObject = NULL; PETHREAD HotKeyThread; DECLARE_RETURN(BOOL);
@@ -215,17 +181,8 @@ HotKeyThread = Window->OwnerThread; }
- - if(HotKeyThread->ThreadsProcess && HotKeyThread->ThreadsProcess->Win32Process) - WinStaObject = HotKeyThread->Tcb.Win32Thread->Desktop->WindowStation; - - if(!WinStaObject) - { - RETURN( FALSE); - } - /* Check for existing hotkey */ - if (IsHotKey (WinStaObject, fsModifiers, vk)) + if (IsHotKey (fsModifiers, vk)) { RETURN( FALSE); } @@ -242,8 +199,7 @@ HotKeyItem->fsModifiers = fsModifiers; HotKeyItem->vk = vk;
- InsertHeadList (&WinStaObject->HotKeyListHead, - &HotKeyItem->ListEntry); + InsertHeadList (&gHotkeyList, &HotKeyItem->ListEntry);
RETURN( TRUE);
@@ -255,13 +211,10 @@
BOOL STDCALL -NtUserUnregisterHotKey(HWND hWnd, - int id) +NtUserUnregisterHotKey(HWND hWnd, int id) { - PLIST_ENTRY Entry; PHOT_KEY_ITEM HotKeyItem; PWINDOW_OBJECT Window; - PWINSTATION_OBJECT WinStaObject = NULL; DECLARE_RETURN(BOOL);
DPRINT("Enter NtUserUnregisterHotKey\n"); @@ -272,30 +225,15 @@ RETURN( FALSE); }
- if(Window->OwnerThread->ThreadsProcess && Window->OwnerThread->ThreadsProcess->Win32Process) - WinStaObject = Window->OwnerThread->Tcb.Win32Thread->Desktop->WindowStation; - - if(!WinStaObject) + LIST_FOR_EACH(HotKeyItem, &gHotkeyList, HOT_KEY_ITEM, ListEntry) { - RETURN( FALSE); - } - - Entry = WinStaObject->HotKeyListHead.Flink; - while (Entry != &WinStaObject->HotKeyListHead) - { - HotKeyItem = (PHOT_KEY_ITEM) CONTAINING_RECORD (Entry, - HOT_KEY_ITEM, - ListEntry); - if (HotKeyItem->hWnd == hWnd && - HotKeyItem->id == id) + if (HotKeyItem->hWnd == hWnd && HotKeyItem->id == id) { RemoveEntryList (&HotKeyItem->ListEntry); ExFreePool (HotKeyItem);
RETURN( TRUE); } - - Entry = Entry->Flink; }
RETURN( FALSE); _____
Modified: trunk/reactos/subsys/win32k/ntuser/input.c --- trunk/reactos/subsys/win32k/ntuser/input.c 2005-09-18 21:48:56 UTC (rev 17922) +++ trunk/reactos/subsys/win32k/ntuser/input.c 2005-09-18 23:06:15 UTC (rev 17923) @@ -642,6 +642,8 @@
if(NextKeyInput.MakeCode == 0x2E)/* Ctrl-C */ { DPRINT1("Ctrl-C pressed\n"); + /* FIXME: this seems wrong! this bypass hotkeys and all and the winhellos CRTL+C hotkey test + dont work (anymore) */ co_MsqPostKeyboardMessage(WM_COPY,0,0); continue; } @@ -697,8 +699,7 @@ KeyInput.Flags & KEY_E0 ? 0xE0 : (KeyInput.Flags & KEY_E1 ? 0xE1 : 0));
- if (GetHotKey(InputWindowStation, - ModifierState, + if (GetHotKey(ModifierState, msg.wParam, &Thread, &hWnd, _____
Modified: trunk/reactos/subsys/win32k/ntuser/winsta.c --- trunk/reactos/subsys/win32k/ntuser/winsta.c 2005-09-18 21:48:56 UTC (rev 17922) +++ trunk/reactos/subsys/win32k/ntuser/winsta.c 2005-09-18 23:06:15 UTC (rev 17923) @@ -535,8 +535,6 @@
return 0; }
- InitHotKeys(WindowStationObject); - CurInfo->Enabled = FALSE; CurInfo->ButtonsDown = 0; CurInfo->CursorClipInfo.IsClipped = FALSE;