ATOM WINAPI InternalDeleteAtom(BOOLEAN Local, ATOM Atom) { NTSTATUS Status; /* Validate it */ if (Atom >= MAXINTATOM) { /* Check if it's a local delete */ if (Local) { /* Delete it locally */ Status = RtlDeleteAtomFromAtomTable(InternalInitAtomTable(), Atom); } else { /* Delete it globall */ Status = NtDeleteAtom(Atom); } /* Check for success */ if (!NT_SUCCESS(Status)) { /* Fail */ BaseSetLastNTError(Status); return INVALID_ATOM; } } /* Return failure */ return 0; }
/*********************************************************************** * GlobalDeleteAtom (KERNEL32.@) * * Decrement the reference count of a string atom. If the count is * zero, the string associated with the atom is removed from the table. * * RETURNS * Success: 0. * Failure: atom. */ ATOM WINAPI GlobalDeleteAtom( ATOM atom /* [in] Atom to delete */ ) { if (atom >= MAXINTATOM) { NTSTATUS status = NtDeleteAtom( atom ); if (status) { SetLastError( RtlNtStatusToDosError( status ) ); return atom; } } return 0; }
static VOID ShowStatusMenu( _In_ HWND hwndDlg ) { PPH_STRING cacheEntryName; cacheEntryName = PhGetSelectedListViewItemText(ListViewWndHandle); if (cacheEntryName) { POINT cursorPos; PPH_EMENU menu; PPH_EMENU_ITEM selectedItem; GetCursorPos(&cursorPos); menu = PhCreateEMenu(); PhInsertEMenuItem(menu, PhCreateEMenuItem(0, 1, L"Remove", NULL, NULL), -1); selectedItem = PhShowEMenu( menu, ListViewWndHandle, PH_EMENU_SHOW_LEFTRIGHT, PH_ALIGN_LEFT | PH_ALIGN_TOP, cursorPos.x, cursorPos.y ); if (selectedItem && selectedItem->Id != -1) { switch (selectedItem->Id) { case 1: { INT lvItemIndex = PhFindListViewItemByFlags( ListViewWndHandle, -1, LVNI_SELECTED ); if (lvItemIndex != -1) { if (!PhGetIntegerSetting(L"EnableWarnings") || PhShowConfirmMessage( hwndDlg, L"remove", cacheEntryName->Buffer, NULL, FALSE )) { PATOM_TABLE_INFORMATION atomTable = NULL; if (!NT_SUCCESS(PhEnumAtomTable(&atomTable))) return; for (ULONG i = 0; i < atomTable->NumberOfAtoms; i++) { PATOM_BASIC_INFORMATION atomInfo = NULL; if (!NT_SUCCESS(PhQueryAtomTableEntry(atomTable->Atoms[i], &atomInfo))) continue; if (!PhEqualStringZ(atomInfo->Name, cacheEntryName->Buffer, TRUE)) continue; do { if (!NT_SUCCESS(NtDeleteAtom(atomTable->Atoms[i]))) { break; } PhFree(atomInfo); atomInfo = NULL; if (!NT_SUCCESS(PhQueryAtomTableEntry(atomTable->Atoms[i], &atomInfo))) break; } while (atomInfo->UsageCount >= 1); ListView_DeleteItem(ListViewWndHandle, lvItemIndex); if (atomInfo) { PhFree(atomInfo); } } PhFree(atomTable); } } } break; } } PhDestroyEMenu(menu); PhDereferenceObject(cacheEntryName); } }