This whole while is dead. ///*++ //Copyright (c) 1990 Microsoft Corporation //Module Name: // srvatom.c //Abstract: // This file contains the Global Atom manager API routines //Author: // Steve Wood (stevewo) 29-Oct-1990 //Revision History: //--*/ //#include "basesrv.h" //// //// Pointer to User function that returns a pointer to the //// global atom table associated with the windowstation //// userd by the specified thread. //// //NTSTATUS (*_UserGetGlobalAtomTable)( // HANDLE hThread, // PVOID *GlobalAtomTable // ); //// //// Pointer to User function that sets a pointer to the //// global atom table into the windowstation associated //// with the specified thread. //// //NTSTATUS (*_UserSetGlobalAtomTable)( // HANDLE hThread, // PVOID GlobalAtomTable // ); //NTSTATUS //BaseSrvGetGlobalAtomTable( // PVOID *GlobalAtomTable // ) //{ // STRING ProcedureName; // ANSI_STRING DllName; // UNICODE_STRING DllName_U; // HANDLE UserServerModuleHandle; // static BOOL fInit = FALSE; // NTSTATUS Status; // if ( _UserGetGlobalAtomTable == NULL ) { // if ( fInit == TRUE ) { // // // // If the exported atom routines cannot be found, deny access // // // return( STATUS_ACCESS_DENIED ); // } // fInit = TRUE; // // // // Load pointers to the functions in winsrv.dll // // // RtlInitAnsiString( &DllName, "winsrv" ); // RtlAnsiStringToUnicodeString( &DllName_U, &DllName, TRUE ); // Status = LdrGetDllHandle( // UNICODE_NULL, // NULL, // &DllName_U, // (PVOID *)&UserServerModuleHandle // ); // RtlFreeUnicodeString( &DllName_U ); // if ( NT_SUCCESS(Status) ) { // // // // Now get the routined to query and set the // // atom table pointer. // // // RtlInitString( &ProcedureName, "_UserGetGlobalAtomTable" ); // Status = LdrGetProcedureAddress( // (PVOID)UserServerModuleHandle, // &ProcedureName, // 0L, // (PVOID *)&_UserGetGlobalAtomTable // ); // RtlInitString( &ProcedureName, "_UserSetGlobalAtomTable" ); // Status = LdrGetProcedureAddress( // (PVOID)UserServerModuleHandle, // &ProcedureName, // 0L, // (PVOID *)&_UserSetGlobalAtomTable // ); // } // // // // Deny access upon failure // // // if ( !NT_SUCCESS(Status) ) // return( STATUS_ACCESS_DENIED ); // } // Status = (*_UserGetGlobalAtomTable)( // CSR_SERVER_QUERYCLIENTTHREAD()->ThreadHandle, // GlobalAtomTable); // if ( !NT_SUCCESS(Status) ) { // return Status; // } // // // // // Lock the heap until the call is complete. // // // RtlLockHeap( BaseSrvHeap ); // // // // If there is an atom table, return it. // // // if ( *GlobalAtomTable ) { // return STATUS_SUCCESS; // } // Status = BaseRtlCreateAtomTable( 37, // (USHORT)~MAXINTATOM, // GlobalAtomTable // ); // if ( NT_SUCCESS(Status) ) { // Status = (*_UserSetGlobalAtomTable)( // CSR_SERVER_QUERYCLIENTTHREAD()->ThreadHandle, // *GlobalAtomTable); // if ( !NT_SUCCESS(Status) ) { // BaseRtlDestroyAtomTable( *GlobalAtomTable ); // } // } // if ( !NT_SUCCESS(Status) ) { // RtlUnlockHeap( BaseSrvHeap ); // } // return Status; //} //ULONG //BaseSrvDestroyGlobalAtomTable( // IN OUT PCSR_API_MSG m, // IN OUT PCSR_REPLY_STATUS ReplyStatus // ) //{ // PBASE_DESTROYGLOBALATOMTABLE_MSG a = (PBASE_DESTROYGLOBALATOMTABLE_MSG)&m->u.ApiMessageData; // return BaseRtlDestroyAtomTable(a->GlobalAtomTable); //} //ULONG //BaseSrvGlobalAddAtom( // IN OUT PCSR_API_MSG m, // IN OUT PCSR_REPLY_STATUS ReplyStatus // ) //{ // PBASE_GLOBALATOMNAME_MSG a = (PBASE_GLOBALATOMNAME_MSG)&m->u.ApiMessageData; // PVOID GlobalAtomTable; // NTSTATUS Status; // UNICODE_STRING AtomName; // AtomName = a->AtomName; // if (a->AtomNameInClient) { // AtomName.Buffer = RtlAllocateHeap( BaseSrvHeap, // MAKE_TAG( TMP_TAG ), // AtomName.Length // ); // if (AtomName.Buffer == NULL) { // return (ULONG)STATUS_NO_MEMORY; // } // Status = NtReadVirtualMemory( CSR_SERVER_QUERYCLIENTTHREAD()->Process->ProcessHandle, // a->AtomName.Buffer, // AtomName.Buffer, // AtomName.Length, // NULL // ); // } // else { // Status = STATUS_SUCCESS; // } // if (NT_SUCCESS( Status )) { // Status = BaseSrvGetGlobalAtomTable(&GlobalAtomTable); // if (NT_SUCCESS( Status )) { // Status = BaseRtlAddAtomToAtomTable( GlobalAtomTable, // &AtomName, // NULL, // &a->Atom // ); // RtlUnlockHeap( BaseSrvHeap ); // } // } // if (a->AtomNameInClient) { // RtlFreeHeap( BaseSrvHeap, 0, AtomName.Buffer ); // } // return( (ULONG)Status ); // ReplyStatus; // get rid of unreferenced parameter warning message //} //ULONG //BaseSrvGlobalFindAtom( // IN OUT PCSR_API_MSG m, // IN OUT PCSR_REPLY_STATUS ReplyStatus // ) //{ // PBASE_GLOBALATOMNAME_MSG a = (PBASE_GLOBALATOMNAME_MSG)&m->u.ApiMessageData; // PVOID GlobalAtomTable; // UNICODE_STRING AtomName; // NTSTATUS Status; // AtomName = a->AtomName; // if (a->AtomNameInClient) { // AtomName.Buffer = RtlAllocateHeap( BaseSrvHeap, // MAKE_TAG( TMP_TAG ), // AtomName.Length // ); // if (AtomName.Buffer == NULL) { // return (ULONG)STATUS_NO_MEMORY; // } // Status = NtReadVirtualMemory( CSR_SERVER_QUERYCLIENTTHREAD()->Process->ProcessHandle, // a->AtomName.Buffer, // AtomName.Buffer, // AtomName.Length, // NULL // ); // } // else { // Status = STATUS_SUCCESS; // } // if (NT_SUCCESS( Status )) { // Status = BaseSrvGetGlobalAtomTable(&GlobalAtomTable); // if (NT_SUCCESS( Status )) { // Status = BaseRtlLookupAtomInAtomTable( GlobalAtomTable, // &AtomName, // NULL, // &a->Atom // ); // RtlUnlockHeap( BaseSrvHeap ); // } // } // if (a->AtomNameInClient) { // RtlFreeHeap( BaseSrvHeap, 0, AtomName.Buffer ); // } // return( (ULONG)Status ); // ReplyStatus; // get rid of unreferenced parameter warning message //} //ULONG //BaseSrvGlobalDeleteAtom( // IN OUT PCSR_API_MSG m, // IN OUT PCSR_REPLY_STATUS ReplyStatus // ) //{ // PBASE_GLOBALDELETEATOM_MSG a = (PBASE_GLOBALDELETEATOM_MSG)&m->u.ApiMessageData; // PVOID GlobalAtomTable; // NTSTATUS Status; // Status = BaseSrvGetGlobalAtomTable(&GlobalAtomTable); // if (NT_SUCCESS( Status )) { // Status = BaseRtlDeleteAtomFromAtomTable( GlobalAtomTable, // a->Atom // ); // RtlUnlockHeap( BaseSrvHeap ); // } // return( (ULONG)Status ); // ReplyStatus; // get rid of unreferenced parameter warning message //} //ULONG //BaseSrvGlobalGetAtomName( // IN OUT PCSR_API_MSG m, // IN OUT PCSR_REPLY_STATUS ReplyStatus // ) //{ // PBASE_GLOBALATOMNAME_MSG a = (PBASE_GLOBALATOMNAME_MSG)&m->u.ApiMessageData; // UNICODE_STRING AtomName; // PVOID GlobalAtomTable; // NTSTATUS Status; // AtomName = a->AtomName; // if (a->AtomNameInClient) { // AtomName.Buffer = RtlAllocateHeap( BaseSrvHeap, // MAKE_TAG( TMP_TAG ), // AtomName.MaximumLength // ); // if (AtomName.Buffer == NULL) { // return (ULONG)STATUS_NO_MEMORY; // } // } // Status = BaseSrvGetGlobalAtomTable(&GlobalAtomTable); // if (NT_SUCCESS( Status )) { // Status = BaseRtlQueryAtomInAtomTable( GlobalAtomTable, // a->Atom, // &AtomName, // NULL, // NULL // ); // a->AtomName.Length = AtomName.Length; // if (NT_SUCCESS( Status ) && a->AtomNameInClient) { // Status = NtWriteVirtualMemory( CSR_SERVER_QUERYCLIENTTHREAD()->Process->ProcessHandle, // a->AtomName.Buffer, // AtomName.Buffer, // AtomName.Length, // NULL // ); // } // RtlUnlockHeap( BaseSrvHeap ); // } // if (a->AtomNameInClient) { // RtlFreeHeap( BaseSrvHeap, 0, AtomName.Buffer ); // } // return( (ULONG)Status ); // ReplyStatus; // get rid of unreferenced parameter warning message //}