- PMENU_OBJECT MenuObject;
- PWINDOW_OBJECT WindowObject;
- TPMPARAMS Safetpm;
- NTSTATUS Status;
- POINT Pos;
- BOOL Ret;
-
- MenuObject = IntGetMenuObject(hmenu);
- if(!MenuObject)
- {
- SetLastWin32Error(ERROR_INVALID_MENU_HANDLE);
- return FALSE;
- }
-
- WindowObject = IntGetWindowObject(hwnd);
- if(!WindowObject)
- {
- IntReleaseMenuObject(MenuObject);
- SetLastWin32Error(ERROR_INVALID_HANDLE);
- return FALSE;
- }
-
- if(lptpm)
- {
- Status = MmCopyFromCaller(&Safetpm, lptpm, sizeof(TPMPARAMS));
- if(!NT_SUCCESS(Status))
- {
- IntReleaseWindowObject(WindowObject);
- IntReleaseMenuObject(MenuObject);
- SetLastNtError(Status);
- return FALSE;
- }
- if(Safetpm.cbSize != sizeof(TPMPARAMS))
- {
- IntReleaseWindowObject(WindowObject);
- IntReleaseMenuObject(MenuObject);
- SetLastWin32Error(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
- }
-
- Pos.x = x;
- Pos.y = y;
-
- Ret = co_IntTrackPopupMenu(MenuObject, WindowObject, fuFlags, &Pos, 0,
- (lptpm ? &Safetpm.rcExclude : NULL));
-
- IntReleaseWindowObject(WindowObject);
- IntReleaseMenuObject(MenuObject);
-
- return Ret;