//#define STATUS_PENDING (0x00000103L)
#endif /* WIN32_NO_STATUS */
-
+#define GA_PARENT (1)
+#define GA_ROOT (2)
+#define GA_ROOTOWNER (3)
/* CreateFile, GetFileAttributes, SetFileAttributes */
DWORD Unknown4,
DWORD Unknown5);
-DWORD
-STDCALL
-NtUserGetAncestor(
- DWORD Unknown0,
- DWORD Unknown1);
+HWND STDCALL
+NtUserGetAncestor(HWND hWnd, UINT Flags);
+
DWORD
STDCALL
-/* $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
}
HWND STDCALL
-GetAncestor(HWND hwnd,
- UINT gaFlags)
+GetAncestor(HWND hwnd, UINT gaFlags)
{
- return (HWND)0;
+ return(NtUserGetAncestor(hwnd, gaFlags));
}
WINBOOL STDCALL
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
* 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
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
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
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
-/* $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
PULONG CallerResultLength;
PNTSTATUS CallbackStatus;
PKTRAP_FRAME SavedTrapFrame;
+ PVOID SavedCallbackStack;
} NTW32CALL_SAVED_STATE, *PNTW32CALL_SAVED_STATE;
/* FUNCTIONS ***************************************************************/
KIRQL oldIrql;
PNTW32CALL_SAVED_STATE State;
PKTRAP_FRAME SavedTrapFrame;
+ PVOID SavedCallbackStack;
Thread = PsGetCurrentThread();
if (Thread->Tcb.CallbackStack == NULL)
}
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;
StackBase = State->SavedStackBase;
StackLimit = State->SavedStackLimit;
SavedTrapFrame = State->SavedTrapFrame;
+ SavedCallbackStack = State->SavedCallbackStack;
/*
* Copy the callback status and the callback result to NtW32Call
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));
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);
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);
return 0;
}
-DWORD
-STDCALL
-NtUserGetAncestor(
- DWORD Unknown0,
- DWORD Unknown1)
-{
- UNIMPLEMENTED
-
- return 0;
-}
-
DWORD
STDCALL
NtUserGetAsyncKeyState(
-/* $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
/* 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)
{