You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
389 lines
11 KiB
389 lines
11 KiB
/*++
|
|
|
|
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
|
|
|