390 lines
10 KiB
C
390 lines
10 KiB
C
|
/*++
|
|||
|
|
|||
|
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 <netlibnt.h>
|
|||
|
#include <crypt.h> // must be included before <logonmsv.h>
|
|||
|
#include <ntsam.h> // must be included before <logonmsv.h>
|
|||
|
#include <logonmsv.h> // must be included before <ssi.h>
|
|||
|
#include <ssi.h> // 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
|
|||
|
|