merge from trunk 16686-16827 misc stuff still crash often due to referencing problems/freed message queue Added: branches/win32k rewrite attempt/win32k/docs/ Added: branches/win32k rewrite attempt/win32k/docs/refs.txt Modified: branches/win32k rewrite attempt/win32k/eng/event.c Modified: branches/win32k rewrite attempt/win32k/include/focus.h Modified: branches/win32k rewrite attempt/win32k/include/mmcopy.h Modified: branches/win32k rewrite attempt/win32k/include/userfuncs.h Modified: branches/win32k rewrite attempt/win32k/misc/copy.c Modified: branches/win32k rewrite attempt/win32k/ntuser/class.c Modified: branches/win32k rewrite attempt/win32k/ntuser/focus.c Modified: branches/win32k rewrite attempt/win32k/ntuser/input.c Modified: branches/win32k rewrite attempt/win32k/ntuser/monitor.c Modified: branches/win32k rewrite attempt/win32k/ntuser/window.c Modified: branches/win32k rewrite attempt/win32k/ntuser/winpos.c Modified: branches/win32k rewrite attempt/win32k/objects/brush.c Modified: branches/win32k rewrite attempt/win32k/objects/cliprgn.c Modified: branches/win32k rewrite attempt/win32k/objects/color.c Modified: branches/win32k rewrite attempt/win32k/objects/coord.c Modified: branches/win32k rewrite attempt/win32k/objects/dc.c Modified: branches/win32k rewrite attempt/win32k/objects/dib.c Modified: branches/win32k rewrite attempt/win32k/objects/fillshap.c Modified: branches/win32k rewrite attempt/win32k/objects/line.c Modified: branches/win32k rewrite attempt/win32k/objects/pen.c Modified: branches/win32k rewrite attempt/win32k/objects/print.c Modified: branches/win32k rewrite attempt/win32k/objects/rect.c Modified: branches/win32k rewrite attempt/win32k/objects/region.c Modified: branches/win32k rewrite attempt/win32k/objects/text.c Modified: branches/win32k rewrite attempt/win32k/tests/win32k.xml Modified: branches/win32k rewrite attempt/win32k/win32k.xml _____
Added: branches/win32k rewrite attempt/win32k/docs/refs.txt --- branches/win32k rewrite attempt/win32k/docs/refs.txt 2005-07-28 11:48:58 UTC (rev 16828) +++ branches/win32k rewrite attempt/win32k/docs/refs.txt 2005-07-28 13:40:52 UTC (rev 16829) @@ -0,0 +1,26 @@
+References: +----------- + +window -> desktop +window -> class + +window -> queue/thread_input ????????? +thread -> queue/thread_input ????????? + +thread -> process +process -> winsta +thread -> desktop +desktop -> winsta +winsta -> session + + +Above references create following dependencies: +----------------------------------------------- + +window -> desktop -> winsta -> session +window -> class + +thread -> process -> winsta -> session +thread -> desktop -> winsta -> session + +process -> winsta -> session _____
Modified: branches/win32k rewrite attempt/win32k/eng/event.c --- branches/win32k rewrite attempt/win32k/eng/event.c 2005-07-28 11:48:58 UTC (rev 16828) +++ branches/win32k rewrite attempt/win32k/eng/event.c 2005-07-28 13:40:52 UTC (rev 16829) @@ -36,7 +36,7 @@
STDCALL EngCreateEvent ( OUT PEVENT *Event ) { - (*Event) = ExAllocatePool(NonPagedPool, sizeof(TAG_DRIVER)); + (*Event) = ExAllocatePool(NonPagedPool, sizeof(KEVENT)); if ((*Event) == NULL) { return FALSE; _____
Modified: branches/win32k rewrite attempt/win32k/include/focus.h --- branches/win32k rewrite attempt/win32k/include/focus.h 2005-07-28 11:48:58 UTC (rev 16828) +++ branches/win32k rewrite attempt/win32k/include/focus.h 2005-07-28 13:40:52 UTC (rev 16829) @@ -9,9 +9,8 @@
PWINDOW_OBJECT FASTCALL UserGetFocusWindow();
-PWINDOW_OBJECT FASTCALL -IntGetForegroundWindow(VOID);
+ /* * These functions take the window handles from current thread queue. */ _____
Modified: branches/win32k rewrite attempt/win32k/include/mmcopy.h --- branches/win32k rewrite attempt/win32k/include/mmcopy.h 2005-07-28 11:48:58 UTC (rev 16828) +++ branches/win32k rewrite attempt/win32k/include/mmcopy.h 2005-07-28 13:40:52 UTC (rev 16829) @@ -4,8 +4,9 @@
#include <pseh/pseh.h>
NTSTATUS _MmCopyFromCaller( PVOID Target, PVOID Source, UINT Bytes ); +NTSTATUS _MmCopyToCaller( PVOID Target, PVOID Source, UINT Bytes );
#define MmCopyFromCaller(x,y,z) _MmCopyFromCaller((PCHAR)(x),(PCHAR)(y),(UINT)(z)) -#define MmCopyToCaller(x,y,z) MmCopyFromCaller(x,y,z) +#define MmCopyToCaller(x,y,z) _MmCopyToCaller((PCHAR)(x),(PCHAR)(y),(UINT)(z))
#endif/*NDK_MMCOPY_H*/ _____
Modified: branches/win32k rewrite attempt/win32k/include/userfuncs.h --- branches/win32k rewrite attempt/win32k/include/userfuncs.h 2005-07-28 11:48:58 UTC (rev 16828) +++ branches/win32k rewrite attempt/win32k/include/userfuncs.h 2005-07-28 13:40:52 UTC (rev 16829) @@ -38,8 +38,12 @@
NTSTATUS FASTCALL UserAcquireOrReleaseInputOwnership(BOOLEAN Release);
-/* focus.c */ +/******************** FOCUS.C ********************************/ + PWINDOW_OBJECT FASTCALL +UserGetForegroundWindow(VOID); + +PWINDOW_OBJECT FASTCALL UserSetFocus(PWINDOW_OBJECT Wnd OPTIONAL);
@@ -96,7 +100,8 @@ UserCreateMenuObject(HANDLE* h);
-/* caret.c */ +/************************* CARET.C ****************************/ + BOOL FASTCALL UserShowCaret(PWINDOW_OBJECT Wnd);
@@ -106,12 +111,14 @@ BOOL FASTCALL UserHideCaret(PWINDOW_OBJECT Wnd);
-/* winpos.c */ +/************************* WINPOS.C ****************************/
+ BOOL FASTCALL UserGetClientOrigin(PWINDOW_OBJECT hWnd, LPPOINT Point);
-/* scrollbar.c */ +/************************* SCROLLBAR.C ****************************/ + DWORD FASTCALL UserShowScrollBar(PWINDOW_OBJECT Wnd, int wBar, DWORD bShow);
@@ -144,7 +151,7 @@ ClassReferenceClass(PWNDCLASS_OBJECT Class);
VOID FASTCALL -ClassDereferenceClass(PWNDCLASS_OBJECT Class); +UserDereferenceClass(PWNDCLASS_OBJECT Class);
PWNDCLASS_OBJECT FASTCALL ClassCreateClass(DWORD bytes); _____
Modified: branches/win32k rewrite attempt/win32k/misc/copy.c --- branches/win32k rewrite attempt/win32k/misc/copy.c 2005-07-28 11:48:58 UTC (rev 16828) +++ branches/win32k rewrite attempt/win32k/misc/copy.c 2005-07-28 13:40:52 UTC (rev 16829) @@ -2,9 +2,23 @@
NTSTATUS _MmCopyFromCaller( PVOID Target, PVOID Source, UINT Bytes ) { NTSTATUS Status = STATUS_SUCCESS; + + _SEH_TRY { + ProbeForRead(Source,Bytes,1); + RtlCopyMemory(Target,Source,Bytes); + } _SEH_HANDLE { + Status = _SEH_GetExceptionCode(); + } _SEH_END;
+ return Status; +} + +NTSTATUS _MmCopyToCaller( PVOID Target, PVOID Source, UINT Bytes ) { + NTSTATUS Status = STATUS_SUCCESS; + _SEH_TRY { - RtlCopyMemory(Target,Source,Bytes); + ProbeForWrite(Target,Bytes,1); + RtlCopyMemory(Target,Source,Bytes); } _SEH_HANDLE { Status = _SEH_GetExceptionCode(); } _SEH_END; _____
Modified: branches/win32k rewrite attempt/win32k/ntuser/class.c --- branches/win32k rewrite attempt/win32k/ntuser/class.c 2005-07-28 11:48:58 UTC (rev 16828) +++ branches/win32k rewrite attempt/win32k/ntuser/class.c 2005-07-28 13:40:52 UTC (rev 16829) @@ -54,7 +54,7 @@
}
VOID FASTCALL -ClassDereferenceClass(PWNDCLASS_OBJECT Class) +UserDereferenceClass(PWNDCLASS_OBJECT Class) { //if (--Class->RefCount == 0) //{ @@ -319,7 +319,7 @@ if (ClassObject->hInstance == lpwcx->hInstance) { SetLastWin32Error(ERROR_CLASS_ALREADY_EXISTS); - ClassDereferenceClass(ClassObject); + UserDereferenceClass(ClassObject); return(NULL); } } @@ -739,7 +739,7 @@
if (Class->hInstance && Class->hInstance != hInstance) { - ClassDereferenceClass(Class); + UserDereferenceClass(Class); SetLastWin32Error(ERROR_CLASS_DOES_NOT_EXIST); RETURN(FALSE); } @@ -747,20 +747,20 @@ if (!IsListEmpty(&Class->ClassWindowsListHead)) { /* Dereference the ClassReferenceClassByNameOrAtom() call */ - ClassDereferenceClass(Class); + UserDereferenceClass(Class); SetLastWin32Error(ERROR_CLASS_HAS_WINDOWS); RETURN(FALSE); }
/* Dereference the ClassReferenceClassByNameOrAtom() call */ - ClassDereferenceClass(Class); + UserDereferenceClass(Class);
RemoveEntryList(&Class->ListEntry);
RtlDeleteAtomFromAtomTable(WinStaObject->AtomTable, Class->Atom);
/* Free the object */ - ClassDereferenceClass(Class); + UserDereferenceClass(Class);
RETURN(TRUE);
_____
Modified: branches/win32k rewrite attempt/win32k/ntuser/focus.c --- branches/win32k rewrite attempt/win32k/ntuser/focus.c 2005-07-28 11:48:58 UTC (rev 16828) +++ branches/win32k rewrite attempt/win32k/ntuser/focus.c 2005-07-28 13:40:52 UTC (rev 16829) @@ -91,7 +91,7 @@
/* FIXME: IntIsWindow */
- IntPostOrSendMessage(hWnd, WM_NCACTIVATE, (WPARAM)(Window == IntGetForegroundWindow()), 0); + IntPostOrSendMessage(hWnd, WM_NCACTIVATE, (WPARAM)(Window == UserGetForegroundWindow()), 0); /* FIXME: WA_CLICKACTIVE */ IntPostOrSendMessage(hWnd, WM_ACTIVATE, MAKEWPARAM(MouseActivate ? WA_CLICKACTIVE : WA_ACTIVE, @@ -340,8 +340,9 @@ DPRINT("Enter NtUserGetForegroundWindow\n"); UserEnterExclusive();
- PUSER_MESSAGE_QUEUE ForegroundQueue = UserGetFocusMessageQueue(); - RETURN(ForegroundQueue != NULL ? ForegroundQueue->ActiveWindow : 0); + //PUSER_MESSAGE_QUEUE ForegroundQueue = UserGetFocusMessageQueue(); + //RETURN(ForegroundQueue != NULL ? ForegroundQueue->ActiveWindow : 0); + RETURN(GetHwnd(UserGetForegroundWindow()));
CLEANUP: DPRINT("Leave NtUserGetForegroundWindow, ret=%i\n",_ret_); @@ -352,7 +353,7 @@
PWINDOW_OBJECT FASTCALL -IntGetForegroundWindow(VOID) +UserGetForegroundWindow(VOID) { PUSER_MESSAGE_QUEUE ForegroundQueue = UserGetFocusMessageQueue();
_____
Modified: branches/win32k rewrite attempt/win32k/ntuser/input.c --- branches/win32k rewrite attempt/win32k/ntuser/input.c 2005-07-28 11:48:58 UTC (rev 16828) +++ branches/win32k rewrite attempt/win32k/ntuser/input.c 2005-07-28 13:40:52 UTC (rev 16829) @@ -379,13 +379,11 @@
MSG Mesg; NTSTATUS Status;
-// Status = ObmReferenceObjectByHandle(InputWindowStation->HandleTable, -// InputWindowStation->ShellWindow, -// otWindow, -// (PVOID *)&Window); - - Window = IntGetWindowObject( InputWindowStation->ShellWindow); - + Window = UserGetObject( + &InputWindowStation->HandleTable, + InputWindowStation->ShellWindow, + USER_WINDOW); + if (!NT_SUCCESS(Status)) { DPRINT1("Couldn't find window to send Windows key message!\n"); @@ -399,8 +397,6 @@
/* The QS_HOTKEY is just a guess */ MsqPostMessage(Window->MessageQueue, &Mesg, FALSE, QS_HOTKEY); - -// ObmDereferenceObject(Window); }
STATIC VOID STDCALL @@ -930,7 +926,6 @@ SwapButtons = CurInfo->SwapButtons; DoMove = FALSE;
-// ExAcquireFastMutex(&CurInfo->CursorMutex); UserGetCursorLocation(WinSta, &MousePos); OrgPos.x = MousePos.x; OrgPos.y = MousePos.y; @@ -948,17 +943,18 @@ MousePos.y += mi->dy; }
-// Status = ObmReferenceObjectByHandle(WinSta->HandleTable, -// WinSta->ActiveDesktop->DesktopWindow, otWindow, (PVOID*)&DesktopWindow); - - DesktopWindow = UserGetDesktopWindow(); + //FIXME: make typename like HACCEL, HWND -> USER_WND, USER_ACCEL + DesktopWindow = UserGetObject( + &WinSta->HandleTable, + WinSta->ActiveDesktop->DesktopWindow, + USER_WINDOW); + if (DesktopWindow) { if(MousePos.x >= DesktopWindow->ClientRect.right) MousePos.x = DesktopWindow->ClientRect.right - 1; if(MousePos.y >= DesktopWindow->ClientRect.bottom) MousePos.y = DesktopWindow->ClientRect.bottom - 1; -// ObmDereferenceObject(DesktopWindow); }
if(MousePos.x < 0) @@ -983,7 +979,6 @@ DoMove = (MousePos.x != OrgPos.x || MousePos.y != OrgPos.y); }
-// ExReleaseFastMutex(&CurInfo->CursorMutex);
if (DoMove) { @@ -1000,9 +995,9 @@
IntEngMovePointer(SurfObj, MousePos.x, MousePos.y, &(GDIDEV(SurfObj)->Pointer.Exclude)); /* Only now, update the info in the GDIDEVICE, so EngMovePointer can - * use the old values to move the pointer image */ - GDIDEV(SurfObj)->Pointer.Pos.x = MousePos.x; - GDIDEV(SurfObj)->Pointer.Pos.y = MousePos.y; + * use the old values to move the pointer image */ + GDIDEV(SurfObj)->Pointer.Pos.x = MousePos.x; + GDIDEV(SurfObj)->Pointer.Pos.y = MousePos.y;
BITMAPOBJ_UnlockBitmap(BitmapObj); } @@ -1019,7 +1014,7 @@ if(DoMove) { Msg.message = WM_MOUSEMOVE; - //FIXME: uhm... Msg is built on stack... + /* Msg is built on stack but MsqInsertSystemMessage copies it, so its ok */ MsqInsertSystemMessage(&Msg); }
_____
Modified: branches/win32k rewrite attempt/win32k/ntuser/monitor.c --- branches/win32k rewrite attempt/win32k/ntuser/monitor.c 2005-07-28 11:48:58 UTC (rev 16828) +++ branches/win32k rewrite attempt/win32k/ntuser/monitor.c 2005-07-28 13:40:52 UTC (rev 16829) @@ -111,7 +111,6 @@
HANDLE Handle; PMONITOR_OBJECT Monitor;
-// Monitor = ObmCreateObject(PsGetWin32Thread()->Desktop->WindowStation->HandleTable, &Handle, otMonitor, sizeof (MONITOR_OBJECT)); Monitor = UserCreateMonitorObject(&Handle); if (Monitor == NULL) { @@ -174,10 +173,7 @@ IntGetMonitorObject(IN HMONITOR hMonitor) { PMONITOR_OBJECT Monitor; -// NTSTATUS Status;
-// Status = ObmReferenceObjectByHandle(PsGetWin32Thread()->Desktop->WindowStation->H andleTable, hMonitor, otMonitor, (PVOID *)&Monitor); - Monitor = UserGetMonitorObject(hMonitor); if (!Monitor) { _____
Modified: branches/win32k rewrite attempt/win32k/ntuser/window.c --- branches/win32k rewrite attempt/win32k/ntuser/window.c 2005-07-28 11:48:58 UTC (rev 16828) +++ branches/win32k rewrite attempt/win32k/ntuser/window.c 2005-07-28 13:40:52 UTC (rev 16829) @@ -428,7 +428,7 @@
RemoveEntryList(&Window->ClassListEntry);
/* dereference the class */ - ClassDereferenceClass(Window->Class); + UserDereferenceClass(Window->Class); Window->Class = NULL;
if(Window->WindowRegion) @@ -495,7 +495,7 @@ pwi->rcClient = WindowObject->ClientRect; pwi->dwStyle = WindowObject->Style; pwi->dwExStyle = WindowObject->ExStyle; - pwi->dwWindowStatus = (IntGetForegroundWindow() == WindowObject); /* WS_ACTIVECAPTION */ + pwi->dwWindowStatus = (UserGetForegroundWindow() == WindowObject); /* WS_ACTIVECAPTION */ IntGetWindowBorderMeasures(WindowObject, &pwi->cxWindowBorders, &pwi->cyWindowBorders); pwi->atomWindowType = (WindowObject->Class ? WindowObject->Class->Atom : 0); pwi->wCreatorVersion = 0x400; /* FIXME - return a real version number */ @@ -510,13 +510,19 @@ { PMENU_OBJECT OldMenuObject, NewMenuObject = NULL;
+ if ((WindowObject->Style & (WS_CHILD | WS_POPUP)) == WS_CHILD) + { + SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); + return FALSE; + } + *Changed = (WindowObject->IDMenu != (UINT) Menu); if (! *Changed) { return TRUE; }
- if (0 != WindowObject->IDMenu) + if (WindowObject->IDMenu) { OldMenuObject = UserGetMenuObject((HMENU) WindowObject->IDMenu); ASSERT(NULL == OldMenuObject || OldMenuObject->MenuInfo.Wnd == WindowObject->Self); @@ -574,12 +580,24 @@ DestroyThreadWindows(struct _ETHREAD *Thread) { PLIST_ENTRY Current; - PW32PROCESS Win32Process; +// PW32PROCESS Win32Process; PW32THREAD Win32Thread; - PWINDOW_OBJECT *List, *pWnd; - ULONG Cnt = 0; +// PWINDOW_OBJECT *List, *pWnd, Wnd; + PWINDOW_OBJECT Wnd; +// ULONG Cnt = 0;
Win32Thread = Thread->Tcb.Win32Thread; + + while (!IsListEmpty(&Win32Thread->WindowListHead)) + { + Current = RemoveHeadList(&Win32Thread->WindowListHead); + Wnd = CONTAINING_RECORD(Current, WINDOW_OBJECT, ThreadListEntry); + /* window removes itself from the list */ + UserDestroyWindow(Wnd); + } + +#if 0 + Win32Process = (PW32PROCESS)Thread->ThreadsProcess->Win32Process;
Current = Win32Thread->WindowListHead.Flink; @@ -615,7 +633,7 @@ ExFreePool(List); return; } - +#endif }
@@ -1494,10 +1512,12 @@ /* Check the window station. */ if (PsGetWin32Thread()->Desktop == NULL) { - ClassDereferenceClass(ClassObject); + UserDereferenceClass(ClassObject); DPRINT("Thread is not attached to a desktop! Cannot create window!\n"); return (HWND)0; } + + //FIXME: DO NOT REFERENCE WINSTA! Reference desktop instead!! WinStaObject = UserGetCurrentWinSta(); ObReferenceObjectByPointer(WinStaObject, KernelMode, ExWindowStationObjectType, 0);
@@ -1513,7 +1533,7 @@ if (!WindowObject) { ObDereferenceObject(WinStaObject); - ClassDereferenceClass(ClassObject); + UserDereferenceClass(ClassObject); SetLastNtError(STATUS_INSUFFICIENT_RESOURCES); return (HWND)0; } @@ -1529,6 +1549,8 @@ * Fill out the structure describing it. */ WindowObject->Class = ClassObject; + + //er dette n°dvendig? InsertTailList(&ClassObject->ClassWindowsListHead, &WindowObject->ClassListEntry);
WindowObject->ExStyle = dwExStyle; @@ -1551,8 +1573,11 @@
WindowObject->MessageQueue = UserGetCurrentQueue();
+ ASSERT(WindowObject->MessageQueue); + DPRINT1("Set 0x%x's parent to 0x%x\n",WindowObject, ParentWindow); WindowObject->ParentWnd = ParentWindow; + if((OwnerWindow = IntGetWindowObject(OwnerWindowHandle))) { WindowObject->Owner = OwnerWindowHandle; @@ -1604,7 +1629,7 @@
TAG_STRING); if (NULL == WindowObject->WindowName.Buffer) { - ClassDereferenceClass(ClassObject); + UserDereferenceClass(ClassObject); DPRINT1("Failed to allocate mem for window name\n"); SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); return NULL; @@ -1691,7 +1716,7 @@ /* FIXME - Delete window object and remove it from the thread windows list */ /* FIXME - delete allocated DCE */
- ClassDereferenceClass(ClassObject); + UserDereferenceClass(ClassObject); DPRINT1("CBT-hook returned !0\n"); return (HWND) NULL; } @@ -1894,7 +1919,7 @@ if (Result == (LRESULT)-1) { /* FIXME: Cleanup. */ - ClassDereferenceClass(ClassObject); + UserDereferenceClass(ClassObject); DPRINT("IntCreateWindowEx(): send CREATE message failed.\n"); return((HWND)0); } @@ -2149,7 +2174,7 @@ WinPosActivateOtherWindow(Wnd); } } - +// IntDereferenceMessageQueue(Window->MessageQueue); if (Wnd->MessageQueue->ActiveWindow == Wnd->Self) Wnd->MessageQueue->ActiveWindow = NULL;
_____
Modified: branches/win32k rewrite attempt/win32k/ntuser/winpos.c --- branches/win32k rewrite attempt/win32k/ntuser/winpos.c 2005-07-28 11:48:58 UTC (rev 16828) +++ branches/win32k rewrite attempt/win32k/ntuser/winpos.c 2005-07-28 13:40:52 UTC (rev 16829) @@ -114,56 +114,71 @@
WinPosActivateOtherWindow(PWINDOW_OBJECT Window) { PWINDOW_OBJECT Wnd, Old; - int TryTopmost; + HWND Fg;
if (!Window || IntIsDesktopWindow(Window)) { IntSetFocusMessageQueue(NULL); return; } + + /* If this is popup window, try to activate the owner first. */ + if ((Window->Style & WS_POPUP) && (Wnd = IntGetOwner(Window))) + { + for(;;) + { + Old = Wnd; + Wnd = Wnd->ParentWnd;//IntGetParentObject(Wnd); + if(IntIsDesktopWindow(Wnd)) + { + Wnd = Old; + break; + } + } + + if ((Wnd->Style & (WS_DISABLED | WS_VISIBLE)) == WS_VISIBLE && + (Wnd->Style & (WS_POPUP | WS_CHILD)) != WS_CHILD) + goto done; + + } + + /* Pick a next top-level window. */ + /* FIXME: Search for non-tooltip windows first. */ Wnd = Window; - for(;;) + while (Wnd != NULL) { - HWND *List, *phWnd; - Old = Wnd; - Wnd = Wnd->ParentWnd; - if(!Wnd) + if (Old->NextSibling == NULL) { - IntSetFocusMessageQueue(NULL); - return; + Wnd = NULL; +//(( if (Old != Window) +//(( IntReleaseWindowObject(Old); + break; } + Wnd = IntGetWindowObject(Old->NextSibling->Self); +// IntUnLockRelatives(Old); +// if (Old != Window) +// IntReleaseWindowObject(Old); + if ((Wnd->Style & (WS_DISABLED | WS_VISIBLE)) == WS_VISIBLE && + (Wnd->Style & (WS_POPUP | WS_CHILD)) != WS_CHILD) + break; + }
- if((List = IntWinListChildren(Wnd))) +done: +// Fg = NtUserGetForegroundWindow(); + Fg = GetHwnd(UserGetForegroundWindow()); + if (Wnd && (!Fg || Window->Self == Fg)) + { + if (IntSetForegroundWindow(Wnd)) { - for(TryTopmost = 0; TryTopmost <= 1; TryTopmost++) - { - for(phWnd = List; *phWnd; phWnd++) - { - PWINDOW_OBJECT Child; - - if((*phWnd) == Window->Self) - { - continue; - } - - if((Child = IntGetWindowObject(*phWnd))) -// Child = *phWnd; - { - if(((! TryTopmost && (0 == (Child->ExStyle & WS_EX_TOPMOST))) - || (TryTopmost && (0 != (Child->ExStyle & WS_EX_TOPMOST)))) - && IntSetForegroundWindow(Child)) - { - ExFreePool(List); - return; - } - } - } - } - ExFreePool(List); +// IntReleaseWindowObject(Wnd); + return; } } - + if (!IntSetActiveWindow(Wnd)) + IntSetActiveWindow(0); +// if (Wnd) +// IntReleaseWindowObject(Wnd); }
@@ -733,7 +748,7 @@
//FIXME - tmp = IntGetForegroundWindow(); + tmp = UserGetForegroundWindow(); if (WinPos->hwnd == (tmp ? tmp->Self : 0)) { WinPos->flags |= SWP_NOACTIVATE; /* Already active */ _____
Modified: branches/win32k rewrite attempt/win32k/objects/brush.c --- branches/win32k rewrite attempt/win32k/objects/brush.c 2005-07-28 11:48:58 UTC (rev 16828) +++ branches/win32k rewrite attempt/win32k/objects/brush.c 2005-07-28 13:40:52 UTC (rev 16829) @@ -563,7 +563,7 @@
CONST VOID *PackedDIB) { BITMAPINFO *SafeBitmapInfoAndData; - NTSTATUS Status; + NTSTATUS Status = STATUS_SUCCESS; HBRUSH hBrush;
SafeBitmapInfoAndData = EngAllocMem(0, BitmapInfoSize, 0); @@ -573,10 +573,24 @@ return NULL; }
- Status = MmCopyFromCaller(SafeBitmapInfoAndData, BitmapInfoAndData, - BitmapInfoSize); + _SEH_TRY + { + ProbeForRead(BitmapInfoAndData, + BitmapInfoSize, + 1); + RtlCopyMemory(SafeBitmapInfoAndData, + BitmapInfoAndData, + BitmapInfoSize); + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + if (!NT_SUCCESS(Status)) { + EngFreeMem(SafeBitmapInfoAndData); SetLastNtError(Status); return 0; } @@ -632,11 +646,23 @@
if (Point != NULL) { - NTSTATUS Status; + NTSTATUS Status = STATUS_SUCCESS; POINT SafePoint; SafePoint.x = dc->w.brushOrgX; SafePoint.y = dc->w.brushOrgY; - Status = MmCopyToCaller(Point, &SafePoint, sizeof(POINT)); + _SEH_TRY + { + ProbeForWrite(Point, + sizeof(POINT), + 1); + *Point = SafePoint; + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + if(!NT_SUCCESS(Status)) { DC_UnlockDc(dc); @@ -661,7 +687,7 @@ ULONG Reserved) { PPATRECT rb = NULL; - NTSTATUS Status; + NTSTATUS Status = STATUS_SUCCESS; BOOL Ret;
if (cRects > 0) @@ -672,7 +698,21 @@ SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); return FALSE; } - Status = MmCopyFromCaller(rb, pRects, sizeof(PATRECT) * cRects); + _SEH_TRY + { + ProbeForRead(pRects, + cRects * sizeof(PATRECT), + 1); + RtlCopyMemory(rb, + pRects, + cRects * sizeof(PATRECT)); + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + if (!NT_SUCCESS(Status)) { ExFreePool(rb); _____
Modified: branches/win32k rewrite attempt/win32k/objects/cliprgn.c --- branches/win32k rewrite attempt/win32k/objects/cliprgn.c 2005-07-28 11:48:58 UTC (rev 16828) +++ branches/win32k rewrite attempt/win32k/objects/cliprgn.c 2005-07-28 13:40:52 UTC (rev 16829) @@ -192,7 +192,19 @@
Ret = IntGdiGetClipBox(hDC, &Saferect);
- Status = MmCopyToCaller(rc, &Saferect, sizeof(RECT)); + _SEH_TRY + { + ProbeForWrite(rc, + sizeof(RECT), + 1); + *rc = Saferect; + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + if(!NT_SUCCESS(Status)) {
@@ -341,7 +353,7 @@ BOOL STDCALL NtGdiRectVisible(HDC hDC, CONST PRECT UnsafeRect) { - NTSTATUS Status; + NTSTATUS Status = STATUS_SUCCESS; PROSRGNDATA Rgn; PDC dc = DC_LockDc(hDC); BOOL Result = FALSE; @@ -353,10 +365,23 @@ return FALSE; }
- Status = MmCopyFromCaller(&Rect, UnsafeRect, sizeof(RECT)); + _SEH_TRY + { + ProbeForRead(UnsafeRect, + sizeof(RECT), + 1); + Rect = *UnsafeRect; + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + if(!NT_SUCCESS(Status)) { DC_UnlockDc(dc); + SetLastNtError(Status); return FALSE; }
_____
Modified: branches/win32k rewrite attempt/win32k/objects/color.c --- branches/win32k rewrite attempt/win32k/objects/color.c 2005-07-28 11:48:58 UTC (rev 16828) +++ branches/win32k rewrite attempt/win32k/objects/color.c 2005-07-28 13:40:52 UTC (rev 16829) @@ -588,6 +588,13 @@
return old; }
+/* + Win 2k Graphics API, Black Book. by coriolis.com + Page 62, Note that Steps 3, 5, and 6 are not required for Windows NT(tm) + and Windows 2000(tm). + + Step 5. UnrealizeObject(hTrackBrush); + */ BOOL STDCALL NtGdiUnrealizeObject(HGDIOBJ hgdiobj) { @@ -595,7 +602,6 @@ GDIOBJHDR * ptr; DWORD objectType; BOOL Ret = FALSE; - UNIMPLEMENTED;
ptr = GDIOBJ_LockObj(hgdiobj, GDI_OBJECT_TYPE_DONTCARE); if (ptr == 0) @@ -606,12 +612,6 @@ objectType = GDIOBJ_GetObjectType(hgdiobj); switch(objectType) { - case GDI_OBJECT_TYPE_PALETTE: - { - /* Make sure this is a Palette object!*/ - DPRINT1("GDI_OBJECT_TYPE_PALETTE\n"); - break; - } /* msdn.microsoft.com, "Windows 2000/XP: If hgdiobj is a brush, UnrealizeObject does nothing, @@ -620,7 +620,7 @@ */ case GDI_OBJECT_TYPE_BRUSH: { - DPRINT1("GDI_OBJECT_TYPE_BRUSH\n"); + DPRINT("GDI_OBJECT_TYPE_BRUSH\n"); Ret = TRUE; break; } _____
Modified: branches/win32k rewrite attempt/win32k/objects/coord.c --- branches/win32k rewrite attempt/win32k/objects/coord.c 2005-07-28 11:48:58 UTC (rev 16828) +++ branches/win32k rewrite attempt/win32k/objects/coord.c 2005-07-28 13:40:52 UTC (rev 16829) @@ -63,17 +63,29 @@
{ XFORM xformTemp; XFORM xform1, xform2; - NTSTATUS Status; + NTSTATUS Status = STATUS_SUCCESS; BOOL Ret;
- - Status = MmCopyFromCaller( &xform1, Unsafexform1, sizeof(XFORM) ); - if(!NT_SUCCESS(Status)) + _SEH_TRY { - SetLastNtError(Status); - return FALSE; + ProbeForWrite(UnsafeXFormResult, + sizeof(XFORM), + 1); + ProbeForRead(Unsafexform1, + sizeof(XFORM), + 1); + ProbeForRead(Unsafexform2, + sizeof(XFORM), + 1); + xform1 = *Unsafexform1; + xform2 = *Unsafexform2; } - Status = MmCopyFromCaller( &xform2, Unsafexform2, sizeof(XFORM) ); + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + if(!NT_SUCCESS(Status)) { SetLastNtError(Status); @@ -83,7 +95,17 @@ Ret = IntGdiCombineTransform(&xformTemp, &xform1, &xform2);
/* Copy the result to xformResult */ - Status = MmCopyToCaller( UnsafeXFormResult, &xformTemp, sizeof(XFORM) ); + _SEH_TRY + { + /* pointer was already probed! */ + *UnsafeXFormResult = xformTemp; + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + if(!NT_SUCCESS(Status)) { SetLastNtError(Status); @@ -131,7 +153,7 @@ int Count) { PDC dc; - NTSTATUS Status; + NTSTATUS Status = STATUS_SUCCESS; LPPOINT Points; ULONG Size;
@@ -159,7 +181,21 @@ return FALSE; }
- Status = MmCopyFromCaller(Points, UnsafePoints, Size); + _SEH_TRY + { + ProbeForWrite(UnsafePoints, + Size, + 1); + RtlCopyMemory(Points, + UnsafePoints, + Size); + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + if(!NT_SUCCESS(Status)) { DC_UnlockDc(dc); @@ -170,7 +206,19 @@
IntDPtoLP(dc, Points, Count);
- Status = MmCopyToCaller(UnsafePoints, Points, Size); + _SEH_TRY + { + /* pointer was already probed! */ + RtlCopyMemory(UnsafePoints, + Points, + Size); + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + if(!NT_SUCCESS(Status)) { DC_UnlockDc(dc); @@ -218,7 +266,7 @@ LPXFORM XForm) { PDC dc; - NTSTATUS Status; + NTSTATUS Status = STATUS_SUCCESS;
dc = DC_LockDc ( hDC ); if (!dc) @@ -233,7 +281,18 @@ return FALSE; }
- Status = MmCopyToCaller(XForm, &dc->w.xformWorld2Wnd, sizeof(XFORM)); + _SEH_TRY + { + ProbeForWrite(XForm, + sizeof(XFORM), + 1); + *XForm = dc->w.xformWorld2Wnd; + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END;
DC_UnlockDc(dc); return NT_SUCCESS(Status); @@ -280,7 +339,7 @@ NtGdiLPtoDP ( HDC hDC, LPPOINT UnsafePoints, INT Count ) { PDC dc; - NTSTATUS Status; + NTSTATUS Status = STATUS_SUCCESS; LPPOINT Points; ULONG Size;
@@ -308,7 +367,21 @@ [truncated at 1000 lines; 2213 more skipped]