mirror of
https://github.com/reactos/reactos.git
synced 2025-06-03 16:30:26 +00:00
Implemented GetAncestor and IsWindowVisible
Save and restore the trap frame around exceptions Allow nested w32 callbacks svn path=/trunk/; revision=3440
This commit is contained in:
parent
6332533037
commit
c0b94f90f9
7 changed files with 87 additions and 45 deletions
|
@ -49,7 +49,9 @@
|
|||
//#define STATUS_PENDING (0x00000103L)
|
||||
#endif /* WIN32_NO_STATUS */
|
||||
|
||||
|
||||
#define GA_PARENT (1)
|
||||
#define GA_ROOT (2)
|
||||
#define GA_ROOTOWNER (3)
|
||||
|
||||
/* CreateFile, GetFileAttributes, SetFileAttributes */
|
||||
|
||||
|
|
|
@ -509,11 +509,9 @@ NtUserGetAltTabInfo(
|
|||
DWORD Unknown4,
|
||||
DWORD Unknown5);
|
||||
|
||||
DWORD
|
||||
STDCALL
|
||||
NtUserGetAncestor(
|
||||
DWORD Unknown0,
|
||||
DWORD Unknown1);
|
||||
HWND STDCALL
|
||||
NtUserGetAncestor(HWND hWnd, UINT Flags);
|
||||
|
||||
|
||||
DWORD
|
||||
STDCALL
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: window.c,v 1.8 2002/07/17 21:04:54 dwelch Exp $
|
||||
/* $Id: window.c,v 1.9 2002/08/30 02:47:36 dwelch Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS user32.dll
|
||||
|
@ -541,10 +541,9 @@ GetAltTabInfoW(HWND hwnd,
|
|||
}
|
||||
|
||||
HWND STDCALL
|
||||
GetAncestor(HWND hwnd,
|
||||
UINT gaFlags)
|
||||
GetAncestor(HWND hwnd, UINT gaFlags)
|
||||
{
|
||||
return (HWND)0;
|
||||
return(NtUserGetAncestor(hwnd, gaFlags));
|
||||
}
|
||||
|
||||
WINBOOL STDCALL
|
||||
|
@ -719,7 +718,15 @@ IsWindowUnicode(HWND hWnd)
|
|||
WINBOOL STDCALL
|
||||
IsWindowVisible(HWND hWnd)
|
||||
{
|
||||
return FALSE;
|
||||
while (GetWindowLong(hWnd, GWL_STYLE) & WS_CHILD)
|
||||
{
|
||||
if (!(GetWindowLong(hWnd, GWL_STYLE) & WS_VISIBLE))
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
hWnd = GetAncestor(hWnd, GA_PARENT);
|
||||
}
|
||||
return(GetWindowLong(hWnd, GWL_STYLE) & WS_VISIBLE);
|
||||
}
|
||||
|
||||
WINBOOL STDCALL
|
||||
|
|
|
@ -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: trap.s,v 1.13 2002/07/17 21:04:55 dwelch Exp $
|
||||
/* $Id: trap.s,v 1.14 2002/08/30 02:47:36 dwelch Exp $
|
||||
*
|
||||
* PROJECT: ReactOS kernel
|
||||
* FILE: ntoskrnl/ke/i386/trap.s
|
||||
|
@ -40,14 +40,7 @@ _KiTrapEpilog:
|
|||
cmpl $1, %eax /* Check for v86 recovery */
|
||||
jne _KiTrapRet
|
||||
jmp _KiV86Complete
|
||||
_KiTrapRet:
|
||||
/* Get a pointer to the current thread */
|
||||
movl %fs:0x124, %esi
|
||||
|
||||
/* Restore the old trap frame pointer */
|
||||
movl 0x3c(%esp), %ebx
|
||||
movl %ebx, KTHREAD_TRAP_FRAME(%esi)
|
||||
|
||||
_KiTrapRet:
|
||||
/* Skip debug information and unsaved registers */
|
||||
addl $0x30, %esp
|
||||
popl %gs
|
||||
|
@ -138,21 +131,31 @@ _KiTrapProlog:
|
|||
pushl $0 /* XXX: DebugArgMark */
|
||||
movl 0x60(%esp), %ebx
|
||||
pushl %ebx /* XXX: DebugEIP */
|
||||
pushl %ebp /* XXX: DebugEBP */
|
||||
|
||||
pushl %ebp /* XXX: DebugEBP */
|
||||
|
||||
/* Load the segment registers */
|
||||
movl $KERNEL_DS, %ebx
|
||||
movl %ebx, %ds
|
||||
movl %ebx, %es
|
||||
movl %ebx, %gs
|
||||
|
||||
|
||||
/* Set ES to kernel segment */
|
||||
movw $KERNEL_DS,%bx
|
||||
movw %bx,%es
|
||||
|
||||
movl %esp, %ebx
|
||||
movl %esp, %ebp
|
||||
|
||||
movl %esp, %ebp
|
||||
|
||||
/* Save the old trap frame. */
|
||||
cmpl $0, %edi
|
||||
je .L7
|
||||
movl %ss:KTHREAD_TRAP_FRAME(%edi), %edx
|
||||
pushl %edx
|
||||
jmp .L8
|
||||
.L7:
|
||||
pushl $0
|
||||
.L8:
|
||||
|
||||
/* Save a pointer to the trap frame in the current KTHREAD */
|
||||
cmpl $0, %edi
|
||||
je .L6
|
||||
|
@ -166,6 +169,13 @@ _KiTrapProlog:
|
|||
addl $4, %esp
|
||||
addl $4, %esp
|
||||
|
||||
/* Get a pointer to the current thread */
|
||||
movl %fs:0x124, %esi
|
||||
|
||||
/* Restore the old trap frame pointer */
|
||||
popl %ebx
|
||||
movl %ebx, KTHREAD_TRAP_FRAME(%esi)
|
||||
|
||||
/* Return to the caller */
|
||||
jmp _KiTrapEpilog
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: w32call.c,v 1.1 2002/06/18 22:03:48 dwelch Exp $
|
||||
/* $Id: w32call.c,v 1.2 2002/08/30 02:47:37 dwelch Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -43,6 +43,7 @@ typedef struct _NTW32CALL_SAVED_STATE
|
|||
PULONG CallerResultLength;
|
||||
PNTSTATUS CallbackStatus;
|
||||
PKTRAP_FRAME SavedTrapFrame;
|
||||
PVOID SavedCallbackStack;
|
||||
} NTW32CALL_SAVED_STATE, *PNTW32CALL_SAVED_STATE;
|
||||
|
||||
/* FUNCTIONS ***************************************************************/
|
||||
|
@ -63,6 +64,7 @@ NtCallbackReturn (PVOID Result,
|
|||
KIRQL oldIrql;
|
||||
PNTW32CALL_SAVED_STATE State;
|
||||
PKTRAP_FRAME SavedTrapFrame;
|
||||
PVOID SavedCallbackStack;
|
||||
|
||||
Thread = PsGetCurrentThread();
|
||||
if (Thread->Tcb.CallbackStack == NULL)
|
||||
|
@ -71,12 +73,11 @@ NtCallbackReturn (PVOID Result,
|
|||
}
|
||||
|
||||
OldStack = (PULONG)Thread->Tcb.CallbackStack;
|
||||
Thread->Tcb.CallbackStack = NULL;
|
||||
|
||||
/*
|
||||
* Get the values that NtW32Call left on the inactive stack for us.
|
||||
*/
|
||||
State = (PNTW32CALL_SAVED_STATE)OldStack[0];
|
||||
State = (PNTW32CALL_SAVED_STATE)OldStack[0];
|
||||
CallbackStatus = State->CallbackStatus;
|
||||
CallerResultLength = State->CallerResultLength;
|
||||
CallerResult = State->CallerResult;
|
||||
|
@ -84,6 +85,7 @@ NtCallbackReturn (PVOID Result,
|
|||
StackBase = State->SavedStackBase;
|
||||
StackLimit = State->SavedStackLimit;
|
||||
SavedTrapFrame = State->SavedTrapFrame;
|
||||
SavedCallbackStack = State->SavedCallbackStack;
|
||||
|
||||
/*
|
||||
* Copy the callback status and the callback result to NtW32Call
|
||||
|
@ -110,6 +112,7 @@ NtCallbackReturn (PVOID Result,
|
|||
Thread->Tcb.StackBase = StackBase;
|
||||
Thread->Tcb.StackLimit = StackLimit;
|
||||
Thread->Tcb.TrapFrame = SavedTrapFrame;
|
||||
Thread->Tcb.CallbackStack = SavedCallbackStack;
|
||||
KeGetCurrentKPCR()->TSS->Esp0 = (ULONG)Thread->Tcb.InitialStack;
|
||||
KeStackSwitchAndRet((PVOID)(OldStack + 1));
|
||||
|
||||
|
@ -199,14 +202,10 @@ NtW32Call (IN ULONG RoutineIndex,
|
|||
NTSTATUS CallbackStatus;
|
||||
NTW32CALL_SAVED_STATE SavedState;
|
||||
|
||||
DPRINT1("NtW32Call(RoutineIndex %d, Argument %X, ArgumentLength %d)\n",
|
||||
DPRINT("NtW32Call(RoutineIndex %d, Argument %X, ArgumentLength %d)\n",
|
||||
RoutineIndex, Argument, ArgumentLength);
|
||||
|
||||
Thread = PsGetCurrentThread();
|
||||
if (Thread->Tcb.CallbackStack != NULL)
|
||||
{
|
||||
return(STATUS_UNSUCCESSFUL);
|
||||
}
|
||||
|
||||
/* Set up the new kernel and user environment. */
|
||||
StackSize = (ULONG)(Thread->Tcb.StackBase - Thread->Tcb.StackLimit);
|
||||
|
@ -233,6 +232,7 @@ NtW32Call (IN ULONG RoutineIndex,
|
|||
SavedState.CallerResultLength = ResultLength;
|
||||
SavedState.CallbackStatus = &CallbackStatus;
|
||||
SavedState.SavedTrapFrame = Thread->Tcb.TrapFrame;
|
||||
SavedState.SavedCallbackStack = Thread->Tcb.CallbackStack;
|
||||
Thread->Tcb.InitialStack = Thread->Tcb.StackBase = NewStack + StackSize;
|
||||
Thread->Tcb.StackLimit = (ULONG)NewStack;
|
||||
Thread->Tcb.KernelStack = NewStack + StackSize - sizeof(KTRAP_FRAME);
|
||||
|
|
|
@ -654,17 +654,6 @@ NtUserGetAltTabInfo(
|
|||
return 0;
|
||||
}
|
||||
|
||||
DWORD
|
||||
STDCALL
|
||||
NtUserGetAncestor(
|
||||
DWORD Unknown0,
|
||||
DWORD Unknown1)
|
||||
{
|
||||
UNIMPLEMENTED
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
DWORD
|
||||
STDCALL
|
||||
NtUserGetAsyncKeyState(
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: window.c,v 1.11 2002/08/26 23:20:54 dwelch Exp $
|
||||
/* $Id: window.c,v 1.12 2002/08/30 02:47:37 dwelch Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -28,6 +28,42 @@
|
|||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
HWND STDCALL
|
||||
NtUserGetAncestor(HWND hWnd, UINT Flags)
|
||||
{
|
||||
if (W32kIsDesktopWindow(hWnd))
|
||||
{
|
||||
return(NULL);
|
||||
}
|
||||
if (Flags & GA_PARENT)
|
||||
{
|
||||
PWINDOW_OBJECT Window;
|
||||
HWND hParent;
|
||||
|
||||
Window = W32kGetWindowObject(hWnd);
|
||||
if (Window == NULL)
|
||||
{
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
if (Window->Parent == NULL)
|
||||
{
|
||||
W32kReleaseWindowObject(Window);
|
||||
}
|
||||
|
||||
hParent = Window->Parent->Self;
|
||||
|
||||
W32kReleaseWindowObject(Window);
|
||||
|
||||
return(hParent);
|
||||
}
|
||||
else
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
VOID
|
||||
W32kSetFocusWindow(HWND hWnd)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue