Leaked source code of windows server 2003
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

/**************************** 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;
}