362 lines
8.8 KiB
C
362 lines
8.8 KiB
C
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1992 - 1995.
|
||
|
//
|
||
|
// File: xtcbpkg.c
|
||
|
//
|
||
|
// Contents: Xtcb Security Package
|
||
|
//
|
||
|
// Classes:
|
||
|
//
|
||
|
// Functions: Basic management
|
||
|
//
|
||
|
// History: 2-19-97 RichardW Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#include "xtcbpkg.h"
|
||
|
|
||
|
SECPKG_FUNCTION_TABLE XtcbTable = {
|
||
|
NULL, // InitializePackage
|
||
|
NULL, // LogonUser
|
||
|
XtcbCallPackage,
|
||
|
XtcbLogonTerminated,
|
||
|
XtcbCallPackageUntrusted,
|
||
|
NULL, // CallPackagePassthrough
|
||
|
NULL, // LogonUserEx
|
||
|
NULL, // LogonUserEx2
|
||
|
XtcbInitialize,
|
||
|
XtcbShutdown,
|
||
|
XtcbGetInfo,
|
||
|
XtcbAcceptCredentials,
|
||
|
XtcbAcquireCredentialsHandle,
|
||
|
XtcbQueryCredentialsAttributes,
|
||
|
XtcbFreeCredentialsHandle,
|
||
|
NULL,
|
||
|
NULL,
|
||
|
NULL,
|
||
|
XtcbInitLsaModeContext,
|
||
|
XtcbAcceptLsaModeContext,
|
||
|
XtcbDeleteContext,
|
||
|
XtcbApplyControlToken,
|
||
|
XtcbGetUserInfo,
|
||
|
XtcbGetExtendedInformation,
|
||
|
XtcbQueryLsaModeContext
|
||
|
};
|
||
|
|
||
|
|
||
|
ULONG_PTR XtcbPackageId;
|
||
|
PLSA_SECPKG_FUNCTION_TABLE LsaTable ;
|
||
|
TimeStamp XtcbNever = { 0xFFFFFFFF, 0x7FFFFFFF };
|
||
|
TOKEN_SOURCE XtcbSource ;
|
||
|
SECURITY_STRING XtcbComputerName ;
|
||
|
SECURITY_STRING XtcbUnicodeDnsName ;
|
||
|
SECURITY_STRING XtcbDomainName ;
|
||
|
STRING XtcbDnsName ;
|
||
|
PSID XtcbMachineSid ;
|
||
|
|
||
|
ULONG ThunkedContextLevels[] = { SECPKG_ATTR_LIFESPAN };
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: SpLsaModeInitialize
|
||
|
//
|
||
|
// Synopsis: Initializes connection with LSA. Allows the DLL to specify all the
|
||
|
// packages contained within it, and their function tables.
|
||
|
//
|
||
|
// Arguments: [LsaVersion] -- Version of the LSA
|
||
|
// [PackageVersion] -- Version of the package (out)
|
||
|
// [Table] -- Table of package functions
|
||
|
// [TableCount] -- Count of tables
|
||
|
//
|
||
|
// History: 2-19-97 RichardW Created
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
SECURITY_STATUS
|
||
|
SEC_ENTRY
|
||
|
SpLsaModeInitialize(
|
||
|
IN ULONG LsaVersion,
|
||
|
OUT PULONG PackageVersion,
|
||
|
OUT PSECPKG_FUNCTION_TABLE * Table,
|
||
|
OUT PULONG TableCount)
|
||
|
{
|
||
|
*PackageVersion = SECPKG_INTERFACE_VERSION ;
|
||
|
*Table = &XtcbTable ;
|
||
|
*TableCount = 1;
|
||
|
|
||
|
#if DBG
|
||
|
InitDebugSupport();
|
||
|
#endif
|
||
|
|
||
|
DebugLog(( DEB_TRACE, "XtcbPkg DLL Loaded\n" ));
|
||
|
|
||
|
return( SEC_E_OK );
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
XtcbReadParameters(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
MGroupReload();
|
||
|
|
||
|
return TRUE ;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: XtcbInitialize
|
||
|
//
|
||
|
// Synopsis: Actual initialization function for the security package
|
||
|
//
|
||
|
// Arguments: [dwPackageID] -- Assigned package ID
|
||
|
// [pParameters] -- Initialization parameters
|
||
|
// [Table] -- Table of callbacks into the LSA for support
|
||
|
//
|
||
|
// History: 2-19-97 RichardW Created
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
SECURITY_STATUS
|
||
|
SEC_ENTRY
|
||
|
XtcbInitialize(
|
||
|
ULONG_PTR dwPackageID,
|
||
|
PSECPKG_PARAMETERS Parameters,
|
||
|
PLSA_SECPKG_FUNCTION_TABLE Table
|
||
|
)
|
||
|
{
|
||
|
WCHAR ComputerName[ MAX_PATH ];
|
||
|
DWORD Size ;
|
||
|
XtcbPackageId = dwPackageID ;
|
||
|
LsaTable = Table ;
|
||
|
|
||
|
//
|
||
|
// Initialize our control structures
|
||
|
//
|
||
|
|
||
|
XtcbInitCreds();
|
||
|
|
||
|
XtcbInitializeContexts();
|
||
|
|
||
|
//
|
||
|
// Set up the source name that we will use for tokens
|
||
|
//
|
||
|
|
||
|
CopyMemory( XtcbSource.SourceName, "XTCBPKG", sizeof( "XTCBPKG" ) );
|
||
|
AllocateLocallyUniqueId( &XtcbSource.SourceIdentifier );
|
||
|
|
||
|
//
|
||
|
// Get the names for the XTCB protocol.
|
||
|
//
|
||
|
|
||
|
Size = sizeof( ComputerName ) / sizeof( WCHAR );
|
||
|
|
||
|
GetComputerName( ComputerName, &Size );
|
||
|
|
||
|
XtcbDupStringToSecurityString( &XtcbComputerName, ComputerName );
|
||
|
|
||
|
Size = MAX_PATH ;
|
||
|
|
||
|
if ( GetComputerNameEx( ComputerNameDnsFullyQualified,
|
||
|
ComputerName,
|
||
|
&Size ) )
|
||
|
{
|
||
|
XtcbDupStringToSecurityString( &XtcbUnicodeDnsName, ComputerName );
|
||
|
}
|
||
|
|
||
|
XtcbDupSecurityString( &XtcbDomainName, &Parameters->DomainName );
|
||
|
|
||
|
if ( !MGroupInitialize() )
|
||
|
{
|
||
|
return STATUS_UNSUCCESSFUL ;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Start a watch on our reg key to reload any parameter change
|
||
|
//
|
||
|
|
||
|
|
||
|
|
||
|
DebugLog(( DEB_TRACE_CALLS, "Initialized in LSA mode\n" ));
|
||
|
|
||
|
return(S_OK);
|
||
|
}
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: XtcbGetInfo
|
||
|
//
|
||
|
// Synopsis: Returns information about the package to the LSA
|
||
|
//
|
||
|
// Arguments: [pInfo] --
|
||
|
//
|
||
|
// History: 2-19-97 RichardW Created
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
SECURITY_STATUS
|
||
|
SEC_ENTRY
|
||
|
XtcbGetInfo(PSecPkgInfo pInfo)
|
||
|
{
|
||
|
|
||
|
DebugLog(( DEB_TRACE_CALLS, "GetInfo\n" ));
|
||
|
|
||
|
pInfo->wVersion = 1;
|
||
|
pInfo->wRPCID = 0x15 ;
|
||
|
pInfo->fCapabilities =
|
||
|
SECPKG_FLAG_CONNECTION |
|
||
|
SECPKG_FLAG_MULTI_REQUIRED |
|
||
|
SECPKG_FLAG_EXTENDED_ERROR |
|
||
|
SECPKG_FLAG_IMPERSONATION |
|
||
|
SECPKG_FLAG_ACCEPT_WIN32_NAME |
|
||
|
SECPKG_FLAG_NEGOTIABLE ;
|
||
|
|
||
|
pInfo->cbMaxToken = 8000;
|
||
|
pInfo->Name = L"XTCB";
|
||
|
pInfo->Comment = L"Extended TCB package";
|
||
|
|
||
|
return(S_OK);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: XtcbGetExtendedInformation
|
||
|
//
|
||
|
// Synopsis: Return extended information to the LSA
|
||
|
//
|
||
|
// Arguments: [Class] -- Information Class
|
||
|
// [pInfo] -- Returned Information Pointer
|
||
|
//
|
||
|
// History: 3-04-97 RichardW Created
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
SECURITY_STATUS
|
||
|
SEC_ENTRY
|
||
|
XtcbGetExtendedInformation(
|
||
|
SECPKG_EXTENDED_INFORMATION_CLASS Class,
|
||
|
PSECPKG_EXTENDED_INFORMATION * pInfo
|
||
|
)
|
||
|
{
|
||
|
PSECPKG_EXTENDED_INFORMATION Info ;
|
||
|
SECURITY_STATUS Status ;
|
||
|
|
||
|
DebugLog(( DEB_TRACE_CALLS, "GetExtendedInfo( %d )\n", Class ));
|
||
|
|
||
|
switch ( Class )
|
||
|
{
|
||
|
case SecpkgContextThunks:
|
||
|
|
||
|
//
|
||
|
// Which context information levels do we want
|
||
|
// thunked over to the LSA, and which can we handle
|
||
|
// in the user process?
|
||
|
//
|
||
|
|
||
|
Info = (PSECPKG_EXTENDED_INFORMATION) LsaTable->AllocateLsaHeap(
|
||
|
sizeof( SECPKG_EXTENDED_INFORMATION ) +
|
||
|
sizeof( ThunkedContextLevels ) );
|
||
|
|
||
|
if ( Info )
|
||
|
{
|
||
|
Info->Class = Class ;
|
||
|
Info->Info.ContextThunks.InfoLevelCount =
|
||
|
sizeof( ThunkedContextLevels ) / sizeof( ULONG );
|
||
|
CopyMemory( Info->Info.ContextThunks.Levels,
|
||
|
ThunkedContextLevels,
|
||
|
sizeof( ThunkedContextLevels ) );
|
||
|
|
||
|
Status = SEC_E_OK ;
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Status = SEC_E_INSUFFICIENT_MEMORY ;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
|
||
|
default:
|
||
|
Status = SEC_E_UNSUPPORTED_FUNCTION ;
|
||
|
Info = NULL ;
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
|
||
|
*pInfo = Info ;
|
||
|
return Status ;
|
||
|
}
|
||
|
|
||
|
|
||
|
NTSTATUS
|
||
|
NTAPI
|
||
|
XtcbCallPackage(
|
||
|
IN PLSA_CLIENT_REQUEST ClientRequest,
|
||
|
IN PVOID ProtocolSubmitBuffer,
|
||
|
IN PVOID ClientBufferBase,
|
||
|
IN ULONG SubmitBufferLength,
|
||
|
OUT PVOID *ProtocolReturnBuffer,
|
||
|
OUT PULONG ReturnBufferLength,
|
||
|
OUT PNTSTATUS ProtocolStatus
|
||
|
)
|
||
|
{
|
||
|
PULONG TagType ;
|
||
|
NTSTATUS Status ;
|
||
|
|
||
|
|
||
|
return( SEC_E_UNSUPPORTED_FUNCTION );
|
||
|
}
|
||
|
|
||
|
NTSTATUS
|
||
|
NTAPI
|
||
|
XtcbCallPackageUntrusted(
|
||
|
IN PLSA_CLIENT_REQUEST ClientRequest,
|
||
|
IN PVOID ProtocolSubmitBuffer,
|
||
|
IN PVOID ClientBufferBase,
|
||
|
IN ULONG SubmitBufferLength,
|
||
|
OUT PVOID *ProtocolReturnBuffer,
|
||
|
OUT PULONG ReturnBufferLength,
|
||
|
OUT PNTSTATUS ProtocolStatus
|
||
|
)
|
||
|
{
|
||
|
return( SEC_E_UNSUPPORTED_FUNCTION );
|
||
|
}
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: XtcbShutdown
|
||
|
//
|
||
|
// Synopsis: Called at shutdown to clean up state
|
||
|
//
|
||
|
// Arguments: (none)
|
||
|
//
|
||
|
// History: 8-15-98 RichardW Created
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
SECURITY_STATUS
|
||
|
SEC_ENTRY
|
||
|
XtcbShutdown(void)
|
||
|
{
|
||
|
return( STATUS_SUCCESS );
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|