/**
 * Windows API header module
 *
 * Translated from MinGW Windows headers
 *
 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
 * Source: $(DRUNTIMESRC src/core/sys/windows/_subauth.d)
 */
module core.sys.windows.subauth;
version (Windows):
@system:

private import core.sys.windows.ntdef, core.sys.windows.windef;

/+
alias LONG NTSTATUS;
alias NTSTATUS* PNTSTATUS;
+/

enum : ULONG {
    MSV1_0_PASSTHRU    = 1,
    MSV1_0_GUEST_LOGON = 2
}

// USER_ALL_INFORMATION.WhichFields (Undocumented)
enum ULONG
    MSV1_0_VALIDATION_LOGOFF_TIME  = 1,
    MSV1_0_VALIDATION_KICKOFF_TIME = 2,
    MSV1_0_VALIDATION_LOGON_SERVER = 4,
    MSV1_0_VALIDATION_LOGON_DOMAIN = 8,
    MSV1_0_VALIDATION_SESSION_KEY  = 16,
    MSV1_0_VALIDATION_USER_FLAGS   = 32,
    MSV1_0_VALIDATION_USER_ID      = 64;

// ?ActionsPerformed? (Undocumented)
enum MSV1_0_SUBAUTH_ACCOUNT_DISABLED = 1;
enum MSV1_0_SUBAUTH_PASSWORD         = 2;
enum MSV1_0_SUBAUTH_WORKSTATIONS = 4;
enum MSV1_0_SUBAUTH_LOGON_HOURS = 8;
enum MSV1_0_SUBAUTH_ACCOUNT_EXPIRY = 16;
enum MSV1_0_SUBAUTH_PASSWORD_EXPIRY = 32;
enum MSV1_0_SUBAUTH_ACCOUNT_TYPE = 64;
enum MSV1_0_SUBAUTH_LOCKOUT = 128;

enum NEXT_FREE_ACCOUNT_CONTROL_BIT = 131072;

enum SAM_DAYS_PER_WEEK    = 7;
enum SAM_HOURS_PER_WEEK   = 168;
enum SAM_MINUTES_PER_WEEK = 10080;

enum : NTSTATUS {
    STATUS_SUCCESS                = 0,
    STATUS_INVALID_INFO_CLASS     = 0xC0000003,
    STATUS_NO_SUCH_USER           = 0xC0000064,
    STATUS_WRONG_PASSWORD         = 0xC000006A,
    STATUS_PASSWORD_RESTRICTION   = 0xC000006C,
    STATUS_LOGON_FAILURE          = 0xC000006D,
    STATUS_ACCOUNT_RESTRICTION    = 0xC000006E,
    STATUS_INVALID_LOGON_HOURS    = 0xC000006F,
    STATUS_INVALID_WORKSTATION    = 0xC0000070,
    STATUS_PASSWORD_EXPIRED       = 0xC0000071,
    STATUS_ACCOUNT_DISABLED       = 0xC0000072,
    STATUS_INSUFFICIENT_RESOURCES = 0xC000009A,
    STATUS_ACCOUNT_EXPIRED        = 0xC0000193,
    STATUS_PASSWORD_MUST_CHANGE   = 0xC0000224,
    STATUS_ACCOUNT_LOCKED_OUT     = 0xC0000234
}

// Note: undocumented in MSDN
// USER_ALL_INFORMATION.UserAccountControl
enum ULONG
    USER_ACCOUNT_DISABLED                = 1,
    USER_HOME_DIRECTORY_REQUIRED         = 2,
    USER_PASSWORD_NOT_REQUIRED           = 4,
    USER_TEMP_DUPLICATE_ACCOUNT          = 8,
    USER_NORMAL_ACCOUNT                  = 16,
    USER_MNS_LOGON_ACCOUNT               = 32,
    USER_INTERDOMAIN_TRUST_ACCOUNT       = 64,
    USER_WORKSTATION_TRUST_ACCOUNT       = 128,
    USER_SERVER_TRUST_ACCOUNT            = 256,
    USER_DONT_EXPIRE_PASSWORD            = 512,
    USER_ACCOUNT_AUTO_LOCKED             = 1024,
    USER_ENCRYPTED_TEXT_PASSWORD_ALLOWED = 2048,
    USER_SMARTCARD_REQUIRED              = 4096,
    USER_TRUSTED_FOR_DELEGATION          = 8192,
    USER_NOT_DELEGATED                   = 16384,
    USER_USE_DES_KEY_ONLY                = 32768,
    USER_DONT_REQUIRE_PREAUTH            = 65536,

    USER_MACHINE_ACCOUNT_MASK            = 448,
    USER_ACCOUNT_TYPE_MASK               = 472,
    USER_ALL_PARAMETERS                  = 2097152;

