Implement NtUserGetMenuBarInfo. Tested with MPlayerC with OBJID_MENU only, the rest...
[reactos.git] / reactos / subsys / win32k / ntuser / menu.c
index 883c14d..c4b4f3c 100644 (file)
@@ -115,7 +115,15 @@ CleanupMenuImpl(VOID)
 
 PMENU_OBJECT FASTCALL UserGetMenuObject(HMENU hMenu)
 {
-   PMENU_OBJECT Menu = (PMENU_OBJECT)UserGetObject(&gHandleTable, hMenu, otMenu);
+   PMENU_OBJECT Menu;
+   
+   if (!hMenu)
+   {
+      SetLastWin32Error(ERROR_INVALID_MENU_HANDLE);
+      return NULL;
+   }
+   
+   Menu = (PMENU_OBJECT)UserGetObject(&gHandleTable, hMenu, otMenu);
    if (!Menu)
    {
       SetLastWin32Error(ERROR_INVALID_MENU_HANDLE);
@@ -206,11 +214,10 @@ IntFreeMenuItem(PMENU_OBJECT Menu, PMENU_ITEM MenuItem,
    if(bRecurse && MenuItem->hSubMenu)
    {
       PMENU_OBJECT SubMenu;
-      SubMenu = IntGetMenuObject(MenuItem->hSubMenu );
+      SubMenu = UserGetMenuObject(MenuItem->hSubMenu );
       if(SubMenu)
       {
          IntDestroyMenuObject(SubMenu, bRecurse, TRUE);
-         IntReleaseMenuObject(SubMenu);
       }
    }
 
@@ -315,7 +322,7 @@ IntCreateMenu(PHANDLE Handle, BOOL IsMenuBar)
    Menu->MenuInfo.dwStyle = 0; /* FIXME */
    Menu->MenuInfo.cyMax = 0; /* default */
    Menu->MenuInfo.hbrBack =
-      NtGdiCreateSolidBrush(RGB(192, 192, 192)); /* FIXME: default background color */
+      NtGdiCreateSolidBrush(RGB(192, 192, 192), 0); /* FIXME: default background color */
    Menu->MenuInfo.dwContextHelpID = 0; /* default */
    Menu->MenuInfo.dwMenuData = 0; /* default */
    Menu->MenuInfo.Self = *Handle;
@@ -485,9 +492,8 @@ IntIsMenu(HMENU hMenu)
 {
    PMENU_OBJECT Menu;
 
-   if((Menu = IntGetMenuObject(hMenu)))
+   if((Menu = UserGetMenuObject(hMenu)))
    {
-      IntReleaseMenuObject(Menu);
       return TRUE;
    }
    return FALSE;
@@ -781,12 +787,11 @@ IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, PROSMENUITEMINF
       /* Make sure the submenu is marked as a popup menu */
       if (MenuItem->hSubMenu)
       {
-         SubMenuObject = IntGetMenuObject(MenuItem->hSubMenu);
+         SubMenuObject = UserGetMenuObject(MenuItem->hSubMenu);
          if (SubMenuObject != NULL)
          {
             SubMenuObject->MenuInfo.Flags |= MF_POPUP;
             MenuItem->fType |= MF_POPUP;
-            IntReleaseMenuObject(SubMenuObject);
          }
          else
          {
@@ -827,7 +832,10 @@ IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, PROSMENUITEMINF
       }
       else
       {
-         MenuItem->fType |= MF_SEPARATOR;
+         if (0 == (MenuObject->MenuInfo.Flags & MF_SYSMENU))
+         {
+            MenuItem->fType |= MF_SEPARATOR;
+         }
          RtlInitUnicodeString(&MenuItem->Text, NULL);
       }
    }
@@ -899,7 +907,9 @@ IntInsertMenuItem(PMENU_OBJECT MenuObject, UINT uItem, BOOL fByPosition,
 
    pos = IntInsertMenuItemToList(MenuObject, MenuItem, pos);
 
-   return pos >= 0;
+   DPRINT("IntInsertMenuItemToList = %i\n", pos);
+
+   return (pos >= 0);
 }
 
 UINT FASTCALL
@@ -1184,7 +1194,7 @@ IntGetMenuDefaultItem(PMENU_OBJECT MenuObject, UINT fByPos, UINT gmdiFlags,
                MenuItem->hSubMenu)
          {
 
-            SubMenuObject = IntGetMenuObject(MenuItem->hSubMenu);
+            SubMenuObject = UserGetMenuObject(MenuItem->hSubMenu);
             if(!SubMenuObject || (SubMenuObject == MenuObject))
                break;
 
@@ -1192,8 +1202,6 @@ IntGetMenuDefaultItem(PMENU_OBJECT MenuObject, UINT fByPos, UINT gmdiFlags,
             sres = IntGetMenuDefaultItem(SubMenuObject, fByPos, gmdiFlags, gismc);
             (*gismc)--;
 
-            IntReleaseMenuObject(SubMenuObject);
-
             if(sres > (UINT)-1)
                res = sres;
          }
@@ -1311,30 +1319,26 @@ NtUserBuildMenuItemList(
    DWORD Reserved)
 {
    DWORD res = -1;
-   PMENU_OBJECT MenuObject;
+   PMENU_OBJECT Menu;
    DECLARE_RETURN(DWORD);
 
    DPRINT("Enter NtUserBuildMenuItemList\n");
    UserEnterExclusive();
 
-   MenuObject = IntGetMenuObject(hMenu);
-   if(!MenuObject)
+   if(!(Menu = UserGetMenuObject(hMenu)))
    {
-      SetLastWin32Error(ERROR_INVALID_MENU_HANDLE);
       RETURN( (DWORD)-1);
    }
 
    if(Buffer)
    {
-      res = IntBuildMenuItemList(MenuObject, Buffer, nBufSize);
+      res = IntBuildMenuItemList(Menu, Buffer, nBufSize);
    }
    else
    {
-      res = MenuObject->MenuInfo.MenuItemCount;
+      res = Menu->MenuInfo.MenuItemCount;
    }
 
-   IntReleaseMenuObject(MenuObject);
-
    RETURN( res);
 
 CLEANUP:
@@ -1349,28 +1353,22 @@ CLEANUP:
  */
 DWORD STDCALL
 NtUserCheckMenuItem(
-   HMENU hmenu,
+   HMENU hMenu,
    UINT uIDCheckItem,
    UINT uCheck)
 {
-   DWORD res = 0;
-   PMENU_OBJECT MenuObject;
+   PMENU_OBJECT Menu;
    DECLARE_RETURN(DWORD);
 
    DPRINT("Enter NtUserCheckMenuItem\n");
    UserEnterExclusive();
 
-   MenuObject = IntGetMenuObject(hmenu);
-   if(!MenuObject)
+   if(!(Menu = UserGetMenuObject(hMenu)))
    {
-      SetLastWin32Error(ERROR_INVALID_MENU_HANDLE);
       RETURN( (DWORD)-1);
    }
 
-   res = IntCheckMenuItem(MenuObject, uIDCheckItem, uCheck);
-
-   IntReleaseMenuObject(MenuObject);
-   RETURN( res);
+   RETURN( IntCheckMenuItem(Menu, uIDCheckItem, uCheck));
 
 CLEANUP:
    DPRINT("Leave NtUserCheckMenuItem, ret=%i\n",_ret_);
@@ -1432,24 +1430,18 @@ NtUserDeleteMenu(
    UINT uPosition,
    UINT uFlags)
 {
-   BOOL res;
-   PMENU_OBJECT MenuObject;
+   PMENU_OBJECT Menu;
    DECLARE_RETURN(BOOL);
 
    DPRINT("Enter NtUserDeleteMenu\n");
    UserEnterExclusive();
 
-   MenuObject = IntGetMenuObject(hMenu);
-   if(!MenuObject)
+   if(!(Menu = UserGetMenuObject(hMenu)))
    {
-      SetLastWin32Error(ERROR_INVALID_MENU_HANDLE);
       RETURN( FALSE);
    }
 
-   res = IntRemoveMenuItem(MenuObject, uPosition, uFlags, TRUE);
-   IntReleaseMenuObject(MenuObject);
-
-   RETURN( res);
+   RETURN( IntRemoveMenuItem(Menu, uPosition, uFlags, TRUE));
 
 CLEANUP:
    DPRINT("Leave NtUserDeleteMenu, ret=%i\n",_ret_);
@@ -1464,25 +1456,20 @@ CLEANUP:
  */
 BOOL FASTCALL UserDestroyMenu(HMENU hMenu)
 {
-   BOOL Ret;
-
-   PMENU_OBJECT MenuObject = IntGetMenuObject(hMenu);
-   if(!MenuObject)
+   PMENU_OBJECT Menu;
+   
+   if(!(Menu = UserGetMenuObject(hMenu)))
    {
-      SetLastWin32Error(ERROR_INVALID_MENU_HANDLE);
       return FALSE;
    }
-   if(MenuObject->Process != PsGetCurrentProcess())
+   
+   if(Menu->Process != PsGetCurrentProcess())
    {
-      IntReleaseMenuObject(MenuObject);
       SetLastWin32Error(ERROR_ACCESS_DENIED);
       return FALSE;
    }
 
-   Ret = IntDestroyMenuObject(MenuObject, FALSE, TRUE);
-
-   IntReleaseMenuObject(MenuObject);
-   return Ret;
+   return IntDestroyMenuObject(Menu, FALSE, TRUE);
 }
 
 /*
@@ -1492,29 +1479,24 @@ BOOL STDCALL
 NtUserDestroyMenu(
    HMENU hMenu)
 {
-   BOOL Ret;
+   PMENU_OBJECT Menu;
    DECLARE_RETURN(BOOL);
 
    DPRINT("Enter NtUserDestroyMenu\n");
    UserEnterExclusive();
 
-   PMENU_OBJECT MenuObject = IntGetMenuObject(hMenu);
-   if(!MenuObject)
+   if(!(Menu = UserGetMenuObject(hMenu)))
    {
-      SetLastWin32Error(ERROR_INVALID_MENU_HANDLE);
       RETURN( FALSE);
    }
-   if(MenuObject->Process != PsGetCurrentProcess())
+   
+   if(Menu->Process != PsGetCurrentProcess())
    {
-      IntReleaseMenuObject(MenuObject);
       SetLastWin32Error(ERROR_ACCESS_DENIED);
       RETURN( FALSE);
    }
 
-   Ret = IntDestroyMenuObject(MenuObject, FALSE, TRUE);
-
-   IntReleaseMenuObject(MenuObject);
-   RETURN( Ret);
+   RETURN( IntDestroyMenuObject(Menu, FALSE, TRUE));
 
 CLEANUP:
    DPRINT("Leave NtUserDestroyMenu, ret=%i\n",_ret_);
@@ -1532,25 +1514,18 @@ NtUserEnableMenuItem(
    UINT uIDEnableItem,
    UINT uEnable)
 {
-   UINT res = (UINT)-1;
-   PMENU_OBJECT MenuObject;
+   PMENU_OBJECT Menu;
    DECLARE_RETURN(UINT);
 
    DPRINT("Enter NtUserEnableMenuItem\n");
    UserEnterExclusive();
 
-   MenuObject = IntGetMenuObject(hMenu);
-   if(!MenuObject)
+   if(!(Menu = UserGetMenuObject(hMenu)))
    {
-      SetLastWin32Error(ERROR_INVALID_MENU_HANDLE);
-      RETURN( res);
+      RETURN(-1);
    }
 
-   res = IntEnableMenuItem(MenuObject, uIDEnableItem, uEnable);
-
-   IntReleaseMenuObject(MenuObject);
-
-   RETURN( res);
+   RETURN( IntEnableMenuItem(Menu, uIDEnableItem, uEnable));
 
 CLEANUP:
    DPRINT("Leave NtUserEnableMenuItem, ret=%i\n",_ret_);
@@ -1569,8 +1544,7 @@ NtUserInsertMenuItem(
    BOOL fByPosition,
    LPCMENUITEMINFOW UnsafeItemInfo)
 {
-   DWORD Res = 0;
-   PMENU_OBJECT MenuObject;
+   PMENU_OBJECT Menu;
    NTSTATUS Status;
    ROSMENUITEMINFO ItemInfo;
    DECLARE_RETURN(DWORD);
@@ -1578,32 +1552,39 @@ NtUserInsertMenuItem(
    DPRINT("Enter NtUserInsertMenuItem\n");
    UserEnterExclusive();
 
-   MenuObject = IntGetMenuObject(hMenu);
-   if(!MenuObject)
+   if(!(Menu = UserGetMenuObject(hMenu)))
    {
-      SetLastWin32Error(ERROR_INVALID_MENU_HANDLE);
-      RETURN( 0);
+      RETURN( FALSE);
    }
 
+   /* Try to copy the whole MENUITEMINFOW structure */
    Status = MmCopyFromCaller(&ItemInfo, UnsafeItemInfo, sizeof(MENUITEMINFOW));
-   if (NT_SUCCESS(Status))
+   if (NT_SUCCESS(Status))
    {
-      IntReleaseMenuObject(MenuObject);
-      SetLastNtError(Status);
-      RETURN( FALSE);
+      if (sizeof(MENUITEMINFOW) != ItemInfo.cbSize
+         && FIELD_OFFSET(MENUITEMINFOW, hbmpItem) != ItemInfo.cbSize)
+      {
+         SetLastWin32Error(ERROR_INVALID_PARAMETER);
+         RETURN( FALSE);
+      }
+      RETURN( IntInsertMenuItem(Menu, uItem, fByPosition, &ItemInfo));
    }
-   if (ItemInfo.cbSize != sizeof(MENUITEMINFOW))
+
+   /* Try to copy without last field (not present in older versions) */
+   Status = MmCopyFromCaller(&ItemInfo, UnsafeItemInfo, FIELD_OFFSET(MENUITEMINFOW, hbmpItem));
+   if (NT_SUCCESS(Status))
    {
-      IntReleaseMenuObject(MenuObject);
-      SetLastWin32Error(ERROR_INVALID_PARAMETER);
-      RETURN( FALSE);
+      if (FIELD_OFFSET(MENUITEMINFOW, hbmpItem) != ItemInfo.cbSize)
+      {
+         SetLastWin32Error(ERROR_INVALID_PARAMETER);
+         RETURN( FALSE);
+      }
+      ItemInfo.hbmpItem = (HBITMAP)0;
+      RETURN( IntInsertMenuItem(Menu, uItem, fByPosition, &ItemInfo));
    }
 
-   Res = IntInsertMenuItem(MenuObject, uItem, fByPosition, &ItemInfo);
-
-   IntReleaseMenuObject(MenuObject);
-
-   RETURN( Res);
+   SetLastNtError(Status);
+   RETURN( FALSE);
 
 CLEANUP:
    DPRINT("Leave NtUserInsertMenuItem, ret=%i\n",_ret_);
@@ -1655,7 +1636,7 @@ CLEANUP:
 
 
 /*
- * @unimplemented
+ * @implemented
  */
 BOOL STDCALL
 NtUserGetMenuBarInfo(
@@ -1664,9 +1645,209 @@ NtUserGetMenuBarInfo(
    LONG idItem,
    PMENUBARINFO pmbi)
 {
-   UNIMPLEMENTED
+   BOOL Res = TRUE;
+   PMENU_OBJECT MenuObject;
+   PMENU_ITEM mi;
+   PWINDOW_OBJECT WindowObject;
+   HMENU hMenu;
+   POINT Offset;
+   RECT Rect;
+   MENUBARINFO kmbi;
+   DECLARE_RETURN(BOOL);
+  
+   DPRINT("Enter NtUserGetMenuBarInfo\n");
+   UserEnterShared();
+  
+   if (!(WindowObject = UserGetWindowObject(hwnd)))
+     {
+        SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE);
+        RETURN(FALSE);
+     }
+
+   hMenu = (HMENU)WindowObject->IDMenu;
+
+   if (!(MenuObject = UserGetMenuObject(hMenu)))
+     {
+       SetLastWin32Error(ERROR_INVALID_MENU_HANDLE);
+       RETURN(FALSE);
+     }
+
+   if (pmbi->cbSize != sizeof(MENUBARINFO))
+     {
+       SetLastWin32Error(ERROR_INVALID_PARAMETER);
+       RETURN(FALSE);
+     }
+
+   kmbi.cbSize = sizeof(MENUBARINFO);
+   kmbi.fBarFocused = FALSE;
+   kmbi.fFocused = FALSE;
+   kmbi.hwndMenu = NULL;
+   
+   switch (idObject)
+   {
+      case OBJID_MENU:
+      {
+         PMENU_OBJECT SubMenuObject;
+         kmbi.hMenu = hMenu;
+         if (idItem) /* Non-Zero-Based. */
+           {
+              if (IntGetMenuItemByFlag(MenuObject, idItem-1, MF_BYPOSITION, &mi, NULL) > -1)
+                   kmbi.rcBar = mi->Rect;
+              else
+                {
+                   Res = FALSE;
+                   break;
+                }
+           }
+         else
+           {  
+              /* If items is zero we assume info for the menu itself. */
+              if (!(IntGetClientOrigin(WindowObject, &Offset)))
+                {
+                   Res = FALSE;
+                   break;
+                }
+              Rect.left = Offset.x;
+              Rect.right = Offset.x + MenuObject->MenuInfo.Width;
+              Rect.top = Offset.y;
+              Rect.bottom = Offset.y + MenuObject->MenuInfo.Height;
+              kmbi.rcBar = Rect;
+              DPRINT("Rect top = %d bottom = %d left = %d right = %d \n",
+                       Rect.top, Rect.bottom, Rect.left, Rect.right);
+           }
+         if (idItem)
+           {
+              if (idItem-1 == MenuObject->MenuInfo.FocusedItem)
+                    kmbi.fFocused = TRUE;
+           }
+         if (MenuObject->MenuInfo.FocusedItem != NO_SELECTED_ITEM)
+               kmbi.fBarFocused = TRUE;
+         SubMenuObject = UserGetMenuObject(MenuObject->MenuItemList->hSubMenu);
+         if(SubMenuObject) kmbi.hwndMenu = SubMenuObject->MenuInfo.Wnd;
+         DPRINT("OBJID_MENU, idItem = %d\n",idItem);
+         break;
+      }
+      case OBJID_CLIENT:
+      {
+         PMENU_OBJECT SubMenuObject, XSubMenuObject;
+         SubMenuObject = UserGetMenuObject(MenuObject->MenuItemList->hSubMenu);
+         if(SubMenuObject) kmbi.hMenu = SubMenuObject->MenuInfo.Self;
+         else
+           {
+              Res = FALSE;
+              DPRINT1("OBJID_CLIENT, No SubMenu!\n");
+              break;
+           }
+         if (idItem)
+           {
+              if (IntGetMenuItemByFlag(SubMenuObject, idItem-1, MF_BYPOSITION, &mi, NULL) > -1)
+                   kmbi.rcBar = mi->Rect;
+              else
+                {
+                   Res = FALSE;
+                   break;
+                }
+           }
+         else
+           {
+              PWINDOW_OBJECT SubWinObj;
+              if (!(SubWinObj = UserGetWindowObject(SubMenuObject->MenuInfo.Wnd)))
+                {
+                   Res = FALSE;
+                   break;
+                }
+              if (!(IntGetClientOrigin(SubWinObj, &Offset)))
+                {
+                   Res = FALSE;
+                   break;
+                }
+              Rect.left = Offset.x;
+              Rect.right = Offset.x + SubMenuObject->MenuInfo.Width;
+              Rect.top = Offset.y;
+              Rect.bottom = Offset.y + SubMenuObject->MenuInfo.Height;
+              kmbi.rcBar = Rect;
+           }
+         if (idItem)
+           {
+              if (idItem-1 == SubMenuObject->MenuInfo.FocusedItem)
+                   kmbi.fFocused = TRUE;
+           }
+         if (SubMenuObject->MenuInfo.FocusedItem != NO_SELECTED_ITEM)
+               kmbi.fBarFocused = TRUE;
+         XSubMenuObject = UserGetMenuObject(SubMenuObject->MenuItemList->hSubMenu);
+         if (XSubMenuObject) kmbi.hwndMenu = XSubMenuObject->MenuInfo.Wnd;
+         DPRINT("OBJID_CLIENT, idItem = %d\n",idItem);
+         break;
+      }
+      case OBJID_SYSMENU:
+      {
+         PMENU_OBJECT SysMenuObject, SubMenuObject;
+         if(!(SysMenuObject = IntGetSystemMenu(WindowObject, FALSE, FALSE)))
+         {
+           Res = FALSE;
+           break;
+         }
+         kmbi.hMenu = SysMenuObject->MenuInfo.Self;
+         if (idItem)
+           {
+              if (IntGetMenuItemByFlag(SysMenuObject, idItem-1, MF_BYPOSITION, &mi, NULL) > -1)
+                   kmbi.rcBar = mi->Rect;
+              else
+                {
+                   Res = FALSE;
+                   break;
+                }
+           }
+         else
+           {
+              PWINDOW_OBJECT SysWinObj;
+              if (!(SysWinObj = UserGetWindowObject(SysMenuObject->MenuInfo.Wnd)))
+                {
+                   Res = FALSE;
+                   break;
+                }
+              if (!(IntGetClientOrigin(SysWinObj, &Offset)))
+                {
+                   Res = FALSE;
+                   break;
+                }
+              Rect.left = Offset.x;
+              Rect.right = Offset.x + SysMenuObject->MenuInfo.Width;
+              Rect.top = Offset.y;
+              Rect.bottom = Offset.y + SysMenuObject->MenuInfo.Height;
+              kmbi.rcBar = Rect;
+           }
+         if (idItem)
+           {
+              if (idItem-1 == SysMenuObject->MenuInfo.FocusedItem)
+                    kmbi.fFocused = TRUE;
+           }
+         if (SysMenuObject->MenuInfo.FocusedItem != NO_SELECTED_ITEM)
+               kmbi.fBarFocused = TRUE;
+         SubMenuObject = UserGetMenuObject(SysMenuObject->MenuItemList->hSubMenu);
+         if(SubMenuObject) kmbi.hwndMenu = SubMenuObject->MenuInfo.Wnd;
+         DPRINT("OBJID_SYSMENU, idItem = %d\n",idItem);
+         break;
+      }
+      default:
+         Res = FALSE;
+         DPRINT1("Unknown idObject = %d, idItem = %d\n",idObject,idItem);
+   }
+   if (Res)
+     {
+        NTSTATUS Status = MmCopyToCaller(pmbi, &kmbi, sizeof(MENUBARINFO));
+        if (! NT_SUCCESS(Status))
+          {
+            SetLastNtError(Status);
+            RETURN(FALSE);
+          }
+     }
+   RETURN(Res);
 
-   return 0;
+CLEANUP:
+   DPRINT("Leave NtUserGetMenuBarInfo, ret=%i\n",_ret_);
+   UserLeave();
+   END_CLEANUP;  
 }
 
 
@@ -1695,16 +1876,11 @@ NtUserGetMenuItemRect(
    LPRECT lprcItem)
 {
    ROSMENUINFO mi;
-   ROSMENUITEMINFO mii;
    HWND referenceHwnd;
-   LPPOINT lpPoints;
-   LPRECT lpRect = NULL;
-   POINT FromOffset;
-   LONG XMove, YMove;
-   ULONG i;
+   RECT Rect;
    NTSTATUS Status;
    PMENU_OBJECT Menu;
-   PWINDOW_OBJECT ReferenceWnd;
+   PMENU_ITEM MenuItem;
    DECLARE_RETURN(BOOL);
 
    DPRINT("Enter NtUserGetMenuItemRect\n");
@@ -1715,41 +1891,26 @@ NtUserGetMenuItemRect(
       RETURN(FALSE);
    }
 
-   if(!UserMenuItemInfo(Menu, uItem, MF_BYPOSITION, &mii, FALSE))
-      RETURN( FALSE);
-
+   if (IntGetMenuItemByFlag(Menu, uItem, MF_BYPOSITION, &MenuItem, NULL) > -1)
+        Rect = MenuItem->Rect;
+   else
+      RETURN(FALSE);
+   
    referenceHwnd = hWnd;
-
+   
    if(!hWnd)
    {
       if(!UserMenuInfo(Menu, &mi, FALSE))
          RETURN( FALSE);
       if(mi.Wnd == 0)
          RETURN( FALSE);
-      referenceHwnd = mi.Wnd;
+      referenceHwnd = mi.Wnd; /* Okay we found it, so now what do we do? */
    }
 
    if (lprcItem == NULL)
       RETURN( FALSE);
-   *lpRect = mii.Rect;
-   lpPoints = (LPPOINT)lpRect;
-
-   ReferenceWnd = UserGetWindowObject(referenceHwnd);
-   if (!ReferenceWnd || !UserGetClientOrigin(ReferenceWnd, &FromOffset))
-   {
-      RETURN( FALSE);
-   }
-
-   XMove = FromOffset.x;
-   YMove = FromOffset.y;
 
-   for (i = 0; i < 2; i++)
-   {
-      lpPoints[i].x += XMove;
-      lpPoints[i].y += YMove;
-   }
-
-   Status = MmCopyToCaller(lprcItem, lpPoints, sizeof(POINT));
+   Status = MmCopyToCaller(lprcItem, &Rect, sizeof(RECT));
    if (! NT_SUCCESS(Status))
    {
       SetLastNtError(Status);
@@ -1769,39 +1930,34 @@ CLEANUP:
  */
 BOOL STDCALL
 NtUserHiliteMenuItem(
-   HWND hwnd,
-   HMENU hmenu,
+   HWND hWnd,
+   HMENU hMenu,
    UINT uItemHilite,
    UINT uHilite)
 {
-   BOOL res = FALSE;
-   PMENU_OBJECT MenuObject;
-   PWINDOW_OBJECT WindowObject;
+   PMENU_OBJECT Menu;
+   PWINDOW_OBJECT Window;
    DECLARE_RETURN(BOOLEAN);
 
    DPRINT("Enter NtUserHiliteMenuItem\n");
    UserEnterExclusive();
 
-   WindowObject = IntGetWindowObject(hwnd);
-   if(!WindowObject)
+   if(!(Window = UserGetWindowObject(hWnd)))
    {
-      SetLastWin32Error(ERROR_INVALID_HANDLE);
-      RETURN( res);
+      RETURN(FALSE);
    }
-   MenuObject = IntGetMenuObject(hmenu);
-   if(!MenuObject)
+   
+   if(!(Menu = UserGetMenuObject(hMenu)))
    {
-      IntReleaseWindowObject(WindowObject);
-      SetLastWin32Error(ERROR_INVALID_MENU_HANDLE);
-      RETURN( res);
+      RETURN(FALSE);
    }
-   if(WindowObject->IDMenu == (UINT)hmenu)
+   
+   if(Window->IDMenu == (UINT)hMenu)
    {
-      res = IntHiliteMenuItem(WindowObject, MenuObject, uItemHilite, uHilite);
+      RETURN( IntHiliteMenuItem(Window, Menu, uItemHilite, uHilite));
    }
-   IntReleaseMenuObject(MenuObject);
-   IntReleaseWindowObject(WindowObject);
-   RETURN( res);
+
+   RETURN(FALSE);
 
 CLEANUP:
    DPRINT("Leave NtUserHiliteMenuItem, ret=%i\n",_ret_);
@@ -1972,7 +2128,7 @@ UserMenuItemInfo(
       return( FALSE);
    }
    if (sizeof(MENUITEMINFOW) != Size
-         && sizeof(MENUITEMINFOW) - sizeof(HBITMAP) != Size
+         && FIELD_OFFSET(MENUITEMINFOW, hbmpItem) != Size
          && sizeof(ROSMENUITEMINFO) != Size)
    {
       SetLastWin32Error(ERROR_INVALID_PARAMETER);
@@ -1986,7 +2142,7 @@ UserMenuItemInfo(
    }
    /* If this is a pre-0x0500 _WIN32_WINNT MENUITEMINFOW, you can't
       set/get hbmpItem */
-   if (sizeof(MENUITEMINFOW) - sizeof(HBITMAP) == Size
+   if (FIELD_OFFSET(MENUITEMINFOW, hbmpItem) == Size
          && 0 != (ItemInfo.fMask & MIIM_BITMAP))
    {
       SetLastWin32Error(ERROR_INVALID_PARAMETER);