You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.2 KiB
81 lines
2.2 KiB
/**************************** Module Header ********************************\
|
|
* Module Name: mndstry.c
|
|
*
|
|
* Copyright (c) 1985 - 1999, Microsoft Corporation
|
|
*
|
|
* Menu Destruction Routines
|
|
*
|
|
* History:
|
|
* 10-10-90 JimA Created.
|
|
* 02-11-91 JimA Added access checks.
|
|
* 03-18-91 IanJa Window revalidation added (none required)
|
|
\***************************************************************************/
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
/***************************************************************************\
|
|
* DestroyMenu
|
|
*
|
|
* Destroy a menu and free its memory.
|
|
*
|
|
* History:
|
|
* 10-11-90 JimA Translated from ASM.
|
|
* 02-11-91 JimA Added access checks.
|
|
\***************************************************************************/
|
|
|
|
BOOL _DestroyMenu(
|
|
PMENU pMenu)
|
|
{
|
|
PITEM pItem;
|
|
int i;
|
|
PDESKTOP rpdeskLock;
|
|
|
|
if (pMenu == NULL)
|
|
return FALSE;
|
|
|
|
/*
|
|
* If the object is locked, just mark it for destroy and don't
|
|
* free it yet.
|
|
*/
|
|
if (!HMMarkObjectDestroy(pMenu))
|
|
return TRUE;
|
|
|
|
/*
|
|
* Go down the item list and free the items
|
|
*/
|
|
pItem = pMenu->rgItems;
|
|
for (i = pMenu->cItems; i--; ++pItem)
|
|
MNFreeItem(pMenu, pItem, TRUE);
|
|
|
|
/*
|
|
* free the menu items
|
|
*/
|
|
if (pMenu->rgItems)
|
|
DesktopFree(pMenu->head.rpdesk, pMenu->rgItems);
|
|
|
|
/*
|
|
* Because menus are the only objects on the desktop owned
|
|
* by the process and process cleanup is done after thread
|
|
* cleanup, this may be the last reference to the desktop.
|
|
* We must lock the desktop before unlocking
|
|
* the parent desktop reference and freeing the menu to
|
|
* ensure that the desktop will not be freed until after
|
|
* the menu is freed. Don't use static locks because
|
|
* the pti for this thread will not be valid during
|
|
* process cleanup.
|
|
*/
|
|
rpdeskLock = NULL;
|
|
LockDesktop(&rpdeskLock, pMenu->head.rpdesk, LDL_FN_DESTROYMENU, (ULONG_PTR)PtiCurrent());
|
|
|
|
/*
|
|
* Unlock all menu objects.
|
|
*/
|
|
Unlock(&pMenu->spwndNotify);
|
|
|
|
HMFreeObject(pMenu);
|
|
|
|
UnlockDesktop(&rpdeskLock, LDU_FN_DESTROYMENU, (ULONG_PTR)PtiCurrent());
|
|
|
|
return TRUE;
|
|
}
|