/+
struct UNICODE_STRING {
    USHORT Length;
    USHORT MaximumLength;
    PWSTR Buffer;
}
alias UNICODE_STRING* PUNICODE_STRING;

struct STRING {
    USHORT Length;
    USHORT MaximumLength;
    PCHAR Buffer;
}
alias STRING* PSTRING;
+/

mixin DECLARE_HANDLE!("SAM_HANDLE");
alias SAM_HANDLE* PSAM_HANDLE;

struct OLD_LARGE_INTEGER {
    ULONG LowPart;
    LONG HighPart;
}
alias OLD_LARGE_INTEGER* POLD_LARGE_INTEGER;

enum NETLOGON_LOGON_INFO_CLASS {
    NetlogonInteractiveInformation = 1,
    NetlogonNetworkInformation,
    NetlogonServiceInformation,
    NetlogonGenericInformation,
    NetlogonInteractiveTransitiveInformation,
    NetlogonNetworkTransitiveInformation,
    NetlogonServiceTransitiveInformation
}


enum CYPHER_BLOCK_LENGTH = 8;
enum USER_SESSION_KEY_LENGTH = CYPHER_BLOCK_LENGTH * 2;
enum CLEAR_BLOCK_LENGTH = 8;

struct CYPHER_BLOCK {
    CHAR[CYPHER_BLOCK_LENGTH] data = 0;
}
alias CYPHER_BLOCK* PCYPHER_BLOCK;

struct CLEAR_BLOCK {
    CHAR[CLEAR_BLOCK_LENGTH] data = 0;
}
alias CLEAR_BLOCK* PCLEAR_BLOCK;

struct LM_OWF_PASSWORD {
    CYPHER_BLOCK[2] data;
}
alias LM_OWF_PASSWORD* PLM_OWF_PASSWORD;

struct USER_SESSION_KEY {
    CYPHER_BLOCK[2] data;
}
alias USER_SESSION_KEY* PUSER_SESSION_KEY;

alias CLEAR_BLOCK LM_CHALLENGE;
alias LM_CHALLENGE* PLM_CHALLENGE;

alias LM_OWF_PASSWORD NT_OWF_PASSWORD;
alias NT_OWF_PASSWORD* PNT_OWF_PASSWORD;
alias LM_CHALLENGE NT_CHALLENGE;
alias NT_CHALLENGE* PNT_CHALLENGE;

struct LOGON_HOURS {
    USHORT UnitsPerWeek;
    PUCHAR LogonHours;
}
alias LOGON_HOURS* PLOGON_HOURS;

struct SR_SECURITY_DESCRIPTOR {
    ULONG Length;
    PUCHAR SecurityDescriptor;
}
alias SR_SECURITY_DESCRIPTOR* PSR_SECURITY_DESCRIPTOR;

