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:
David Welch 2002-08-30 02:47:37 +00:00
parent 6332533037
commit c0b94f90f9
7 changed files with 87 additions and 45 deletions

View file

@ -49,7 +49,9 @@
//#define STATUS_PENDING (0x00000103L) //#define STATUS_PENDING (0x00000103L)
#endif /* WIN32_NO_STATUS */ #endif /* WIN32_NO_STATUS */
#define GA_PARENT (1)
#define GA_ROOT (2)
#define GA_ROOTOWNER (3)
/* CreateFile, GetFileAttributes, SetFileAttributes */ /* CreateFile, GetFileAttributes, SetFileAttributes */

View file

@ -509,11 +509,9 @@ NtUserGetAltTabInfo(
DWORD Unknown4, DWORD Unknown4,
DWORD Unknown5); DWORD Unknown5);
DWORD HWND STDCALL
STDCALL NtUserGetAncestor(HWND hWnd, UINT Flags);
NtUserGetAncestor(
DWORD Unknown0,
DWORD Unknown1);
DWORD DWORD
STDCALL STDCALL

View file

@ -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 * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS user32.dll * PROJECT: ReactOS user32.dll
@ -541,10 +541,9 @@ GetAltTabInfoW(HWND hwnd,
} }
HWND STDCALL HWND STDCALL
GetAncestor(HWND hwnd, GetAncestor(HWND hwnd, UINT gaFlags)
UINT gaFlags)
{ {
return (HWND)0; return(NtUserGetAncestor(hwnd, gaFlags));
} }
WINBOOL STDCALL WINBOOL STDCALL
@ -719,7 +718,15 @@ IsWindowUnicode(HWND hWnd)
WINBOOL STDCALL WINBOOL STDCALL
IsWindowVisible(HWND hWnd) 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 WINBOOL STDCALL

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * 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 * PROJECT: ReactOS kernel
* FILE: ntoskrnl/ke/i386/trap.s * FILE: ntoskrnl/ke/i386/trap.s
@ -40,14 +40,7 @@ _KiTrapEpilog:
cmpl $1, %eax /* Check for v86 recovery */ cmpl $1, %eax /* Check for v86 recovery */
jne _KiTrapRet jne _KiTrapRet
jmp _KiV86Complete jmp _KiV86Complete
_KiTrapRet: _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)
/* Skip debug information and unsaved registers */ /* Skip debug information and unsaved registers */
addl $0x30, %esp addl $0x30, %esp
popl %gs popl %gs
@ -138,21 +131,31 @@ _KiTrapProlog:
pushl $0 /* XXX: DebugArgMark */ pushl $0 /* XXX: DebugArgMark */
movl 0x60(%esp), %ebx movl 0x60(%esp), %ebx
pushl %ebx /* XXX: DebugEIP */ pushl %ebx /* XXX: DebugEIP */
pushl %ebp /* XXX: DebugEBP */ pushl %ebp /* XXX: DebugEBP */
/* Load the segment registers */ /* Load the segment registers */
movl $KERNEL_DS, %ebx movl $KERNEL_DS, %ebx
movl %ebx, %ds movl %ebx, %ds
movl %ebx, %es movl %ebx, %es
movl %ebx, %gs movl %ebx, %gs
/* Set ES to kernel segment */ /* Set ES to kernel segment */
movw $KERNEL_DS,%bx movw $KERNEL_DS,%bx
movw %bx,%es movw %bx,%es
movl %esp, %ebx 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 */ /* Save a pointer to the trap frame in the current KTHREAD */
cmpl $0, %edi cmpl $0, %edi
je .L6 je .L6
@ -166,6 +169,13 @@ _KiTrapProlog:
addl $4, %esp addl $4, %esp
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 */ /* Return to the caller */
jmp _KiTrapEpilog jmp _KiTrapEpilog

View file

