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.
276 lines
6.1 KiB
276 lines
6.1 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1997.
|
|
//
|
|
// File: util.c
|
|
//
|
|
// Contents: General utility functions
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: 2-20-97 RichardW Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "xtcbpkg.h"
|
|
#include "stdio.h"
|
|
|
|
BOOL
|
|
XtcbDupSecurityString(
|
|
PSECURITY_STRING Dest,
|
|
PSECURITY_STRING Source
|
|
)
|
|
{
|
|
if ( Source->Buffer == NULL )
|
|
{
|
|
ZeroMemory( Dest, sizeof( SECURITY_STRING ) );
|
|
return TRUE ;
|
|
}
|
|
Dest->Buffer = LocalAlloc( LMEM_FIXED, Source->Length + sizeof(WCHAR) );
|
|
if ( Dest->Buffer )
|
|
{
|
|
Dest->MaximumLength = Source->Length + sizeof( WCHAR ) ;
|
|
Dest->Length = Source->Length ;
|
|
CopyMemory( Dest->Buffer, Source->Buffer, Source->Length);
|
|
Dest->Buffer[ Dest->Length / sizeof( WCHAR ) ] = L'\0';
|
|
return TRUE ;
|
|
}
|
|
return FALSE ;
|
|
}
|
|
|
|
BOOL
|
|
XtcbAnsiStringToSecurityString(
|
|
PSECURITY_STRING Dest,
|
|
PSTRING Source
|
|
)
|
|
{
|
|
int len;
|
|
|
|
len = (Source->Length + 1) * sizeof(WCHAR) ;
|
|
|
|
// overkill, but safe
|
|
|
|
Dest->Buffer = LocalAlloc( LMEM_FIXED, len );
|
|
|
|
if ( Dest->Buffer )
|
|
{
|
|
Dest->Length = (USHORT) (len - sizeof(WCHAR)) ;
|
|
Dest->MaximumLength = (USHORT) len ;
|
|
|
|
MultiByteToWideChar( CP_ACP, 0,
|
|
Source->Buffer, -1,
|
|
Dest->Buffer, len / sizeof(WCHAR) );
|
|
|
|
return TRUE ;
|
|
}
|
|
|
|
return FALSE ;
|
|
|
|
|
|
}
|
|
|
|
BOOL
|
|
XtcbSecurityStringToAnsiString(
|
|
PSTRING Dest,
|
|
PSECURITY_STRING Source
|
|
)
|
|
{
|
|
int len ;
|
|
|
|
len = (Source->Length / sizeof(WCHAR)) + 1 ;
|
|
|
|
Dest->Buffer = LocalAlloc( LMEM_FIXED, len );
|
|
|
|
if ( Dest->Buffer )
|
|
{
|
|
Dest->Length = (USHORT) (len - 1) ;
|
|
Dest->MaximumLength = (USHORT) len ;
|
|
|
|
WideCharToMultiByte( CP_ACP, 0,
|
|
Source->Buffer, -1,
|
|
Dest->Buffer, len,
|
|
NULL, NULL );
|
|
|
|
return TRUE ;
|
|
}
|
|
|
|
return FALSE ;
|
|
}
|
|
|
|
BOOL
|
|
XtcbDupStringToSecurityString(
|
|
PSECURITY_STRING Dest,
|
|
PWSTR Source
|
|
)
|
|
{
|
|
ULONG Len ;
|
|
|
|
Len = (wcslen( Source ) + 1) * 2 ;
|
|
|
|
Dest->Buffer = LocalAlloc( LMEM_FIXED, Len );
|
|
|
|
if ( Dest->Buffer )
|
|
{
|
|
Dest->MaximumLength = (USHORT) Len ;
|
|
Dest->Length = (USHORT) Len - 2 ;
|
|
|
|
CopyMemory( Dest->Buffer, Source, Len );
|
|
|
|
return TRUE ;
|
|
}
|
|
return FALSE ;
|
|
}
|
|
|
|
BOOL
|
|
XtcbGenerateChallenge(
|
|
PUCHAR Challenge,
|
|
ULONG Length,
|
|
PULONG Actual
|
|
)
|
|
{
|
|
CHAR Temp[ MAX_PATH ];
|
|
LUID Unique;
|
|
ULONG Len ;
|
|
|
|
AllocateLocallyUniqueId( &Unique );
|
|
|
|
_snprintf( Temp, MAX_PATH, "<%x%x.%x%x@%s>",
|
|
GetCurrentProcessId(), GetCurrentThreadId(),
|
|
Unique.HighPart, Unique.LowPart,
|
|
XtcbDnsName.Buffer
|
|
);
|
|
|
|
Len = strlen( Temp );
|
|
|
|
if ( Len < Length )
|
|
{
|
|
strcpy( Challenge, Temp );
|
|
*Actual = Len;
|
|
return TRUE ;
|
|
}
|
|
|
|
*Actual = Len + 1;
|
|
|
|
return FALSE ;
|
|
|
|
}
|
|
|
|
BOOL
|
|
XtcbCaptureAuthData(
|
|
PVOID pvAuthData,
|
|
PSEC_WINNT_AUTH_IDENTITY * AuthData
|
|
)
|
|
{
|
|
SEC_WINNT_AUTH_IDENTITY Auth ;
|
|
PSEC_WINNT_AUTH_IDENTITY pAuth ;
|
|
SECURITY_STATUS Status ;
|
|
ULONG TotalSize ;
|
|
PWSTR Current ;
|
|
|
|
ZeroMemory( &Auth, sizeof( Auth ) );
|
|
|
|
Status = LsaTable->CopyFromClientBuffer(
|
|
NULL,
|
|
sizeof( SEC_WINNT_AUTH_IDENTITY ),
|
|
& Auth,
|
|
pvAuthData );
|
|
|
|
if ( !NT_SUCCESS( Status ) )
|
|
{
|
|
return FALSE ;
|
|
}
|
|
|
|
if ( Auth.Flags & SEC_WINNT_AUTH_IDENTITY_ANSI )
|
|
{
|
|
return FALSE ;
|
|
}
|
|
|
|
TotalSize = sizeof( SEC_WINNT_AUTH_IDENTITY ) +
|
|
( Auth.UserLength + 1 +
|
|
Auth.DomainLength + 1 +
|
|
Auth.PasswordLength + 1 ) * sizeof( WCHAR );
|
|
|
|
pAuth = (PSEC_WINNT_AUTH_IDENTITY) LocalAlloc( LMEM_FIXED | LMEM_ZEROINIT,
|
|
TotalSize );
|
|
|
|
if ( !pAuth )
|
|
{
|
|
return FALSE ;
|
|
}
|
|
|
|
pAuth->Flags = Auth.Flags ;
|
|
|
|
Current = (PWSTR) (pAuth + 1);
|
|
|
|
if ( Auth.User )
|
|
{
|
|
pAuth->User = Current ;
|
|
pAuth->UserLength = Auth.UserLength ;
|
|
|
|
Status = LsaTable->CopyFromClientBuffer(
|
|
NULL,
|
|
(Auth.UserLength + 1) * sizeof(WCHAR) ,
|
|
pAuth->User,
|
|
Auth.User );
|
|
|
|
if ( !NT_SUCCESS( Status ) )
|
|
{
|
|
goto Error_Cleanup ;
|
|
}
|
|
|
|
Current += Auth.UserLength + 1;
|
|
}
|
|
|
|
if ( Auth.Domain )
|
|
{
|
|
pAuth->Domain = Current ;
|
|
pAuth->DomainLength = Auth.DomainLength ;
|
|
|
|
Status = LsaTable->CopyFromClientBuffer(
|
|
NULL,
|
|
(Auth.DomainLength + 1) * sizeof( WCHAR ),
|
|
pAuth->Domain,
|
|
Auth.Domain );
|
|
|
|
if ( !NT_SUCCESS( Status ) )
|
|
{
|
|
goto Error_Cleanup ;
|
|
}
|
|
|
|
Current += Auth.DomainLength + 1;
|
|
|
|
}
|
|
|
|
if ( Auth.Password )
|
|
{
|
|
pAuth->Password = Current ;
|
|
pAuth->PasswordLength = Auth.PasswordLength ;
|
|
|
|
Status = LsaTable->CopyFromClientBuffer(
|
|
NULL,
|
|
(Auth.PasswordLength + 1) * sizeof( WCHAR ),
|
|
pAuth->Password,
|
|
Auth.Password );
|
|
|
|
if ( !NT_SUCCESS( Status ) )
|
|
{
|
|
goto Error_Cleanup ;
|
|
}
|
|
|
|
Current += Auth.PasswordLength + 1;
|
|
|
|
}
|
|
|
|
*AuthData = pAuth ;
|
|
|
|
return TRUE ;
|
|
|
|
Error_Cleanup:
|
|
|
|
LocalFree( pAuth );
|
|
|
|
return FALSE ;
|
|
|
|
}
|
|
|