/*-- Copyright (c) 1987-1993 Microsoft Corporation Module Name: pwdtest.c Abstract: Test program for the changing passwords. Author: 30-Apr-1993 (cliffv) Environment: User mode only. Contains NT-specific code. Requires ANSI C extensions: slash-slash comments, long external names. Revision History: Chandana Surlu 21-Jul-96 Stolen from \\kernel\razzle3\src\security\msv1_0\pwdtest.c --*/ // // Common include files. // #include #define NLP_ALLOCATE #include #include // Lsar routines #include // LsaIFree and Trusted Client Routines #include // // Dummy routines from LSA // NTSTATUS LsapAllocateClientBuffer ( IN PLSA_CLIENT_REQUEST ClientRequest, IN ULONG LengthRequired, OUT PVOID *ClientBaseAddress ) { UNREFERENCED_PARAMETER (ClientRequest); *ClientBaseAddress = RtlAllocateHeap( MspHeap, 0, LengthRequired ); if ( *ClientBaseAddress == NULL ) { return(STATUS_QUOTA_EXCEEDED); } return(STATUS_SUCCESS); } NTSTATUS LsapFreeClientBuffer ( IN PLSA_CLIENT_REQUEST ClientRequest, IN PVOID ClientBaseAddress OPTIONAL ) { UNREFERENCED_PARAMETER (ClientRequest); UNREFERENCED_PARAMETER (ClientBaseAddress); return(STATUS_SUCCESS); } NTSTATUS LsapCopyToClientBuffer ( IN PLSA_CLIENT_REQUEST ClientRequest, IN ULONG Length, IN PVOID ClientBaseAddress, IN PVOID BufferToCopy ) { UNREFERENCED_PARAMETER (ClientRequest); RtlMoveMemory( ClientBaseAddress, BufferToCopy, Length ); return(STATUS_SUCCESS); } int __cdecl main( IN int argc, IN char ** argv ) /*++ Routine Description: Drive the password changing. Arguments: argc - the number of command-line arguments. argv - an array of pointers to the arguments. Return Value: Exit status --*/ { NTSTATUS Status; MSV1_0_CHANGEPASSWORD_REQUEST Request; PMSV1_0_CHANGEPASSWORD_RESPONSE ReturnBuffer; ULONG ReturnBufferSize; NTSTATUS ProtocolStatus; OBJECT_ATTRIBUTES LSAObjectAttributes; UNICODE_STRING LocalComputerName = { 0, 0, NULL }; PPOLICY_PRIMARY_DOMAIN_INFO PrimaryDomainInfo = NULL; if ( argc < 5 ) { fprintf( stderr, "Usage: pwdtest DomainName UserName OldPassword NewPassword\n" ); return(1); } // // Set up MSV1_0.dll environment. // MspHeap = RtlProcessHeap(); Status = NlInitialize(); if ( !NT_SUCCESS( Status ) ) { printf("pwdtest: NlInitialize failed, status %x\n", Status); return(1); } Lsa.AllocateClientBuffer = LsapAllocateClientBuffer; Lsa.FreeClientBuffer = LsapFreeClientBuffer; Lsa.CopyToClientBuffer = LsapCopyToClientBuffer; // // Open the LSA policy database in case change password needs it // InitializeObjectAttributes( &LSAObjectAttributes, NULL, // Name 0, // Attributes NULL, // Root NULL ); // Security Descriptor Status = LsaOpenPolicy( &LocalComputerName, &LSAObjectAttributes, POLICY_VIEW_LOCAL_INFORMATION, &NlpPolicyHandle ); if( !NT_SUCCESS(Status) ) { printf("pwdtest: LsaOpenPolicy failed, status %x\n", Status); return(1); } // // Get the name of our domain. // Status = LsaQueryInformationPolicy( NlpPolicyHandle, PolicyPrimaryDomainInformation, (PVOID *) &PrimaryDomainInfo ); if( !NT_SUCCESS(Status) ) { KdPrint(("pwdtest: LsaQueryInformationPolicy failed, status %x\n", Status)); return(1); } NlpSamDomainName = PrimaryDomainInfo->Name; // // Build the request message // Request.MessageType = MsV1_0ChangePassword; RtlCreateUnicodeStringFromAsciiz( &Request.DomainName, argv[1] ); RtlCreateUnicodeStringFromAsciiz( &Request.AccountName, argv[2] ); RtlCreateUnicodeStringFromAsciiz( &Request.OldPassword, argv[3] ); RtlCreateUnicodeStringFromAsciiz( &Request.NewPassword, argv[4] ); Status = MspLm20ChangePassword( NULL, &Request, &Request, 0x7FFFFFFF, (PVOID *) &ReturnBuffer, &ReturnBufferSize, &ProtocolStatus ); printf( "Status = 0x%lx 0x%lx\n", Status, ProtocolStatus ); if ( ProtocolStatus == STATUS_CANT_DISABLE_MANDATORY ) { printf( "Are you running as SYSTEM?\n" ); } if ( ReturnBufferSize != 0 ) { printf( "PasswordInfoValid %ld\n", ReturnBuffer->PasswordInfoValid ); if ( ReturnBuffer->PasswordInfoValid ) { printf( "Min length: %ld PasswordHistory: %ld Prop 0x%lx\n", ReturnBuffer->DomainPasswordInfo.MinPasswordLength, ReturnBuffer->DomainPasswordInfo.PasswordHistoryLength, ReturnBuffer->DomainPasswordInfo.PasswordProperties ); } } return 0; } // // Stub routines needed by msvpaswd.c // NTSTATUS LsarQueryInformationPolicy( IN LSAPR_HANDLE PolicyHandle, IN POLICY_INFORMATION_CLASS InfoClass, OUT PLSAPR_POLICY_INFORMATION *Buffer ) { return( LsaQueryInformationPolicy( PolicyHandle, InfoClass, Buffer ) ); } VOID LsaIFree_LSAPR_POLICY_INFORMATION ( POLICY_INFORMATION_CLASS InfoClass, PLSAPR_POLICY_INFORMATION Buffer ) { UNREFERENCED_PARAMETER (InfoClass); UNREFERENCED_PARAMETER (Buffer); } NTSTATUS NlpChangePassword( IN PUNICODE_STRING DomainName, IN PUNICODE_STRING UserName, IN PLM_OWF_PASSWORD LmOwfPassword, IN PNT_OWF_PASSWORD NtOwfPassword ) { UNREFERENCED_PARAMETER (DomainName); UNREFERENCED_PARAMETER (UserName); UNREFERENCED_PARAMETER (LmOwfPassword); UNREFERENCED_PARAMETER (NtOwfPassword); return(STATUS_SUCCESS); } NTSTATUS NlInitialize( VOID ) /*++ Routine Description: Initialize NETLOGON portion of msv1_0 authentication package. Arguments: None. Return Status: STATUS_SUCCESS - Indicates NETLOGON successfully initialized. --*/ { NTSTATUS Status; LPWSTR ComputerName; DWORD ComputerNameLength = MAX_COMPUTERNAME_LENGTH + 1; NT_PRODUCT_TYPE NtProductType; UNICODE_STRING TempUnicodeString; // // Initialize global data // NlpEnumerationHandle = 0; NlpSessionCount = 0; NlpComputerName.Buffer = NULL; NlpSamDomainName.Buffer = NULL; NlpSamDomainId = NULL; NlpSamDomainHandle = NULL; // // Get the name of this machine. // ComputerName = RtlAllocateHeap( MspHeap, 0, ComputerNameLength * sizeof(WCHAR) ); if (ComputerName == NULL || !GetComputerNameW( ComputerName, &ComputerNameLength )) { KdPrint(( "MsV1_0: Cannot get computername %lX\n", GetLastError() )); NlpLanmanInstalled = FALSE; RtlFreeHeap( MspHeap, 0, ComputerName ); ComputerName = NULL; } else { NlpLanmanInstalled = TRUE; } RtlInitUnicodeString( &NlpComputerName, ComputerName ); // // Determine if this machine is running Windows NT or Lanman NT. // LanMan NT runs on a domain controller. // if ( !RtlGetNtProductType( &NtProductType ) ) { KdPrint(( "MsV1_0: Nt Product Type undefined (WinNt assumed)\n" )); NtProductType = NtProductWinNt; } NlpWorkstation = (BOOLEAN)(NtProductType != NtProductLanManNt); #ifdef notdef // // Initialize any locks. // __try { RtlInitializeResource(&NlpActiveLogonLock); } __except(EXCEPTION_EXECUTE_HANDLER) { Status = STATUS_INSUFFICIENT_RESOURCES; } ASSERT( NT_SUCCESS(Status) ); InitializeListHead(&NlpActiveLogonListAnchor); RtlInitializeCriticalSection(&NlpSessionCountLock); // // initialize the cache - creates a critical section is all // NlpCacheInitialize(); #endif // notdef // // Attempt to load Netapi.dll // NlpLoadNetapiDll(); #ifdef COMPILED_BY_DEVELOPER KdPrint(("msv1_0: COMPILED_BY_DEVELOPER breakpoint.\n")); DbgBreakPoint(); #endif // COMPILED_BY_DEVELOPER // // Initialize useful encryption constants // Status = RtlCalculateLmOwfPassword( "", &NlpNullLmOwfPassword ); ASSERT( NT_SUCCESS(Status) ); RtlInitUnicodeString(&TempUnicodeString, NULL); Status = RtlCalculateNtOwfPassword(&TempUnicodeString, &NlpNullNtOwfPassword); ASSERT( NT_SUCCESS(Status) ); #ifdef notdef // // If we weren't successful, // Clean up global resources we intended to initialize. // if ( !NT_SUCCESS(Status) ) { if ( NlpComputerName.Buffer != NULL ) { MIDL_user_free( NlpComputerName.Buffer ); } } #endif // notdef return STATUS_SUCCESS; }