mirror of https://github.com/tongzx/nt5src
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.
144 lines
2.7 KiB
144 lines
2.7 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1997.
|
|
//
|
|
// File: userctxt.c
|
|
//
|
|
// Contents:
|
|
//
|
|
// Classes:
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: 3-26-97 RichardW Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "xtcbpkg.h"
|
|
|
|
LIST_ENTRY XtcbContextList ;
|
|
CRITICAL_SECTION XtcbContextListLock ;
|
|
|
|
#define LockContextList() EnterCriticalSection( &XtcbContextListLock )
|
|
#define UnlockContextList() LeaveCriticalSection( &XtcbContextListLock )
|
|
|
|
BOOL
|
|
XtcbUserContextInit(
|
|
VOID
|
|
)
|
|
{
|
|
InitializeListHead( &XtcbContextList );
|
|
|
|
InitializeCriticalSection( &XtcbContextListLock );
|
|
|
|
return TRUE ;
|
|
}
|
|
|
|
|
|
SECURITY_STATUS
|
|
XtcbAddUserContext(
|
|
IN LSA_SEC_HANDLE LsaHandle,
|
|
IN PSecBuffer ContextData)
|
|
{
|
|
DWORD Size;
|
|
PXTCB_USER_CONTEXT Context ;
|
|
|
|
Context = XtcbFindUserContext( LsaHandle );
|
|
|
|
if ( Context )
|
|
{
|
|
DebugLog(( DEB_TRACE, "Replacing existing context!\n" ));
|
|
|
|
}
|
|
|
|
if ( ContextData->cbBuffer < sizeof( XTCB_CONTEXT_CORE ) )
|
|
{
|
|
return( SEC_E_INVALID_TOKEN );
|
|
}
|
|
|
|
Size = sizeof( XTCB_CONTEXT_CORE );
|
|
|
|
Context = LocalAlloc( LMEM_FIXED | LMEM_ZEROINIT,
|
|
sizeof( XTCB_USER_CONTEXT ) + Size );
|
|
|
|
if ( !Context )
|
|
{
|
|
return( SEC_E_INSUFFICIENT_MEMORY );
|
|
}
|
|
|
|
Context->LsaHandle = LsaHandle ;
|
|
|
|
CopyMemory( &Context->Context,
|
|
ContextData->pvBuffer,
|
|
ContextData->cbBuffer );
|
|
|
|
LockContextList();
|
|
|
|
InsertTailList( &XtcbContextList, &Context->List );
|
|
|
|
UnlockContextList();
|
|
|
|
return( SEC_E_OK );
|
|
}
|
|
|
|
PXTCB_USER_CONTEXT
|
|
XtcbFindUserContext(
|
|
IN LSA_SEC_HANDLE LsaHandle
|
|
)
|
|
{
|
|
PLIST_ENTRY List ;
|
|
PXTCB_USER_CONTEXT Context = NULL ;
|
|
|
|
|
|
LockContextList();
|
|
|
|
List = XtcbContextList.Flink ;
|
|
|
|
while ( List != &XtcbContextList )
|
|
{
|
|
Context = CONTAINING_RECORD( List, XTCB_USER_CONTEXT, List.Flink );
|
|
|
|
if ( Context->LsaHandle == LsaHandle )
|
|
{
|
|
break;
|
|
}
|
|
|
|
Context = NULL ;
|
|
|
|
List = List->Flink ;
|
|
}
|
|
|
|
UnlockContextList();
|
|
|
|
return( Context );
|
|
}
|
|
|
|
VOID
|
|
XtcbDeleteUserContext(
|
|
IN LSA_SEC_HANDLE LsaHandle
|
|
)
|
|
{
|
|
PXTCB_USER_CONTEXT Context ;
|
|
|
|
Context = XtcbFindUserContext( LsaHandle );
|
|
|
|
if ( Context )
|
|
{
|
|
LockContextList();
|
|
|
|
RemoveEntryList( &Context->List );
|
|
|
|
UnlockContextList();
|
|
|
|
DebugLog(( DEB_TRACE, "Deleting user mode context %x, handle = %x\n",
|
|
Context, LsaHandle ));
|
|
|
|
LocalFree( Context );
|
|
}
|
|
else
|
|
{
|
|
DebugLog(( DEB_TRACE, "No context found for handle %x\n", LsaHandle ));
|
|
}
|
|
}
|
|
|