|
|
//+---------------------------------------------------------------------------
//
// 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 ;
}
|