/*++

Copyright (c) 1990  Microsoft Corporation

Module Name:

    LOGON.IDL

Abstract:

    Contains the Netr (Net Remote) RPC interface specification for the
    API associated with the Netlogon Service.

    Also contains the RPC specific data structures for these API.

Author:

    Cliff Van Dyke (CliffV) 25-Jun-1991

Environment:

    User Mode - Win32

Revision History:

    25-Jun-1991     CliffV
        created

    04-Apr-1992     MadanA
        Added support for LSA replication.

--*/

//
// Interface Attributes
//

[
    uuid(12345678-1234-ABCD-EF00-01234567CFFB),
    version(1.0),
#ifdef __midl
    ms_union,
#endif // __midl
    pointer_default(unique)
]

//
// Interface Keyword
//

interface logon

//
// Interface Body
//

{

#define _RPC_

import   "imports.idl"; // import all the include files
#include <lmcons.h>     // Needed for prototype below

//
// FunctionCode values for I_NetLogonControl.
//

#define NETLOGON_CONTROL_QUERY         1    // No-op: just query
#define NETLOGON_CONTROL_REPLICATE     2    // Force replicate on BDC
#define NETLOGON_CONTROL_SYNCHRONIZE   3    // Force synchronize on BDC
#define NETLOGON_CONTROL_PDC_REPLICATE 4    // Force PDC to broadcast change
#define NETLOGON_CONTROL_REDISCOVER    5    // Force to re-discover trusted domain DCs
#define NETLOGON_CONTROL_TC_QUERY      6    // Query status of specified trusted channel status
#define NETLOGON_CONTROL_TRANSPORT_NOTIFY 7 // Notify netlogon that a new transport has come online
#define NETLOGON_CONTROL_FIND_USER     8    // Find named user in a trusted domain
#define NETLOGON_CONTROL_CHANGE_PASSWORD 9  // Change machine password on a secure channel to a trusted domain
#define NETLOGON_CONTROL_TC_VERIFY     10   // Verify status of specified trusted channel
#define NETLOGON_CONTROL_FORCE_DNS_REG 11   // Force DNS re-registration of all registered records
#define NETLOGON_CONTROL_QUERY_DNS_REG 12   // Query the status of DNS updates

// Debug function codes

#define NETLOGON_CONTROL_BACKUP_CHANGE_LOG  0xFFFC
#define NETLOGON_CONTROL_TRUNCATE_LOG       0xFFFD
#define NETLOGON_CONTROL_SET_DBFLAG         0xFFFE
#define NETLOGON_CONTROL_BREAKPOINT         0xFFFF

typedef [handle] wchar_t *   LOGONSRV_HANDLE;

//
// Data types for rpc stubs.
//

// ?? the following data types should come from LSA or SAM idl definitions

//
// We must hide the PSID in a structure to avoid too many *'s in a
// field that uses size_is - otherwise MIDL has a fit.
//

typedef struct _NLPR_SID_INFORMATION {

    PISID    SidPointer;

} NLPR_SID_INFORMATION, *PNLPR_SID_INFORMATION;


//
// Define an array of pointers to SIDs
//

typedef struct _NLPR_SID_ARRAY {

    //
    // Indicates the number of Elements in the array.
    //

    ULONG Count;

    //
    // Points to the array of sid-pointers
    //

    [size_is(Count)] PNLPR_SID_INFORMATION Sids;

} NLPR_SID_ARRAY, *PNLPR_SID_ARRAY;


//
// Two-way encrypted value structure in Self-relative form.  This
// is just like a String.
//

typedef struct _NLPR_CR_CIPHER_VALUE {

    ULONG Length;
    ULONG MaximumLength;
    [size_is(MaximumLength), length_is(Length)] PUCHAR  Buffer;

} NLPR_CR_CIPHER_VALUE, *PNLPR_CR_CIPHER_VALUE;


typedef struct _NLPR_LOGON_HOURS {

    USHORT UnitsPerWeek;

    //
    // Points to an array of bitmask.  The bits represent either days,
    // hours or minutes in the week depending upon the value of
    // UnitsPerWeek.  (Technically, they could represent any division of
    // time not finer than minute granularity).

    // Day granularity is specified by specifying SAM_DAYS_PER_WEEK.
    // Hours granularity is specified by specifying SAM_HOURS_PER_WEEK.
    // Minute granularity is specified by specifying
    // SAM_MINUTES_PER_WEEK.  The number of bytes pointed to by this
    // field is ((UnitsPerWeek + 7) / 8) and may not exceed
    // ((SAM_MINUTES_PER_WEEK+7)/8 == 1260).
    //

    [size_is(1260), length_is((UnitsPerWeek+7)/8)]   PUCHAR  LogonHours;

} NLPR_LOGON_HOURS, *PNLPR_LOGON_HOURS;


typedef struct _NLPR_USER_PRIVATE_INFO {

    BOOLEAN SensitiveData;

        //
        // If SesitiveData is TRUE then the data is encrypted using
        // sessionkey across wire.
        //

    ULONG DataLength;
    [size_is(DataLength)] PUCHAR Data;

} NLPR_USER_PRIVATE_INFO, *PNLPR_USER_PRIVATE_INFO;

typedef struct _NLPR_MODIFIED_COUNT {

    OLD_LARGE_INTEGER  ModifiedCount;

} NLPR_MODIFIED_COUNT, *PNLPR_MODIFIED_COUNT;

typedef struct _NLPR_QUOTA_LIMITS {
    ULONG PagedPoolLimit;
    ULONG NonPagedPoolLimit;
    ULONG MinimumWorkingSetSize;
    ULONG MaximumWorkingSetSize;
    ULONG PagefileLimit;
    OLD_LARGE_INTEGER TimeLimit;
} NLPR_QUOTA_LIMITS, *PNLPR_QUOTA_LIMITS;

//
// Enumeration structure returned from I_NetSamDeltas and I_NetSamSync
//

//
// Structure to completely describe a user.
//

typedef struct _NETLOGON_DELTA_USER {
    UNICODE_STRING UserName;
    UNICODE_STRING FullName;
    ULONG UserId;
    ULONG PrimaryGroupId;
    UNICODE_STRING HomeDirectory;
    UNICODE_STRING HomeDirectoryDrive;
    UNICODE_STRING ScriptPath;
    UNICODE_STRING AdminComment;
    UNICODE_STRING WorkStations;
    OLD_LARGE_INTEGER LastLogon;
    OLD_LARGE_INTEGER LastLogoff;
    NLPR_LOGON_HOURS LogonHours;
    USHORT BadPasswordCount;
    USHORT LogonCount;
    OLD_LARGE_INTEGER PasswordLastSet;
    OLD_LARGE_INTEGER AccountExpires;
    ULONG UserAccountControl;

    //
    // The following fields are duplicates of information already in
    // the Private data.  Starting in NT 3.51, these fields are zeroed.
    //
    ENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword;
    ENCRYPTED_LM_OWF_PASSWORD EncryptedLmOwfPassword;
    BOOLEAN NtPasswordPresent;
    BOOLEAN LmPasswordPresent;
    BOOLEAN PasswordExpired;

    UNICODE_STRING UserComment;
    UNICODE_STRING Parameters;
    USHORT CountryCode;
    USHORT CodePage;

    NLPR_USER_PRIVATE_INFO PrivateData; // password history

    SECURITY_INFORMATION SecurityInformation;
    ULONG SecuritySize;
    [size_is(SecuritySize)] PUCHAR SecurityDescriptor;

    UNICODE_STRING DummyString1;    // used for profile path.
    UNICODE_STRING DummyString2;
    UNICODE_STRING DummyString3;
    UNICODE_STRING DummyString4;
    ULONG DummyLong1;               // used for LastBadPasswordTime.HighPart
    ULONG DummyLong2;               // used for LastBadPasswordTime.LowPart
    ULONG DummyLong3;
    ULONG DummyLong4;

} NETLOGON_DELTA_USER, *PNETLOGON_DELTA_USER;

//
// Structure to completely describe a group.
//
typedef struct _NETLOGON_DELTA_GROUP {
    UNICODE_STRING Name;
    ULONG RelativeId;
    ULONG Attributes;
    UNICODE_STRING AdminComment;

    SECURITY_INFORMATION SecurityInformation;
    ULONG SecuritySize;
    [size_is(SecuritySize)] PUCHAR SecurityDescriptor;

    UNICODE_STRING DummyString1;
    UNICODE_STRING DummyString2;
    UNICODE_STRING DummyString3;
    UNICODE_STRING DummyString4;
    ULONG DummyLong1;
    ULONG DummyLong2;
    ULONG DummyLong3;
    ULONG DummyLong4;
} NETLOGON_DELTA_GROUP, *PNETLOGON_DELTA_GROUP;


//
// Structure to completely describe all the members of a group.
//
typedef struct _NETLOGON_DELTA_GROUP_MEMBER {
    [size_is(MemberCount)] PULONG MemberIds;
    [size_is(MemberCount)] PULONG Attributes;
    ULONG MemberCount;

    ULONG DummyLong1;
    ULONG DummyLong2;
    ULONG DummyLong3;
    ULONG DummyLong4;
} NETLOGON_DELTA_GROUP_MEMBER, *PNETLOGON_DELTA_GROUP_MEMBER;

//
// Structure to completely describe a alias.
//
typedef struct _NETLOGON_DELTA_ALIAS {
    UNICODE_STRING Name;
    ULONG RelativeId;
//    UNICODE_STRING AdminComment;

    SECURITY_INFORMATION SecurityInformation;
    ULONG SecuritySize;
    [size_is(SecuritySize)] PUCHAR SecurityDescriptor;

    UNICODE_STRING DummyString1;    // used for admin comment
    UNICODE_STRING DummyString2;
    UNICODE_STRING DummyString3;
    UNICODE_STRING DummyString4;
    ULONG DummyLong1;
    ULONG DummyLong2;
    ULONG DummyLong3;
    ULONG DummyLong4;
} NETLOGON_DELTA_ALIAS, *PNETLOGON_DELTA_ALIAS;


//
// Structure to completely describe all the members of a alias.
//
typedef struct _NETLOGON_DELTA_ALIAS_MEMBER {
    NLPR_SID_ARRAY Members;

    ULONG DummyLong1;
    ULONG DummyLong2;
    ULONG DummyLong3;
    ULONG DummyLong4;
} NETLOGON_DELTA_ALIAS_MEMBER, *PNETLOGON_DELTA_ALIAS_MEMBER;

//
// Structure to completely describe a domain.
//
typedef struct _NETLOGON_DELTA_DOMAIN {
    UNICODE_STRING DomainName;
    UNICODE_STRING OemInformation;
    OLD_LARGE_INTEGER ForceLogoff;
    USHORT MinPasswordLength;
    USHORT PasswordHistoryLength;
    OLD_LARGE_INTEGER MaxPasswordAge;
    OLD_LARGE_INTEGER MinPasswordAge;

    OLD_LARGE_INTEGER DomainModifiedCount;
    OLD_LARGE_INTEGER DomainCreationTime;

    // All this information is maintained separately on each system.
#ifdef notdef
    UNICODE_STRING ReplicaSourceNodeName;
    DOMAIN_SERVER_ENABLE_STATE DomainServerState;
    DOMAIN_SERVER_ROLE DomainServerRole;
#endif // notdef

    SECURITY_INFORMATION SecurityInformation;
    ULONG SecuritySize;
    [size_is(SecuritySize)] PUCHAR SecurityDescriptor;

    UNICODE_STRING DummyString1; // used to replicate DOMAIN_LOCKOUT_INFORMATION
    UNICODE_STRING DummyString2;
    UNICODE_STRING DummyString3;
    UNICODE_STRING DummyString4;
    ULONG DummyLong1;   // used to replicate PasswordProperties
    ULONG DummyLong2;
    ULONG DummyLong3;
    ULONG DummyLong4;
} NETLOGON_DELTA_DOMAIN, *PNETLOGON_DELTA_DOMAIN;

typedef struct _NETLOGON_DELTA_RENAME {
    UNICODE_STRING OldName;
    UNICODE_STRING NewName;

    UNICODE_STRING DummyString1;
    UNICODE_STRING DummyString2;
    UNICODE_STRING DummyString3;
    UNICODE_STRING DummyString4;
    ULONG DummyLong1;
    ULONG DummyLong2;
    ULONG DummyLong3;
    ULONG DummyLong4;
} NETLOGON_RENAME_GROUP, *PNETLOGON_DELTA_RENAME_GROUP,
  NETLOGON_RENAME_USER, *PNETLOGON_DELTA_RENAME_USER,
  NETLOGON_RENAME_ALIAS, *PNETLOGON_DELTA_RENAME_ALIAS;

typedef struct _NETLOGON_DELTA_POLICY {
    ULONG MaximumLogSize;
    OLD_LARGE_INTEGER AuditRetentionPeriod;

    BOOLEAN AuditingMode;
    ULONG MaximumAuditEventCount;
    [size_is(MaximumAuditEventCount + 1)] PULONG EventAuditingOptions;

    UNICODE_STRING PrimaryDomainName;
    PISID PrimaryDomainSid;

    NLPR_QUOTA_LIMITS QuotaLimits;

    OLD_LARGE_INTEGER ModifiedId;
    OLD_LARGE_INTEGER DatabaseCreationTime;

    SECURITY_INFORMATION SecurityInformation;
    ULONG SecuritySize;
    [size_is(SecuritySize)] PUCHAR SecurityDescriptor;

    UNICODE_STRING DummyString1;
    UNICODE_STRING DummyString2;
    UNICODE_STRING DummyString3;
    UNICODE_STRING DummyString4;
    ULONG DummyLong1;
    ULONG DummyLong2;
    ULONG DummyLong3;
    ULONG DummyLong4;
} NETLOGON_DELTA_POLICY, *PNETLOGON_DELTA_POLICY;

typedef struct _NETLOGON_DELTA_TRUSTED_DOMAINS {
    UNICODE_STRING DomainName;
    ULONG NumControllerEntries;
    [size_is(NumControllerEntries)] PUNICODE_STRING ControllerNames;

    SECURITY_INFORMATION SecurityInformation;
    ULONG SecuritySize;
    [size_is(SecuritySize)] PUCHAR SecurityDescriptor;

    UNICODE_STRING DummyString1;
    UNICODE_STRING DummyString2;
    UNICODE_STRING DummyString3;
    UNICODE_STRING DummyString4;
    ULONG DummyLong1;               // used for posix offset.
    ULONG DummyLong2;
    ULONG DummyLong3;
    ULONG DummyLong4;
} NETLOGON_DELTA_TRUSTED_DOMAINS, *PNETLOGON_DELTA_TRUSTED_DOMAINS;

typedef struct _NETLOGON_DELTA_ACCOUNTS {
    ULONG PrivilegeEntries;
    ULONG PrivilegeControl;
    [size_is(PrivilegeEntries)] PULONG PrivilegeAttributes;
    [size_is(PrivilegeEntries)] PUNICODE_STRING PrivilegeNames;

    NLPR_QUOTA_LIMITS QuotaLimits;
    ULONG SystemAccessFlags;

    SECURITY_INFORMATION SecurityInformation;
    ULONG SecuritySize;
    [size_is(SecuritySize)] PUCHAR SecurityDescriptor;

    UNICODE_STRING DummyString1;
    UNICODE_STRING DummyString2;
    UNICODE_STRING DummyString3;
    UNICODE_STRING DummyString4;
    ULONG DummyLong1;
    ULONG DummyLong2;
    ULONG DummyLong3;
    ULONG DummyLong4;
} NETLOGON_DELTA_ACCOUNTS, *PNETLOGON_DELTA_ACCOUNTS;

typedef struct _NETLOGON_DELTA_SECRET {
    NLPR_CR_CIPHER_VALUE CurrentValue;
    OLD_LARGE_INTEGER CurrentValueSetTime;
    NLPR_CR_CIPHER_VALUE OldValue;
    OLD_LARGE_INTEGER OldValueSetTime;

    SECURITY_INFORMATION SecurityInformation;
    ULONG SecuritySize;
    [size_is(SecuritySize)] PUCHAR SecurityDescriptor;

    UNICODE_STRING DummyString1;
    UNICODE_STRING DummyString2;
    UNICODE_STRING DummyString3;
    UNICODE_STRING DummyString4;
    ULONG DummyLong1;
    ULONG DummyLong2;
    ULONG DummyLong3;
    ULONG DummyLong4;
} NETLOGON_DELTA_SECRET, *PNETLOGON_DELTA_SECRET;

typedef struct _NETLOGON_DELTA_DELETE {
    [string] wchar_t *  AccountName;

    UNICODE_STRING DummyString1;
    UNICODE_STRING DummyString2;
    UNICODE_STRING DummyString3;
    UNICODE_STRING DummyString4;
    ULONG DummyLong1;
    ULONG DummyLong2;
    ULONG DummyLong3;
    ULONG DummyLong4;
} NETLOGON_DELTA_DELETE_GROUP, *PNETLOGON_DELTA_DELETE_GROUP,
  NETLOGON_DELTA_DELETE_USER, *PNETLOGON_DELTA_DELETE_USER;

//
// A Union of each of the above types.
//
typedef [switch_type(NETLOGON_DELTA_TYPE)] union _NETLOGON_DELTA_UNION {
    [case(AddOrChangeDomain)] PNETLOGON_DELTA_DOMAIN DeltaDomain;
    [case(AddOrChangeGroup)] PNETLOGON_DELTA_GROUP DeltaGroup;
    [case(RenameGroup)] PNETLOGON_DELTA_RENAME_GROUP DeltaRenameGroup;
    [case(AddOrChangeUser)] PNETLOGON_DELTA_USER DeltaUser;
    [case(RenameUser)] PNETLOGON_DELTA_RENAME_USER DeltaRenameUser;
    [case(ChangeGroupMembership)] PNETLOGON_DELTA_GROUP_MEMBER DeltaGroupMember;
    [case(AddOrChangeAlias)] PNETLOGON_DELTA_ALIAS DeltaAlias;
    [case(RenameAlias)] PNETLOGON_DELTA_RENAME_ALIAS DeltaRenameAlias;
    [case(ChangeAliasMembership)] PNETLOGON_DELTA_ALIAS_MEMBER DeltaAliasMember;
    [case(AddOrChangeLsaPolicy)] PNETLOGON_DELTA_POLICY DeltaPolicy;
    [case(AddOrChangeLsaTDomain)] PNETLOGON_DELTA_TRUSTED_DOMAINS DeltaTDomains;
    [case(AddOrChangeLsaAccount)] PNETLOGON_DELTA_ACCOUNTS DeltaAccounts;
    [case(AddOrChangeLsaSecret)] PNETLOGON_DELTA_SECRET DeltaSecret;
    [case(DeleteGroupByName)] PNETLOGON_DELTA_DELETE_GROUP DeltaDeleteGroup;
    [case(DeleteUserByName)] PNETLOGON_DELTA_DELETE_USER DeltaDeleteUser;
    [case(SerialNumberSkip)] PNLPR_MODIFIED_COUNT DeltaSerialNumberSkip;
    [default] ;        // Ship nothing for Delete Cases
} NETLOGON_DELTA_UNION, *PNETLOGON_DELTA_UNION;

typedef [switch_type(NETLOGON_DELTA_TYPE)] union _NETLOGON_DELTA_ID_UNION {
    [case(AddOrChangeDomain,
          AddOrChangeGroup,
          DeleteGroup,
          RenameGroup,
          AddOrChangeUser,
          DeleteUser,
          RenameUser,
          ChangeGroupMembership,
          AddOrChangeAlias,
          DeleteAlias,
          RenameAlias,
          ChangeAliasMembership,
          DeleteGroupByName,
          DeleteUserByName )] ULONG Rid;

    [case(AddOrChangeLsaPolicy,
          AddOrChangeLsaTDomain,
          DeleteLsaTDomain,
          AddOrChangeLsaAccount,
          DeleteLsaAccount)] PISID Sid;
    [case(AddOrChangeLsaSecret,
          DeleteLsaSecret)] [string] wchar_t *  Name;
    [default] ;
} NETLOGON_DELTA_ID_UNION, *PNETLOGON_DELTA_ID_UNION;


//
// A common structure to describe a single enumerated object.
//
typedef struct _NETLOGON_DELTA_ENUM {
    NETLOGON_DELTA_TYPE DeltaType;
    [switch_is(DeltaType)] NETLOGON_DELTA_ID_UNION DeltaID;
    [switch_is(DeltaType)] NETLOGON_DELTA_UNION DeltaUnion;
} NETLOGON_DELTA_ENUM, *PNETLOGON_DELTA_ENUM;

//
// Structure that defines the array of enumerated objects.
//

typedef struct _NETLOGON_DELTA_ENUM_ARRAY {
    DWORD CountReturned;
    [size_is(CountReturned)] PNETLOGON_DELTA_ENUM Deltas;
} NETLOGON_DELTA_ENUM_ARRAY, *PNETLOGON_DELTA_ENUM_ARRAY;

//
// Function Prototypes - Logon Service
//


NET_API_STATUS
NetrLogonUasLogon (
    [in,unique,string] LOGONSRV_HANDLE ServerName,
    [in, string]    wchar_t * UserName,
    [in, string]    wchar_t * Workstation,
    [out] PNETLOGON_VALIDATION_UAS_INFO  *ValidationInformation
    );

NET_API_STATUS
NetrLogonUasLogoff (
    [in,unique,string]  LOGONSRV_HANDLE ServerName,
    [in, string] wchar_t * UserName,
    [in, string] wchar_t * Workstation,
    [out] PNETLOGON_LOGOFF_UAS_INFO  LogoffInformation
    );

//
// NetrLogonSam routines
//
typedef [switch_type(enum _NETLOGON_LOGON_INFO_CLASS)]
    union _NETLOGON_LEVEL {
    [case(NetlogonInteractiveInformation)]
        PNETLOGON_INTERACTIVE_INFO LogonInteractive;
    [case(NetlogonInteractiveTransitiveInformation)]
        PNETLOGON_INTERACTIVE_INFO LogonInteractiveTransitive;
    [case(NetlogonServiceInformation)]
        PNETLOGON_SERVICE_INFO LogonService;
    [case(NetlogonServiceTransitiveInformation)]
        PNETLOGON_SERVICE_INFO LogonServiceTransitive;
    [case(NetlogonNetworkInformation)]
        PNETLOGON_NETWORK_INFO LogonNetwork;
    [case(NetlogonNetworkTransitiveInformation)]
        PNETLOGON_NETWORK_INFO LogonNetworkTransitive;
    [case(NetlogonGenericInformation)]
        PNETLOGON_GENERIC_INFO LogonGeneric;
    [default]
        ;
} NETLOGON_LEVEL, * PNETLOGON_LEVEL;

typedef [switch_type(enum _NETLOGON_VALIDATION_INFO_CLASS)]
    union _NETLOGON_VALIDATION {
    [case(NetlogonValidationSamInfo)]
        PNETLOGON_VALIDATION_SAM_INFO ValidationSam;
    [case(NetlogonValidationSamInfo2)]
        PNETLOGON_VALIDATION_SAM_INFO2 ValidationSam2;
    [case(NetlogonValidationGenericInfo)]
        PNETLOGON_VALIDATION_GENERIC_INFO ValidationGeneric;
    [case(NetlogonValidationGenericInfo2)]
        PNETLOGON_VALIDATION_GENERIC_INFO2 ValidationGeneric2;
    [case(NetlogonValidationSamInfo4)]
        PNETLOGON_VALIDATION_SAM_INFO4 ValidationSam4;
    [default]
        ;
} NETLOGON_VALIDATION, * PNETLOGON_VALIDATION;

NTSTATUS
NetrLogonSamLogon (
    [in,unique,string] LOGONSRV_HANDLE LogonServer,
    [in,string,unique] wchar_t * ComputerName,
    [in,unique] PNETLOGON_AUTHENTICATOR Authenticator,
    [in,out,unique] PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
    [in] NETLOGON_LOGON_INFO_CLASS LogonLevel,
    [in,switch_is(LogonLevel)] PNETLOGON_LEVEL LogonInformation,
    [in] NETLOGON_VALIDATION_INFO_CLASS ValidationLevel,
    [out,switch_is(ValidationLevel)] PNETLOGON_VALIDATION ValidationInformation,
    [out] PBOOLEAN Authoritative
    );

NTSTATUS
NetrLogonSamLogoff (
    [in,unique,string] LOGONSRV_HANDLE LogonServer,
    [in,string,unique] wchar_t * ComputerName,
    [in,unique] PNETLOGON_AUTHENTICATOR Authenticator,
    [in,out,unique] PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
    [in] NETLOGON_LOGON_INFO_CLASS LogonLevel,
    [in,switch_is(LogonLevel)] PNETLOGON_LEVEL LogonInformation
);

NTSTATUS
NetrServerReqChallenge (
    [in,unique,string] LOGONSRV_HANDLE PrimaryName,
    [in, string] wchar_t * ComputerName,
    [in] PNETLOGON_CREDENTIAL ClientChallenge,
    [out] PNETLOGON_CREDENTIAL ServerChallenge
    );

NTSTATUS
NetrServerAuthenticate (
    [in,unique,string] LOGONSRV_HANDLE PrimaryName,
    [in,string] wchar_t * AccountName,
    [in] NETLOGON_SECURE_CHANNEL_TYPE AccountType,
    [in, string] wchar_t * ComputerName,
    [in] PNETLOGON_CREDENTIAL ClientCredential,
    [out] PNETLOGON_CREDENTIAL ServerCredential
    );

NTSTATUS
NetrServerPasswordSet (
    [in,unique,string] LOGONSRV_HANDLE PrimaryName,
    [in,string] wchar_t * AccountName,
    [in] NETLOGON_SECURE_CHANNEL_TYPE AccountType,
    [in, string] wchar_t * ComputerName,
    [in] PNETLOGON_AUTHENTICATOR Authenticator,
    [out] PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
    [in] PENCRYPTED_LM_OWF_PASSWORD UasNewPassword
    );

//
// Replication Routines
//


NTSTATUS
NetrDatabaseDeltas (
    [in, string] LOGONSRV_HANDLE primaryname,
    [in, string] wchar_t * computername,
    [in] PNETLOGON_AUTHENTICATOR authenticator,
    [in,out] PNETLOGON_AUTHENTICATOR ret_auth,
    [in] DWORD DatabaseID,
    [in, out] PNLPR_MODIFIED_COUNT DomainModifiedCount,
    [out] PNETLOGON_DELTA_ENUM_ARRAY *DeltaArray,
    [in] DWORD PreferredMaximumLength
    );

NTSTATUS
NetrDatabaseSync (
    [in, string] LOGONSRV_HANDLE PrimaryName,
    [in, string] wchar_t * ComputerName,
    [in] PNETLOGON_AUTHENTICATOR Authenticator,
    [in,out] PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
    [in] DWORD DatabaseID,
    [in, out] PULONG SyncContext,
    [out] PNETLOGON_DELTA_ENUM_ARRAY *DeltaArray,
    [in] DWORD PreferredMaximumLength
    );

NTSTATUS
NetrAccountDeltas (
    [in, unique, string] LOGONSRV_HANDLE PrimaryName,
    [in, string] wchar_t * ComputerName,
    [in] PNETLOGON_AUTHENTICATOR Authenticator,
    [in,out] PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
    [in] PUAS_INFO_0 RecordId,
    [in] DWORD Count,
    [in] DWORD Level,
    [out, size_is(BufferSize)] LPBYTE Buffer,
    [in] DWORD BufferSize,
    [out] PULONG CountReturned,
    [out] PULONG TotalEntries,
    [out] PUAS_INFO_0 NextRecordId
    );

NTSTATUS
NetrAccountSync (
    [in, unique, string] LOGONSRV_HANDLE PrimaryName,
    [in, string] wchar_t * ComputerName,
    [in] PNETLOGON_AUTHENTICATOR Authenticator,
    [in,out] PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
    [in] DWORD Reference,
    [in] DWORD Level,
    [out, size_is(BufferSize) ] LPBYTE Buffer,
    [in] DWORD BufferSize,
    [out] PULONG CountReturned,
    [out] PULONG TotalEntries,
    [out] PULONG NextReference,
    [out] PUAS_INFO_0 LastRecordId
    );


NET_API_STATUS
NetrGetDCName (
    [in, string] LOGONSRV_HANDLE ServerName,
    [in, unique, string] wchar_t *DomainName,
    [out, string] wchar_t **Buffer
    );

//
// I_NetLogonControl
//

typedef [switch_type(DWORD)] union _NETLOGON_CONTROL_DATA_INFORMATION {
    [case(NETLOGON_CONTROL_REDISCOVER,
            NETLOGON_CONTROL_TC_QUERY,
            NETLOGON_CONTROL_CHANGE_PASSWORD,
            NETLOGON_CONTROL_TC_VERIFY)] [string] wchar_t * TrustedDomainName;
    [case(NETLOGON_CONTROL_SET_DBFLAG)] DWORD DebugFlag;
    [case(NETLOGON_CONTROL_FIND_USER)] [string] wchar_t * UserName;
    [default]
        ;
} NETLOGON_CONTROL_DATA_INFORMATION, * PNETLOGON_CONTROL_DATA_INFORMATION;

typedef [switch_type(DWORD)] union _NETLOGON_CONTROL_QUERY_INFORMATION {
    [case(1)] PNETLOGON_INFO_1 NetlogonInfo1;
    [case(2)] PNETLOGON_INFO_2 NetlogonInfo2;
    [case(3)] PNETLOGON_INFO_3 NetlogonInfo3;
    [case(4)] PNETLOGON_INFO_4 NetlogonInfo4;
    [default] ;
} NETLOGON_CONTROL_QUERY_INFORMATION, * PNETLOGON_CONTROL_QUERY_INFORMATION;

NET_API_STATUS
NetrLogonControl(
    [in, unique, string] LOGONSRV_HANDLE ServerName,
    [in] DWORD FunctionCode,
    [in] DWORD QueryLevel,
    [out,switch_is(QueryLevel)] PNETLOGON_CONTROL_QUERY_INFORMATION Buffer
    );

NET_API_STATUS
NetrGetAnyDCName (
    [in, unique, string] LOGONSRV_HANDLE ServerName,
    [in, unique, string] wchar_t *DomainName,
    [out, string] wchar_t **Buffer
    );

NET_API_STATUS
NetrLogonControl2(
    [in, unique, string] LOGONSRV_HANDLE ServerName,
    [in] DWORD FunctionCode,
    [in] DWORD QueryLevel,
    [in,switch_is(FunctionCode)] PNETLOGON_CONTROL_DATA_INFORMATION Data,
    [out,switch_is(QueryLevel)] PNETLOGON_CONTROL_QUERY_INFORMATION Buffer
    );

NTSTATUS
NetrServerAuthenticate2 (
    [in,unique,string] LOGONSRV_HANDLE PrimaryName,
    [in,string] wchar_t * AccountName,
    [in] NETLOGON_SECURE_CHANNEL_TYPE AccountType,
    [in, string] wchar_t * ComputerName,
    [in] PNETLOGON_CREDENTIAL ClientCredential,
    [out] PNETLOGON_CREDENTIAL ServerCredential,
    [in,out] PULONG NegotiateFlags
    );

//
// The Sync state indicates tracks the progression of the sync.
//      NlSynchronize() depends on these being in order.
//

typedef enum _SYNC_STATE {
    NormalState,
    DomainState,
    GroupState,
    UasBuiltinGroupState,
    UserState,
    GroupMemberState,
    AliasState,
    AliasMemberState,
    SamDoneState
} SYNC_STATE, *PSYNC_STATE;

NTSTATUS
NetrDatabaseSync2 (
    [in, string] LOGONSRV_HANDLE PrimaryName,
    [in, string] wchar_t * ComputerName,
    [in] PNETLOGON_AUTHENTICATOR Authenticator,
    [in,out] PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
    [in] DWORD DatabaseID,
    [in] SYNC_STATE RestartState,
    [in, out] PULONG SyncContext,
    [out] PNETLOGON_DELTA_ENUM_ARRAY *DeltaArray,
    [in] DWORD PreferredMaximumLength
    );

NTSTATUS
NetrDatabaseRedo(
    [in, string] LOGONSRV_HANDLE PrimaryName,
    [in, string] wchar_t * ComputerName,
    [in] PNETLOGON_AUTHENTICATOR Authenticator,
    [in,out] PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
    [in, size_is(ChangeLogEntrySize)] PUCHAR ChangeLogEntry,
    [in] DWORD ChangeLogEntrySize,
    [out] PNETLOGON_DELTA_ENUM_ARRAY *DeltaArray
    );

// Same as NetrLogonControl2, but support QueryLevel of 4
// and function code of NETLOGON_CONTROL_FIND_USER
NET_API_STATUS
NetrLogonControl2Ex(
    [in, unique, string] LOGONSRV_HANDLE ServerName,
    [in] DWORD FunctionCode,
    [in] DWORD QueryLevel,
    [in,switch_is(FunctionCode)] PNETLOGON_CONTROL_DATA_INFORMATION Data,
    [out,switch_is(QueryLevel)] PNETLOGON_CONTROL_QUERY_INFORMATION Buffer
    );

//
// Routine to enumerate trusted domains.
//

typedef struct _DOMAIN_NAME_BUFFER {
    ULONG DomainNameByteCount;
    [unique, size_is(DomainNameByteCount)] PUCHAR DomainNames;
} DOMAIN_NAME_BUFFER, *PDOMAIN_NAME_BUFFER;

NTSTATUS
NetrEnumerateTrustedDomains (
    [in, unique, string] LOGONSRV_HANDLE ServerName,
    [out] PDOMAIN_NAME_BUFFER DomainNameBuffer
    );

//
// Routine to find a DC.
//

NET_API_STATUS
DsrGetDcName(
    [in, unique, string ] LOGONSRV_HANDLE ComputerName,
    [in, unique, string] wchar_t * DomainName,
    [in, unique] GUID *DomainGuid,
    [in, unique] GUID *SiteGuid,
    [in] ULONG Flags,
    [out] PDOMAIN_CONTROLLER_INFOW *DomainControllerInfo
);

//
// Routine used between NT 4.0 and NT 5.0 beta 1
//

typedef [switch_type(DWORD)] union _NETLOGON_DUMMY1 {
    [case(1)] ULONG Dummy;
} NETLOGON_DUMMY1, *PNETLOGON_DUMMY1;

NTSTATUS
NetrLogonDummyRoutine1(
    [in, string] LOGONSRV_HANDLE ServerName,
    [in,string,unique] wchar_t * ComputerName,
    [in] PNETLOGON_AUTHENTICATOR Authenticator,
    [in,out] PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
    [in] DWORD QueryLevel,
    [out,switch_is(QueryLevel)] PNETLOGON_DUMMY1 Buffer
    );

NTSTATUS
NetrLogonSetServiceBits(
    [in, unique, string] LOGONSRV_HANDLE ServerName,
    [in] DWORD ServiceBitsOfInterest,
    [in] DWORD ServiceBits
    );

//
// Routines to compute a digest for a specified message using the machine trust account.
//

NET_API_STATUS
NetrLogonGetTrustRid(
    [in, unique, string] LOGONSRV_HANDLE ServerName,
    [in,string,unique] wchar_t * DomainName,
    [out] PULONG Rid
    );

#define NL_DIGEST_SIZE 16

NET_API_STATUS
NetrLogonComputeServerDigest(
    [in, unique, string] LOGONSRV_HANDLE ServerName,
    [in] ULONG Rid,
    [in, size_is(MessageSize)] LPBYTE Message,
    [in] ULONG MessageSize,
    [out] CHAR NewMessageDigest[NL_DIGEST_SIZE],
    [out] CHAR OldMessageDigest[NL_DIGEST_SIZE]
    );

NET_API_STATUS
NetrLogonComputeClientDigest(
    [in, unique, string] LOGONSRV_HANDLE ServerName,
    [in,string,unique] wchar_t * DomainName,
    [in, size_is(MessageSize)] LPBYTE Message,
    [in] ULONG MessageSize,
    [out] CHAR NewMessageDigest[NL_DIGEST_SIZE],
    [out] CHAR OldMessageDigest[NL_DIGEST_SIZE]
    );

NTSTATUS
NetrServerAuthenticate3 (
    [in,unique,string] LOGONSRV_HANDLE PrimaryName,
    [in,string] wchar_t * AccountName,
    [in] NETLOGON_SECURE_CHANNEL_TYPE AccountType,
    [in, string] wchar_t * ComputerName,
    [in] PNETLOGON_CREDENTIAL ClientCredential,
    [out] PNETLOGON_CREDENTIAL ServerCredential,
    [in,out] PULONG NegotiateFlags,
    [out] PULONG AccountRid
    );

//
// Routine to find a DC.
//

NET_API_STATUS
DsrGetDcNameEx(
    [in, unique, string ] LOGONSRV_HANDLE ComputerName,
    [in, unique, string] wchar_t * DomainName,
    [in, unique] GUID *DomainGuid,
    [in, unique, string] wchar_t * SiteName,
    [in] ULONG Flags,
    [out] PDOMAIN_CONTROLLER_INFOW *DomainControllerInfo
    );

NET_API_STATUS
DsrGetSiteName(
    [in, unique, string ] LOGONSRV_HANDLE ComputerName,
    [out, string] wchar_t **SiteName
    );

//
// Routine to return information about the domain to a workstaion.
//

//
// Values of QueryLevel
#define NETLOGON_QUERY_DOMAIN_INFO      1
#define NETLOGON_QUERY_LSA_POLICY_INFO  2

typedef struct _NETLOGON_LSA_POLICY_INFO {

    //
    // LSA Policy
    //

    ULONG LsaPolicySize;
    [size_is(LsaPolicySize)] PUCHAR LsaPolicy;

} NETLOGON_LSA_POLICY_INFO, *PNETLOGON_LSA_POLICY_INFO;

typedef struct _NETLOGON_ONE_DOMAIN_INFO {
    UNICODE_STRING DomainName;
    UNICODE_STRING DnsDomainName;
    UNICODE_STRING DnsForestName;
    GUID DomainGuid;
    PISID DomainSid;

    // Passes NL_TRUST_EXTENSION structure starting after NT 5 beta 2
    UNICODE_STRING TrustExtension;
    UNICODE_STRING DummyString2;
    UNICODE_STRING DummyString3;
    UNICODE_STRING DummyString4;
    ULONG DummyLong1;
    ULONG DummyLong2;
    ULONG DummyLong3;
    ULONG DummyLong4;
} NETLOGON_ONE_DOMAIN_INFO, *PNETLOGON_ONE_DOMAIN_INFO;

typedef struct _NETLOGON_DOMAIN_INFO {

    //
    // Information about the domain we're a member of.
    //

    NETLOGON_ONE_DOMAIN_INFO PrimaryDomain;

    //
    // Information about the domains trusted by the domain we're a member of.
    //

    ULONG TrustedDomainCount;
    [size_is(TrustedDomainCount)] PNETLOGON_ONE_DOMAIN_INFO TrustedDomains;

    //
    // LSA Policy
    //

    NETLOGON_LSA_POLICY_INFO LsaPolicy;

    //
    // Room for expansion.
    //
    UNICODE_STRING DnsHostNameInDs;
    UNICODE_STRING DummyString2;
    UNICODE_STRING DummyString3;
    UNICODE_STRING DummyString4;
    ULONG WorkstationFlags;
    ULONG DummyLong2;
    ULONG DummyLong3;
    ULONG DummyLong4;

} NETLOGON_DOMAIN_INFO, *PNETLOGON_DOMAIN_INFO;

typedef [switch_type(DWORD)] union _NETLOGON_DOMAIN_INFORMATION {
    [case(NETLOGON_QUERY_DOMAIN_INFO)] PNETLOGON_DOMAIN_INFO DomainInfo;
    [case(NETLOGON_QUERY_LSA_POLICY_INFO)] PNETLOGON_LSA_POLICY_INFO LsaPolicyInfo;
} NETLOGON_DOMAIN_INFORMATION, *PNETLOGON_DOMAIN_INFORMATION;

typedef struct _NETLOGON_WORKSTATION_INFO {

    //
    // LSA Policy
    //

    NETLOGON_LSA_POLICY_INFO LsaPolicy;

    //
    // Information describing the workstation.
    //
    [string] wchar_t * DnsHostName;
    [string] wchar_t * SiteName;
    [string] wchar_t * Dummy1;
    [string] wchar_t * Dummy2;
    [string] wchar_t * Dummy3;
    [string] wchar_t * Dummy4;

    UNICODE_STRING OsVersion;
    UNICODE_STRING OsName;
    UNICODE_STRING DummyString3;
    UNICODE_STRING DummyString4;
    ULONG WorkstationFlags;
    ULONG DummyLong2;
    ULONG DummyLong3;
    ULONG DummyLong4;

} NETLOGON_WORKSTATION_INFO, *PNETLOGON_WORKSTATION_INFO;

typedef [switch_type(DWORD)] union _NETLOGON_WORKSTATION_INFORMATION {
    [case(NETLOGON_QUERY_DOMAIN_INFO)] PNETLOGON_WORKSTATION_INFO WorkstationInfo;
    [case(NETLOGON_QUERY_LSA_POLICY_INFO)] PNETLOGON_WORKSTATION_INFO LsaPolicyInfo;
} NETLOGON_WORKSTATION_INFORMATION, *PNETLOGON_WORKSTATION_INFORMATION;

NTSTATUS
NetrLogonGetDomainInfo(
    [in, string] LOGONSRV_HANDLE ServerName,
    [in,string,unique] wchar_t * ComputerName,
    [in] PNETLOGON_AUTHENTICATOR Authenticator,
    [in,out] PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
    [in] DWORD Level,
    [in,switch_is(Level)] PNETLOGON_WORKSTATION_INFORMATION WkstaBuffer,
    [out,switch_is(Level)] PNETLOGON_DOMAIN_INFORMATION DomBuffer
    );

NTSTATUS
NetrServerPasswordSet2 (
    [in,unique,string] LOGONSRV_HANDLE PrimaryName,
    [in,string] wchar_t * AccountName,
    [in] NETLOGON_SECURE_CHANNEL_TYPE AccountType,
    [in, string] wchar_t * ComputerName,
    [in] PNETLOGON_AUTHENTICATOR Authenticator,
    [out] PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
    [in] PNL_TRUST_PASSWORD ClearNewPassword
    );

NTSTATUS
NetrServerPasswordGet (
    [in,unique,string] LOGONSRV_HANDLE PrimaryName,
    [in,string] wchar_t * AccountName,
    [in] NETLOGON_SECURE_CHANNEL_TYPE AccountType,
    [in, string] wchar_t * ComputerName,
    [in] PNETLOGON_AUTHENTICATOR Authenticator,
    [out] PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
    [out] PENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword
    );

NTSTATUS
NetrLogonSendToSam (
    [in,unique,string] LOGONSRV_HANDLE PrimaryName,
    [in, string] wchar_t * ComputerName,
    [in] PNETLOGON_AUTHENTICATOR Authenticator,
    [out] PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
    [in,size_is(OpaqueBufferSize)] PUCHAR OpaqueBuffer,
    [in] ULONG OpaqueBufferSize
    );

typedef struct _NL_SOCKET_ADDRESS {
    [size_is(iSockaddrLength)] PUCHAR lpSockaddr;
    ULONG iSockaddrLength;
} NL_SOCKET_ADDRESS, *PNL_SOCKET_ADDRESS;

typedef struct _NL_SITE_NAME_ARRAY {
    ULONG EntryCount;
    [size_is(EntryCount)] PUNICODE_STRING SiteNames;
} NL_SITE_NAME_ARRAY, *PNL_SITE_NAME_ARRAY;

NET_API_STATUS
DsrAddressToSiteNamesW(
    [in,unique,string] LOGONSRV_HANDLE ComputerName,
    [in] DWORD EntryCount,
    [in,size_is(EntryCount)] PNL_SOCKET_ADDRESS SocketAddresses,
    [out] PNL_SITE_NAME_ARRAY *SiteNames
    );

NET_API_STATUS
DsrGetDcNameEx2(
    [in, unique, string ] LOGONSRV_HANDLE ComputerName,
    [in, unique, string] wchar_t * AccountName,
    [in] ULONG AllowableAccountControlBits,
    [in, unique, string] wchar_t * DomainName,
    [in, unique] GUID *DomainGuid,
    [in, unique, string] wchar_t * SiteName,
    [in] ULONG Flags,
    [out] PDOMAIN_CONTROLLER_INFOW *DomainControllerInfo
    );

NET_API_STATUS
NetrLogonGetTimeServiceParentDomain(
    [in, unique, string] LOGONSRV_HANDLE ServerName,
    [out, string] wchar_t **DomainName,
    [out] PBOOL PdcSameSite
    );

typedef struct _NETLOGON_TRUSTED_DOMAIN_ARRAY {
    DWORD DomainCount;
    [size_is(DomainCount)] PDS_DOMAIN_TRUSTSW Domains;
} NETLOGON_TRUSTED_DOMAIN_ARRAY, *PNETLOGON_TRUSTED_DOMAIN_ARRAY;

NET_API_STATUS
NetrEnumerateTrustedDomainsEx (
    [in, unique, string] LOGONSRV_HANDLE ServerName,
    [out] PNETLOGON_TRUSTED_DOMAIN_ARRAY Domains
    );

typedef struct _NL_SITE_NAME_EX_ARRAY {
    ULONG EntryCount;
    [size_is(EntryCount)] PUNICODE_STRING SiteNames;
    [size_is(EntryCount)] PUNICODE_STRING SubnetNames;
} NL_SITE_NAME_EX_ARRAY, *PNL_SITE_NAME_EX_ARRAY;

NET_API_STATUS
DsrAddressToSiteNamesExW(
    [in,unique,string] LOGONSRV_HANDLE ComputerName,
    [in] DWORD EntryCount,
    [in,size_is(EntryCount)] PNL_SOCKET_ADDRESS SocketAddresses,
    [out] PNL_SITE_NAME_EX_ARRAY *SiteNames
    );

NET_API_STATUS
DsrGetDcSiteCoverageW(
    [in,unique,string] LOGONSRV_HANDLE ServerName,
    [out] PNL_SITE_NAME_ARRAY *SiteNames
    );


//
// Define a logon routine that uses a passed in RPC handle.
// This will allow us to do multiple simultaneous RPCs over a secure channel.
//

NTSTATUS
NetrLogonSamLogonEx (
    [in] handle_t ContextHandle,
    [in,unique,string] wchar_t * LogonServer,
    [in,unique,string] wchar_t * ComputerName,
    [in] NETLOGON_LOGON_INFO_CLASS LogonLevel,
    [in,switch_is(LogonLevel)] PNETLOGON_LEVEL LogonInformation,
    [in] NETLOGON_VALIDATION_INFO_CLASS ValidationLevel,
    [out,switch_is(ValidationLevel)] PNETLOGON_VALIDATION ValidationInformation,
    [out] PBOOLEAN Authoritative,
    [in,out] PULONG ExtraFlags
    );

NET_API_STATUS
DsrEnumerateDomainTrusts (
    [in, unique, string] LOGONSRV_HANDLE ServerName,
    [in] ULONG Flags,
    [out] PNETLOGON_TRUSTED_DOMAIN_ARRAY Domains
    );

NET_API_STATUS
DsrDeregisterDnsHostRecords (
    [in, unique, string] LOGONSRV_HANDLE ServerName,
    [in, unique, string] wchar_t * DnsDomainName,
    [in, unique] GUID *DomainGuid,
    [in, unique] GUID *DsaGuid,
    [in, string] wchar_t * DnsHostName
    );

NTSTATUS
NetrServerTrustPasswordsGet (
    [in,unique,string] LOGONSRV_HANDLE TrustedDcName,
    [in,string] wchar_t * AccountName,
    [in] NETLOGON_SECURE_CHANNEL_TYPE AccountType,
    [in, string] wchar_t * ComputerName,
    [in] PNETLOGON_AUTHENTICATOR Authenticator,
    [out] PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
    [out] PENCRYPTED_NT_OWF_PASSWORD EncryptedNewOwfPassword,
    [out] PENCRYPTED_NT_OWF_PASSWORD EncryptedOldOwfPassword
    );

NET_API_STATUS
DsrGetForestTrustInformation (
    [in, unique, string] LOGONSRV_HANDLE ServerName,
    [in, unique, string] wchar_t * TrustedDomainName,
    [in] DWORD Flags,
    [out] PLSA_FOREST_TRUST_INFORMATION * ForestTrustInfo
    );

NTSTATUS
NetrGetForestTrustInformation (
    [in,unique,string] LOGONSRV_HANDLE ServerName,
    [in, string] wchar_t * ComputerName,
    [in] PNETLOGON_AUTHENTICATOR Authenticator,
    [out] PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
    [in] DWORD Flags,
    [out] PLSA_FOREST_TRUST_INFORMATION * ForestTrustInfo
    );

// This is the non-Ex version but with Flags
NTSTATUS
NetrLogonSamLogonWithFlags (
    [in,unique,string] LOGONSRV_HANDLE LogonServer,
    [in,string,unique] wchar_t * ComputerName,
    [in,unique] PNETLOGON_AUTHENTICATOR Authenticator,
    [in,out,unique] PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
    [in] NETLOGON_LOGON_INFO_CLASS LogonLevel,
    [in,switch_is(LogonLevel)] PNETLOGON_LEVEL LogonInformation,
    [in] NETLOGON_VALIDATION_INFO_CLASS ValidationLevel,
    [out,switch_is(ValidationLevel)] PNETLOGON_VALIDATION ValidationInformation,
    [out] PBOOLEAN Authoritative,
    [in,out] PULONG ExtraFlags
    );

//
// Generic data sent over netlogon RPC interfaces.
//
// The following data structure can be used to send generic data
// from the server to teh client.  Suppose the client requests
// an info about some property from the server over an RPC interface.
// Suppose that property has several attributes (which can be
// generically represented as ULONGs and/or UNICODE_STRINGS) and
// suppose that the property has several versions where older versions
// have more attributes. Using this generic data structure, the server
// will send all N attributes for the version the server supports. Here
// N is the number of attributes for the version teh server supports.
// If the client is older than the server, the client will be able to
// understand the first M attributes and the client will ignore the rest
// of attributes. Here M is the number of attributes the client version
// supports.  If the client is newer than the server, the client will be
// able to understand all N attributes from the server and the client
// will realize that the server supports an old version of the property.
// This scheme works provided the attributes are ordered by their creation
// time. This technique avoids new RPC interfaces as property gets new
// attributes and avoids special case coding.
//

typedef struct _NL_GENERIC_RPC_DATA {

    ULONG UlongEntryCount;
    [size_is(UlongEntryCount)] PULONG UlongData;

    ULONG UnicodeStringEntryCount;
    [size_is(UnicodeStringEntryCount)] PUNICODE_STRING UnicodeStringData;

} NL_GENERIC_RPC_DATA, *PNL_GENERIC_RPC_DATA;

NTSTATUS
NetrServerGetTrustInfo (
    [in,unique,string] LOGONSRV_HANDLE TrustedDcName,
    [in,string] wchar_t * AccountName,
    [in] NETLOGON_SECURE_CHANNEL_TYPE AccountType,
    [in, string] wchar_t * ComputerName,
    [in] PNETLOGON_AUTHENTICATOR Authenticator,
    [out] PNETLOGON_AUTHENTICATOR ReturnAuthenticator,
    [out] PENCRYPTED_NT_OWF_PASSWORD EncryptedNewOwfPassword,
    [out] PENCRYPTED_NT_OWF_PASSWORD EncryptedOldOwfPassword,
    [out] PNL_GENERIC_RPC_DATA *TrustInfo
    );
}