Leaked source code of windows server 2003
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.
 
 
 
 
 
 

236 lines
4.9 KiB

//+-----------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (c) Microsoft Corporation 1992 - 1997
//
// File: ntlm.c
//
// Contents: ntlm kernel-mode functions
//
//
// History: 3/17/94 MikeSw Created
// 12/15/97 AdamBa Modified from private\lsa\client\ssp
//
//------------------------------------------------------------------------
#include <rdrssp.h>
KSPIN_LOCK NtlmLock;
PKernelContext pNtlmList;
BOOLEAN NtlmInitialized = FALSE;
//+-------------------------------------------------------------------------
//
// Function: NtlmInitialize
//
// Synopsis: initializes the NTLM package functions
//
// Effects:
//
// Arguments:
//
// Requires:
//
// Returns:
//
// Notes:
//
//
//--------------------------------------------------------------------------
SECURITY_STATUS SEC_ENTRY
NtlmInitialize(void)
{
KeInitializeSpinLock(&NtlmLock);
pNtlmList = NULL;
return(STATUS_SUCCESS);
}
#if 0
//+-------------------------------------------------------------------------
//
// Function: NtlmGetToken
//
// Synopsis: returns the token from a context
//
// Effects:
//
// Arguments:
//
// Requires:
//
// Returns:
//
// Notes:
//
//--------------------------------------------------------------------------
SECURITY_STATUS SEC_ENTRY
NtlmGetToken( ULONG ulContext,
PHANDLE phToken,
PACCESS_TOKEN * pAccessToken)
{
PKernelContext pContext;
NTSTATUS Status;
PAGED_CODE();
pContext = (PKernelContext) ulContext;
if (pContext == NULL)
{
DebugLog((DEB_ERROR,"Invalid handle 0x%x\n", ulContext));
return(SEC_E_INVALID_HANDLE);
}
// Now, after all that checking, let's actually try and set the
// thread impersonation token.
if (phToken != NULL)
{
*phToken = pContext->TokenHandle;
}
if (pAccessToken != NULL)
{
if (pContext->TokenHandle != NULL)
{
if (pContext->AccessToken == NULL)
{
Status = ObReferenceObjectByHandle(
pContext->TokenHandle,
TOKEN_IMPERSONATE,
NULL,
KeGetPreviousMode(),
(PVOID *) &pContext->AccessToken,
NULL // no handle information
);
if (!NT_SUCCESS(Status))
{
return(Status);
}
}
}
*pAccessToken = pContext->AccessToken;
}
return(STATUS_SUCCESS);
}
#endif
//+-------------------------------------------------------------------------
//
// Function: NtlmInitKernelContext
//
// Synopsis: Initializes a kernel context with the session key
// and possible token handle.
//
// Effects:
//
// Arguments:
//
// Requires:
//
// Returns:
//
// Notes:
//
//
//--------------------------------------------------------------------------
SECURITY_STATUS
NtlmInitKernelContext(
IN PUCHAR UserSessionKey,
IN PUCHAR LanmanSessionKey,
IN HANDLE TokenHandle,
OUT PCtxtHandle ContextHandle
)
{
PKernelContext pContext;
KIRQL OldIrql;
if (!NtlmInitialized) {
NtlmInitialize();
NtlmInitialized = TRUE;
}
pContext = AllocContextRec();
if (!pContext)
{
return(SEC_E_INSUFFICIENT_MEMORY);
}
RtlCopyMemory(
pContext->UserSessionKey,
UserSessionKey,
MSV1_0_USER_SESSION_KEY_LENGTH
);
RtlCopyMemory(
pContext->LanmanSessionKey,
LanmanSessionKey,
MSV1_0_LANMAN_SESSION_KEY_LENGTH
);
pContext->TokenHandle = TokenHandle;
pContext->AccessToken = NULL;
pContext->pPrev = NULL;
ContextHandle->dwLower = (ULONG_PTR) pContext;
ContextHandle->dwUpper = 0;
//
// Add it to the client record
//
AddKernelContext(&pNtlmList, &NtlmLock, pContext);
return(STATUS_SUCCESS);
}
//+-------------------------------------------------------------------------
//
// Function: NtlmDeleteKernelContext
//
// Synopsis: Deletes a kernel context from the list of contexts
//
// Effects:
//
// Arguments:
//
// Requires:
//
// Returns:
//
// Notes:
//
//
//--------------------------------------------------------------------------
SECURITY_STATUS
NtlmDeleteKernelContext( PCtxtHandle ContextHandle)
{
SECURITY_STATUS scRet;
scRet = DeleteKernelContext(
&pNtlmList,
&NtlmLock,
(PKernelContext) ContextHandle->dwLower );
return(scRet);
}