@ -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 * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -43,6 +43,7 @@ typedef struct _NTW32CALL_SAVED_STATE
PULONG CallerResultLength; PULONG CallerResultLength;
PNTSTATUS CallbackStatus; PNTSTATUS CallbackStatus;
PKTRAP_FRAME SavedTrapFrame; PKTRAP_FRAME SavedTrapFrame;
PVOID SavedCallbackStack;
} NTW32CALL_SAVED_STATE, *PNTW32CALL_SAVED_STATE; } NTW32CALL_SAVED_STATE, *PNTW32CALL_SAVED_STATE;
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
@ -63,6 +64,7 @@ NtCallbackReturn (PVOID Result,
KIRQL oldIrql; KIRQL oldIrql;
PNTW32CALL_SAVED_STATE State; PNTW32CALL_SAVED_STATE State;
PKTRAP_FRAME SavedTrapFrame; PKTRAP_FRAME SavedTrapFrame;
PVOID SavedCallbackStack;
Thread = PsGetCurrentThread(); Thread = PsGetCurrentThread();
if (Thread->Tcb.CallbackStack == NULL) if (Thread->Tcb.CallbackStack == NULL)
@ -71,12 +73,11 @@ NtCallbackReturn (PVOID Result,
} }
OldStack = (PULONG)Thread->Tcb.CallbackStack; OldStack = (PULONG)Thread->Tcb.CallbackStack;
Thread->Tcb.CallbackStack = NULL;
/* /*
* Get the values that NtW32Call left on the inactive stack for us. * 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; CallbackStatus = State->CallbackStatus;
CallerResultLength = State->CallerResultLength; CallerResultLength = State->CallerResultLength;
CallerResult = State->CallerResult; CallerResult = State->CallerResult;
@ -84,6 +85,7 @@ NtCallbackReturn (PVOID Result,
StackBase = State->SavedStackBase; StackBase = State->SavedStackBase;
StackLimit = State->SavedStackLimit; StackLimit = State->SavedStackLimit;
SavedTrapFrame = State->SavedTrapFrame; SavedTrapFrame = State->SavedTrapFrame;
SavedCallbackStack = State->SavedCallbackStack;
/* /*
* Copy the callback status and the callback result to NtW32Call * Copy the callback status and the callback result to NtW32Call
@ -110,6 +112,7 @@ NtCallbackReturn (PVOID Result,
Thread->Tcb.StackBase = StackBase; Thread->Tcb.StackBase = StackBase;
Thread->Tcb.StackLimit = StackLimit; Thread->Tcb.StackLimit = StackLimit;
Thread->Tcb.TrapFrame = SavedTrapFrame; Thread->Tcb.TrapFrame = SavedTrapFrame;
Thread->Tcb.CallbackStack = SavedCallbackStack;
KeGetCurrentKPCR()->TSS->Esp0 = (ULONG)Thread->Tcb.InitialStack; KeGetCurrentKPCR()->TSS->Esp0 = (ULONG)Thread->Tcb.InitialStack;
KeStackSwitchAndRet((PVOID)(OldStack + 1)); KeStackSwitchAndRet((PVOID)(OldStack + 1));
@ -199,14 +202,10 @@ NtW32Call (IN ULONG RoutineIndex,
NTSTATUS CallbackStatus; NTSTATUS CallbackStatus;
NTW32CALL_SAVED_STATE SavedState; 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); RoutineIndex, Argument, ArgumentLength);
Thread = PsGetCurrentThread(); Thread = PsGetCurrentThread();
if (Thread->Tcb.CallbackStack != NULL)
{
return(STATUS_UNSUCCESSFUL);
}
/* Set up the new kernel and user environment. */ /* Set up the new kernel and user environment. */
StackSize = (ULONG)(Thread->Tcb.StackBase - Thread->Tcb.StackLimit); StackSize = (ULONG)(Thread->Tcb.StackBase - Thread->Tcb.StackLimit);
@ -233,6 +232,7 @@ NtW32Call (IN ULONG RoutineIndex,
SavedState.CallerResultLength = ResultLength; SavedState.CallerResultLength = ResultLength;
SavedState.CallbackStatus = &CallbackStatus; SavedState.CallbackStatus = &CallbackStatus;
SavedState.SavedTrapFrame = Thread->Tcb.TrapFrame; SavedState.SavedTrapFrame = Thread->Tcb.TrapFrame;
SavedState.SavedCallbackStack = Thread->Tcb.CallbackStack;
Thread->Tcb.InitialStack = Thread->Tcb.StackBase = NewStack + StackSize; Thread->Tcb.InitialStack = Thread->Tcb.StackBase = NewStack + StackSize;
Thread->Tcb.StackLimit = (ULONG)NewStack; Thread->Tcb.StackLimit = (ULONG)NewStack;
Thread->Tcb.KernelStack = NewStack + StackSize - sizeof(KTRAP_FRAME); Thread->Tcb.KernelStack = NewStack + StackSize - sizeof(KTRAP_FRAME);

View file

@ -654,17 +654,6 @@ NtUserGetAltTabInfo(
return 0; return 0;
} }
DWORD
STDCALL
NtUserGetAncestor(
DWORD Unknown0,
DWORD Unknown1)
{
UNIMPLEMENTED
return 0;
}
DWORD DWORD
STDCALL STDCALL
NtUserGetAsyncKeyState( NtUserGetAsyncKeyState(

View file

@ -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 * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -28,6 +28,42 @@
/* FUNCTIONS *****************************************************************/ /* 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 VOID
W32kSetFocusWindow(HWND hWnd) W32kSetFocusWindow(HWND hWnd)
{ {