/*++ Copyright (c) 1991 Microsoft Corporation Module Name: ApiAcct.c Abstract: This module contains individual API handlers for the Account APIs. SUPPORTED - NetAccountDeltas, NetAccountSync. SEE ALSO - Other NetLogon service APIs - in ApiLogon.c. Author: Shanku Niyogi (w-shanku) 04-Apr-1991 Jim Waters (t-jamesw) 09-August-1991 Revision History: --*/ // Account APIs are UNICODE only. #ifndef UNICODE #define UNICODE #endif #include "XactSrvP.h" #include #include // must be included before #include // must be included before #include // must be included before #include // I_NetAccountDeltas and I_NetAccountSync prototypes NTSTATUS XsNetAccountDeltas ( API_HANDLER_PARAMETERS ) /*++ Routine Description: This routine handles a call to NetAccountDeltas. Arguments: API_HANDLER_PARAMETERS - information about the API call. See XsTypes.h for details. Return Value: NTSTATUS - STATUS_SUCCESS or reason for failure. --*/ { NET_API_STATUS status; PXS_I_NET_ACCOUNT_DELTAS parameters = Parameters; LPTSTR nativeComputerName = NULL; // Native parameters NETLOGON_AUTHENTICATOR authIn; NETLOGON_AUTHENTICATOR authOut; UAS_INFO_0 infoIn; DWORD entriesRead; DWORD totalEntries; UAS_INFO_0 infoOut; LPBYTE structure = NULL; // Conversion variables API_HANDLER_PARAMETERS_REFERENCE; // Avoid warnings IF_DEBUG(ACCOUNT) { NetpKdPrint(( "XsNetAccountDeltas: header at %lx, params at %lx, " "buf size %ld\n", Header, parameters, SmbGetUshort( ¶meters->BufferLen ))); } try { // // Convert parameters to Unicode, check for errors. // if ( SmbGetUshort( ¶meters->Level ) != 0 ) { status = ERROR_INVALID_LEVEL; goto cleanup; } XsConvertTextParameter( nativeComputerName, (LPSTR)XsSmbGetPointer( ¶meters->ComputerName ) ); // // Set up the input structures. This is to make sure that the // structures we pass to the API are naturally aligned, as well // as properly byte-aligned. // structure = (LPBYTE)XsSmbGetPointer( ¶meters->RecordID ); RtlCopyMemory( infoIn.ComputerName, structure, sizeof( infoIn.ComputerName ) ); structure += sizeof( infoIn.ComputerName ); infoIn.TimeCreated = SmbGetUlong( structure ); structure += sizeof(DWORD); infoIn.SerialNumber = SmbGetUlong( structure ); structure = (LPBYTE)XsSmbGetPointer( ¶meters->Authenticator ); RtlCopyMemory( &authIn.Credential, structure, sizeof(NETLOGON_CREDENTIAL) ); structure += sizeof(NETLOGON_CREDENTIAL); authIn.timestamp = SmbGetUlong( structure ); RtlZeroMemory( &authOut, sizeof(NETLOGON_AUTHENTICATOR) ); // // Make the local I_NetAccountDeltas call. // status = NetpNtStatusToApiStatus( I_NetAccountDeltas( NULL, nativeComputerName, &authIn, &authOut, &infoIn, (DWORD)SmbGetUshort( ¶meters->Count ), (DWORD)SmbGetUshort( ¶meters->Level ), (LPBYTE)XsSmbGetPointer( ¶meters->Buffer ), (DWORD)SmbGetUshort( ¶meters->BufferLen ), (LPDWORD)&entriesRead, (LPDWORD)&totalEntries, &infoOut )); if ( !XsApiSuccess( status )) { IF_DEBUG(API_ERRORS) { NetpKdPrint(( "XsNetAccountDeltas: I_NetAccountDeltas failed: " "%X\n", status )); } // // !!! When protocol level is available in the header information, // we can check it. Right now, we ignore this code. // // For clients older than LanMan 2.1, return a different error code. // LANMAN 2.1 Protocol Level is 6. // #if 0 if ( status == NERR_TimeDiffAtDC && Header->ProtocolLevel < 6 ) { status = NERR_SyncRequired; } #endif goto cleanup; } // // Fill in 16 bit return structures. // structure = parameters->NextRecordID; RtlCopyMemory( structure, infoOut.ComputerName, sizeof( infoOut.ComputerName ) ); structure += sizeof( infoOut.ComputerName ); SmbPutUlong( (LPDWORD)structure, infoOut.TimeCreated ); structure += sizeof(DWORD); SmbPutUlong( (LPDWORD)structure, infoOut.SerialNumber ); structure = parameters->RetAuth; RtlCopyMemory( structure, &authOut.Credential, sizeof(NETLOGON_CREDENTIAL) ); structure += sizeof(NETLOGON_CREDENTIAL); SmbPutUlong( (LPDWORD)structure, authOut.timestamp ); // // Fill in 16 bit return values. // SmbPutUshort( ¶meters->EntriesRead, (WORD)entriesRead ); SmbPutUshort( ¶meters->TotalEntries, (WORD)totalEntries ); cleanup: ; } except( EXCEPTION_EXECUTE_HANDLER ) { status = (WORD)RtlNtStatusToDosError( GetExceptionCode() ); } // // Free strings. // NetpMemoryFree( nativeComputerName ); Header->Status = (WORD)status; return STATUS_SUCCESS; } // XsNetAccountDeltas NTSTATUS XsNetAccountSync ( API_HANDLER_PARAMETERS ) /*++ Routine Description: This routine handles a call to NetAccountSync. Arguments: API_HANDLER_PARAMETERS - information about the API call. See XsTypes.h for details. Return Value: NTSTATUS - STATUS_SUCCESS or reason for failure. --*/ { NET_API_STATUS status; PXS_I_NET_ACCOUNT_SYNC parameters = Parameters; LPTSTR nativeComputerName = NULL; // Native parameters NETLOGON_AUTHENTICATOR authIn; NETLOGON_AUTHENTICATOR authOut; DWORD entriesRead; DWORD totalEntries; DWORD nextReference; UAS_INFO_0 infoOut; LPBYTE structure; // Conversion variables API_HANDLER_PARAMETERS_REFERENCE; // Avoid warnings IF_DEBUG(ACCOUNT) { NetpKdPrint(( "XsNetAccountSync: header at %lx, params at %lx, " "buf size %ld\n", Header, parameters, SmbGetUshort( ¶meters->BufferLen ))); } // NetpBreakPoint(); try { // // Convert parameters to Unicode, check for errors. // if ( SmbGetUshort( ¶meters->Level ) != 0 ) { status = ERROR_INVALID_LEVEL; goto cleanup; } XsConvertTextParameter( nativeComputerName, (LPSTR)XsSmbGetPointer( ¶meters->ComputerName ) ); // // Set up the input structure. This is to make sure that the // structure we pass to the API is naturally aligned, as well // as properly byte-aligned. // structure = (LPBYTE)XsSmbGetPointer( ¶meters->Authenticator ); RtlCopyMemory( &authIn.Credential, structure, sizeof(NETLOGON_CREDENTIAL) ); structure += sizeof(NETLOGON_CREDENTIAL); authIn.timestamp = SmbGetUlong( structure ); RtlZeroMemory( &authOut, sizeof(NETLOGON_AUTHENTICATOR) ); // // Make the local I_NetAccountSync call. // status = NetpNtStatusToApiStatus( I_NetAccountSync( NULL, nativeComputerName, &authIn, &authOut, (DWORD)SmbGetUlong( ¶meters->Reference ), (DWORD)SmbGetUshort( ¶meters->Level ), (LPBYTE)XsSmbGetPointer( ¶meters->Buffer ), (DWORD)SmbGetUshort( ¶meters->BufferLen ), (LPDWORD)&entriesRead, (LPDWORD)&totalEntries, (LPDWORD)&nextReference, &infoOut )); if ( !XsApiSuccess( status )) { IF_DEBUG(API_ERRORS) { NetpKdPrint(( "XsNetAccountSync: I_NetAccountSync failed: " "%X\n", status )); } // // !!! When protocol level is available in the header information, // we can check it. Right now, we ignore this code. // // For clients older than LanMan 2.1, return a different error code. // LANMAN 2.1 Protocol Level is 6. // #if 0 if ( status == NERR_TimeDiffAtDC && Header->ProtocolLevel < 6 ) { status = NERR_SyncRequired; } #endif goto cleanup; } // // Fill in 16 bit return structures. // structure = parameters->LastRecordID; RtlCopyMemory( structure, infoOut.ComputerName, sizeof( infoOut.ComputerName ) ); structure += sizeof( infoOut.ComputerName ); SmbPutUlong( (LPDWORD)structure, infoOut.TimeCreated ); structure += sizeof(DWORD); SmbPutUlong( (LPDWORD)structure, infoOut.SerialNumber ); structure = parameters->RetAuth; RtlCopyMemory( structure, &authOut.Credential, sizeof(NETLOGON_CREDENTIAL) ); structure += sizeof(NETLOGON_CREDENTIAL); SmbPutUlong( (LPDWORD)structure, authOut.timestamp ); // // Fill in 16 bit return values. // SmbPutUshort( ¶meters->EntriesRead, (WORD)entriesRead ); SmbPutUshort( ¶meters->TotalEntries, (WORD)totalEntries ); SmbPutUlong( ¶meters->NextReference, nextReference ); cleanup: ; } except( EXCEPTION_EXECUTE_HANDLER ) { status = (WORD)RtlNtStatusToDosError( GetExceptionCode() ); } // // Free strings. // NetpMemoryFree( nativeComputerName ); Header->Status = (WORD)status; return STATUS_SUCCESS; } // XsNetAccountSync