286 lines
10 KiB
C
286 lines
10 KiB
C
/*++
|
|
|
|
Copyright (c) 1989 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
nbfhdrs.h
|
|
|
|
Abstract:
|
|
|
|
This module defines private structure definitions describing the layout
|
|
of the NetBIOS Frames Protocol headers for the NT NBF transport
|
|
provider.
|
|
|
|
Author:
|
|
|
|
Stephen E. Jones (stevej) 25-Oct-1989
|
|
|
|
Revision History:
|
|
|
|
David Beaver (dbeaver) 24-Sep-1990
|
|
remove pc586 and PDI specific code; add NDIS support
|
|
|
|
--*/
|
|
|
|
#ifndef _NBFHDRS_
|
|
#define _NBFHDRS_
|
|
|
|
//
|
|
// Pack these headers, as they are sent fully packed on the network.
|
|
//
|
|
|
|
#ifdef PACKING
|
|
|
|
#ifdef __STDC__
|
|
#pragma Off(Align_members)
|
|
#else
|
|
#pragma pack(1)
|
|
#endif // def __STDC__
|
|
|
|
#endif // def PACKING
|
|
|
|
#define NETBIOS_SIGNATURE_1 0xef // signature in NetBIOS frames.
|
|
#define NETBIOS_SIGNATURE_0 0xff // 1st byte.
|
|
#define NETBIOS_SIGNATURE 0xefff
|
|
|
|
//
|
|
// NetBIOS Frames Protocol Command Codes.
|
|
//
|
|
|
|
#define NBF_CMD_ADD_GROUP_NAME_QUERY 0x00
|
|
#define NBF_CMD_ADD_NAME_QUERY 0x01
|
|
#define NBF_CMD_NAME_IN_CONFLICT 0x02
|
|
#define NBF_CMD_STATUS_QUERY 0x03
|
|
#define NBF_CMD_TERMINATE_TRACE 0x07
|
|
#define NBF_CMD_DATAGRAM 0x08
|
|
#define NBF_CMD_DATAGRAM_BROADCAST 0x09
|
|
#define NBF_CMD_NAME_QUERY 0x0a
|
|
#define NBF_CMD_ADD_NAME_RESPONSE 0x0d
|
|
#define NBF_CMD_NAME_RECOGNIZED 0x0e
|
|
#define NBF_CMD_STATUS_RESPONSE 0x0f
|
|
#define NBF_CMD_TERMINATE_TRACE2 0x13
|
|
#define NBF_CMD_DATA_ACK 0x14
|
|
#define NBF_CMD_DATA_FIRST_MIDDLE 0x15
|
|
#define NBF_CMD_DATA_ONLY_LAST 0x16
|
|
#define NBF_CMD_SESSION_CONFIRM 0x17
|
|
#define NBF_CMD_SESSION_END 0x18
|
|
#define NBF_CMD_SESSION_INITIALIZE 0x19
|
|
#define NBF_CMD_NO_RECEIVE 0x1a
|
|
#define NBF_CMD_RECEIVE_OUTSTANDING 0x1b
|
|
#define NBF_CMD_RECEIVE_CONTINUE 0x1c
|
|
#define NBF_CMD_SESSION_ALIVE 0x1f
|
|
|
|
//
|
|
// NBF Transport Layer Header.
|
|
//
|
|
|
|
typedef struct _NBF_HDR_GENERIC {
|
|
USHORT Length; // Length of this header in bytes.
|
|
UCHAR Signature [2]; // always {0xef, 0xff} for NBF.
|
|
UCHAR Command; // command code, NBF_CMD_xxx.
|
|
UCHAR Data1; // optional parameter.
|
|
USHORT Data2; // optional parameter.
|
|
USHORT TransmitCorrelator; // transmit correlator parameter.
|
|
USHORT ResponseCorrelator; // response correlator parameter.
|
|
} NBF_HDR_GENERIC;
|
|
typedef NBF_HDR_GENERIC UNALIGNED *PNBF_HDR_GENERIC;
|
|
|
|
typedef struct _NBF_HDR_CONNECTION {
|
|
USHORT Length; // length of the header in bytes (14).
|
|
USHORT Signature; // always {0xef, 0xff} for NBF.
|
|
UCHAR Command; // command code, NBF_CMD_xxx.
|
|
UCHAR Data1; // optional parameter.
|
|
UCHAR Data2Low, Data2High; // Intel-formatted DW parameter.
|
|
USHORT TransmitCorrelator; // Intel-formatted DW param. (transmit correlator).
|
|
USHORT ResponseCorrelator; // Intel-formatted DW param. (response correlator).
|
|
UCHAR DestinationSessionNumber; // connection identifier of packet receiver.
|
|
UCHAR SourceSessionNumber; // connection identifier of packet sender.
|
|
} NBF_HDR_CONNECTION;
|
|
typedef NBF_HDR_CONNECTION UNALIGNED *PNBF_HDR_CONNECTION;
|
|
|
|
typedef struct _NBF_HDR_CONNECTIONLESS {
|
|
USHORT Length; // length of the header in bytes (44).
|
|
USHORT Signature; // always {0xef, 0xff} for NBF.
|
|
UCHAR Command; // command code, NBF_CMD_xxx.
|
|
UCHAR Data1; // optional parameter.
|
|
UCHAR Data2Low, Data2High; // Intel-formatted DW parameter.
|
|
USHORT TransmitCorrelator; // Intel-formatted DW param. (transmit correlator).
|
|
USHORT ResponseCorrelator; // Intel-formatted DW param. (response correlator).
|
|
UCHAR DestinationName [NETBIOS_NAME_LENGTH]; // name of packet receiver.
|
|
UCHAR SourceName [NETBIOS_NAME_LENGTH]; // name of packet sender.
|
|
} NBF_HDR_CONNECTIONLESS;
|
|
typedef NBF_HDR_CONNECTIONLESS UNALIGNED *PNBF_HDR_CONNECTIONLESS;
|
|
|
|
//
|
|
// These macros are used to retrieve the transmit and response
|
|
// correlators from an NBF_HDR_CONNECTION(LESS). The first two
|
|
// are general, the second two are used when the correlators
|
|
// are known to be WORD aligned.
|
|
//
|
|
|
|
#define TRANSMIT_CORR_A(_Hdr) ((_Hdr)->TransmitCorrelator)
|
|
#define RESPONSE_CORR_A(_Hdr) ((_Hdr)->ResponseCorrelator)
|
|
|
|
#ifdef _IA64_
|
|
|
|
//
|
|
// BUGBUG This is a workaround for a bug in the IA64 compiler version
|
|
// 13.00.8837 (bug #utc_p7#15002: FE bug). When it is fixed, remove
|
|
// this new version of the macros in favor of the original version,
|
|
// below.
|
|
//
|
|
|
|
__inline
|
|
USHORT UNALIGNED *
|
|
TempUShortCast(
|
|
IN USHORT UNALIGNED *p
|
|
)
|
|
{
|
|
return p;
|
|
}
|
|
|
|
#define TRANSMIT_CORR(_Hdr) (*TempUShortCast( &(_Hdr)->TransmitCorrelator ))
|
|
#define RESPONSE_CORR(_Hdr) (*TempUShortCast( &(_Hdr)->ResponseCorrelator ))
|
|
|
|
#define HEADER_LENGTH(_Hdr) (*TempUShortCast( &(_Hdr)->Length ))
|
|
#define HEADER_SIGNATURE(_Hdr) (*TempUShortCast( &(_Hdr)->Signature ))
|
|
|
|
#else
|
|
|
|
#define TRANSMIT_CORR(_Hdr) (*(USHORT UNALIGNED *)(&(_Hdr)->TransmitCorrelator))
|
|
#define RESPONSE_CORR(_Hdr) (*(USHORT UNALIGNED *)(&(_Hdr)->ResponseCorrelator))
|
|
|
|
#define HEADER_LENGTH(_Hdr) (*(USHORT UNALIGNED *)(&(_Hdr)->Length))
|
|
#define HEADER_SIGNATURE(_Hdr) (*(USHORT UNALIGNED *)(&(_Hdr)->Signature))
|
|
|
|
#endif
|
|
|
|
#define HEADER_LENGTH_A(_Hdr) ((_Hdr)->Length)
|
|
#define HEADER_SIGNATURE_A(_Hdr) ((_Hdr)->Signature)
|
|
|
|
typedef union _NBF_HDR {
|
|
NBF_HDR_GENERIC Generic;
|
|
NBF_HDR_CONNECTION ConnectionOrientedFrame;
|
|
NBF_HDR_CONNECTIONLESS ConnectionlessFrame;
|
|
} NBF_HDR;
|
|
typedef NBF_HDR UNALIGNED *PNBF_HDR;
|
|
|
|
//
|
|
// The following structures define I-frame, U-frame, and S-frame DLC headers.
|
|
//
|
|
|
|
#define DLC_SSAP_RESPONSE 0x0001 // if (ssap & DLC_SSAP_RESP), it's a response.
|
|
#define DLC_SSAP_GLOBAL 0x00ff // the global SAP.
|
|
#define DLC_SSAP_NULL 0x0000 // the null SAP.
|
|
#define DLC_SSAP_MASK 0x00fe // mask to wipe out the response bit.
|
|
#define DLC_DSAP_MASK 0x00fe // mask to wipe out the group SAP bit.
|
|
|
|
#define DLC_CMD_RR 0x01 // command code for RR.
|
|
#define DLC_CMD_RNR 0x05 // command code for RNR.
|
|
#define DLC_CMD_REJ 0x09 // command code for REJ.
|
|
|
|
#define DLC_CMD_SABME 0x6f // command code for SABME.
|
|
#define DLC_CMD_DISC 0x43 // command code for DISC.
|
|
#define DLC_CMD_UA 0x63 // command code for UA.
|
|
#define DLC_CMD_DM 0x0f // command code for DM.
|
|
#define DLC_CMD_FRMR 0x87 // command code for FRMR.
|
|
#define DLC_CMD_UI 0x03 // command code for UI.
|
|
#define DLC_CMD_XID 0xaf // command code for XID.
|
|
#define DLC_CMD_TEST 0xe3 // command code for TEST.
|
|
|
|
typedef struct _DLC_XID_INFORMATION {
|
|
UCHAR FormatId; // format of this XID frame.
|
|
UCHAR Info1; // first information byte.
|
|
UCHAR Info2; // second information byte.
|
|
} DLC_XID_INFORMATION;
|
|
typedef DLC_XID_INFORMATION UNALIGNED *PDLC_XID_INFORMATION;
|
|
|
|
typedef struct _DLC_TEST_INFORMATION {
|
|
UCHAR Buffer [10]; // this buffer is actually arbitrarily large.
|
|
} DLC_TEST_INFORMATION;
|
|
typedef DLC_TEST_INFORMATION UNALIGNED *PDLC_TEST_INFORMATION;
|
|
|
|
typedef struct _DLC_FRMR_INFORMATION {
|
|
UCHAR Command; // format: mmmpmm11, m=modifiers, p=poll/final.
|
|
UCHAR Ctrl; // control field of rejected frame.
|
|
UCHAR Vs; // our next send when error was detected.
|
|
UCHAR Vr; // our next receive when error was detected.
|
|
UCHAR Reason; // reason for sending FRMR: 000VZYXW.
|
|
} DLC_FRMR_INFORMATION;
|
|
typedef DLC_FRMR_INFORMATION UNALIGNED *PDLC_FRMR_INFORMATION;
|
|
|
|
typedef struct _DLC_U_FRAME {
|
|
UCHAR Dsap; // Destination Service Access Point.
|
|
UCHAR Ssap; // Source Service Access Point.
|
|
UCHAR Command; // command code.
|
|
union { // information field for FRMR, TEST, XID.
|
|
DLC_XID_INFORMATION XidInfo; // XID information.
|
|
DLC_TEST_INFORMATION TestInfo; // TEST information.
|
|
DLC_FRMR_INFORMATION FrmrInfo; // FRMR information.
|
|
NBF_HDR_CONNECTIONLESS NbfHeader; // UI frame contains NetBIOS header.
|
|
} Information;
|
|
} DLC_U_FRAME;
|
|
typedef DLC_U_FRAME UNALIGNED *PDLC_U_FRAME;
|
|
|
|
#define DLC_U_INDICATOR 0x03 // (cmd & DLC_U_IND) == DLC_U_IND --> U-frame.
|
|
#define DLC_U_PF 0x10 // (cmd & DLC_U_PF) -> poll/final set.
|
|
|
|
typedef struct _DLC_S_FRAME {
|
|
UCHAR Dsap; // Destination Service Access Point.
|
|
UCHAR Ssap; // Source Service Access Point.
|
|
UCHAR Command; // RR, RNR, REJ command code.
|
|
UCHAR RcvSeq; // receive seq #, bottom bit is poll/final.
|
|
} DLC_S_FRAME;
|
|
typedef DLC_S_FRAME UNALIGNED *PDLC_S_FRAME;
|
|
|
|
#define DLC_S_PF 0x01 // (rcvseq & DLC_S_PF) means poll/final set.
|
|
|
|
typedef struct _DLC_I_FRAME {
|
|
UCHAR Dsap; // Destination Service Access Point.
|
|
UCHAR Ssap; // Source Service Access Point.
|
|
UCHAR SendSeq; // send sequence number, bottom bit 0.
|
|
UCHAR RcvSeq; // rcv sequence number, bottom bit p/f.
|
|
} DLC_I_FRAME;
|
|
typedef DLC_I_FRAME UNALIGNED *PDLC_I_FRAME;
|
|
|
|
#define DLC_I_PF 0x01 // (rcvseq & DLC_I_PF) means poll/final set.
|
|
#define DLC_I_INDICATOR 0x01 // !(sndseq & DLC_I_INDICATOR) indicates I-frame.
|
|
|
|
typedef struct _DLC_FRAME {
|
|
UCHAR Dsap; // Destination Service Access Point.
|
|
UCHAR Ssap; // Source Service Access Point.
|
|
UCHAR Byte1; // command byte.
|
|
} DLC_FRAME;
|
|
typedef DLC_FRAME UNALIGNED *PDLC_FRAME;
|
|
|
|
|
|
//
|
|
// This macro builds a DLC UI-frame header.
|
|
//
|
|
|
|
#define NbfBuildUIFrameHeader(_Header) \
|
|
{ \
|
|
PDLC_FRAME DlcHeader = (PDLC_FRAME)(_Header); \
|
|
DlcHeader->Dsap = DSAP_NETBIOS_OVER_LLC; \
|
|
DlcHeader->Ssap = DSAP_NETBIOS_OVER_LLC; \
|
|
DlcHeader->Byte1 = DLC_CMD_UI; \
|
|
}
|
|
|
|
|
|
//
|
|
// Resume previous structure packing method.
|
|
//
|
|
|
|
#ifdef PACKING
|
|
|
|
#ifdef __STDC__
|
|
#pragma Pop(Align_members)
|
|
#else
|
|
#pragma pack()
|
|
#endif // def __STDC__
|
|
|
|
#endif // def PACKING
|
|
|
|
#endif // def _NBFHDRS_
|