|
|
/*++
Copyright (c) 1991 Microsoft Corporation (c) 1991 Nokia Data Systems AB
Module Name:
ntccbs.h
Abstract:
This file defines the internal DLC API data structures used by Windows/NT DLC. Most parameter structures are copied directly, but here are also defined some new structures for internal use. Author:
Antti Saarenheimo [o-anttis] 6-JUNE-1991
Revision History:
--*/
/*
The commands in alphanumeric order (just saved here)
LLC_BUFFER_CREATE 0x0025 LLC_BUFFER_FREE 0x0027 LLC_BUFFER_GET 0x0026 LLC_DIR_CLOSE_ADAPTER 0x0004 LLC_DIR_CLOSE_DIRECT 0x0034 LLC_DIR_INITIALIZE 0x0020 LLC_DIR_INTERRUPT 0x0000 LLC_DIR_OPEN_ADAPTER 0x0003 LLC_DIR_OPEN_DIRECT 0x0035 LLC_DIR_READ_LOG 0x0008 LLC_DIR_SET_EXCEPTION_FLAGS 0x002D LLC_DIR_SET_FUNCTIONAL_ADDRESS 0x0007 LLC_DIR_SET_GROUP_ADDRESS 0x0006 LLC_DIR_STATUS 0x0021 LLC_DIR_TIMER_CANCEL 0x0023 LLC_DIR_TIMER_CANCEL_GROUP 0x002C LLC_DIR_TIMER_SET 0x0022 LLC_DLC_CLOSE_SAP 0x0016 LLC_DLC_CLOSE_STATION 0x001A LLC_DLC_CONNECT_STATION 0x001B LLC_DLC_FLOW_CONTROL 0x001D LLC_DLC_MODIFY 0x001C LLC_DLC_OPEN_SAP 0x0015 LLC_DLC_OPEN_STATION 0x0019 LLC_DLC_REALLOCATE_STATIONS 0x0017 LLC_DLC_RESET 0x0014 LLC_DLC_SET_THRESHOLD 0x0033 LLC_DLC_STATISTICS 0x001E LLC_READ 0x0031 LLC_READ_CANCEL 0x0032 LLC_RECEIVE 0x0028 LLC_RECEIVE_CANCEL 0x0029 LLC_RECEIVE_MODIFY 0x002A LLC_TRANSMIT_DIR_FRAME 0x000A LLC_TRANSMIT_FRAMES 0x0009 LLC_TRANSMIT_I_FRAME 0x000B LLC_TRANSMIT_TEST_CMD 0x0011 LLC_TRANSMIT_UI_FRAME 0x000D LLC_TRANSMIT_XID_CMD 0x000E LLC_TRANSMIT_XID_RESP_FINAL 0x000F LLC_TRANSMIT_XID_RESP_NOT_FINAL 0x0010
*/
//
// Change this version number whenever the driver-acslan api has
// been changed or both modules must be changed.
//
#define NT_DLC_IOCTL_VERSION 1
//
// Defines the maximum number of buffer segments used in a transmit.
// Max IBM token-ring frame may consist about 72 buffers ((18 * 4) * 256),
// if the application uses 256 bytes as its buffer size.
//
#define MAX_TRANSMIT_SEGMENTS 128 // takes about 1 kB in stack!!!
//
// We use three different CCB structures: the first one is needed
// to allocate space for whole ccb, if READ and RECEIVE parameter table
// is catenated to CCB structure (=> we have only one output buffer).
// The second input CCB buffer is used with the commands having no
// input parameters except those in CCB parameter table field
// (all close commands, DirTimerSet).
// The last buffer is always returned by asynchronous dlc commands.
//
typedef struct _NT_DLC_CCB { IN UCHAR uchAdapterNumber; // Adapter 0 or 1
IN UCHAR uchDlcCommand; // DLC command
OUT UCHAR uchDlcStatus; // DLC command completion code
OUT UCHAR uchInformation; // # successful transmits
IN PVOID pCcbAddress; IN ULONG CommandCompletionFlag; union { IN PLLC_PARMS pParameterTable; // pointer to the parameter table
IN PVOID pMdl; struct { IN USHORT usStationId; // Station id
IN USHORT usParameter; // optional parameter
} dlc; struct { IN USHORT usParameter0; // first optional parameter
IN USHORT usParameter1; // second optional parameter
} dir; IN UCHAR auchBuffer[4]; // group/functional address
IN ULONG ulParameter; } u; ULONG Reserved1; ULONG Reserved2;
// (I am still thinking about this):
//
// The multiple frame transmit should return the number a successfully
// sent frames or otherwise it's not useable for higher protocols.
// We should actually free the transmit buffers only as far as the
// transmits succeeds. The buffers should not be released after the
// first error, because then the data would be lost for ever. The only thing
// the user need to know is how many sequestial frames were sent successfully.
// The number is also the index of the first failed frame, when one
// of the frames fails. The frames are not necessary completed in
// same order, because the error may happed in DlcTransmit, LlcSendX or
// asynchronoulsy (eg. link lost) => we need the index of the first
// failing frame. The frame must not be released, if its index is higher
// than that of the first failed frame. A new error (async) be overwrite
// an earlier (sync) error having higher sequency number.
// Initially the number of successful frames is -1 and each frame of
// the multiple send needs a sequency number. The last frame copies
// own sequency number (added by one) to the CCB.
//
// ULONG cSuccessfulTransmits; // REMOVE Reserved2!!!!!
//
} NT_DLC_CCB, *PNT_DLC_CCB;
typedef struct _NT_DLC_CCB_INPUT { IN UCHAR uchAdapterNumber; // Adapter 0 or 1
IN UCHAR uchDlcCommand; // DLC command
OUT UCHAR uchDlcStatus; // DLC command completion code
UCHAR uchReserved1; // reserved for DLC DLL
OUT PVOID pCcbAddress; //
IN ULONG CommandCompletionFlag; union { IN OUT PLLC_PARMS pParameterTable; // pointer to the parameter table
struct { IN USHORT usStationId; // Station id
IN USHORT usParameter; // optional parameter
} dlc; struct { IN USHORT usParameter0; // first optional parameter
IN USHORT usParameter1; // second optional parameter
} dir; IN UCHAR auchBuffer[4]; // group/functional address
IN ULONG ulParameter; } u; } NT_DLC_CCB_INPUT, *PNT_DLC_CCB_INPUT;
typedef struct _NT_DLC_CCB_OUTPUT { IN UCHAR uchAdapterNumber; // Adapter 0 or 1
IN UCHAR uchDlcCommand; // DLC command
OUT UCHAR uchDlcStatus; // DLC command completion code
UCHAR uchReserved1; // reserved for DLC DLL
OUT PVOID pCcbAddress; //
} NT_DLC_CCB_OUTPUT, *PNT_DLC_CCB_OUTPUT;
typedef struct _NT_DLC_TRANSMIT2_CCB_OUTPUT { IN UCHAR uchAdapterNumber; // Adapter 0 or 1
IN UCHAR uchDlcCommand; // DLC command
OUT UCHAR uchDlcStatus; // DLC command completion code
UCHAR uchReserved1; // reserved for DLC DLL
OUT PVOID pCcbAddress; //
} NT_DLC_TRANSMIT2_CCB_OUTPUT, *PNT_DLC_CCB_TRANSMIT2_OUTPUT; //
// BUFFER.FREE
//
// DlcCommand = 0x27
//
// Internal NT DLC API data structure.
//
typedef struct _NT_DLC_BUFFER_FREE_PARMS { IN USHORT Reserved1; OUT USHORT cBuffersLeft; IN USHORT BufferCount; IN USHORT Reserved2; IN LLC_TRANSMIT_DESCRIPTOR DlcBuffer[1]; } NT_DLC_BUFFER_FREE_PARMS, *PNT_DLC_BUFFER_FREE_PARMS;
typedef struct _NT_DLC_BUFFER_FREE_ALLOCATION { IN USHORT Reserved1; OUT USHORT cBuffersLeft; IN USHORT BufferCount; IN USHORT Reserved2; IN LLC_TRANSMIT_DESCRIPTOR DlcBuffer[MAX_TRANSMIT_SEGMENTS]; } NT_DLC_BUFFER_FREE_ALLOCATION, *PNT_DLC_BUFFER_FREE_ALLOCATION;
typedef struct _NT_DLC_BUFFER_FREE_OUTPUT { IN USHORT Reserved2; OUT USHORT cBuffersLeft; } NT_DLC_BUFFER_FREE_OUTPUT, *PNT_DLC_BUFFER_FREE_OUTPUT;
//
// DLC_CONNECT_STATION
//
// DlcCommand = 0x1b
// (copied by DLC API)
//
#define DLC_MAX_ROUTING_INFOMATION 18
typedef struct _NT_DLC_CONNECT_STATION_PARMS { IN LLC_CCB Ccb; IN USHORT Reserved; IN USHORT StationId; IN UCHAR aRoutingInformation[DLC_MAX_ROUTING_INFOMATION]; IN USHORT RoutingInformationLength; } NT_DLC_CONNECT_STATION_PARMS, *PNT_DLC_CONNECT_STATION_PARMS;
//
// DLC_FLOW_CONTROL
//
// DlcCommand = 0x1d
// (copied by DLC API)
//
#define LLC_VALID_FLOW_CONTROL_BITS 0xc0
//
// This is special DOS DLC extensions to generate
// dlc local busy (dos dlc buffer) indication from
// dos dlc support dll.
//
#define LLC_SET_LOCAL_BUSY_BUFFER 0x20
#define LLC_DOS_DLC_FLOW_CONTROL 0x1f
typedef struct _NT_DLC_FLOW_CONTROL_PARMS { IN USHORT StationId; IN UCHAR FlowControlOption; IN UCHAR Reserved; } NT_DLC_FLOW_CONTROL_PARMS, *PNT_DLC_FLOW_CONTROL_PARMS;
//
// DLC_SET_INFORMATION
//
// This command is used to set the parameters of a link
// station or a sap. A null field in the station id struct
// defines a
//
// DlcCommand = 0x1c
//
//
// Info classes for datalink Set/Query Information
//
enum _DLC_INFO_CLASS_TYPES { DLC_INFO_CLASS_STATISTICS, // get
DLC_INFO_CLASS_STATISTICS_RESET, // get and reset
DLC_INFO_CLASS_DLC_TIMERS, // get/set
DLC_INFO_CLASS_DIR_ADAPTER, // get
DLC_INFO_CLASS_DLC_ADAPTER, // get
DLC_INFO_CLASS_PERMANENT_ADDRESS, // get
DLC_INFO_CLASS_LINK_STATION, // set
DLC_INFO_CLASS_DIRECT_INFO, // set
DLC_INFO_CLASS_GROUP, // set
DLC_INFO_CLASS_RESET_FUNCTIONAL, // set
DLC_INFO_CLASS_SET_GROUP, // set / get
DLC_INFO_CLASS_SET_FUNCTIONAL, // set / get
DLC_INFO_CLASS_ADAPTER_LOG, // get
DLC_INFO_CLASS_SET_MULTICAST // set
}; #define DLC_MAX_GROUPS 127 // max for group saps
typedef struct _LinkStationInfoSet { IN UCHAR TimerT1; IN UCHAR TimerT2; IN UCHAR TimerTi; IN UCHAR MaxOut; IN UCHAR MaxIn; IN UCHAR MaxOutIncrement; IN UCHAR MaxRetryCount; IN UCHAR TokenRingAccessPriority; IN USHORT MaxInformationField; } DLC_LINK_PARAMETERS, * PDLC_LINK_PARAMETERS;
typedef struct _LLC_TICKS { UCHAR T1TickOne; // default short delay for response timer
UCHAR T2TickOne; // default short delay for ack delay timer
UCHAR TiTickOne; // default short delay for inactivity timer
UCHAR T1TickTwo; // default short delay for response timer
UCHAR T2TickTwo; // default short delay for ack delay timer
UCHAR TiTickTwo; // default short delay for inactivity timer
} LLC_TICKS, *PLLC_TICKS;
typedef union _TR_BROADCAST_ADDRESS { ULONG ulAddress; UCHAR auchAddress[4]; } TR_BROADCAST_ADDRESS, *PTR_BROADCAST_ADDRESS;
typedef struct _NT_DLC_SET_INFORMATION_PARMS { struct _DlcSetInfoHeader { IN USHORT StationId; IN USHORT InfoClass; } Header; union { // InfoClass = DLC_INFO_CLASS_LINK_STATION
DLC_LINK_PARAMETERS LinkStation;
// InfoClass = DLC_INFO_CLASS_GROUP
struct _DlcSapInfoSet { IN UCHAR GroupCount; IN UCHAR GroupList[DLC_MAX_GROUPS]; } Sap;
// InfoClass = DLC_INFO_CLASS_DIRECT_STATION
struct _DlcDirectStationInfoSet { IN ULONG FrameMask; } Direct;
// InfoClass = DLC_INFO_CLASS_DLC_TIMERS
LLC_TICKS TimerParameters;
// InfoClass = DLC_INFO_CLASS_SET_FUNCTIONAL
// InfoClass = DLC_INFO_CLASS_RESET_FUNCTIONAL
// InfoClass = DLC_INFO_CLASS_SET_GROUP
UCHAR Buffer[1]; // InfoClass = DLC_INFO_CLASS_SET_MULTICAST
UCHAR auchMulticastAddress[6]; TR_BROADCAST_ADDRESS Broadcast; } Info; } NT_DLC_SET_INFORMATION_PARMS, *PNT_DLC_SET_INFORMATION_PARMS;
typedef struct _DlcAdapterInfoGet { OUT UCHAR MaxSap; OUT UCHAR OpenSaps; OUT UCHAR MaxStations; OUT UCHAR OpenStations; OUT UCHAR AvailStations; } LLC_ADAPTER_DLC_INFO, *PLLC_ADAPTER_DLC_INFO;
//
// This structure is tailored for DLC DirOpenAdapter and DirStatus
// functions.
//
typedef struct _LLC_ADAPTER_INFO { UCHAR auchNodeAddress[6]; UCHAR auchGroupAddress[4]; UCHAR auchFunctionalAddress[4]; USHORT usAdapterType; // (struct may not be dword align!)
USHORT usReserved; USHORT usMaxFrameSize; ULONG ulLinkSpeed; } LLC_ADAPTER_INFO, *PLLC_ADAPTER_INFO;
//
// DLC_QUERY_INFOMATION
//
// This command is used to set the parameters of a link
// station or a sap. A null field in the station id struct
// defines a
//
// DlcCommand =
//
typedef union _NT_DLC_QUERY_INFORMATION_OUTPUT { // (Query dlc parameters not used by DLC)
// // InfoClass = DLC_INFO_CLASS_STATION_INFO for link station
// DLC_LINK_PARAMETERS Link;
// // InfoClass = DLC_INFO_CLASS_DIRECT_INFO for direct station
// struct _DlcDirectStationInfoGet {
// OUT ULONG FrameMask;
// } Direct;
// InfoClass = DLC_INFO_CLASS_DIR_ADAPTER;
LLC_ADAPTER_INFO DirAdapter;
// InfoClass = DLC_INFO_CLASS_SAP
struct _DlcSapInfoGet { OUT USHORT MaxInformationField; OUT UCHAR MaxMembers; OUT UCHAR GroupCount; OUT UCHAR GroupList[DLC_MAX_GROUPS]; } Sap;
// InfoClass = DLC_INFO_CLASS_LINK_STATION
struct _DlcLinkInfoGet { OUT USHORT MaxInformationField; } Link;
// InfoClass = DLC_INFO_CLASS_DLC_ADAPTER
LLC_ADAPTER_DLC_INFO DlcAdapter;
// struct _DlcInfoSetBroadcast Broadcast;
// InfoClass = DLC_INFO_CLASS_DLC_TIMERS
LLC_TICKS TimerParameters;
// InfoClass = DLC_INFO_CLASS_ADAPTER_LOG
LLC_ADAPTER_LOG AdapterLog;
// InfoClass = DLC_INFO_CLASS_SET_FUNCTIONAL
// InfoClass = DLC_INFO_CLASS_RESET_FUNCTIONAL
// InfoClass = DLC_INFO_CLASS_SET_GROUP
UCHAR Buffer[1]; } NT_DLC_QUERY_INFORMATION_OUTPUT, *PNT_DLC_QUERY_INFORMATION_OUTPUT;
typedef struct _NT_DLC_QUERY_INFORMATION_INPUT { IN USHORT StationId; IN USHORT InfoClass; } NT_DLC_QUERY_INFORMATION_INPUT, *PNT_DLC_QUERY_INFORMATION_INPUT;
typedef union _NT_DLC_QUERY_INFORMATION_PARMS { NT_DLC_QUERY_INFORMATION_INPUT Header; NT_DLC_QUERY_INFORMATION_OUTPUT Info; } NT_DLC_QUERY_INFORMATION_PARMS, *PNT_DLC_QUERY_INFORMATION_PARMS;
//
// DLC_OPEN_SAP
//
// DlcCommand = 0x15
//
typedef struct _NT_DLC_OPEN_SAP_PARMS { OUT USHORT StationId; // SAP or link station id
IN USHORT UserStatusValue; IN DLC_LINK_PARAMETERS LinkParameters; IN UCHAR SapValue; IN UCHAR OptionsPriority; IN UCHAR StationCount; IN UCHAR Reserved1[7]; IN ULONG DlcStatusFlag; IN UCHAR Reserved2[8]; OUT UCHAR AvailableStations; // == StationCount
} NT_DLC_OPEN_SAP_PARMS, *PNT_DLC_OPEN_SAP_PARMS;
//
// NT_DLC_OPEN_STATION
//
// DlcCommand = 0x19
//
//
typedef struct _NT_DLC_OPEN_STATION_PARMS { IN OUT USHORT LinkStationId; IN DLC_LINK_PARAMETERS LinkParameters; IN UCHAR aRemoteNodeAddress[6]; IN UCHAR RemoteSap; } NT_DLC_OPEN_STATION_PARMS, *PNT_DLC_OPEN_STATION_PARMS;
//
// NT_DLC_SET_TRESHOLD
//
// DlcCommand = 0x33
//
//typedef struct _NT_DLC_SET_TRESHOLD_PARMS {
// IN USHORT StationId;
// IN USHORT Reserved;
// IN ULONG BufferTresholdSize;
// IN PVOID AlertEvent;
//} NT_DLC_SET_TRESHOLD_PARMS, *PNT_DLC_SET_TRESHOLD_PARMS;
//
// DIR_OPEN_ADAPTER
//
// DlcCommand = 0x03
//
// OUT: Info.ulParameter = BringUpDiagnostics;
//
#ifndef MAX_PATH // I don't want to include whole windows because of this
#define MAX_PATH 260
#endif
typedef struct _NT_DIR_OPEN_ADAPTER_PARMS { OUT LLC_ADAPTER_OPEN_PARMS Adapter; IN PVOID pSecurityDescriptor; IN PVOID hBufferPoolHandle; IN LLC_ETHERNET_TYPE LlcEthernetType; IN ULONG NtDlcIoctlVersion; IN LLC_TICKS LlcTicks; IN UCHAR AdapterNumber; IN UCHAR uchReserved; IN UNICODE_STRING NdisDeviceName; IN WCHAR Buffer[ MAX_PATH ]; } NT_DIR_OPEN_ADAPTER_PARMS, *PNT_DIR_OPEN_ADAPTER_PARMS;
//
// READ_CANCEL (DlcCommand = 0x32)
// DIR_TIMER_CANCEL (DlcCommand = 0x23)
//
typedef struct _NT_DLC_CANCEL_COMMAND_PARMS { IN PVOID CcbAddress; } NT_DLC_CANCEL_COMMAND_PARMS, *PNT_DLC_CANCEL_COMMAND_PARMS;
//
// RECEIVE_CANCEL
//
// DlcCommand = 0x29
//
typedef struct _NT_DLC_RECEIVE_CANCEL_PARMS { PVOID pCcb; } NT_DLC_RECEIVE_CANCEL_PARMS, *PNT_DLC_RECEIVE_CANCEL_PARMS;
typedef struct _NT_DLC_COMMAND_CANCEL_PARMS { PVOID pCcb; } NT_DLC_COMMAND_CANCEL_PARMS, *PNT_DLC_COMMAND_CANCEL_PARMS;
//
// TRANSMIT_DIR_FRAME
// TRANSMIT_I_FRAME
// TRANSMIT_TEST_CMD
// TRANSMIT_UI_FRAME
// TRANSMIT_XID_CMD
// TRANSMIT_XID_RESP_FINAL
// TRANSMIT_XID_RESP_NOT_FINAL
//
typedef struct _NT_DLC_TRANSMIT_PARMS { IN USHORT StationId; IN USHORT FrameType; // DLC frame or ethernet protocol
IN UCHAR RemoteSap OPTIONAL; // used only for DLC types
IN UCHAR XmitReadOption; OUT UCHAR FrameStatus; // not returned by I or new xmit
IN UCHAR Reserved; IN ULONG XmitBufferCount; IN LLC_TRANSMIT_DESCRIPTOR XmitBuffer[1]; } NT_DLC_TRANSMIT_PARMS, *PNT_DLC_TRANSMIT_PARMS;
typedef struct _NT_DLC_TRANSMIT_ALLOCATION { IN USHORT StationId; IN USHORT FrameType; IN UCHAR RemoteSap; IN UCHAR XmitReadOption; OUT UCHAR FrameStatus; IN UCHAR Reserved; IN ULONG XmitBufferCount; IN LLC_TRANSMIT_DESCRIPTOR XmitBuffer[MAX_TRANSMIT_SEGMENTS]; } NT_DLC_TRANSMIT_ALLOCATION;
typedef struct _NT_DLC_TRANSMIT_OUTPUT { OUT UCHAR FrameStatus; } NT_DLC_TRANSMIT_OUTPUT, *PNT_DLC_TRANSMIT_OUTPUT;
enum _XMIT_READ_OPTION { DLC_CHAIN_XMIT_IN_LINK = 0, DLC_DO_NOT_CHAIN_XMIT = 1, DLC_CHAIN_XMIT_IN_SAP = 2 }; //
// COMPLETE_COMMAND
//
// DlcCommand = 0x??
//
// The command is used to complete all synchronous commands.
// The DLC API library calls the DLC device driver again with
// these parameters, when a synchronous DLC command with
// COMMAND_COMPLETION_FLAG has completed.
// The command completes immediately, but the orginal CCB pointer
// and command completion flag are queued to the even queue
// or completed immediately with a READ command.
// The asynchronous commands are queued immediately when they
// completes, but their
//
typedef struct _NT_DLC_COMPLETE_COMMAND_PARMS { IN PVOID pCcbPointer; IN ULONG CommandCompletionFlag; IN USHORT StationId; IN USHORT Reserved; } NT_DLC_COMPLETE_COMMAND_PARMS, *PNT_DLC_COMPLETE_COMMAND_PARMS;
//
// There is a small READ_INPUT parameter structure, because we
// do not want to copy all output parameters in every read request.
//
//
typedef struct _NT_DLC_READ_INPUT { IN USHORT StationId; IN UCHAR OptionIndicator; IN UCHAR EventSet; IN PVOID CommandCompletionCcbLink; } NT_DLC_READ_INPUT, * PNT_DLC_READ_INPUT;
//
// This buffer is copied back to user memory, when read parameter table
// is separate from CCB- table.
//
typedef LLC_READ_PARMS LLC_READ_OUTPUT_PARMS, *PLLC_READ_OUTPUT_PARMS;
//typedef struct _LLC_READ_OUTPUT_PARMS {
// IN USHORT usStationId;
// IN UCHAR uchOptionIndicator;
// IN UCHAR uchEventSet;
// OUT UCHAR uchEvent;
// OUT UCHAR uchCriticalSubset;
// OUT ULONG ulNotificationFlag;
// union {
// struct {
// OUT USHORT usCcbCount;
// OUT PLLC_CCB pCcbCompletionList;
// OUT USHORT usBufferCount;
// OUT PLLC_BUFFER pFirstBuffer;
// OUT USHORT usReceivedFrameCount;
// OUT PLLC_BUFFER pReceivedFrame;
// OUT USHORT usEventErrorCode;
// OUT USHORT usEventErrorData[3];
// } Event;
// struct {
// OUT USHORT usStationId;
// OUT USHORT usDlcStatusCode;
// OUT UCHAR uchFrmrData[5];
// OUT UCHAR uchAccessPritority;
// OUT UCHAR uchRemoteNodeAddress[6];
// OUT UCHAR uchRemoteSap;
// OUT UCHAR uchReserved;
// OUT USHORT usUserStatusValue;
// } Status;
// } Type;
//} LLC_READ_OUTPUT_PARMS, *PLLC_READ_OUTPUT_PARMS;
typedef struct _NT_DLC_READ_PARMS { IN USHORT StationId; IN UCHAR OptionIndicator; IN UCHAR EventSet; OUT UCHAR Event; OUT UCHAR CriticalSubset; OUT ULONG NotificationFlag; union { struct { OUT USHORT CcbCount; OUT PVOID pCcbCompletionList; OUT USHORT BufferCount; OUT PLLC_BUFFER pFirstBuffer; OUT USHORT ReceivedFrameCount; OUT PLLC_BUFFER pReceivedFrame; OUT USHORT EventErrorCode; OUT USHORT EventErrorData[3]; } Event; struct { OUT USHORT StationId; OUT USHORT DlcStatusCode; OUT UCHAR FrmrData[5]; OUT UCHAR AccessPritority; OUT UCHAR RemoteNodeAddress[6]; OUT UCHAR RemoteSap; OUT UCHAR Reserved; OUT USHORT UserStatusValue; } Status; } u; } NT_DLC_READ_PARMS, *PNT_DLC_READ_PARMS;
typedef struct _LLC_IOCTL_BUFFERS { USHORT InputBufferSize; USHORT OutputBufferSize; } LLC_IOCTL_BUFFERS, *PLLC_IOCTL_BUFFERS;
//
// This table is used by dlc driver and dlcapi dll modules.
// In the application level debug version of dlc we link all modules
// together and this table must be defined only once.
//
#ifdef INCLUDE_IO_BUFFER_SIZE_TABLE
LLC_IOCTL_BUFFERS aDlcIoBuffers[IOCTL_DLC_LAST_COMMAND] = { {sizeof(NT_DLC_READ_PARMS) + sizeof( NT_DLC_CCB ), sizeof( NT_DLC_CCB_OUTPUT )}, {sizeof(LLC_RECEIVE_PARMS) + sizeof( NT_DLC_CCB ), sizeof( NT_DLC_CCB_OUTPUT )}, {sizeof(NT_DLC_TRANSMIT_PARMS) + sizeof( NT_DLC_CCB ), sizeof( NT_DLC_CCB_OUTPUT )}, {sizeof(NT_DLC_BUFFER_FREE_PARMS), sizeof(NT_DLC_BUFFER_FREE_OUTPUT)}, {sizeof(LLC_BUFFER_GET_PARMS), sizeof(LLC_BUFFER_GET_PARMS)}, {sizeof(LLC_BUFFER_CREATE_PARMS), sizeof(PVOID)}, // DirInitialize included in DirClose
// {sizeof( NT_DLC_CCB_INPUT ),
// sizeof( NT_DLC_CCB_OUTPUT )}, // DIR.INITIALIZE
{sizeof(LLC_DIR_SET_EFLAG_PARMS), 0}, {sizeof( NT_DLC_CCB_INPUT ), sizeof( NT_DLC_CCB_OUTPUT )}, // DLC.CLOSE.STATION
{sizeof(NT_DLC_CONNECT_STATION_PARMS) + sizeof( NT_DLC_CCB ), sizeof( NT_DLC_CCB_OUTPUT )}, {sizeof(NT_DLC_FLOW_CONTROL_PARMS), 0}, {sizeof(NT_DLC_OPEN_STATION_PARMS), sizeof( USHORT )}, {sizeof( NT_DLC_CCB_INPUT ), sizeof( NT_DLC_CCB_OUTPUT )}, // DLC.RESET
{sizeof(NT_DLC_COMMAND_CANCEL_PARMS), 0}, // READ.CANCEL
{sizeof(NT_DLC_RECEIVE_CANCEL_PARMS), 0}, {sizeof(NT_DLC_QUERY_INFORMATION_INPUT), 0}, {sizeof( struct _DlcSetInfoHeader ), 0}, {sizeof(NT_DLC_COMMAND_CANCEL_PARMS), // TIMER.CANCEL
0}, {sizeof( NT_DLC_CCB_INPUT ), // TIMER.CANCEL.GROUP
sizeof( NT_DLC_CCB_OUTPUT )}, {sizeof( NT_DLC_CCB_INPUT ), // DIR.TIMER.SET
sizeof( NT_DLC_CCB_OUTPUT )}, {sizeof(NT_DLC_OPEN_SAP_PARMS), sizeof(NT_DLC_OPEN_SAP_PARMS)}, {sizeof( NT_DLC_CCB_INPUT ), sizeof( NT_DLC_CCB_OUTPUT )}, // DLC.CLOSE.SAP
{sizeof(LLC_DIR_OPEN_DIRECT_PARMS), 0}, {sizeof( NT_DLC_CCB_INPUT ), // DIR.CLOSE.DIRECT
sizeof( NT_DLC_CCB_OUTPUT )}, {sizeof(NT_DIR_OPEN_ADAPTER_PARMS), // DIR.OPEN.ADAPTER
sizeof( LLC_ADAPTER_OPEN_PARMS )}, {sizeof( NT_DLC_CCB_INPUT ), // DIR.CLOSE.ADAPTER
sizeof( NT_DLC_CCB_OUTPUT )}, {sizeof( LLC_DLC_REALLOCATE_PARMS ), // DLC.REALLOCATE
sizeof( LLC_DLC_REALLOCATE_PARMS )}, {sizeof( NT_DLC_READ_INPUT) + sizeof( LLC_CCB ), // READ2
sizeof( NT_DLC_READ_PARMS) + sizeof( LLC_CCB )}, {sizeof( LLC_RECEIVE_PARMS) + sizeof( LLC_CCB ), // RECEIVE2
sizeof( NT_DLC_CCB_OUTPUT )}, {sizeof( NT_DLC_TRANSMIT_PARMS ) + sizeof( LLC_CCB ), // TRANSMIT2
sizeof( NT_DLC_CCB_OUTPUT )}, {sizeof( NT_DLC_COMPLETE_COMMAND_PARMS ), // DLC.COMPLETE.COMMAND
0}, // {sizeof( LLC_TRACE_INITIALIZE_PARMS ) + sizeof( LLC_CCB ),
// 0},
// {0, 0}
// {sizeof( NT_NDIS_REQUEST_PARMS ),
// sizeof( NT_NDIS_REQUEST_PARMS )}
}; #else
extern LLC_IOCTL_BUFFERS aDlcIoBuffers[];
#endif
//
// All NT DLC API parameters in one structure
//
typedef union _NT_DLC_PARMS { NT_DLC_BUFFER_FREE_ALLOCATION BufferFree; LLC_BUFFER_GET_PARMS BufferGet; LLC_BUFFER_CREATE_PARMS BufferCreate; NT_DLC_FLOW_CONTROL_PARMS DlcFlowControl; NT_DLC_OPEN_STATION_PARMS DlcOpenStation; NT_DLC_SET_INFORMATION_PARMS DlcSetInformation; NT_DLC_QUERY_INFORMATION_PARMS DlcGetInformation; NT_DLC_OPEN_SAP_PARMS DlcOpenSap; LLC_DIR_SET_EFLAG_PARMS DirSetExceptionFlags; NT_DLC_CANCEL_COMMAND_PARMS DlcCancelCommand; NT_DLC_RECEIVE_CANCEL_PARMS ReceiveCancel; USHORT StationId; NT_DLC_COMPLETE_COMMAND_PARMS CompleteCommand; LLC_DLC_REALLOCATE_PARMS DlcReallocate; LLC_DIR_OPEN_DIRECT_PARMS DirOpenDirect; NT_DIR_OPEN_ADAPTER_PARMS DirOpenAdapter; // NT_NDIS_REQUEST_PARMS NdisRequest;
LLC_DLC_STATISTICS_PARMS DlcStatistics; LLC_ADAPTER_DLC_INFO DlcAdapter; WCHAR UnicodePath[MAX_PATH];
//
// At least DirTimerCancelGroup:
//
NT_DLC_CCB_INPUT InputCcb;
//
// Asynchronous parameters
//
//close sap/link/direct,reset, DirTimerSet;
struct _ASYNC_DLC_PARMS { NT_DLC_CCB Ccb; union { UCHAR ByteBuffer[512]; NT_DLC_CONNECT_STATION_PARMS DlcConnectStation; NT_DLC_READ_INPUT ReadInput; NT_DLC_READ_PARMS Read; LLC_RECEIVE_PARMS Receive; NT_DLC_TRANSMIT_ALLOCATION Transmit; // NT_NDIS_REQUEST_PARMS NdisRequest;
LLC_TRACE_INITIALIZE_PARMS TraceInitialize; } Parms; } Async; } NT_DLC_PARMS, *PNT_DLC_PARMS;
LLC_STATUS DlcCallDriver( IN UINT AdapterNumber, IN UINT IoctlCommand, IN PVOID pInputBuffer, IN UINT InputBufferLength, OUT PVOID pOutputBuffer, IN UINT OutputBufferLength ); LLC_STATUS NtAcsLan( IN PLLC_CCB pCCB, IN PVOID pOrginalCcbAddress, OUT PLLC_CCB pOutputCcb, IN HANDLE EventHandle OPTIONAL );
|