//+-----------------------------------------------------------------------
//
// File:        kdcsvr.hxx
//
// Contents:    KDC Private definitions
//
//
// History:     <whenever>  RichardW Created
//              16-Jan-93   WadeR   Converted to C++
//
//------------------------------------------------------------------------

#ifndef _INC_KDCSVR_HXX_
#define _INC_KDCSVR_HXX_

#include <secpch2.hxx>
extern "C"
{
#include <lsarpc.h>
#include <samrpc.h>
#include <lmsname.h>
#include <samisrv.h>    // SamIFree_XXX
#include <logonmsv.h>
#include <lsaisrv.h>    // LsaIFree_XXX
#include <config.h>
#include <lmerr.h>
#include <netlibnt.h>
#include <lsaitf.h>
#include <msaudite.h>
#include <wintrust.h>   // for WinVerifyTrust and wincrypt.h
}
#include <kerbcomm.h>
#include <kerberr.h>
#include <kdcevent.h>
#include <exterr.h> // whack this soon
#include <events.hxx>
#include <authen.hxx>
#include <fileno.h>

//
// Global typedefs
//

typedef struct _KDC_TICKET_INFO
{
    UNICODE_STRING AccountName;
    UNICODE_STRING TrustedForest;
    LARGE_INTEGER PasswordExpires;
    ULONG fTicketOpts;
    ULONG UserAccountControl;
    ULONG UserId;
    ULONG TrustAttributes;
    PKERB_STORED_CREDENTIAL Passwords;
    PKERB_STORED_CREDENTIAL OldPasswords;
    PSID TrustSid;               
} KDC_TICKET_INFO, *PKDC_TICKET_INFO;

                                         
typedef enum {
    Unknown,
    Inbound,
    Outbound
} KDC_DOMAIN_INFO_DIRECTION, *PKDC_DOMAIN_INFO_DIRECTION;



#include "debug.hxx"
#include "secdata.hxx"
#include "tktutil.hxx"
#include "pkserv.h"


#define KdcLsaIAuditKdcEvent(_a_, _b_, _c_, _d_, _e_, _f_, _g_, _h_, _i_, _j_, _k_, _l_ ) \
    LsaIAuditKdcEvent(_a_, _b_, _c_, _d_, _e_, _f_, _g_, _h_, _i_, _j_, _k_, _l_ )



//
// Global prototypes:
//



void
ServiceMain(
    ULONG ArgC,
    LPSTR * ArgV
    );

NTSTATUS
ShutDown(
    LPTSTR String
     );

BOOLEAN
UpdateStatus(
    ULONG Status
    );


extern "C"
BOOLEAN
InitializeChangeNotify(
    VOID
    );

//
// Global data defn's
//

typedef enum {
        Stopped,
        Starting,
        Running
} KDC_STATE;

extern TimeStamp    tsInfinity;
extern KDC_STATE KdcState;
extern LARGE_INTEGER SkewTime;
extern BOOLEAN      fStopKDC;
extern HANDLE       hKdcHandles[];
extern CRITICAL_SECTION ApiCriticalSection;
extern ULONG        CurrentApiCallers;
extern UNICODE_STRING GlobalDomainName;
extern UNICODE_STRING GlobalKerberosName;
extern UNICODE_STRING GlobalKdcName;
extern BOOL KdcGlobalAvoidPdcOnWan;
extern UNICODE_STRING KdcForestRootDomainName;
extern BOOLEAN KdcIsGc;
extern BOOLEAN KdcForestRoot;
extern BOOLEAN KdcCrossForestEnabled;
extern LIST_ENTRY KdcReferralCache;
extern PKERB_INTERNAL_NAME GlobalKpasswdName;
extern PSID         GlobalDomainSid;
extern SAMPR_HANDLE GlobalAccountDomainHandle;
extern LSAPR_HANDLE GlobalPolicyHandle;
extern BYTE         GlobalLocalhostAddress[4];

#define GET_CLIENT_ADDRESS(_x_) \
    (((_x_) != NULL ) ? \
        ((PBYTE) (&((struct sockaddr_in *)(_x_))->sin_addr.S_un.S_addr)) : \
        GlobalLocalhostAddress)

//
// KDC handle definitions
//

#define hKdcShutdownEvent  hKdcHandles[0]
#define MAX_KDC_HANDLE     1

// class CAuthenticatorList;
extern CAuthenticatorList * Authenticators;
extern CAuthenticatorList * FailedRequests;



class CSecurityData;
extern CSecurityData SecData;


//
// Global constants
//
const ULONG     ulInfinity = 0xFFFFFFFF;
const ULONG     ulTsPerSecond = 10000000L;


// Number of creds supplied in DS for LM_OWF but no NT_OWF support
#define CRED_ONLY_LM_OWF 1

//
// Global macros
//

#define _str_(a) #a
#define _xstr_(a) _str_(a)
#define DIAGNOSTIC(num, txt) message(__FILE__ "(" _xstr_(__LINE__) \
                                    ") : diagnostic V" _xstr_(num) " : "#txt)

#define MEMO(txt) message( __FILE__ "(" _xstr_(__LINE__) ") : Memo : " #txt )

 
#define KdcGetTime(_x_) ((_x_).QuadPart)


#define MAX_EXPR_LEN        50
#define MAX_SID_LEN (sizeof(SID) + sizeof(ULONG) * SID_MAX_SUB_AUTHORITIES)

#define KdcMakeAccountSid( _buffer_, _rid_) \
{ \
    PSID TempSid = (PSID) _buffer_; \
    RtlCopyMemory( _buffer_, GlobalDomainSid, RtlLengthSid(GlobalDomainSid)); \
    *RtlSubAuthoritySid(TempSid, *RtlSubAuthorityCountSid(TempSid)) = _rid_; \
    *RtlSubAuthorityCountSid(TempSid) += 1; \
}

#define KdcFreeEncodedData(_x_) MIDL_user_free(_x_)

//
// Global inline functions.
//


#endif // _INC_KDCSVR_HXX_