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.
 
 
 
 
 
 

123 lines
3.1 KiB

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