mirror of https://github.com/lianthony/NT4.0
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.
498 lines
15 KiB
498 lines
15 KiB
/*++
|
|
|
|
Copyright (c) 1987-93 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
local.h
|
|
|
|
Abstract:
|
|
|
|
Main include file used by rpldll & rploem code.
|
|
|
|
Author:
|
|
|
|
Vladimir Z. Vulovic (vladimv) 03 - February - 1993
|
|
|
|
Revision History:
|
|
|
|
03-Feb-1993 vladimv
|
|
Ported to NT
|
|
19-Nov-1993 vladimv
|
|
rpldll.h -> local.h + cleanup & face-lift
|
|
|
|
--*/
|
|
|
|
#define NOTHING // same def in ntdef.h which is not included here
|
|
|
|
#include <nt.h> // NT definitions
|
|
#include <ntrtl.h> // NT runtime library definitions
|
|
#include <nturtl.h>
|
|
|
|
#include <windows.h> // DWORD, IN, File APIs, etc.
|
|
#include <stdlib.h>
|
|
#include <lmcons.h>
|
|
|
|
#include <stdio.h> // vsprintf
|
|
#include <ctype.h> // isspace
|
|
|
|
|
|
//#include <lmcons.h> // LAN Manager common definitions
|
|
#include <lmerr.h> // LAN Manager network error definitions
|
|
#include <lmsname.h> // LAN Manager service names
|
|
#include <lmapibuf.h> // NetApiBufferFree
|
|
|
|
#include <netlib.h> // LAN Man utility routines
|
|
#include <netlibnt.h> // NetpNtStatusToApiStatus
|
|
#include <netdebug.h> // NetpDbgPrint
|
|
#include <tstring.h> // Transitional string functions
|
|
#include <icanon.h> // I_Net canonicalize functions
|
|
#include <align.h> // ROUND_UP_COUNT macro
|
|
|
|
#include <services.h> // LMSVCS_GLOBAL_DATA
|
|
#include <apperr.h> // APE_AT_ID_NOT_FOUND
|
|
|
|
#include <dlcapi.h> // - LLC_CCB
|
|
#include <dlcio.h> // - DLC_DO_NOT_CHAIN_XMIT
|
|
#include <lmerrlog.h> // - ERRLOG_BASE NELOG_OEM_Code
|
|
|
|
//
|
|
// Global types and constants (used in all RPL server files).
|
|
//
|
|
|
|
#include <rpldebug.h>
|
|
#include <rpldll.h> // rplnet.dll entry points & return codes
|
|
#include <riplcons.h>
|
|
#include <ripltyps.h>
|
|
|
|
|
|
//
|
|
// BUGBUG For Ethernet, DLC driver returns 0x100 while LLC_ADAPTER_ETHERNET
|
|
// BUGBUG is 0x10. One or the other should be changed. The following
|
|
// BUGBUG defines & "<<4" are introduced as a workaround.
|
|
//
|
|
#define RPL_ADAPTER_ETHERNET (LLC_ADAPTER_ETHERNET<<4)
|
|
#define RPL_ADAPTER_TOKEN_RING LLC_ADAPTER_TOKEN_RING
|
|
//
|
|
// BUGBUG -- DLC uses a "currently free value" to indicate FDDI.
|
|
//
|
|
#define RPL_ADAPTER_FDDI 0x0200
|
|
|
|
|
|
#define LOAD_SAP 0xF8 // Receive SAP for SEND.FILE.REQUEST frames
|
|
#define FIND_SAP 0xFC // Receice SAP for FIND frames
|
|
|
|
//
|
|
// Error handler definitions and return codes to server
|
|
//
|
|
|
|
|
|
//
|
|
// Non DLC causing error. Note that these do NOT and should NOT overlap
|
|
// with dlcapi.h command codes.
|
|
//
|
|
#define RPLDLL_NO_ERROR (0xFF)
|
|
#define SEM_SET (RPLDLL_NO_ERROR - 1) // ResetEvent
|
|
#define SEM_WAIT (RPLDLL_NO_ERROR - 2) // WaitForSingle
|
|
#define SEM_CREATE (RPLDLL_NO_ERROR - 3) // CreateEvent
|
|
#define THREAD_CREATE (RPLDLL_NO_ERROR - 5) // CreateThread
|
|
|
|
// Message number definitions. See RMTDLL.MSG file
|
|
|
|
// SEM_ , ACSLAN_, MEMORY_, THREAD_ERROR
|
|
#define FAIL_MSG 110 // RMT0110I: RMTNET2.DLL: %1 failed.
|
|
|
|
// SEM_ , MEMORY_, and THREAD_ERROR
|
|
#define DOS_ERROR 111 // RMT0111I: The error code is the data.
|
|
|
|
#define TOO_SMALL_XMIT_BUFF 120
|
|
|
|
// RMTNET1.DLL errors
|
|
|
|
#define CANNOT_LOAD_MOD 125
|
|
#define PROC_NOT_FOUND 126
|
|
#define VERSION_MISMATCH 127
|
|
|
|
|
|
#define MSG_FILENAME "RPLDLL.MSG"
|
|
|
|
|
|
// BYTE => BYTE
|
|
// INT => SHORT
|
|
// UINT => WORD
|
|
|
|
//
|
|
// COMPLETE_BY_READ is used for LLL_RECEIVE in "ulReceivedFlag".
|
|
// Apparently, any other non-zero value would do equally well.
|
|
//
|
|
#define COMPLETE_BY_READ 1
|
|
|
|
//
|
|
// Version number returned to server ==
|
|
// Version number returned by RPL2_Init
|
|
//
|
|
#define VERSION2_00 0x0200
|
|
|
|
//
|
|
// Helper Macros
|
|
//
|
|
|
|
// Swap bytes of word: (B1-B0) -> (B0-B1)
|
|
//
|
|
#define HILO(w) ((WORD)(((w<<8) | (w>>8))))
|
|
|
|
|
|
// Swap bytes and words of dword: (B3-B2-B1-B0) -> (B0-B1-B2-B3)
|
|
//
|
|
#define HILO2(_x) ((((DWORD)HILO(HIWORD(_x))) | (((DWORD)HILO(LOWORD(_x)))<<16)))
|
|
|
|
|
|
// SAP receive buffer pool values
|
|
#define SAP_BUFFER_SIZE 240
|
|
#define FIND_POOL_SIZE SAP_BUFFER_SIZE
|
|
#define LOAD_POOL_SIZE (20*SAP_BUFFER_SIZE) // 20 rcv buffers for load SAP
|
|
#define PARAGRAPH 16
|
|
#define LOAD_POOL_SIZE_PARA (LOAD_POOL_SIZE/PARAGRAPH)
|
|
#define FIND_POOL_SIZE_PARA (FIND_POOL_SIZE/PARAGRAPH)
|
|
|
|
// Type of buffer for BUFFER.FREE
|
|
#define FIND_FREE 0
|
|
#define SFR_FREE 1
|
|
|
|
// RMT2 internal data structures and RIPL frame formats
|
|
// Size of ADAPTER_INFO structure MUST NOT exceed 2 kbytes
|
|
|
|
|
|
typedef struct _ADAPTER_INFO {
|
|
BYTE Closing; // TRUE if adapter has been closed
|
|
BYTE adapter_number; // number of adapter to be used 0,1...
|
|
WORD network_type; // TokenRing or Ethernet
|
|
WORD loadsid; // Station ID for LOAD SAP
|
|
WORD findsid; // Station ID for FIND SAP
|
|
WORD max_xmit_buff_size; // Upper limit for buffers to xmit
|
|
HANDLE gen_sem; // event for DLC general work
|
|
HANDLE findsem; // event for FIND_SAP RECEIVE and BUFFER.FREE
|
|
HANDLE sfrsem; // event for LOAD_SAP RECEIVE
|
|
HANDLE getdata_sem;// event for LOAD_SAP READ and BUFFER.FREE
|
|
|
|
HANDLE hBufferPool;// DLC handle used for buffer supplied to DLC
|
|
|
|
//
|
|
// Following data is not actual adapter info,
|
|
// but this is only place to hide it to make
|
|
// these DLLs HANDLE-CALLABLE ie. RPL_Init must be made to
|
|
// every network adapter that is used. Adapter_info is
|
|
// so called handle, that must be used on subsequent calls
|
|
// to that adapter.
|
|
//
|
|
|
|
//
|
|
// SfrReceiveThread is used to keep receive posted for SFR.
|
|
// SfrReceiveThreadHandle is NULL if & only this thread exists.
|
|
//
|
|
HANDLE SfrReceiveThreadHandle;
|
|
|
|
//
|
|
// EtherStartThread is used to send DLC to 3Com 3Station clients.
|
|
// EtherStartThreadHandle is non-NULL if & only this thread exists.
|
|
//
|
|
HANDLE EtherStartThreadHandle;
|
|
|
|
//
|
|
// Used by SfrReceiveThread to let DlcSfr thread it is time to exit.
|
|
//
|
|
BOOL SfrReturn;
|
|
|
|
//
|
|
// Command control block and parameter tables for open adapter, open sap,
|
|
// set functional address, get status and close adapter commands.
|
|
//
|
|
|
|
// Note: re-used data space
|
|
struct {
|
|
LLC_CCB ccb; // the base ccb
|
|
union {
|
|
struct {
|
|
LLC_BUFFER_CREATE_PARMS bcp; // Buffer Create Parms
|
|
} s0;
|
|
struct {
|
|
LLC_DIR_OPEN_ADAPTER_PARMS cpo; // Ccb Parms Open
|
|
LLC_ADAPTER_OPEN_PARMS oap; // Open Adapter Parms
|
|
LLC_EXTENDED_ADAPTER_PARMS oep; // Open Extended Parms
|
|
LLC_DLC_PARMS odp; // Open Dlc Parms
|
|
} s1;
|
|
struct {
|
|
LLC_DIR_STATUS_PARMS dsp; // Dir Status Parms
|
|
} s2;
|
|
struct {
|
|
LLC_DLC_OPEN_SAP_PARMS cpo; // Ccb ???
|
|
} s3;
|
|
} u;
|
|
} s;
|
|
// CCBs and parameter tables for RECEIVEs, READ and BUFFER_FREE
|
|
struct {
|
|
LLC_CCB r; // RECEIVE ccb for find
|
|
LLC_RECEIVE_PARMS r1; // parameter table 17 bytes
|
|
BYTE pad; // alignment
|
|
} u1;
|
|
|
|
struct {
|
|
LLC_CCB r; // RECEIVE ccb for sfr
|
|
LLC_RECEIVE_PARMS r1; // parameter table 17 bytes*/
|
|
BYTE pad; // alignment
|
|
} u2;
|
|
|
|
struct {
|
|
LLC_CCB r; // READ ccb for sfr
|
|
LLC_READ_PARMS r1; // parameter table
|
|
} u3;
|
|
|
|
//
|
|
// BUFFER.FREE CCB and parameter table for freeing received buffer,
|
|
// SEND.FILE.REQUEST frames
|
|
//
|
|
LLC_CCB sfr_bf_ccb;
|
|
LLC_BUFFER_FREE_PARMS sfr_bf_ccbpt;
|
|
|
|
//
|
|
// BUFFER.FREE CCB and parameter table for freeing received buffer,
|
|
// FIND frames
|
|
//
|
|
LLC_CCB find_bf_ccb;
|
|
LLC_BUFFER_FREE_PARMS find_bf_ccbpt;
|
|
|
|
} ADAPTER_INFO, *PADAPTER_INFO;
|
|
|
|
|
|
typedef struct _LAN_HEADER {
|
|
BYTE pcf0; // Physical control field 0
|
|
BYTE pcf1; // Physical control field 1
|
|
BYTE dest_addr[ NODE_ADDRESS_LENGTH]; // Destination address
|
|
BYTE source_addr[ NODE_ADDRESS_LENGTH]; // Source address
|
|
BYTE routing_info_header[2]; // Routing information hdr
|
|
} LAN_HEADER;
|
|
|
|
//
|
|
// In LAN_RESOURCE structure below it is essential that LanHeader field
|
|
// is right behind XmitBuffer field. LLC_XMIT_BUFFER structure used to have
|
|
// a trailing auchData[1] which would give a wrong offset for LAN_RESOURCE.
|
|
// Now it has a trailing auchData[0] so compiler complains if it is not the
|
|
// the last element in a tructure. Both problems are solved by defining
|
|
// XMIT_BUFFER which has no auchData[] field.
|
|
//
|
|
|
|
typedef struct _XMIT_BUFFER {
|
|
struct _XMIT_BUFFER * pNext; // next buffer (or NULL)
|
|
WORD usReserved1; //
|
|
WORD cbBuffer; // length of transmitted data
|
|
WORD usReserved2; //
|
|
WORD cbUserData; // length of optional header
|
|
} XMIT_BUFFER, *PXMIT_BUFFER;
|
|
|
|
typedef struct _LAN_RESOURCE {
|
|
BYTE xmit_error_cnt; // consecutive xmit error count
|
|
BYTE retry_count; // xmit retries on current frame
|
|
LLC_CCB ccb; // for RECEIVE ,TRANSMIT frames
|
|
LLC_TRANSMIT_PARMS TransmitParms; // parameter block for TRANSMIT
|
|
XMIT_BUFFER XmitBuffer; // buffer one header
|
|
LAN_HEADER LanHeader; // for TRANSMIT.UI.FRAME
|
|
BYTE rest_of_routing[16]; // lan hdr defines 2 bytes routing
|
|
BYTE frame[110]; // the frame itself
|
|
} LAN_RESOURCE, *PLAN_RESOURCE;
|
|
|
|
|
|
//
|
|
// Remote boot structures cannot use default packing. Thus:
|
|
//
|
|
|
|
#include <packon.h> // Pack structures: #pragma pack(1)
|
|
|
|
// The find frame structure is defined below.
|
|
|
|
typedef struct _FIND_FRAME {
|
|
WORD program_length; // 0x53 + value in first 2 bytes of file_hdr
|
|
WORD program_command; // must be FIND_CMD
|
|
DWORD corr_hdr;
|
|
DWORD correlator;
|
|
DWORD info_hdr;
|
|
DWORD frame_hdr;
|
|
WORD max_frame;
|
|
DWORD class_hdr;
|
|
WORD conn_class;
|
|
DWORD source_hdr;
|
|
BYTE source_addr[ NODE_ADDRESS_LENGTH];
|
|
DWORD lsap_hdr;
|
|
BYTE rsap;
|
|
DWORD search_hdr;
|
|
DWORD loader_hdr;
|
|
BYTE mach_conf[8];
|
|
WORD equip_flags;
|
|
WORD memory_size;
|
|
BYTE rpl_ec[8];
|
|
WORD adapter_id;
|
|
BYTE adapter_ec[10];
|
|
DWORD file_hdr;
|
|
BYTE file_name[1];
|
|
} FIND_FRAME, *PFIND_FRAME;
|
|
|
|
#define FIND_LEN 0x53
|
|
|
|
//
|
|
// The following structure defines the FOUND frame,
|
|
// RMT2 transmits the FOUND frame in response to a FIND
|
|
// frame from a workstation already configured to RIPL.
|
|
//
|
|
|
|
typedef struct _FOUND_FRAME {
|
|
WORD program_length;
|
|
WORD program_command;
|
|
DWORD corr_header;
|
|
DWORD correlator;
|
|
DWORD resp_hdr;
|
|
BYTE resp_code;
|
|
DWORD dest_hdr; // NOTE 4 bytes! not 6
|
|
BYTE dest_addr[ NODE_ADDRESS_LENGTH];
|
|
DWORD source_hdr;
|
|
BYTE source_addr[ NODE_ADDRESS_LENGTH];
|
|
DWORD info_hdr;
|
|
DWORD frame_hdr;
|
|
WORD max_frame;
|
|
DWORD class_hdr;
|
|
WORD conn_class;
|
|
DWORD lsap_hdr;
|
|
BYTE rsap;
|
|
} FOUND_FRAME, *PFOUND_FRAME;
|
|
|
|
|
|
//
|
|
//
|
|
// The fdr structure defines the FILE.DATA.RESPONSE frame transmitted by RMT2
|
|
// in response to a validated SEND.FILE.DATA frame already received by RMT2.
|
|
//
|
|
|
|
|
|
typedef struct _FDR { // FILE.DATA.RESPONSE
|
|
WORD program_length;
|
|
WORD program_command;
|
|
DWORD seq_hdr;
|
|
DWORD seq_num;
|
|
DWORD loader_hdr;
|
|
DWORD locate_addr;
|
|
DWORD xfer_addr;
|
|
BYTE flags;
|
|
DWORD data_hdr; // the data follows this
|
|
} FDR, *PFDR;
|
|
|
|
|
|
//
|
|
// The sfr structure defines the SEND.FILE.REQUEST frame transmitted by
|
|
// the remote workstation after reception of the FOUND frame.
|
|
//
|
|
|
|
typedef struct _SFR { // SEND.FILE.REQUEST
|
|
WORD program_length;
|
|
WORD program_command;
|
|
DWORD seq_header; // sequence number vector
|
|
DWORD seq_num; // starting sequence number
|
|
DWORD info_hdr;
|
|
DWORD frame_hdr;
|
|
WORD max_frame;
|
|
DWORD class_hdr;
|
|
WORD conn_class;
|
|
DWORD source_hdr;
|
|
BYTE source_addr[ NODE_ADDRESS_LENGTH];
|
|
DWORD lsap_hdr;
|
|
BYTE rsap;
|
|
DWORD search_hdr;
|
|
DWORD loader_hdr;
|
|
BYTE mach_conf[8];
|
|
WORD equip_flags;
|
|
} SFR, *PSFR;
|
|
|
|
#include <packoff.h> // Restore default packing, #pragma pack()
|
|
|
|
//
|
|
// The following structure defines the Receive frame from a requesting
|
|
// device seeking a RIPL server. The find_frame occupies the second
|
|
// half of the structure (or the SEND.FILE.REQUEST frame, or ALERT frame).
|
|
// The only field used by RMT2 to determine the
|
|
// frame type is the "program_command" field of the frame.
|
|
//
|
|
|
|
|
|
typedef struct _RCVBUF {
|
|
LLC_NOT_CONTIGUOUS_BUFFER b; // buffer one header
|
|
union {
|
|
FIND_FRAME Find; // the data (find frame)
|
|
SFR SendFileRequest; // or a SEND.FILE.REQUEST
|
|
} u;
|
|
} RCVBUF, *PRCVBUF;
|
|
|
|
|
|
#define RCB_ALERT 0xff // rcb was alerted
|
|
#define RCB_ALERTED 0x1 // bit set for ALERT frame
|
|
#define RCB_ERROR 0x1 // bit for tx-rx error
|
|
|
|
//
|
|
// The following #defines relate to the values of the program_command
|
|
// field in the frame structures above
|
|
//
|
|
|
|
#define FIND_CMD 0x0100 // FIND frame
|
|
#define SEND_CMD 0x1000 // SEND command
|
|
#define FDR_CMD 0x2000 // FILE.DATA.RESPONSE cmd
|
|
#define ALERT_CMD 0x3000 // ALERT frame
|
|
#define FOUND_CMD 0x0200 // FOUND frame
|
|
|
|
//
|
|
// The following #defines relate the the values of various fields in
|
|
// the FOUND frame structure.
|
|
//
|
|
|
|
#define OVRHD 123 // overhead on a FOUND frame
|
|
#define CLASS1 0x100 // class 1 provided by RJS
|
|
#define FL 0x3A00 // sizeof found frame
|
|
#define CORR_HDR 0x03400800 // NOT intel format
|
|
#define RESP_HDR 0x0b400500 // ditto
|
|
#define DEST_HDR 0x0c400a00 // ditto
|
|
#define SOURCE_HDR 0x06400a00 // ditto
|
|
#define INFO_HDR 0x08001000 // NOT intel format
|
|
#define FRAME_HDR 0x09400600 // LAN format
|
|
#define CLASS_HDR 0x0a400600 // LAN format
|
|
#define LSAP_HDR 0x07400500 // LAN format
|
|
#define BRDCST 0x82 // routing for broadcast
|
|
#define UNSPEC_FRM_SIZE 0x70 // (DFFF rrrr) FFF frm size bits ON
|
|
#define SEQ_HDR 0x11400800
|
|
#define LDR_HDR 0x14c00d00
|
|
#define DATA_HDR 0x18400000
|
|
#define MAXRETRY 5 // retry TRANSMIT this much
|
|
|
|
//
|
|
// We do not write to Net error log until there is at least
|
|
// MAX_CONSECUTIVE_ERROR transmit errors.
|
|
//
|
|
#define MAX_CONSECUTIVE_ERROR 3
|
|
|
|
// Definitions for volume_id handling
|
|
#define MAX_VOLID_LEN 17
|
|
#define VOLID_FIELD1 0xFF
|
|
#define VOLID_FIELD2 0xB0
|
|
|
|
|
|
//
|
|
// Routines exported by report.c
|
|
//
|
|
VOID RplDlcReportEvent(
|
|
DWORD ErrorCode,
|
|
DWORD Command
|
|
);
|
|
|
|
//
|
|
// Routines exported by buffer.c
|
|
//
|
|
BOOL RplDlcBufferFree(
|
|
BYTE free_type,
|
|
PADAPTER_INFO pAdapterInfo
|
|
);
|
|
|
|
VOID ReverseBits( PBYTE NodeAddress );
|