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
|
||
|