|
|
/****************************** Module Header ******************************\
* Module Name: atom.c * * Copyright (c) 1985 - 1999, Microsoft Corporation * * This file contains the common code to implement atom tables. * \***************************************************************************/
#include "precomp.h"
#pragma hdrstop
#pragma alloc_text(INIT, UserRtlCreateAtomTable)
PVOID UserAtomTableHandle;
NTSTATUS UserRtlCreateAtomTable( IN ULONG NumberOfBuckets ) { NTSTATUS Status;
if (UserAtomTableHandle == NULL) { Status = RtlCreateAtomTable( NumberOfBuckets, &UserAtomTableHandle ); } else { RIPMSG0(RIP_VERBOSE, "UserRtlCreateAtomTable: table alread exists"); Status = STATUS_SUCCESS; }
return Status; }
ATOM UserAddAtom( LPCWSTR ccxlpAtom, BOOL bPin) { NTSTATUS Status; ATOM atom;
UserAssert(IS_PTR(ccxlpAtom) || (ccxlpAtom == NULL));
/*
* Rtl routines protect accesses to strings with their * own try/except blocks. */ atom = 0; Status = RtlAddAtomToAtomTable( UserAtomTableHandle, (PWSTR)ccxlpAtom, &atom ); if (!NT_SUCCESS(Status)) { RIPNTERR0(Status, RIP_VERBOSE, "UserAddAtom: add failed"); }
if (atom && bPin) RtlPinAtomInAtomTable(UserAtomTableHandle,atom);
return atom; }
ATOM UserFindAtom( LPCWSTR ccxlpAtom) { NTSTATUS Status; ATOM atom;
/*
* Rtl routines protect accesses to strings with their * own try/except blocks. */ atom = 0; Status = RtlLookupAtomInAtomTable( UserAtomTableHandle, (PWSTR)ccxlpAtom, &atom ); if (!NT_SUCCESS(Status)) { RIPNTERR0(Status, RIP_VERBOSE, "UserFindAtom: lookup failed"); }
return atom; }
ATOM UserDeleteAtom( ATOM atom) { NTSTATUS Status;
if ((atom >= gatomFirstPinned) && (atom <= gatomLastPinned)) return 0; // if pinned, just return
Status = RtlDeleteAtomFromAtomTable( UserAtomTableHandle, atom ); if (NT_SUCCESS(Status)) { return 0; } else { RIPNTERR0(Status, RIP_VERBOSE, "UserDeleteAtom: delete failed"); return atom; } }
UINT UserGetAtomName( ATOM atom, LPWSTR ccxlpch, int cchMax) { NTSTATUS Status; ULONG AtomNameLength;
AtomNameLength = cchMax * sizeof(WCHAR); Status = RtlQueryAtomInAtomTable( UserAtomTableHandle, atom, NULL, NULL, ccxlpch, &AtomNameLength ); if (!NT_SUCCESS(Status)) { RIPNTERR0(Status, RIP_VERBOSE, "UserGetAtomName: query failed"); return 0; } else { return AtomNameLength / sizeof(WCHAR); } }
|