align(4):
struct USER_ALL_INFORMATION {
    LARGE_INTEGER LastLogon;
    LARGE_INTEGER LastLogoff;
    LARGE_INTEGER PasswordLastSet;
    LARGE_INTEGER AccountExpires;
    LARGE_INTEGER PasswordCanChange;
    LARGE_INTEGER PasswordMustChange;
    UNICODE_STRING UserName;
    UNICODE_STRING FullName;
    UNICODE_STRING HomeDirectory;
    UNICODE_STRING HomeDirectoryDrive;
    UNICODE_STRING ScriptPath;
    UNICODE_STRING ProfilePath;
    UNICODE_STRING AdminComment;
    UNICODE_STRING WorkStations;
    UNICODE_STRING UserComment;
    UNICODE_STRING Parameters;
    UNICODE_STRING LmPassword;
    UNICODE_STRING NtPassword;
    UNICODE_STRING PrivateData;
    SR_SECURITY_DESCRIPTOR SecurityDescriptor;
    ULONG UserId;
    ULONG PrimaryGroupId;
    ULONG UserAccountControl;
    ULONG WhichFields;
    LOGON_HOURS LogonHours;
    USHORT BadPasswordCount;
    USHORT LogonCount;
    USHORT CountryCode;
    USHORT CodePage;
    BOOLEAN LmPasswordPresent;
    BOOLEAN NtPasswordPresent;
    BOOLEAN PasswordExpired;
    BOOLEAN PrivateDataSensitive;
}
alias USER_ALL_INFORMATION* PUSER_ALL_INFORMATION;
align:

struct MSV1_0_VALIDATION_INFO {
    LARGE_INTEGER LogoffTime;
    LARGE_INTEGER KickoffTime;
    UNICODE_STRING LogonServer;
    UNICODE_STRING LogonDomainName;
    USER_SESSION_KEY SessionKey;
    BOOLEAN Authoritative;
    ULONG UserFlags;
    ULONG WhichFields;
    ULONG UserId;
}
alias MSV1_0_VALIDATION_INFO* PMSV1_0_VALIDATION_INFO;

struct NETLOGON_LOGON_IDENTITY_INFO {
    UNICODE_STRING LogonDomainName;
    ULONG ParameterControl;
    OLD_LARGE_INTEGER LogonId;
    UNICODE_STRING UserName;
    UNICODE_STRING Workstation;
}
alias NETLOGON_LOGON_IDENTITY_INFO* PNETLOGON_LOGON_IDENTITY_INFO;

struct NETLOGON_INTERACTIVE_INFO {
    NETLOGON_LOGON_IDENTITY_INFO Identity;
    LM_OWF_PASSWORD LmOwfPassword;
    NT_OWF_PASSWORD NtOwfPassword;
}
alias NETLOGON_INTERACTIVE_INFO* PNETLOGON_INTERACTIVE_INFO;

struct NETLOGON_GENERIC_INFO {
    NETLOGON_LOGON_IDENTITY_INFO Identity;
    UNICODE_STRING PackageName;
    ULONG DataLength;
    PUCHAR LogonData;
}
alias NETLOGON_GENERIC_INFO* PNETLOGON_GENERIC_INFO;

struct NETLOGON_NETWORK_INFO {
    NETLOGON_LOGON_IDENTITY_INFO Identity;
    LM_CHALLENGE LmChallenge;
    STRING NtChallengeResponse;
    STRING LmChallengeResponse;
}
alias NETLOGON_NETWORK_INFO* PNETLOGON_NETWORK_INFO;

struct NETLOGON_SERVICE_INFO {
    NETLOGON_LOGON_IDENTITY_INFO Identity;
    LM_OWF_PASSWORD LmOwfPassword;
    NT_OWF_PASSWORD NtOwfPassword;
}
alias NETLOGON_SERVICE_INFO* PNETLOGON_SERVICE_INFO;

extern (Windows) {
NTSTATUS Msv1_0SubAuthenticationRoutine(NETLOGON_LOGON_INFO_CLASS,PVOID,
    ULONG,PUSER_ALL_INFORMATION,PULONG,PULONG,
    PBOOLEAN,PLARGE_INTEGER,PLARGE_INTEGER);
NTSTATUS Msv1_0SubAuthenticationFilter(NETLOGON_LOGON_INFO_CLASS,PVOID,
    ULONG,PUSER_ALL_INFORMATION,PULONG,PULONG,
    PBOOLEAN,PLARGE_INTEGER,PLARGE_INTEGER);
NTSTATUS Msv1_0SubAuthenticationRoutineGeneric(PVOID,ULONG,PULONG,PVOID*);
NTSTATUS Msv1_0SubAuthenticationRoutineEx(NETLOGON_LOGON_INFO_CLASS,PVOID,
    ULONG,PUSER_ALL_INFORMATION,SAM_HANDLE,
    PMSV1_0_VALIDATION_INFO,PULONG);
}
