summaryrefslogtreecommitdiffstats
path: root/private/ntos/tdi/nbf/framecon.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/ntos/tdi/nbf/framecon.c1087
1 files changed, 1087 insertions, 0 deletions
diff --git a/private/ntos/tdi/nbf/framecon.c b/private/ntos/tdi/nbf/framecon.c
new file mode 100644
index 000000000..6905d9668
--- /dev/null
+++ b/private/ntos/tdi/nbf/framecon.c
@@ -0,0 +1,1087 @@
+
+/*++
+
+Copyright (c) 1989, 1990, 1991 Microsoft Corporation
+
+Module Name:
+
+ framecon.c
+
+Abstract:
+
+ This module contains routines which build NetBIOS Frames Protocol frames,
+ both connection-oriented and connectionless. The following frames are
+ constructed by routines in this module:
+
+ o NBF_CMD_ADD_GROUP_NAME_QUERY
+ o NBF_CMD_ADD_NAME_QUERY
+ o NBF_CMD_NAME_IN_CONFLICT
+ o NBF_CMD_STATUS_QUERY
+ o NBF_CMD_TERMINATE_TRACE
+ o NBF_CMD_DATAGRAM
+ o NBF_CMD_DATAGRAM_BROADCAST
+ o NBF_CMD_NAME_QUERY
+ o NBF_CMD_ADD_NAME_RESPONSE
+ o NBF_CMD_NAME_RECOGNIZED
+ o NBF_CMD_STATUS_RESPONSE
+ o NBF_CMD_TERMINATE_TRACE2
+ o NBF_CMD_DATA_ACK
+ o NBF_CMD_DATA_FIRST_MIDDLE
+ o NBF_CMD_DATA_ONLY_LAST
+ o NBF_CMD_SESSION_CONFIRM
+ o NBF_CMD_SESSION_END
+ o NBF_CMD_SESSION_INITIALIZE
+ o NBF_CMD_NO_RECEIVE
+ o NBF_CMD_RECEIVE_OUTSTANDING
+ o NBF_CMD_RECEIVE_CONTINUE
+ o NBF_CMD_SESSION_ALIVE
+
+Author:
+
+ David Beaver (dbeaver) 1-July-1991
+
+Environment:
+
+ Kernel mode
+
+Revision History:
+
+--*/
+
+#include "precomp.h"
+#pragma hdrstop
+
+
+VOID
+ConstructAddGroupNameQuery(
+ IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format.
+ IN USHORT Correlator, // correlator for ADD_NAME_RESPONSE.
+ IN PNAME GroupName // NetBIOS group name to be added.
+ )
+
+/*++
+
+Routine Description:
+
+ This routine constructs an NBF_CMD_ADD_GROUP_NAME_QUERY connectionless
+ NetBIOS Frame.
+
+Arguments:
+
+ RawFrame - Pointer to an unformatted 44-byte connectionless frame buffer.
+
+ Correlator - Correlator for ADD_NAME_RESPONSE frame.
+
+ GroupName - Pointer to NetBIOS group name to be added.
+
+Return Value:
+
+ none.
+
+--*/
+
+{
+ USHORT i;
+
+ IF_NBFDBG (NBF_DEBUG_FRAMECON) {
+ NbfPrint0 ("ConstructAddGroupNameQuery: Entered.\n");
+ }
+
+ RawFrame->Command = NBF_CMD_ADD_GROUP_NAME_QUERY;
+ HEADER_LENGTH(RawFrame) = sizeof(NBF_HDR_CONNECTIONLESS);
+ HEADER_SIGNATURE(RawFrame) = NETBIOS_SIGNATURE;
+ RawFrame->Data1 = 0; // reserved field, MBZ.
+ RawFrame->Data2Low = 0;
+ RawFrame->Data2High = 0;
+ TRANSMIT_CORR(RawFrame) = Correlator;
+ RESPONSE_CORR(RawFrame) = (USHORT)0;
+ for (i=0; i<NETBIOS_NAME_LENGTH; i++) {
+ RawFrame->DestinationName [i] = 0;
+ RawFrame->SourceName [i] = GroupName [i];
+ }
+} /* ConstructAddGroupNameQuery */
+
+
+VOID
+ConstructAddNameQuery(
+ IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format.
+ IN USHORT Correlator, // correlator for ADD_NAME_RESPONSE.
+ IN PNAME Name // NetBIOS name to be added.
+ )
+
+/*++
+
+Routine Description:
+
+ This routine constructs an NBF_CMD_ADD_NAME_QUERY connectionless
+ NetBIOS Frame.
+
+Arguments:
+
+ RawFrame - Pointer to an unformatted 44-byte connectionless frame buffer.
+
+ Correlator - Correlator for ADD_NAME_RESPONSE frame.
+
+ Name - Pointer to NetBIOS name to be added.
+
+Return Value:
+
+ none.
+
+--*/
+
+{
+ USHORT i;
+
+ IF_NBFDBG (NBF_DEBUG_FRAMECON) {
+ NbfPrint0 ("ConstructAddNameQuery: Entered.\n");
+ }
+
+ RawFrame->Command = NBF_CMD_ADD_NAME_QUERY;
+ HEADER_LENGTH(RawFrame) = sizeof(NBF_HDR_CONNECTIONLESS);
+ HEADER_SIGNATURE(RawFrame) = NETBIOS_SIGNATURE;
+ RawFrame->Data1 = 0; // reserved field, MBZ.
+ RawFrame->Data2Low = 0;
+ RawFrame->Data2High = 0;
+ TRANSMIT_CORR(RawFrame) = Correlator;
+ RESPONSE_CORR(RawFrame) = (USHORT)0;
+ for (i=0; i<NETBIOS_NAME_LENGTH; i++) {
+ RawFrame->DestinationName [i] = 0;
+ RawFrame->SourceName [i] = Name [i];
+ }
+} /* ConstructAddNameQuery */
+
+
+VOID
+ConstructNameInConflict(
+ IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format.
+ IN PNAME ConflictingName, // NetBIOS name that is conflicting.
+ IN PNAME SendingPermanentName // NetBIOS permanent node name of sender.
+ )
+
+/*++
+
+Routine Description:
+
+ This routine constructs an NBF_CMD_NAME_IN_CONFLICT connectionless
+ NetBIOS Frame.
+
+Arguments:
+
+ RawFrame - Pointer to an unformatted 44-byte connectionless frame buffer.
+
+ Conflictingname - Pointer to NetBIOS name that is conflicting.
+
+ SendingPermanentName - Pointer to NetBIOS permanent node name of sender.
+
+Return Value:
+
+ none.
+
+--*/
+
+{
+ USHORT i;
+
+ IF_NBFDBG (NBF_DEBUG_FRAMECON) {
+ NbfPrint0 ("ConstructNameInConflict: Entered (BUGBUG).\n");
+ }
+
+ RawFrame->Command = NBF_CMD_NAME_IN_CONFLICT;
+ HEADER_LENGTH(RawFrame) = sizeof(NBF_HDR_CONNECTIONLESS);
+ HEADER_SIGNATURE(RawFrame) = NETBIOS_SIGNATURE;
+ RawFrame->Data1 = 0; // reserved field, MBZ.
+ RawFrame->Data2Low = 0;
+ RawFrame->Data2High = 0;
+ TRANSMIT_CORR(RawFrame) = (USHORT)0;
+ RESPONSE_CORR(RawFrame) = (USHORT)0;
+ for (i=0; i<NETBIOS_NAME_LENGTH; i++) {
+ RawFrame->DestinationName [i] = ConflictingName[i];
+ RawFrame->SourceName [i] = SendingPermanentName[i];
+ }
+
+} /* ConstructNameInConflict */
+
+
+VOID
+ConstructStatusQuery(
+ IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format.
+ IN UCHAR RequestType, // type of request.
+ IN USHORT BufferLength, // length of user's status buffer.
+ IN USHORT Correlator, // correlator for STATUS_RESPONSE.
+ IN PNAME ReceiverName, // NetBIOS name of receiver.
+ IN PNAME SendingPermanentName // NetBIOS permanent node name of sender.
+ )
+
+/*++
+
+Routine Description:
+
+ This routine constructs an NBF_CMD_STATUS_QUERY connectionless
+ NetBIOS Frame.
+
+Arguments:
+
+ RawFrame - Pointer to an unformatted 44-byte connectionless frame buffer.
+
+ RequestType - Type of request. One of:
+ 0 - request is 1.x or 2.0.
+ 1 - first request, 2.1 or above.
+ >1 - subsequent request, 2.1 or above.
+
+ BufferLength - Length of user's status buffer.
+
+ Correlator - Correlator for STATUS_RESPONSE frame.
+
+ ReceiverName - Pointer to NetBIOS name of receiver.
+
+ SendingPermanentName - Pointer to NetBIOS permanent node name of sender.
+
+Return Value:
+
+ none.
+
+--*/
+
+{
+ SHORT i;
+
+ IF_NBFDBG (NBF_DEBUG_FRAMECON) {
+ NbfPrint1 ("ConstructStatusQuery: Entered, frame: %lx\n", RawFrame);
+ }
+
+ RawFrame->Command = NBF_CMD_STATUS_QUERY;
+ HEADER_LENGTH(RawFrame) = sizeof(NBF_HDR_CONNECTIONLESS);
+ HEADER_SIGNATURE(RawFrame) = NETBIOS_SIGNATURE;
+ RawFrame->Data1 = RequestType;
+ RawFrame->Data2Low = (UCHAR)(BufferLength & 0xff);
+ RawFrame->Data2High = (UCHAR)(BufferLength >> 8);
+ TRANSMIT_CORR(RawFrame) = (USHORT)0;
+ RESPONSE_CORR(RawFrame) = Correlator;
+ for (i=0; i<NETBIOS_NAME_LENGTH; i++) {
+ RawFrame->DestinationName [i] = ReceiverName [i];
+ RawFrame->SourceName [i] = SendingPermanentName [i];
+ }
+
+} /* ConstructStatusQuery */
+
+
+VOID
+ConstructDatagram(
+ IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format.
+ IN PNAME ReceiverName, // NetBIOS name of receiver.
+ IN PNAME SenderName // NetBIOS name of sender.
+ )
+
+/*++
+
+Routine Description:
+
+ This routine constructs an NBF_CMD_DATAGRAM connectionless
+ NetBIOS Frame.
+
+Arguments:
+
+ RawFrame - Pointer to an unformatted 44-byte connectionless frame buffer.
+
+ ReceiverName - Pointer to a NetBIOS name of the receiver.
+
+ SenderName - Pointer to a NetBIOS name of the sender.
+
+Return Value:
+
+ none.
+
+--*/
+
+{
+ USHORT i;
+
+ IF_NBFDBG (NBF_DEBUG_FRAMECON) {
+ NbfPrint0 ("ConstructDatagram: Entered.\n");
+ }
+
+ RawFrame->Command = NBF_CMD_DATAGRAM;
+ HEADER_LENGTH(RawFrame) = sizeof(NBF_HDR_CONNECTIONLESS);
+ HEADER_SIGNATURE(RawFrame) = NETBIOS_SIGNATURE;
+ RawFrame->Data1 = 0; // reserved field, MBZ.
+ RawFrame->Data2Low = 0;
+ RawFrame->Data2High = 0;
+ TRANSMIT_CORR(RawFrame) = (USHORT)0;
+ RESPONSE_CORR(RawFrame) = (USHORT)0;
+ for (i=0; i<NETBIOS_NAME_LENGTH; i++) {
+ RawFrame->DestinationName [i] = ReceiverName [i];
+ RawFrame->SourceName [i] = SenderName [i];
+ }
+} /* ConstructDatagram */
+
+
+VOID
+ConstructDatagramBroadcast(
+ IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format.
+ IN PNAME SenderName // NetBIOS name of sender.
+ )
+
+/*++
+
+Routine Description:
+
+ This routine constructs an NBF_CMD_DATAGRAM_BROADCAST connectionless
+ NetBIOS Frame.
+
+Arguments:
+
+ RawFrame - Pointer to an unformatted 44-byte connectionless frame buffer.
+
+ SenderName - Pointer to a NetBIOS name of the sender.
+
+Return Value:
+
+ none.
+
+--*/
+
+{
+ USHORT i;
+
+ IF_NBFDBG (NBF_DEBUG_FRAMECON) {
+ NbfPrint0 ("ConstructDatagramBroadcast: Entered.\n");
+ }
+
+ RawFrame->Command = NBF_CMD_DATAGRAM_BROADCAST;
+ HEADER_LENGTH(RawFrame) = sizeof(NBF_HDR_CONNECTIONLESS);
+ HEADER_SIGNATURE(RawFrame) = NETBIOS_SIGNATURE;
+ RawFrame->Data1 = 0; // reserved field, MBZ.
+ RawFrame->Data2Low = 0;
+ RawFrame->Data2High = 0;
+ TRANSMIT_CORR(RawFrame) = (USHORT)0;
+ RESPONSE_CORR(RawFrame) = (USHORT)0;
+ for (i=0; i<NETBIOS_NAME_LENGTH; i++) {
+ RawFrame->DestinationName [i] = 0;
+ RawFrame->SourceName [i] = SenderName [i];
+ }
+} /* ConstructDatagramBroadcast */
+
+
+VOID
+ConstructNameQuery(
+ IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format.
+ IN UCHAR NameType, // type of name.
+ IN UCHAR LocalSessionNumber, // LSN assigned to session (0=FIND_NAME).
+ IN USHORT Correlator, // correlator in NAME_RECOGNIZED.
+ IN PNAME SenderName, // NetBIOS name of sender.
+ IN PNAME ReceiverName // NetBIOS name of receiver.
+ )
+
+/*++
+
+Routine Description:
+
+ This routine constructs an NBF_CMD_NAME_QUERY connectionless
+ NetBIOS Frame.
+
+Arguments:
+
+ RawFrame - Pointer to an unformatted 44-byte connectionless frame buffer.
+
+ NameType - Type of name, one of the following:
+ NAME_QUERY_LSN_FIND_NAME
+
+ LocalSessionNumber - LSN assigned to session (0=FIND.NAME).
+
+ Correlator - Correlator in NAME_RECOGNIZED.
+
+ SenderName - Pointer to a NetBIOS name of the sender.
+
+ ReceiverName - Pointer to a NetBIOS name of the receiver.
+
+Return Value:
+
+ none.
+
+--*/
+
+{
+ SHORT i;
+
+ IF_NBFDBG (NBF_DEBUG_FRAMECON) {
+ NbfPrint1 ("ConstructNameQuery: Entered, frame: %lx\n", RawFrame);
+ }
+
+ RawFrame->Command = NBF_CMD_NAME_QUERY;
+ HEADER_LENGTH(RawFrame) = sizeof(NBF_HDR_CONNECTIONLESS);
+ HEADER_SIGNATURE(RawFrame) = NETBIOS_SIGNATURE;
+ RawFrame->Data1 = 0; // reserved field, MBZ.
+ RawFrame->Data2Low = LocalSessionNumber;
+ RawFrame->Data2High = NameType;
+ TRANSMIT_CORR(RawFrame) = (USHORT)0;
+ RESPONSE_CORR(RawFrame) = Correlator;
+ for (i=0; i<NETBIOS_NAME_LENGTH; i++) {
+ RawFrame->DestinationName [i] = ReceiverName [i];
+ RawFrame->SourceName [i] = SenderName [i];
+ }
+} /* ConstructNameQuery */
+
+
+VOID
+ConstructAddNameResponse(
+ IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format.
+ IN UCHAR NameType, // type of name.
+ IN USHORT Correlator, // correlator from ADD_[GROUP_]NAME_QUERY.
+ IN PNAME Name // NetBIOS name being responded to.
+ )
+
+/*++
+
+Routine Description:
+
+ This routine constructs an NBF_CMD_ADD_NAME_RESPONSE connectionless
+ NetBIOS Frame.
+
+Arguments:
+
+ RawFrame - Pointer to an unformatted 44-byte connectionless frame buffer.
+
+ NameType - Type of name, either group or unique.
+
+ Correlator - Correlator from ADD_[GROUP]NAME_QUERY.
+
+ Name - Pointer to NetBIOS name being responded to.
+
+Return Value:
+
+ none.
+
+--*/
+
+{
+ USHORT i;
+
+ IF_NBFDBG (NBF_DEBUG_FRAMECON) {
+ NbfPrint0 ("ConstructAddNameResponse: Entered (BUGBUG).\n");
+ }
+
+ RawFrame->Command = NBF_CMD_ADD_NAME_RESPONSE;
+ HEADER_LENGTH(RawFrame) = sizeof(NBF_HDR_CONNECTIONLESS);
+ HEADER_SIGNATURE(RawFrame) = NETBIOS_SIGNATURE;
+ RawFrame->Data1 = 0; // reserved field, MBZ.
+ RawFrame->Data2Low = NameType;
+ RawFrame->Data2High = 0;
+ TRANSMIT_CORR(RawFrame) = Correlator;
+ RESPONSE_CORR(RawFrame) = (USHORT)0;
+ for (i=0; i<NETBIOS_NAME_LENGTH; i++) {
+ RawFrame->DestinationName [i] = Name [i];
+ RawFrame->SourceName [i] = Name [i];
+ }
+} /* ConstructAddNameResponse */
+
+
+VOID
+ConstructNameRecognized(
+ IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format.
+ IN UCHAR NameType, // type of name.
+ IN UCHAR LocalSessionNumber, // LSN assigned to session.
+ IN USHORT NameQueryCorrelator, // correlator from NAME_QUERY.
+ IN USHORT Correlator, // correlator expected from next response.
+ IN PNAME SenderName, // NetBIOS name of sender.
+ IN PNAME ReceiverName // NetBIOS name of receiver.
+ )
+
+/*++
+
+Routine Description:
+
+ This routine constructs an NBF_CMD_NAME_RECOGNIZED connectionless
+ NetBIOS Frame.
+
+Arguments:
+
+ RawFrame - Pointer to an unformatted 44-byte connectionless frame buffer.
+
+ NameType - Type of name, either group or unique.
+
+ LocalSessionNumber - LSN assigned to session. Special values are:
+ NAME_RECOGNIZED_LSN_NO_LISTENS // no listens available.
+ NAME_RECOGNIZED_LSN_FIND_NAME // this is a find name response.
+ NAME_RECOGNIZED_LSN_NO_RESOURCE // listen available, but no resources.
+
+ NameQueryCorrelator - Correlator from NAME_QUERY.
+
+ Correlator - Correlator expected from next response.
+
+ SenderName - Pointer to a NetBIOS name of the sender.
+
+ ReceiverName - Pointer to a NetBIOS name of the receiver.
+
+Return Value:
+
+ none.
+
+--*/
+
+{
+ USHORT i;
+
+ IF_NBFDBG (NBF_DEBUG_FRAMECON) {
+ NbfPrint0 ("ConstructNameRecognized: Entered.\n");
+ }
+
+ RawFrame->Command = NBF_CMD_NAME_RECOGNIZED;
+ HEADER_LENGTH(RawFrame) = sizeof(NBF_HDR_CONNECTIONLESS);
+ HEADER_SIGNATURE(RawFrame) = NETBIOS_SIGNATURE;
+ RawFrame->Data1 = 0; // reserved field, MBZ.
+ RawFrame->Data2Low = LocalSessionNumber;
+ RawFrame->Data2High = NameType;
+ TRANSMIT_CORR(RawFrame) = NameQueryCorrelator;
+ RESPONSE_CORR(RawFrame) = Correlator;
+ for (i=0; i<NETBIOS_NAME_LENGTH; i++) {
+ RawFrame->DestinationName [i] = ReceiverName [i];
+ RawFrame->SourceName [i] = SenderName [i];
+ }
+} /* ConstructNameRecognized */
+
+
+VOID
+ConstructStatusResponse(
+ IN PNBF_HDR_CONNECTIONLESS RawFrame,// frame buffer to format.
+ IN UCHAR RequestType, // type of request, defined below.
+ IN BOOLEAN Truncated, // data is truncated.
+ IN BOOLEAN DataOverflow, // too much data for user's buffer.
+ IN USHORT DataLength, // length of data sent.
+ IN USHORT Correlator, // correlator from STATUS_QUERY.
+ IN PNAME ReceivingPermanentName, // NetBIOS permanent node name of receiver.
+ IN PNAME SenderName // NetBIOS name of sender.
+ )
+
+/*++
+
+Routine Description:
+
+ This routine constructs an NBF_CMD_STATUS_RESPONSE connectionless
+ NetBIOS Frame.
+
+Arguments:
+
+ RawFrame - Pointer to an unformatted 44-byte connectionless frame buffer.
+
+ RequestType - type of request, one of the below:
+ 0 - request is 1.x or 2.0.
+ >0 - number of names, 2.1 or above.
+
+ Truncated - TRUE if there are more names.
+
+ DataOverflow - TRUE if the total data is larger than the user's buffer.
+
+ DataLength - The length of the data in Buffer.
+
+ Correlator - Correlator from STATUS_QUERY.
+
+ ReceivingPermanentName - Pointer to the NetBIOS permanent node name of the receiver,
+ as passed in the STATUS_QUERY frame.
+
+ SenderName - Pointer to a NetBIOS name of the sender.
+
+Return Value:
+
+ none.
+
+--*/
+
+{
+ SHORT i;
+
+ IF_NBFDBG (NBF_DEBUG_FRAMECON) {
+ NbfPrint0 ("ConstructStatusResponse: Entered (BUGBUG).\n");
+ }
+
+ RawFrame->Command = NBF_CMD_STATUS_RESPONSE;
+ HEADER_LENGTH(RawFrame) = sizeof(NBF_HDR_CONNECTIONLESS);
+ HEADER_SIGNATURE(RawFrame) = NETBIOS_SIGNATURE;
+ RawFrame->Data1 = RequestType;
+ RawFrame->Data2Low = (UCHAR)(DataLength & 0xff);
+ RawFrame->Data2High = (UCHAR)((DataLength >> 8) +
+ (Truncated << 7) +
+ (DataOverflow << 6));
+ TRANSMIT_CORR(RawFrame) = Correlator;
+ RESPONSE_CORR(RawFrame) = 0;
+ for (i=0; i<NETBIOS_NAME_LENGTH; i++) {
+ RawFrame->DestinationName [i] = ReceivingPermanentName [i];
+ RawFrame->SourceName [i] = SenderName [i];
+ }
+
+} /* ConstructStatusResponse */
+
+
+VOID
+ConstructDataAck(
+ IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format.
+ IN USHORT Correlator, // correlator from DATA_ONLY_LAST.
+ IN UCHAR LocalSessionNumber, // session number of SENDER.
+ IN UCHAR RemoteSessionNumber // session number of RECEIVER.
+ )
+
+/*++
+
+Routine Description:
+
+ This routine constructs an NBF_CMD_DATA_ACK connection-oriented
+ NetBIOS Frame.
+
+Arguments:
+
+ RawFrame - Pointer to an unformatted 14-byte connection-oriented buffer.
+
+ Correlator - Correlator from DATA_ONLY_LAST being acked.
+
+ LocalSessionNumber - Session number of SENDER.
+
+ RemoteSessionNumber - Session number of RECEIVER.
+
+Return Value:
+
+ none.
+
+--*/
+
+{
+ IF_NBFDBG (NBF_DEBUG_FRAMECON) {
+ NbfPrint0 ("ConstructDataAck: Entered.\n");
+ }
+
+ RawFrame->Command = NBF_CMD_DATA_ACK;
+ HEADER_LENGTH(RawFrame) = sizeof(NBF_HDR_CONNECTION);
+ HEADER_SIGNATURE(RawFrame) = NETBIOS_SIGNATURE;
+ RawFrame->Data1 = 0;
+ RawFrame->Data2Low = 0;
+ RawFrame->Data2High = 0;
+ TRANSMIT_CORR(RawFrame) = Correlator;
+ RESPONSE_CORR(RawFrame) = (USHORT)0;
+ RawFrame->SourceSessionNumber = LocalSessionNumber;
+ RawFrame->DestinationSessionNumber = RemoteSessionNumber;
+} /* ConstructDataAck */
+
+
+VOID
+ConstructDataOnlyLast(
+ IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format.
+ IN BOOLEAN Resynched, // TRUE if we are resynching.
+ IN USHORT Correlator, // correlator for RECEIVE_CONTINUE.
+ IN UCHAR LocalSessionNumber, // session number of SENDER.
+ IN UCHAR RemoteSessionNumber // session number of RECEIVER.
+ )
+
+/*++
+
+Routine Description:
+
+ This routine constructs an NBF_CMD_DATA_ONLY_LAST connection-oriented
+ NetBIOS Frame.
+
+Arguments:
+
+ RawFrame - Pointer to an unformatted 14-byte connection-oriented buffer.
+
+ Resynched - TRUE if we are resynching and should set the
+ correct bit in the frame.
+
+ Correlator - Correlator for RECEIVE_CONTINUE, if any.
+
+ LocalSessionNumber - Session number of SENDER.
+
+ RemoteSessionNumber - Session number of RECEIVER.
+
+Return Value:
+
+ none.
+
+--*/
+
+{
+ IF_NBFDBG (NBF_DEBUG_FRAMECON) {
+ NbfPrint0 ("ConstructDataOnlyLast: Entered.\n");
+ }
+
+ RawFrame->Command = NBF_CMD_DATA_ONLY_LAST;
+ HEADER_LENGTH(RawFrame) = sizeof(NBF_HDR_CONNECTION);
+ HEADER_SIGNATURE(RawFrame) = NETBIOS_SIGNATURE;
+ RawFrame->Data1 = 0;
+ ASSERT (TRUE == (UCHAR)1);
+ RawFrame->Data2Low = Resynched;
+ RawFrame->Data2High = (UCHAR)0;
+ TRANSMIT_CORR(RawFrame) = (USHORT)0;
+ RESPONSE_CORR(RawFrame) = Correlator;
+ RawFrame->SourceSessionNumber = LocalSessionNumber;
+ RawFrame->DestinationSessionNumber = RemoteSessionNumber;
+} /* ConstructDataOnlyLast */
+
+
+VOID
+ConstructSessionConfirm(
+ IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format.
+ IN UCHAR Options, // bitflag options, defined below.
+ IN USHORT MaximumUserBufferSize, // max size of user frame on session.
+ IN USHORT Correlator, // correlator from SESSION_INITIALIZE.
+ IN UCHAR LocalSessionNumber, // session number of SENDER.
+ IN UCHAR RemoteSessionNumber // session number of RECEIVER.
+ )
+
+/*++
+
+Routine Description:
+
+ This routine constructs an NBF_CMD_SESSION_CONFIRM connection-oriented
+ NetBIOS Frame.
+
+Arguments:
+
+ RawFrame - Pointer to an unformatted 14-byte connection-oriented buffer.
+
+ Options - Bitflag options, any of the following:
+ SESSION_CONFIRM_OPTIONS_20 // set if NETBIOS 2.0 or above.
+ SESSION_CONFIRM_NO_ACK // set if NO.ACK protocol supported.
+
+ MaximumUserBufferSize - Maximum size of user data per frame on this
+ session, in bytes. This is limited by the following constant:
+ SESSION_CONFIRM_MAXIMUM_FRAME_SIZE // defined limit of this field.
+
+ Correlator - Correlator from SESSION_INITIALIZE.
+
+ LocalSessionNumber - Session number of SENDER.
+
+ RemoteSessionNumber - Session number of RECEIVER.
+
+Return Value:
+
+ none.
+
+--*/
+
+{
+ IF_NBFDBG (NBF_DEBUG_FRAMECON) {
+ NbfPrint0 ("ConstructSessionConfirm: Entered.\n");
+ }
+
+ RawFrame->Command = NBF_CMD_SESSION_CONFIRM;
+ HEADER_LENGTH(RawFrame) = sizeof(NBF_HDR_CONNECTION);
+ HEADER_SIGNATURE(RawFrame) = NETBIOS_SIGNATURE;
+ RawFrame->Data1 = Options;
+ RawFrame->Data2Low = (UCHAR)(MaximumUserBufferSize & 0xff);
+ RawFrame->Data2High = (UCHAR)(MaximumUserBufferSize >> 8);
+ TRANSMIT_CORR(RawFrame) = Correlator;
+ RESPONSE_CORR(RawFrame) = (USHORT)0;
+ RawFrame->SourceSessionNumber = LocalSessionNumber;
+ RawFrame->DestinationSessionNumber = RemoteSessionNumber;
+} /* ConstructSessionConfirm */
+
+
+VOID
+ConstructSessionEnd(
+ IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format.
+ IN USHORT Reason, // reason for termination, defined below.
+ IN UCHAR LocalSessionNumber, // session number of SENDER.
+ IN UCHAR RemoteSessionNumber // session number of RECEIVER.
+ )
+
+/*++
+
+Routine Description:
+
+ This routine constructs an NBF_CMD_SESSION_END connection-oriented
+ NetBIOS Frame.
+
+Arguments:
+
+ RawFrame - Pointer to an unformatted 14-byte connection-oriented buffer.
+
+ Reason - Reason code for termination, any of the following:
+ SESSION_END_REASON_HANGUP // normal termination via HANGUP.
+ SESSION_END_REASON_ABEND // abnormal session termination.
+
+ LocalSessionNumber - Session number of SENDER.
+
+ RemoteSessionNumber - Session number of RECEIVER.
+
+Return Value:
+
+ none.
+
+--*/
+
+{
+ IF_NBFDBG (NBF_DEBUG_FRAMECON) {
+ NbfPrint0 ("ConstructSessionEnd: Entered (BUGBUG).\n");
+ }
+
+ RawFrame->Command = NBF_CMD_SESSION_END;
+ HEADER_LENGTH(RawFrame) = sizeof(NBF_HDR_CONNECTION);
+ HEADER_SIGNATURE(RawFrame) = NETBIOS_SIGNATURE;
+ RawFrame->Data1 = 0;
+ RawFrame->Data2Low = (UCHAR)(Reason & 0xff);
+ RawFrame->Data2High = (UCHAR)(Reason >> 8);
+ TRANSMIT_CORR(RawFrame) = (USHORT)0;
+ RESPONSE_CORR(RawFrame) = (USHORT)0;
+ RawFrame->SourceSessionNumber = LocalSessionNumber;
+ RawFrame->DestinationSessionNumber = RemoteSessionNumber;
+} /* ConstructSessionEnd */
+
+
+VOID
+ConstructSessionInitialize(
+ IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format.
+ IN UCHAR Options, // bitflag options, defined below.
+ IN USHORT MaximumUserBufferSize, // max size of user frame on session.
+ IN USHORT NameRecognizedCorrelator, // correlator from NAME_RECOGNIZED.
+ IN USHORT Correlator, // correlator for SESSION_CONFIRM.
+ IN UCHAR LocalSessionNumber, // session number of SENDER.
+ IN UCHAR RemoteSessionNumber // session number of RECEIVER.
+ )
+
+/*++
+
+Routine Description:
+
+ This routine constructs an NBF_CMD_SESSION_INITIALIZE connection-oriented
+ NetBIOS Frame.
+
+Arguments:
+
+ RawFrame - Pointer to an unformatted 14-byte connection-oriented buffer.
+
+ Options - Bitflag options, any of the following:
+ SESSION_INITIALIZE_OPTIONS_20 // set if NETBIOS 2.0 or above.
+ SESSION_INITIALIZE_NO_ACK // set if NO.ACK protocol supported.
+
+ MaximumUserBufferSize - Maximum size of user data per frame on this
+ session, in bytes. This is limited by the following constant:
+ SESSION_INITIALIZE_MAXIMUM_FRAME_SIZE // defined limit of this field.
+
+ NameRecognizedCorrelator - Correlator from NAME_RECOGNIZED.
+
+ Correlator - Correlator for SESSION_CONFIRM.
+
+ LocalSessionNumber - Session number of SENDER.
+
+ RemoteSessionNumber - Session number of RECEIVER.
+
+Return Value:
+
+ none.
+
+--*/
+
+{
+ IF_NBFDBG (NBF_DEBUG_FRAMECON) {
+ NbfPrint0 ("ConstructSessionInitialize: Entered.\n");
+ }
+
+ RawFrame->Command = NBF_CMD_SESSION_INITIALIZE;
+ HEADER_LENGTH(RawFrame) = sizeof(NBF_HDR_CONNECTION);
+ HEADER_SIGNATURE(RawFrame) = NETBIOS_SIGNATURE;
+ RawFrame->Data1 = Options;
+ RawFrame->Data2Low = (UCHAR)(MaximumUserBufferSize & 0xff);
+ RawFrame->Data2High = (UCHAR)(MaximumUserBufferSize >> 8);
+ TRANSMIT_CORR(RawFrame) = NameRecognizedCorrelator;
+ RESPONSE_CORR(RawFrame) = Correlator;
+ RawFrame->SourceSessionNumber = LocalSessionNumber;
+ RawFrame->DestinationSessionNumber = RemoteSessionNumber;
+} /* ConstructSessionInitialize */
+
+
+VOID
+ConstructNoReceive(
+ IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format.
+ IN USHORT Options, // option bitflags, defined below.
+ IN USHORT BytesAccepted, // number of bytes accepted.
+ IN UCHAR LocalSessionNumber, // session number of SENDER.
+ IN UCHAR RemoteSessionNumber // session number of RECEIVER.
+ )
+
+/*++
+
+Routine Description:
+
+ This routine constructs an NBF_CMD_NO_RECEIVE connection-oriented
+ NetBIOS Frame.
+
+Arguments:
+
+ RawFrame - Pointer to an unformatted 14-byte connection-oriented buffer.
+
+ Options - Bitflag options, any of the following:
+ NO_RECEIVE_OPTIONS_PARTIAL_NO_ACK // NO.ACK data partially received.
+
+ BytesAccepted - Number of bytes accepted, current outstanding message.
+
+ LocalSessionNumber - Session number of SENDER.
+
+ RemoteSessionNumber - Session number of RECEIVER.
+
+Return Value:
+
+ none.
+
+--*/
+
+{
+// Options; // prevent compiler warnings
+
+ IF_NBFDBG (NBF_DEBUG_FRAMECON) {
+ NbfPrint0 ("ConstructNoReceive: Entered.\n");
+ }
+
+ RawFrame->Command = NBF_CMD_NO_RECEIVE;
+ HEADER_LENGTH(RawFrame) = sizeof(NBF_HDR_CONNECTION);
+ HEADER_SIGNATURE(RawFrame) = NETBIOS_SIGNATURE;
+ if (Options == NO_RECEIVE_PARTIAL_NO_ACK) {
+ RawFrame->Data1 = NO_RECEIVE_PARTIAL_NO_ACK;
+ } else {
+ RawFrame->Data1 = 0;
+ }
+ RawFrame->Data2Low = (UCHAR)(BytesAccepted & 0xff);
+ RawFrame->Data2High = (UCHAR)(BytesAccepted >> 8);
+ TRANSMIT_CORR(RawFrame) = (USHORT)0;
+ RESPONSE_CORR(RawFrame) = (USHORT)0;
+ RawFrame->SourceSessionNumber = LocalSessionNumber;
+ RawFrame->DestinationSessionNumber = RemoteSessionNumber;
+} /* ConstructNoReceive */
+
+
+VOID
+ConstructReceiveOutstanding(
+ IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format.
+ IN USHORT BytesAccepted, // number of bytes accepted.
+ IN UCHAR LocalSessionNumber, // session number of SENDER.
+ IN UCHAR RemoteSessionNumber // session number of RECEIVER.
+ )
+
+/*++
+
+Routine Description:
+
+ This routine constructs an NBF_CMD_RECEIVE_OUTSTANDING connection-oriented
+ NetBIOS Frame.
+
+Arguments:
+
+ RawFrame - Pointer to an unformatted 14-byte connection-oriented buffer.
+
+ BytesAccepted - Number of bytes accepted, current outstanding message.
+
+ LocalSessionNumber - Session number of SENDER.
+
+ RemoteSessionNumber - Session number of RECEIVER.
+
+Return Value:
+
+ none.
+
+--*/
+
+{
+ IF_NBFDBG (NBF_DEBUG_FRAMECON) {
+ NbfPrint0 ("ConstructReceiveOutstanding: Entered.\n");
+ }
+
+ RawFrame->Command = NBF_CMD_RECEIVE_OUTSTANDING;
+ HEADER_LENGTH(RawFrame) = sizeof(NBF_HDR_CONNECTION);
+ HEADER_SIGNATURE(RawFrame) = NETBIOS_SIGNATURE;
+ RawFrame->Data1 = 0;
+ RawFrame->Data2Low = (UCHAR)(BytesAccepted & 0xff);
+ RawFrame->Data2High = (UCHAR)(BytesAccepted >> 8);
+ TRANSMIT_CORR(RawFrame) = (USHORT)0;
+ RESPONSE_CORR(RawFrame) = (USHORT)0;
+ RawFrame->SourceSessionNumber = LocalSessionNumber;
+ RawFrame->DestinationSessionNumber = RemoteSessionNumber;
+} /* ConstructReceiveOutstanding */
+
+
+VOID
+ConstructReceiveContinue(
+ IN PNBF_HDR_CONNECTION RawFrame, // frame buffer to format.
+ IN USHORT Correlator, // correlator from DATA_FIRST_MIDDLE
+ IN UCHAR LocalSessionNumber, // session number of SENDER.
+ IN UCHAR RemoteSessionNumber // session number of RECEIVER.
+ )
+
+/*++
+
+Routine Description:
+
+ This routine constructs an NBF_CMD_RECEIVE_CONTINUE connection-oriented
+ NetBIOS Frame.
+
+Arguments:
+
+ RawFrame - Pointer to an unformatted 14-byte connection-oriented buffer.
+
+ Correlator - The correlator from the DATA_FIRST_MIDDLE frame.
+
+ LocalSessionNumber - Session number of SENDER.
+
+ RemoteSessionNumber - Session number of RECEIVER.
+
+Return Value:
+
+ none.
+
+--*/
+
+{
+ IF_NBFDBG (NBF_DEBUG_FRAMECON) {
+ NbfPrint0 ("ConstructReceiveContinue: Entered.\n");
+ }
+
+ RawFrame->Command = NBF_CMD_RECEIVE_CONTINUE;
+ HEADER_LENGTH(RawFrame) = sizeof(NBF_HDR_CONNECTION);
+ HEADER_SIGNATURE(RawFrame) = NETBIOS_SIGNATURE;
+ RawFrame->Data1 = 0;
+ RawFrame->Data2Low = 0;
+ RawFrame->Data2High = 0;
+ TRANSMIT_CORR(RawFrame) = Correlator;
+ RESPONSE_CORR(RawFrame) = (USHORT)0;
+ RawFrame->SourceSessionNumber = LocalSessionNumber;
+ RawFrame->DestinationSessionNumber = RemoteSessionNumber;
+} /* ConstructReceiveContinue */
+
+#if 0
+
+VOID
+ConstructSessionAlive(
+ IN PNBF_HDR_CONNECTION RawFrame // frame buffer to format.
+ )
+
+/*++
+
+Routine Description:
+
+ This routine constructs an NBF_CMD_SESSION_ALIVE connection-oriented
+ NetBIOS Frame.
+
+Arguments:
+
+ RawFrame - Pointer to an unformatted 14-byte connection-oriented buffer.
+
+Return Value:
+
+ none.
+
+--*/
+
+{
+ IF_NBFDBG (NBF_DEBUG_FRAMECON) {
+ NbfPrint0 ("ConstructSessionAlive: Entered.\n");
+ }
+
+ RawFrame->Command = NBF_CMD_SESSION_ALIVE;
+ HEADER_LENGTH(RawFrame) = sizeof(NBF_HDR_CONNECTION);
+ HEADER_SIGNATURE(RawFrame) = NETBIOS_SIGNATURE;
+ RawFrame->Data1 = 0;
+ RawFrame->Data2Low = 0;
+ RawFrame->Data2High = 0;
+ TRANSMIT_CORR(RawFrame) = (USHORT)0;
+ RESPONSE_CORR(RawFrame) = (USHORT)0;
+ RawFrame->SourceSessionNumber = 0;
+ RawFrame->DestinationSessionNumber = 0;
+} /* ConstructSessionAlive */
+
+#endif