456 lines
14 KiB
C
456 lines
14 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1989 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
msp.h
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
MSV1_0 authentication package private definitions.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Jim Kelly 11-Apr-1991
|
|||
|
|
|||
|
Revision History:
|
|||
|
Scott Field (sfield) 05-Oct-98 Add NTLM3
|
|||
|
Scott Field (sfield) 15-Jan-98 Add MspNtDeriveCredential
|
|||
|
Chandana Surlu 21-Jul-96 Stolen from \\kernel\razzle3\src\security\msv1_0\msv1_0.c
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#ifndef _MSP_
|
|||
|
#define _MSP_
|
|||
|
|
|||
|
#if ( _MSC_VER >= 800 )
|
|||
|
#pragma warning ( 3 : 4100 ) // enable "Unreferenced formal parameter"
|
|||
|
#pragma warning ( 3 : 4219 ) // enable "trailing ',' used for variable argument list"
|
|||
|
#endif
|
|||
|
|
|||
|
#include <nt.h>
|
|||
|
#include <ntrtl.h>
|
|||
|
#include <nturtl.h>
|
|||
|
#include <crypt.h>
|
|||
|
#include <ntmsv1_0.h>
|
|||
|
|
|||
|
#include <windows.h>
|
|||
|
#ifndef SECURITY_WIN32
|
|||
|
#define SECURITY_WIN32
|
|||
|
#endif // SECURITY_WIN32
|
|||
|
#define SECURITY_PACKAGE
|
|||
|
#define SECURITY_NTLM
|
|||
|
#include <security.h>
|
|||
|
#include <secint.h>
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Miscellaneous macros //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
//
|
|||
|
// RELOCATE_ONE - Relocate a single pointer in a client buffer.
|
|||
|
//
|
|||
|
// Note: this macro is dependent on parameter names as indicated in the
|
|||
|
// description below. On error, this macro goes to 'Cleanup' with
|
|||
|
// 'Status' set to the NT Status code.
|
|||
|
//
|
|||
|
// The MaximumLength is forced to be Length.
|
|||
|
//
|
|||
|
// Define a macro to relocate a pointer in the buffer the client passed in
|
|||
|
// to be relative to 'ProtocolSubmitBuffer' rather than being relative to
|
|||
|
// 'ClientBufferBase'. The result is checked to ensure the pointer and
|
|||
|
// the data pointed to is within the first 'SubmitBufferSize' of the
|
|||
|
// 'ProtocolSubmitBuffer'.
|
|||
|
//
|
|||
|
// The relocated field must be aligned to a WCHAR boundary.
|
|||
|
//
|
|||
|
// _q - Address of UNICODE_STRING structure which points to data to be
|
|||
|
// relocated
|
|||
|
//
|
|||
|
|
|||
|
#define RELOCATE_ONE( _q ) \
|
|||
|
{ \
|
|||
|
ULONG_PTR Offset; \
|
|||
|
\
|
|||
|
Offset = (((PUCHAR)((_q)->Buffer)) - ((PUCHAR)ClientBufferBase)); \
|
|||
|
if ( Offset >= SubmitBufferSize || \
|
|||
|
Offset + (_q)->Length > SubmitBufferSize || \
|
|||
|
!COUNT_IS_ALIGNED( Offset, ALIGN_WCHAR) ) { \
|
|||
|
\
|
|||
|
SspPrint((SSP_CRITICAL, "Failed RELOCATE_ONE\n")); \
|
|||
|
Status = STATUS_INVALID_PARAMETER; \
|
|||
|
goto Cleanup; \
|
|||
|
} \
|
|||
|
\
|
|||
|
(_q)->Buffer = (PWSTR)(((PUCHAR)ProtocolSubmitBuffer) + Offset); \
|
|||
|
(_q)->MaximumLength = (_q)->Length ; \
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// NULL_RELOCATE_ONE - Relocate a single (possibly NULL) pointer in a client
|
|||
|
// buffer.
|
|||
|
//
|
|||
|
// This macro special cases a NULL pointer then calls RELOCATE_ONE. Hence
|
|||
|
// it has all the restrictions of RELOCATE_ONE.
|
|||
|
//
|
|||
|
//
|
|||
|
// _q - Address of UNICODE_STRING structure which points to data to be
|
|||
|
// relocated
|
|||
|
//
|
|||
|
|
|||
|
#define NULL_RELOCATE_ONE( _q ) \
|
|||
|
{ \
|
|||
|
if ( (_q)->Buffer == NULL ) { \
|
|||
|
if ( (_q)->Length != 0 ) { \
|
|||
|
SspPrint((SSP_CRITICAL, "Failed NULL_RELOCATE_ONE\n")); \
|
|||
|
Status = STATUS_INVALID_PARAMETER; \
|
|||
|
goto Cleanup; \
|
|||
|
} \
|
|||
|
} else if ( (_q)->Length == 0 ) { \
|
|||
|
(_q)->Buffer = NULL; \
|
|||
|
} else { \
|
|||
|
RELOCATE_ONE( _q ); \
|
|||
|
} \
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// RELOCATE_ONE_ENCODED - Relocate a unicode string pointer in a client
|
|||
|
// buffer. The upper byte of the length field may be an encryption seed
|
|||
|
// and should not be used for error checking.
|
|||
|
//
|
|||
|
// Note: this macro is dependent on parameter names as indicated in the
|
|||
|
// description below. On error, this macro goes to 'Cleanup' with
|
|||
|
// 'Status' set to the NT Status code.
|
|||
|
//
|
|||
|
// The MaximumLength is forced to be Length & 0x00ff.
|
|||
|
//
|
|||
|
// Define a macro to relocate a pointer in the buffer the client passed in
|
|||
|
// to be relative to 'ProtocolSubmitBuffer' rather than being relative to
|
|||
|
// 'ClientBufferBase'. The result is checked to ensure the pointer and
|
|||
|
// the data pointed to is within the first 'SubmitBufferSize' of the
|
|||
|
// 'ProtocolSubmitBuffer'.
|
|||
|
//
|
|||
|
// The relocated field must be aligned to a WCHAR boundary.
|
|||
|
//
|
|||
|
// _q - Address of UNICODE_STRING structure which points to data to be
|
|||
|
// relocated
|
|||
|
//
|
|||
|
|
|||
|
#define RELOCATE_ONE_ENCODED( _q ) \
|
|||
|
{ \
|
|||
|
ULONG_PTR Offset; \
|
|||
|
\
|
|||
|
Offset = (((PUCHAR)((_q)->Buffer)) - ((PUCHAR)ClientBufferBase)); \
|
|||
|
if ( Offset >= SubmitBufferSize || \
|
|||
|
Offset + ((_q)->Length & 0x00ff) > SubmitBufferSize || \
|
|||
|
!COUNT_IS_ALIGNED( Offset, ALIGN_WCHAR) ) { \
|
|||
|
\
|
|||
|
SspPrint((SSP_CRITICAL, "Failed RELOCATE_ONE_ENCODED\n")); \
|
|||
|
Status = STATUS_INVALID_PARAMETER; \
|
|||
|
goto Cleanup; \
|
|||
|
} \
|
|||
|
\
|
|||
|
(_q)->Buffer = (PWSTR)(((PUCHAR)ProtocolSubmitBuffer) + Offset); \
|
|||
|
(_q)->MaximumLength = (_q)->Length & 0x00ff; \
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Authentication package dispatch routine definitions //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
LsaApInitializePackage(
|
|||
|
IN ULONG AuthenticationPackageId,
|
|||
|
IN PLSA_DISPATCH_TABLE LsaDispatchTable,
|
|||
|
IN PSTRING Database OPTIONAL,
|
|||
|
IN PSTRING Confidentiality OPTIONAL,
|
|||
|
OUT PSTRING *AuthenticationPackageName
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
LsaApLogonUser(
|
|||
|
IN PLSA_CLIENT_REQUEST ClientRequest,
|
|||
|
IN SECURITY_LOGON_TYPE LogonType,
|
|||
|
IN PVOID AuthenticationInformation,
|
|||
|
IN PVOID ClientAuthenticationBase,
|
|||
|
IN ULONG AuthenticationInformationLength,
|
|||
|
OUT PVOID *ProfileBuffer,
|
|||
|
OUT PULONG ProfileBufferSize,
|
|||
|
OUT PLUID LogonId,
|
|||
|
OUT PNTSTATUS SubStatus,
|
|||
|
OUT PLSA_TOKEN_INFORMATION_TYPE TokenInformationType,
|
|||
|
OUT PVOID *TokenInformation,
|
|||
|
OUT PUNICODE_STRING *AccountName,
|
|||
|
OUT PUNICODE_STRING *AuthenticatingAuthority
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
LsaApCallPackage(
|
|||
|
IN PLSA_CLIENT_REQUEST ClientRequest,
|
|||
|
IN PVOID ProtocolSubmitBuffer,
|
|||
|
IN PVOID ClientBufferBase,
|
|||
|
IN ULONG SubmitBufferSize,
|
|||
|
OUT PVOID *ProtocolReturnBuffer,
|
|||
|
OUT PULONG ReturnBufferSize,
|
|||
|
OUT PNTSTATUS ProtocolStatus
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
LsaApCallPackagePassthrough(
|
|||
|
IN PLSA_CLIENT_REQUEST ClientRequest,
|
|||
|
IN PVOID ProtocolSubmitBuffer,
|
|||
|
IN PVOID ClientBufferBase,
|
|||
|
IN ULONG SubmitBufferSize,
|
|||
|
OUT PVOID *ProtocolReturnBuffer,
|
|||
|
OUT PULONG ReturnBufferSize,
|
|||
|
OUT PNTSTATUS ProtocolStatus
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
LsaApLogonTerminated(
|
|||
|
IN PLUID LogonId
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// LsaApCallPackage function dispatch routines //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
MspLm20Challenge(
|
|||
|
IN PLSA_CLIENT_REQUEST ClientRequest,
|
|||
|
IN PVOID ProtocolSubmitBuffer,
|
|||
|
IN PVOID ClientBufferBase,
|
|||
|
IN ULONG SubmitBufferSize,
|
|||
|
OUT PVOID *ProtocolReturnBuffer,
|
|||
|
OUT PULONG ReturnBufferSize,
|
|||
|
OUT PNTSTATUS ProtocolStatus
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
MspLm20GetChallengeResponse(
|
|||
|
IN PLSA_CLIENT_REQUEST ClientRequest,
|
|||
|
IN PVOID ProtocolSubmitBuffer,
|
|||
|
IN PVOID ClientBufferBase,
|
|||
|
IN ULONG SubmitBufferSize,
|
|||
|
OUT PVOID *ProtocolReturnBuffer,
|
|||
|
OUT PULONG ReturnBufferSize,
|
|||
|
OUT PNTSTATUS ProtocolStatus
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
MspLm20EnumUsers(
|
|||
|
IN PLSA_CLIENT_REQUEST ClientRequest,
|
|||
|
IN PVOID ProtocolSubmitBuffer,
|
|||
|
IN PVOID ClientBufferBase,
|
|||
|
IN ULONG SubmitBufferSize,
|
|||
|
OUT PVOID *ProtocolReturnBuffer,
|
|||
|
OUT PULONG ReturnBufferSize,
|
|||
|
OUT PNTSTATUS ProtocolStatus
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
MspLm20GetUserInfo(
|
|||
|
IN PLSA_CLIENT_REQUEST ClientRequest,
|
|||
|
IN PVOID ProtocolSubmitBuffer,
|
|||
|
IN PVOID ClientBufferBase,
|
|||
|
IN ULONG SubmitBufferSize,
|
|||
|
OUT PVOID *ProtocolReturnBuffer,
|
|||
|
OUT PULONG ReturnBufferSize,
|
|||
|
OUT PNTSTATUS ProtocolStatus
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
MspLm20ReLogonUsers(
|
|||
|
IN PLSA_CLIENT_REQUEST ClientRequest,
|
|||
|
IN PVOID ProtocolSubmitBuffer,
|
|||
|
IN PVOID ClientBufferBase,
|
|||
|
IN ULONG SubmitBufferSize,
|
|||
|
OUT PVOID *ProtocolReturnBuffer,
|
|||
|
OUT PULONG ReturnBufferSize,
|
|||
|
OUT PNTSTATUS ProtocolStatus
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
MspLm20ChangePassword(
|
|||
|
IN PLSA_CLIENT_REQUEST ClientRequest,
|
|||
|
IN PVOID ProtocolSubmitBuffer,
|
|||
|
IN PVOID ClientBufferBase,
|
|||
|
IN ULONG SubmitBufferSize,
|
|||
|
OUT PVOID *ProtocolReturnBuffer,
|
|||
|
OUT PULONG ReturnBufferSize,
|
|||
|
OUT PNTSTATUS ProtocolStatus
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
MspLm20GenericPassthrough(
|
|||
|
IN PLSA_CLIENT_REQUEST ClientRequest,
|
|||
|
IN PVOID ProtocolSubmitBuffer,
|
|||
|
IN PVOID ClientBufferBase,
|
|||
|
IN ULONG SubmitBufferSize,
|
|||
|
OUT PVOID *ProtocolReturnBuffer,
|
|||
|
OUT PULONG ReturnBufferSize,
|
|||
|
OUT PNTSTATUS ProtocolStatus
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
MspLm20CacheLogon(
|
|||
|
IN PLSA_CLIENT_REQUEST ClientRequest,
|
|||
|
IN PVOID ProtocolSubmitBuffer,
|
|||
|
IN PVOID ClientBufferBase,
|
|||
|
IN ULONG SubmitBufferSize,
|
|||
|
OUT PVOID *ProtocolReturnBuffer,
|
|||
|
OUT PULONG ReturnBufferSize,
|
|||
|
OUT PNTSTATUS ProtocolStatus
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
MspLm20CacheLookup(
|
|||
|
IN PLSA_CLIENT_REQUEST ClientRequest,
|
|||
|
IN PVOID ProtocolSubmitBuffer,
|
|||
|
IN PVOID ClientBufferBase,
|
|||
|
IN ULONG SubmitBufferSize,
|
|||
|
OUT PVOID *ProtocolReturnBuffer,
|
|||
|
OUT PULONG ReturnBufferSize,
|
|||
|
OUT PNTSTATUS ProtocolStatus
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
MspNtSubAuth(
|
|||
|
IN PLSA_CLIENT_REQUEST ClientRequest,
|
|||
|
IN PVOID ProtocolSubmitBuffer,
|
|||
|
IN PVOID ClientBufferBase,
|
|||
|
IN ULONG SubmitBufferSize,
|
|||
|
OUT PVOID *ProtocolReturnBuffer,
|
|||
|
OUT PULONG ReturnBufferSize,
|
|||
|
OUT PNTSTATUS ProtocolStatus
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
MspNtDeriveCredential(
|
|||
|
IN PLSA_CLIENT_REQUEST ClientRequest,
|
|||
|
IN PVOID ProtocolSubmitBuffer,
|
|||
|
IN PVOID ClientBufferBase,
|
|||
|
IN ULONG SubmitBufferSize,
|
|||
|
OUT PVOID *ProtocolReturnBuffer,
|
|||
|
OUT PULONG ReturnBufferSize,
|
|||
|
OUT PNTSTATUS ProtocolStatus
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
MspSetProcessOption(
|
|||
|
IN PLSA_CLIENT_REQUEST ClientRequest,
|
|||
|
IN PVOID ProtocolSubmitBuffer,
|
|||
|
IN PVOID ClientBufferBase,
|
|||
|
IN ULONG SubmitBufferSize,
|
|||
|
OUT PVOID *ProtocolReturnBuffer,
|
|||
|
OUT PULONG ReturnBufferSize,
|
|||
|
OUT PNTSTATUS ProtocolStatus
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// NETLOGON routines visible to main msv1_0 code //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
NlInitialize(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
MspLm20LogonUser (
|
|||
|
IN PLSA_CLIENT_REQUEST ClientRequest,
|
|||
|
IN SECURITY_LOGON_TYPE LogonType,
|
|||
|
IN PVOID AuthenticationInformation,
|
|||
|
IN PVOID ClientAuthenticationBase,
|
|||
|
IN ULONG AuthenticationInformationSize,
|
|||
|
OUT PVOID *ProfileBuffer,
|
|||
|
OUT PULONG ProfileBufferSize,
|
|||
|
OUT PLUID LogonId,
|
|||
|
OUT PNTSTATUS SubStatus,
|
|||
|
OUT PLSA_TOKEN_INFORMATION_TYPE TokenInformationType,
|
|||
|
OUT PVOID *TokenInformation
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
MsvLm20LogonTerminated (
|
|||
|
IN PLUID LogonId
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////
|
|||
|
// //
|
|||
|
// Global variables //
|
|||
|
// //
|
|||
|
///////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
//
|
|||
|
// Variables defined in msvars.c
|
|||
|
//
|
|||
|
|
|||
|
extern ULONG MspAuthenticationPackageId;
|
|||
|
extern LSA_SECPKG_FUNCTION_TABLE Lsa;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Change password log support routines
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
#ifndef DONT_LOG_PASSWORD_CHANGES
|
|||
|
|
|||
|
ULONG
|
|||
|
MsvPaswdInitializeLog(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
ULONG
|
|||
|
MsvPaswdSetAndClearLog(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
ULONG
|
|||
|
MsvPaswdCloseLog(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
MsvPaswdLogPrintRoutine(
|
|||
|
IN LPSTR Format,
|
|||
|
...
|
|||
|
);
|
|||
|
|
|||
|
#define MsvPaswdLogPrint( x ) MsvPaswdLogPrintRoutine x
|
|||
|
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
#define MsvPaswdInitializeLog()
|
|||
|
#define MsvPaswdCloseLog()
|
|||
|
#define MsvPaswdLogPrint( x )
|
|||
|
#define MsvPaswdSetAndClearLog()
|
|||
|
#endif
|
|||
|
|
|||
|
#endif // _MSP_
|