/*++ 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 #include 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)))) ; }