/*++ 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 );