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; }
/*********************************************************************** * DeleteAtom (KERNEL32.@) * * Decrement the reference count of a string atom. If the count becomes * zero, the string associated with the atom is removed from the table. * * RETURNS * Success: 0. * Failure: atom */ ATOM WINAPI DeleteAtom( ATOM atom /* [in] Atom to delete */ ) { NTSTATUS status; RTL_ATOM_TABLE table; if (atom >= MAXINTATOM) { if (!(table = get_local_table( 0 ))) return atom; status = RtlDeleteAtomFromAtomTable( table, atom ); if (status) { SetLastError( RtlNtStatusToDosError( status ) ); return atom; } } return 0; }
BOOLEAN FASTCALL IntDestroyCurIconObject(PCURICON_OBJECT CurIcon, BOOLEAN bForce) { if(CurIcon->CURSORF_flags & CURSORF_CURRENT) { /* Mark the object as destroyed, and fail, as per tests */ TRACE("Cursor is current, marking as destroyed.\n"); UserDeleteObject(CurIcon->head.h, TYPE_CURSOR); return FALSE; } if(CurIcon->head.ppi != PsGetCurrentProcessWin32Process()) { /* This object doesn't belong to the current process */ WARN("Trying to delete foreign cursor!\n"); UserDereferenceObject(CurIcon); EngSetLastError(ERROR_DESTROY_OBJECT_OF_OTHER_THREAD); return FALSE; } /* Do not destroy it if it is shared. (And we're not forced to) */ if((CurIcon->CURSORF_flags & CURSORF_LRSHARED) && !bForce) { /* Tests show this is a valid call */ WARN("Trying to destroy shared cursor!\n"); UserDereferenceObject(CurIcon); return TRUE; } if(!(CurIcon->CURSORF_flags & CURSORF_ACON)) { HBITMAP bmpMask = CurIcon->hbmMask; HBITMAP bmpColor = CurIcon->hbmColor; HBITMAP bmpAlpha = CurIcon->hbmAlpha; /* Delete bitmaps */ if (bmpMask) { GreSetObjectOwner(bmpMask, GDI_OBJ_HMGR_POWNED); GreDeleteObject(bmpMask); CurIcon->hbmMask = NULL; } if (bmpColor) { GreSetObjectOwner(bmpColor, GDI_OBJ_HMGR_POWNED); GreDeleteObject(bmpColor); CurIcon->hbmColor = NULL; } if (bmpAlpha) { GreSetObjectOwner(bmpAlpha, GDI_OBJ_HMGR_POWNED); GreDeleteObject(bmpAlpha); CurIcon->hbmAlpha = NULL; } } else { PACON AniCurIcon = (PACON)CurIcon; UINT i; for(i = 0; i < AniCurIcon->cpcur; i++) IntDestroyCurIconObject(AniCurIcon->aspcur[i], TRUE); ExFreePoolWithTag(AniCurIcon->aspcur, USERTAG_CURSOR); } if (CurIcon->CURSORF_flags & CURSORF_LRSHARED) { if (!IS_INTRESOURCE(CurIcon->strName.Buffer)) ExFreePoolWithTag(CurIcon->strName.Buffer, TAG_STRING); if (CurIcon->atomModName) RtlDeleteAtomFromAtomTable(gAtomTable, CurIcon->atomModName); CurIcon->strName.Buffer = NULL; CurIcon->atomModName = 0; } /* We were given a pointer, no need to keep the reference any longer! */ UserDereferenceObject(CurIcon); return UserDeleteObject(CurIcon->head.h, TYPE_CURSOR); }