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)
#endif /* WIN32_NO_STATUS */
#define GA_PARENT (1)
#define GA_ROOT (2)
#define GA_ROOTOWNER (3)
/* CreateFile, GetFileAttributes, SetFileAttributes */

View file

@ -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

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
* 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

View file

@ -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

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
* 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);

View file

@ -654,17 +654,6 @@ NtUserGetAltTabInfo(
return 0;
}
DWORD
STDCALL
NtUserGetAncestor(
DWORD Unknown0,
DWORD Unknown1)
{
UNIMPLEMENTED
return 0;
}
DWORD
STDCALL
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
* 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)
{