Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1087 lines
31 KiB

/*++
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.\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.\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.\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.\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