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
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
|