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.
291 lines
6.5 KiB
291 lines
6.5 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1997.
|
|
//
|
|
// File: context.c
|
|
//
|
|
// Contents: Context manipulation functions
|
|
//
|
|
// Classes:
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: 2-26-97 RichardW Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "xtcbpkg.h"
|
|
|
|
CRITICAL_SECTION XtcbContextLock ;
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: XtcbInitializeContexts
|
|
//
|
|
// Synopsis: Initialization function
|
|
//
|
|
// Arguments: (none)
|
|
//
|
|
// History: 8-15-98 RichardW Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
NTSTATUS
|
|
XtcbInitializeContexts(
|
|
VOID
|
|
)
|
|
{
|
|
NTSTATUS Status ;
|
|
|
|
Status = STATUS_SUCCESS ;
|
|
|
|
try
|
|
{
|
|
InitializeCriticalSection( &XtcbContextLock );
|
|
}
|
|
except ( EXCEPTION_EXECUTE_HANDLER )
|
|
{
|
|
Status = GetExceptionCode();
|
|
}
|
|
|
|
return Status ;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: XtcbCreateContextRecord
|
|
//
|
|
// Synopsis: Create a context record for use during authentication
|
|
//
|
|
// Arguments: [Type] -- Type of context
|
|
// [Handle] -- Credential handle that this context is derived from
|
|
//
|
|
// History: 2-26-97 RichardW Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
PXTCB_CONTEXT
|
|
XtcbCreateContextRecord(
|
|
XTCB_CONTEXT_TYPE Type,
|
|
PXTCB_CRED_HANDLE Handle
|
|
)
|
|
{
|
|
PXTCB_CONTEXT Context ;
|
|
|
|
Context = (PXTCB_CONTEXT) LocalAlloc( LMEM_FIXED, sizeof( XTCB_CONTEXT) );
|
|
|
|
if ( Context )
|
|
{
|
|
Context->Core.Check = XTCB_CONTEXT_CHECK ;
|
|
|
|
Context->Core.Type = Type ;
|
|
|
|
Context->Core.State = ContextFirstCall ;
|
|
|
|
Context->CredHandle = (LSA_SEC_HANDLE) Handle ;
|
|
|
|
XtcbRefCredHandle( Handle );
|
|
|
|
//
|
|
// Set initial count to 2, one for the context handle
|
|
// that will be returned, and one for the reference that
|
|
// indicates that we are currently working on it.
|
|
//
|
|
|
|
Context->Core.RefCount = 2 ;
|
|
|
|
}
|
|
|
|
return Context ;
|
|
}
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: XtcbDeleteContextRecord
|
|
//
|
|
// Synopsis: Deletes a security context record
|
|
//
|
|
// Arguments: [Context] -- Context
|
|
//
|
|
// History: 2-26-97 RichardW Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
VOID
|
|
XtcbDeleteContextRecord(
|
|
PXTCB_CONTEXT Context
|
|
)
|
|
{
|
|
#if DBG
|
|
if ( Context->Core.Check != XTCB_CONTEXT_CHECK )
|
|
{
|
|
DebugLog(( DEB_ERROR, "DeleteContext: not a valid context record: %x\n",
|
|
Context ));
|
|
return;
|
|
|
|
}
|
|
#endif
|
|
|
|
XtcbDerefCredHandle( (PXTCB_CRED_HANDLE) Context->CredHandle );
|
|
|
|
LocalFree( Context );
|
|
}
|
|
|
|
|
|
|
|
VOID
|
|
XtcbDerefContextRecordEx(
|
|
PXTCB_CONTEXT Context,
|
|
LONG RefBy
|
|
)
|
|
{
|
|
LONG RefCount ;
|
|
|
|
EnterCriticalSection( &XtcbContextLock );
|
|
|
|
Context->Core.RefCount -= RefBy ;
|
|
|
|
RefCount = Context->Core.RefCount ;
|
|
|
|
LeaveCriticalSection( &XtcbContextLock );
|
|
|
|
if ( RefCount )
|
|
{
|
|
return ;
|
|
}
|
|
|
|
#if DBG
|
|
|
|
if ( RefCount < 0 )
|
|
{
|
|
DebugLog(( DEB_ERROR, "Refcount below 0\n" ));
|
|
}
|
|
#endif
|
|
|
|
XtcbDeleteContextRecord( Context );
|
|
|
|
}
|
|
|
|
BOOL
|
|
XtcbRefContextRecord(
|
|
PXTCB_CONTEXT Context
|
|
)
|
|
{
|
|
BOOL Ret ;
|
|
|
|
Ret = FALSE ;
|
|
|
|
EnterCriticalSection( &XtcbContextLock );
|
|
|
|
try
|
|
{
|
|
|
|
if ( Context->Core.Check == XTCB_CONTEXT_CHECK )
|
|
{
|
|
if ( Context->Core.RefCount > 0 )
|
|
{
|
|
Context->Core.RefCount++ ;
|
|
Ret = TRUE ;
|
|
}
|
|
|
|
}
|
|
}
|
|
except (EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
Ret = FALSE ;
|
|
}
|
|
|
|
LeaveCriticalSection( &XtcbContextLock );
|
|
|
|
return Ret ;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: XtcbMapContextToUser
|
|
//
|
|
// Synopsis: Prepares a context to be mapped to usermode by the LSA
|
|
//
|
|
// Arguments: [Context] --
|
|
// [ContextBuffer] --
|
|
//
|
|
// History: 3-28-97 RichardW Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
NTSTATUS
|
|
XtcbMapContextToUser(
|
|
PXTCB_CONTEXT Context,
|
|
PSecBuffer ContextBuffer
|
|
)
|
|
{
|
|
PXTCB_CONTEXT_CORE NewContext ;
|
|
NTSTATUS Status ;
|
|
HANDLE DupHandle ;
|
|
|
|
NewContext = LsaTable->AllocateLsaHeap( sizeof( XTCB_CONTEXT_CORE ) );
|
|
|
|
if ( NewContext )
|
|
{
|
|
CopyMemory( NewContext, &Context->Core, sizeof( XTCB_CONTEXT_CORE ) );
|
|
|
|
switch ( Context->Core.Type )
|
|
{
|
|
case XtcbContextClient:
|
|
NewContext->Type = XtcbContextClientMapped ;
|
|
Context->Core.Type = XtcbContextClientMapped ;
|
|
break;
|
|
|
|
case XtcbContextServer:
|
|
NewContext->Type = XtcbContextServerMapped ;
|
|
Context->Core.Type = XtcbContextClientMapped ;
|
|
|
|
Status = LsaTable->DuplicateHandle( Context->Token,
|
|
&DupHandle );
|
|
|
|
DebugLog(( DEB_TRACE, "New token = %x\n", DupHandle ));
|
|
if ( !NT_SUCCESS( Status ) )
|
|
{
|
|
DebugLog(( DEB_ERROR, "Failed to dup handle, %x\n",
|
|
Status ));
|
|
goto MapContext_Cleanup ;
|
|
|
|
}
|
|
NewContext->CoreTokenHandle = (ULONG) ((ULONG_PTR)DupHandle) ;
|
|
|
|
CloseHandle( Context->Token );
|
|
Context->Token = NULL ;
|
|
break;
|
|
|
|
default:
|
|
Status = SEC_E_INVALID_TOKEN ;
|
|
goto MapContext_Cleanup ;
|
|
break;
|
|
|
|
}
|
|
|
|
ContextBuffer->pvBuffer = NewContext ;
|
|
ContextBuffer->cbBuffer = sizeof( XTCB_CONTEXT_CORE );
|
|
|
|
return SEC_E_OK ;
|
|
|
|
}
|
|
else
|
|
{
|
|
Status = SEC_E_INSUFFICIENT_MEMORY ;
|
|
}
|
|
|
|
MapContext_Cleanup:
|
|
|
|
if ( NewContext )
|
|
{
|
|
LsaTable->FreeLsaHeap( NewContext );
|
|
}
|
|
|
|
return Status ;
|
|
}
|