windows-nt/Source/XPSP1/NT/ds/nw/fpnw/client/nwsutil.c

214 lines
5 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1993-1993 Microsoft Corporation
Module Name:
nwsutil.c
Abstract:
This module implements IsNetWareInstalled()
Author:
Congpa You (CongpaY) 02-Dec-1993 Crested
Revision History:
--*/
#include "nt.h"
#include "ntrtl.h"
#include "nturtl.h"
#include "windef.h"
#include "winerror.h"
#include "winbase.h"
#include "ntlsa.h"
#include "nwsutil.h"
#include "crypt.h"
#include <fpnwcomm.h>
#include <usrprop.h>
NTSTATUS
GetRemoteNcpSecretKey (
PUNICODE_STRING SystemName,
CHAR *pchNWSecretKey
)
{
//
// this function returns the FPNW LSA Secret for the specified domain
//
NTSTATUS ntstatus;
OBJECT_ATTRIBUTES ObjAttributes;
LSA_HANDLE PolicyHandle = NULL;
LSA_HANDLE SecretHandle = NULL;
UNICODE_STRING SecretNameString;
PUNICODE_STRING punicodeCurrentValue;
PUNICODE_STRING punicodeOldValue;
InitializeObjectAttributes( &ObjAttributes,
NULL,
0L,
NULL,
NULL );
ntstatus = LsaOpenPolicy( SystemName,
&ObjAttributes,
POLICY_CREATE_SECRET,
&PolicyHandle );
if ( !NT_SUCCESS( ntstatus ))
{
return( ntstatus );
}
RtlInitUnicodeString( &SecretNameString, NCP_LSA_SECRET_KEY );
ntstatus = LsaOpenSecret( PolicyHandle,
&SecretNameString,
SECRET_QUERY_VALUE,
&SecretHandle );
if ( !NT_SUCCESS( ntstatus ))
{
LsaClose( PolicyHandle );
return( ntstatus );
}
//
// Do not need the policy handle anymore.
//
LsaClose( PolicyHandle );
ntstatus = LsaQuerySecret( SecretHandle,
&punicodeCurrentValue,
NULL,
&punicodeOldValue,
NULL );
//
// Do not need the secret handle anymore.
//
LsaClose( SecretHandle );
if ( NT_SUCCESS(ntstatus) && ( punicodeCurrentValue->Buffer != NULL))
{
memcpy( pchNWSecretKey,
punicodeCurrentValue->Buffer,
min(punicodeCurrentValue->Length, USER_SESSION_KEY_LENGTH));
}
LsaFreeMemory( punicodeCurrentValue );
LsaFreeMemory( punicodeOldValue );
return( ntstatus );
}
NTSTATUS
GetNcpSecretKey (
CHAR *pchNWSecretKey
)
{
//
// simply return the LSA Secret for the local domain
//
return GetRemoteNcpSecretKey( NULL, pchNWSecretKey );
}
BOOL IsNetWareInstalled( VOID )
{
CHAR pszNWSecretKey[USER_SESSION_KEY_LENGTH];
return( !NT_SUCCESS( GetNcpSecretKey (pszNWSecretKey))
? FALSE
: (pszNWSecretKey[0] != 0));
}
NTSTATUS InstallNetWare( LPWSTR lpNcpSecretKey )
{
NTSTATUS ntstatus;
OBJECT_ATTRIBUTES ObjAttributes;
LSA_HANDLE PolicyHandle;
LSA_HANDLE SecretHandle;
UNICODE_STRING SecretNameString;
UNICODE_STRING unicodeCurrentValue;
UNICODE_STRING unicodeOldValue;
InitializeObjectAttributes( &ObjAttributes,
NULL,
0L,
NULL,
NULL);
ntstatus = LsaOpenPolicy( NULL,
&ObjAttributes,
POLICY_CREATE_SECRET,
&PolicyHandle );
if ( !NT_SUCCESS( ntstatus ))
{
return( ntstatus );
}
RtlInitUnicodeString( &SecretNameString, NCP_LSA_SECRET_KEY );
ntstatus = LsaCreateSecret( PolicyHandle,
&SecretNameString,
SECRET_SET_VALUE | DELETE,
&SecretHandle );
if ( ntstatus == STATUS_OBJECT_NAME_COLLISION )
{
ntstatus = LsaOpenSecret( PolicyHandle,
&SecretNameString,
SECRET_SET_VALUE,
&SecretHandle );
}
if ( NT_SUCCESS( ntstatus ))
{
RtlInitUnicodeString( &unicodeOldValue, NULL );
RtlInitUnicodeString( &unicodeCurrentValue, lpNcpSecretKey );
ntstatus = LsaSetSecret( SecretHandle,
&unicodeCurrentValue,
&unicodeOldValue );
LsaClose( SecretHandle );
}
LsaClose( PolicyHandle );
return( ntstatus );
}
ULONG
MapRidToObjectId(
DWORD dwRid,
LPWSTR pszUserName,
BOOL fNTAS,
BOOL fBuiltin )
{
(void) fBuiltin ; // unused for now.
if (pszUserName && (lstrcmpi(pszUserName, SUPERVISOR_NAME_STRING)==0))
return SUPERVISOR_USERID ;
return ( fNTAS ? (dwRid | 0x10000000) : dwRid ) ;
}
ULONG SwapObjectId( ULONG ulObjectId )
{
return (MAKELONG(HIWORD(ulObjectId),SWAPWORD(LOWORD(ulObjectId)))) ;
}