// Copyright © 2015, skdltmxn
// Licensed under the MIT License <LICENSE.md>
// This module contains the definitions for portable NetBIOS 3.0 support.
pub const NCBNAMSZ: usize = 16;
pub const MAX_LANA: usize = 254;
pub type PFPOST = Option<unsafe extern "system" fn(*mut NCB)>;
#[cfg(target_arch="x86_64")]
STRUCT!{nodebug struct NCB {
    ncb_command: ::UCHAR,
    ncb_retcode: ::UCHAR,
    ncb_lsn: ::UCHAR,
    ncb_num: ::UCHAR,
    ncb_buffer: ::PUCHAR,
    ncb_length: ::WORD,
    ncb_callname: [::UCHAR; NCBNAMSZ],
    ncb_name: [::UCHAR; NCBNAMSZ],
    ncb_rto: ::UCHAR,
    ncb_sto: ::UCHAR,
    ncb_post: PFPOST,
    ncb_lana_num: ::UCHAR,
    ncb_cmd_cplt: ::UCHAR,
    ncb_reserve: [::UCHAR; 18],
    ncb_event: ::HANDLE,
}}
#[cfg(target_arch="x86")]
STRUCT!{nodebug struct NCB {
    ncb_command: ::UCHAR,
    ncb_retcode: ::UCHAR,
    ncb_lsn: ::UCHAR,
    ncb_num: ::UCHAR,
    ncb_buffer: ::PUCHAR,
    ncb_length: ::WORD,
    ncb_callname: [::UCHAR; NCBNAMSZ],
    ncb_name: [::UCHAR; NCBNAMSZ],
    ncb_rto: ::UCHAR,
    ncb_sto: ::UCHAR,
    ncb_post: PFPOST,
    ncb_lana_num: ::UCHAR,
    ncb_cmd_cplt: ::UCHAR,
    ncb_reserve: [::UCHAR; 10],
    ncb_event: ::HANDLE,
}}
pub type PNCB = *mut NCB;
STRUCT!{struct ADAPTER_STATUS {
    adapter_address: [::UCHAR; 6],
    rev_major: ::UCHAR,
    reserved0: ::UCHAR,
    adapter_type: ::UCHAR,
    rev_minor: ::UCHAR,
    duration: ::WORD,
    frmr_recv: ::WORD,
    frmr_xmit: ::WORD,
    iframe_recv_err: ::WORD,
    xmit_aborts: ::WORD,
    xmit_success: ::DWORD,
    recv_success: ::DWORD,
    iframe_xmit_err: ::WORD,
    recv_buff_unavail: ::WORD,
    t1_timeouts: ::WORD,
    ti_timeouts: ::WORD,
    reserved1: ::DWORD,
    free_ncbs: ::WORD,
    max_cfg_ncbs: ::WORD,
    max_ncbs: ::WORD,
    xmit_buf_unavail: ::WORD,
    max_dgram_size: ::WORD,
    pending_sess: ::WORD,
    max_cfg_sess: ::WORD,
    max_sess: ::WORD,
    max_sess_pkt_size: ::WORD,
    name_count: ::WORD,
}}
pub type PADAPTER_STATUS = *mut ADAPTER_STATUS;
STRUCT!{struct NAME_BUFFER {
    name: [::UCHAR; NCBNAMSZ],
    name_num: ::UCHAR,
    name_flags: ::UCHAR,
}}
pub type PNAME_BUFFER = *mut NAME_BUFFER;
pub const NAME_FLAGS_MASK: ::UCHAR = 0x87;
pub const GROUP_NAME: ::UCHAR = 0x80;
pub const UNIQUE_NAME: ::UCHAR = 0x00;
pub const REGISTERING: ::UCHAR = 0x00;
pub const REGISTERED: ::UCHAR = 0x04;
pub const DEREGISTERED: ::UCHAR = 0x05;
pub const DUPLICATE: ::UCHAR = 0x06;
pub const DUPLICATE_DEREG: ::UCHAR = 0x07;
STRUCT!{struct SESSION_HEADER {
    sess_name: ::UCHAR,
    num_sess: ::UCHAR,
    rcv_dg_outstanding: ::UCHAR,
    rcv_any_outstanding: ::UCHAR,
}}
pub type PSESSION_HEADER = *mut SESSION_HEADER;
STRUCT!{struct SESSION_BUFFER {
    lsn: ::UCHAR,
    state: ::UCHAR,
    local_name: [::UCHAR; NCBNAMSZ],
    remote_name: [::UCHAR; NCBNAMSZ],
    rcvs_outstanding: ::UCHAR,
    sends_outstanding: ::UCHAR,
}}
pub type PSESSION_BUFFER = *mut SESSION_BUFFER;
pub const LISTEN_OUTSTANDING: ::UCHAR = 0x01;
pub const CALL_PENDING: ::UCHAR = 0x02;
pub const SESSION_ESTABLISHED: ::UCHAR = 0x03;
pub const HANGUP_PENDING: ::UCHAR = 0x04;
pub const HANGUP_COMPLETE: ::UCHAR = 0x05;
pub const SESSION_ABORTED: ::UCHAR = 0x06;
STRUCT!{nodebug struct LANA_ENUM {
    length: ::UCHAR,
    lana: [::UCHAR; MAX_LANA + 1],
}}
pub type PLANA_ENUM = *mut LANA_ENUM;
STRUCT!{struct FIND_NAME_HEADER {
    node_count: ::WORD,
    reserved: ::UCHAR,
    unique_group: ::UCHAR,
}}
pub type PFIND_NAME_HEADER = *mut FIND_NAME_HEADER;
STRUCT!{struct FIND_NAME_BUFFER {
    length: ::UCHAR,
    access_control: ::UCHAR,
    frame_control: ::UCHAR,
    destination_addr: [::UCHAR; 6],
    source_addr: [::UCHAR; 6],
    routing_info: [::UCHAR; 18],
}}
pub type PFIND_NAME_BUFFER = *mut FIND_NAME_BUFFER;
STRUCT!{struct ACTION_HEADER {
    transport_id: ::ULONG,
    action_code: ::USHORT,
    reserved: ::USHORT,
}}
pub type PACTION_HEADER = *mut ACTION_HEADER;
pub const NCBCALL: ::UCHAR = 0x10;
pub const NCBLISTEN: ::UCHAR = 0x11;
pub const NCBHANGUP: ::UCHAR = 0x12;
pub const NCBSEND: ::UCHAR = 0x14;
pub const NCBRECV: ::UCHAR = 0x15;
pub const NCBRECVANY: ::UCHAR = 0x16;
pub const NCBCHAINSEND: ::UCHAR = 0x17;
pub const NCBDGSEND: ::UCHAR = 0x20;
pub const NCBDGRECV: ::UCHAR = 0x21;
pub const NCBDGSENDBC: ::UCHAR = 0x22;
pub const NCBADDNAME: ::UCHAR = 0x30;
pub const NCBDELNAME: ::UCHAR = 0x31;
pub const NCBRESET: ::UCHAR = 0x32;
pub const NCBASTAT: ::UCHAR = 0x33;
pub const NCBSSTAT: ::UCHAR = 0x34;
pub const NCBCANCEL: ::UCHAR = 0x35;
pub const NCBADDGRNAME: ::UCHAR = 0x36;
pub const NCBENUM: ::UCHAR = 0x37;
pub const NCBUNLINK: ::UCHAR = 0x70;
pub const NCBSENDNA: ::UCHAR = 0x71;
pub const NCBCHAINSENDNA: ::UCHAR = 0x72;
pub const NCBLANSTALERT: ::UCHAR = 0x73;
pub const NCBACTION: ::UCHAR = 0x77;
pub const NCBFINDNAME: ::UCHAR = 0x78;
pub const NCBTRACE: ::UCHAR = 0x79;
pub const ASYNCH: ::UCHAR = 0x80;
pub const NRC_GOODRET: ::UCHAR = 0x00;
pub const NRC_BUFLEN: ::UCHAR = 0x01;
pub const NRC_ILLCMD: ::UCHAR = 0x03;
pub const NRC_CMDTMO: ::UCHAR = 0x05;
pub const NRC_INCOMP: ::UCHAR = 0x06;
pub const NRC_BADDR: ::UCHAR = 0x07;
pub const NRC_SNUMOUT: ::UCHAR = 0x08;
pub const NRC_NORES: ::UCHAR = 0x09;
pub const NRC_SCLOSED: ::UCHAR = 0x0a;
pub const NRC_CMDCAN: ::UCHAR = 0x0b;
pub const NRC_DUPNAME: ::UCHAR = 0x0d;
pub const NRC_NAMTFUL: ::UCHAR = 0x0e;
pub const NRC_ACTSES: ::UCHAR = 0x0f;
pub const NRC_LOCTFUL: ::UCHAR = 0x11;
pub const NRC_REMTFUL: ::UCHAR = 0x12;
pub const NRC_ILLNN: ::UCHAR = 0x13;
pub const NRC_NOCALL: ::UCHAR = 0x14;
pub const NRC_NOWILD: ::UCHAR = 0x15;
pub const NRC_INUSE: ::UCHAR = 0x16;
pub const NRC_NAMERR: ::UCHAR = 0x17;
pub const NRC_SABORT: ::UCHAR = 0x18;
pub const NRC_NAMCONF: ::UCHAR = 0x19;
pub const NRC_IFBUSY: ::UCHAR = 0x21;
pub const NRC_TOOMANY: ::UCHAR = 0x22;
pub const NRC_BRIDGE: ::UCHAR = 0x23;
pub const NRC_CANOCCR: ::UCHAR = 0x24;
pub const NRC_CANCEL: ::UCHAR = 0x26;
pub const NRC_DUPENV: ::UCHAR = 0x30;
pub const NRC_ENVNOTDEF: ::UCHAR = 0x34;
pub const NRC_OSRESNOTAV: ::UCHAR = 0x35;
pub const NRC_MAXAPPS: ::UCHAR = 0x36;
pub const NRC_NOSAPS: ::UCHAR = 0x37;
pub const NRC_NORESOURCES: ::UCHAR = 0x38;
pub const NRC_INVADDRESS: ::UCHAR = 0x39;
pub const NRC_INVDDID: ::UCHAR = 0x3B;
pub const NRC_LOCKFAIL: ::UCHAR = 0x3C;
pub const NRC_OPENERR: ::UCHAR = 0x3f;
pub const NRC_SYSTEM: ::UCHAR = 0x40;
pub const NRC_PENDING: ::UCHAR = 0xff;
