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.
533 lines
13 KiB
533 lines
13 KiB
/*++
|
|
|
|
Copyright (c) 1992 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
atktdi.h
|
|
|
|
Abstract:
|
|
|
|
This module contains tdi related definitions.
|
|
|
|
Author:
|
|
|
|
Jameel Hyder ([email protected])
|
|
Nikhil Kamkolkar ([email protected])
|
|
|
|
Revision History:
|
|
19 Jun 1992 Initial Version
|
|
|
|
Notes: Tab stop: 4
|
|
--*/
|
|
|
|
#ifndef _ATKTDI_
|
|
#define _ATKTDI_
|
|
|
|
#define DFLAG_ADDR 0x0001
|
|
#define DFLAG_CONN 0x0002
|
|
#define DFLAG_CNTR 0x0004
|
|
#define DFLAG_MDL 0x0008
|
|
|
|
struct _ActionReq;
|
|
|
|
// Typedef for the worker routine used in the dispatch tables
|
|
typedef VOID (*GENERIC_COMPLETION)(IN ATALK_ERROR ErrorCode,
|
|
IN PIRP pIrp);
|
|
typedef VOID (*ACTION_COMPLETION)(IN ATALK_ERROR ErrorCode,
|
|
IN struct _ActionReq *pActReq);
|
|
typedef ATALK_ERROR (*DISPATCH_ROUTINE)(IN PVOID pObject,
|
|
IN struct _ActionReq *pActReq);
|
|
|
|
typedef VOID (*GENERIC_WRITE_COMPLETION)(
|
|
IN ATALK_ERROR ErrorCode,
|
|
IN PAMDL WriteBuf,
|
|
IN USHORT WriteLen,
|
|
IN PIRP pIrp);
|
|
|
|
typedef VOID (*GENERIC_READ_COMPLETION)(
|
|
IN ATALK_ERROR ErrorCode,
|
|
IN PAMDL ReadBuf,
|
|
IN USHORT ReadLen,
|
|
IN ULONG ReadFlags,
|
|
IN PIRP pIrp);
|
|
|
|
// Define the Action dispatch table here.
|
|
//
|
|
// *IMPORTANT*
|
|
// This table is tightly integrated with the action codes defined in
|
|
// ATALKTDI.H.
|
|
//
|
|
// Order is NBP/ZIP/ADSP/ATP/ASP/PAP
|
|
//
|
|
// Each element of the array contains:
|
|
// _MinBufLen - The minimum length of the MdlAddress buffer for the request
|
|
// _OpCode - The action code of the request (sanity check)
|
|
// _OpInfo - Bit flags give more information about the request
|
|
// DFLAG_ADDR - Object for request must be an address object
|
|
// DFLAG_CONN - Object for request must be connection object
|
|
// DFLAG_CNTR - Object for request must be control channel
|
|
// DFLAG_MDL1 - Request uses an mdl (submdl of MdlAddress)
|
|
// DFLAG_MDL2 - Request uses a second mdl (submdl of MdlAddress)
|
|
// _ActionBufSize - The size of the action header buffer for request
|
|
// (beginning of the buffer described by MdlAddress)
|
|
// _DeviceType - Valid device types for the request
|
|
// ATALK_DEV_ANY => Any device
|
|
// _MdlSizeOffset - Offset in action buffer where the size for the first
|
|
// mdl can be found. Non-zero only when DFLAG_MDL2 is set.
|
|
// _Dispatch - The dispatch routine for the request
|
|
//
|
|
typedef struct _ActionDispatch {
|
|
USHORT _MinBufLen;
|
|
USHORT _OpCode;
|
|
USHORT _Flags;
|
|
USHORT _ActionBufSize;
|
|
ATALK_DEV_TYPE _DeviceType;
|
|
DISPATCH_ROUTINE _Dispatch;
|
|
} ACTION_DISPATCH, *PACTION_DISPATCH;
|
|
|
|
|
|
extern POBJECT_TYPE *IoFileObjectType;
|
|
|
|
extern ACTION_DISPATCH AtalkActionDispatch[];
|
|
|
|
#define ACTREQ_SIGNATURE (*(PULONG)"ACRQ")
|
|
#if DBG
|
|
#define VALID_ACTREQ(pActReq) (((pActReq) != NULL) && \
|
|
((pActReq)->ar_Signature == ACTREQ_SIGNATURE))
|
|
#else
|
|
#define VALID_ACTREQ(pActReq) ((pActReq) != NULL)
|
|
#endif
|
|
typedef struct _ActionReq
|
|
{
|
|
#if DBG
|
|
ULONG ar_Signature;
|
|
#endif
|
|
PIRP ar_pIrp; // Irp for the request
|
|
PVOID ar_pParms; // Action parameter block
|
|
PAMDL ar_pAMdl; // Mdl (OPTIONAL)
|
|
SHORT ar_MdlSize; // And its size
|
|
ULONG ar_ActionCode; // TDI Action code
|
|
SHORT ar_DevType; // Which device ?
|
|
ACTION_COMPLETION ar_Completion; // Tdi Completion routine
|
|
PKEVENT ar_CmplEvent; // zone-list acquiring done
|
|
PVOID ar_pZci; // ptr to zoneinfo struct
|
|
ULONG ar_StatusCode;
|
|
} ACTREQ, *PACTREQ;
|
|
|
|
typedef enum {
|
|
ATALK_INDICATE_DISCONNECT,
|
|
ATALK_TIMER_DISCONNECT,
|
|
ATALK_REMOTE_DISCONNECT,
|
|
ATALK_LOCAL_DISCONNECT
|
|
} ATALK_DISCONNECT_TYPE;
|
|
#define DISCONN_STATUS(DiscType) \
|
|
(((DiscType == ATALK_TIMER_DISCONNECT) ? ATALK_CONNECTION_TIMEOUT : \
|
|
(DiscType == ATALK_REMOTE_DISCONNECT)) ? ATALK_REMOTE_CLOSE : \
|
|
ATALK_NO_ERROR)
|
|
|
|
extern
|
|
NTSTATUS
|
|
AtalkTdiOpenAddress(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp,
|
|
IN PTA_APPLETALK_ADDRESS TdiAddress,
|
|
IN UCHAR ProtocolType,
|
|
IN UCHAR SocketType,
|
|
IN OUT PATALK_DEV_CTX Context
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
AtalkTdiOpenConnection(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp,
|
|
IN CONNECTION_CONTEXT ConnectionContext,
|
|
IN OUT PATALK_DEV_CTX Context
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
AtalkTdiOpenControlChannel(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp,
|
|
IN OUT PATALK_DEV_CTX Context
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
AtalkTdiCleanupAddress(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp,
|
|
IN OUT PATALK_DEV_CTX Context
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
AtalkTdiCleanupConnection(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp,
|
|
IN OUT PATALK_DEV_CTX Context
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
AtalkTdiCloseAddress(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp,
|
|
IN OUT PATALK_DEV_CTX Context
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
AtalkTdiCloseConnection(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp,
|
|
IN OUT PATALK_DEV_CTX Context
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
AtalkTdiCloseControlChannel(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp,
|
|
IN OUT PATALK_DEV_CTX Context
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
AtalkTdiCancel(
|
|
IN OUT PATALK_DEV_OBJ pDevObj,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
AtalkTdiAssociateAddress(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp,
|
|
IN OUT PATALK_DEV_CTX Context
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
AtalkTdiDisassociateAddress(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp,
|
|
IN OUT PATALK_DEV_CTX Context
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
AtalkTdiConnect(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp,
|
|
IN OUT PATALK_DEV_CTX Context
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
AtalkTdiDisconnect(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp,
|
|
IN OUT PATALK_DEV_CTX Context
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
AtalkTdiAccept(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp,
|
|
IN OUT PATALK_DEV_CTX Context
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
AtalkTdiListen(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp,
|
|
IN OUT PATALK_DEV_CTX Context
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
AtalkTdiSendDgram(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp,
|
|
IN OUT PATALK_DEV_CTX Context
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
AtalkTdiReceiveDgram(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp,
|
|
IN OUT PATALK_DEV_CTX Context
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
AtalkTdiSend(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp,
|
|
IN OUT PATALK_DEV_CTX Context
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
AtalkTdiReceive(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp,
|
|
IN OUT PATALK_DEV_CTX Context
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
AtalkTdiAction(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp,
|
|
IN OUT PATALK_DEV_CTX Context
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
AtalkTdiQueryInformation(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp,
|
|
IN OUT PATALK_DEV_CTX Context
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
AtalkTdiSetInformation(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp,
|
|
IN OUT PATALK_DEV_CTX Context
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
AtalkTdiSetEventHandler(
|
|
IN PIRP Irp,
|
|
IN PIO_STACK_LOCATION IrpSp,
|
|
IN OUT PATALK_DEV_CTX Context
|
|
);
|
|
|
|
|
|
extern
|
|
ATALK_ERROR
|
|
AtalkStatTdiAction(
|
|
IN PVOID pObject, // Address or Connection object
|
|
IN PACTREQ pActReq // Pointer to action request
|
|
);
|
|
|
|
extern
|
|
ATALK_ERROR
|
|
AtalkNbpTdiAction(
|
|
IN PVOID pObject, // Address or Connection object
|
|
IN PACTREQ pActReq // Pointer to action request
|
|
);
|
|
|
|
extern
|
|
ATALK_ERROR
|
|
AtalkZipTdiAction(
|
|
IN PVOID pObject, // Address or Connection object
|
|
IN PACTREQ pActReq // Pointer to action request
|
|
);
|
|
|
|
extern
|
|
ATALK_ERROR
|
|
AtalkAdspTdiAction(
|
|
IN PVOID pObject, // Address or Connection object
|
|
IN PACTREQ pActReq // Pointer to action request
|
|
);
|
|
|
|
extern
|
|
ATALK_ERROR
|
|
AtalkAspCTdiAction(
|
|
IN PVOID pObject, // Address or Connection object
|
|
IN PACTREQ pActReq // Pointer to action request
|
|
);
|
|
|
|
extern
|
|
ATALK_ERROR
|
|
AtalkPapTdiAction(
|
|
IN PVOID pObject, // Address or Connection object
|
|
IN PACTREQ pActReq // Pointer to action request
|
|
);
|
|
|
|
extern
|
|
ATALK_ERROR
|
|
AtalkAspTdiAction(
|
|
IN PVOID pObject, // Address or Connection object
|
|
IN PACTREQ pActReq // Pointer to action request
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
atalkTdiGenericWriteComplete(
|
|
IN ATALK_ERROR ErrorCode,
|
|
IN PAMDL WriteBuf,
|
|
IN USHORT WriteLen,
|
|
IN PIRP pIrp
|
|
);
|
|
|
|
typedef struct
|
|
{
|
|
LONG ls_LockCount;
|
|
PVOID ls_LockHandle;
|
|
} LOCK_SECTION, *PLOCK_SECTION;
|
|
|
|
#define AtalkLockAdspIfNecessary() AtalkLockUnlock(TRUE, \
|
|
&AtalkPgLkSection[ADSP_SECTION])
|
|
#define AtalkUnlockAdspIfNecessary() AtalkLockUnlock(FALSE, \
|
|
&AtalkPgLkSection[ADSP_SECTION])
|
|
|
|
#define AtalkLockPapIfNecessary() AtalkLockUnlock(TRUE, \
|
|
&AtalkPgLkSection[PAP_SECTION])
|
|
#define AtalkUnlockPapIfNecessary() AtalkLockUnlock(FALSE, \
|
|
&AtalkPgLkSection[PAP_SECTION])
|
|
|
|
#define AtalkLockNbpIfNecessary() AtalkLockUnlock(TRUE, \
|
|
&AtalkPgLkSection[NBP_SECTION])
|
|
#define AtalkUnlockNbpIfNecessary() AtalkLockUnlock(FALSE, \
|
|
&AtalkPgLkSection[NBP_SECTION])
|
|
|
|
#define AtalkLockZipIfNecessary() AtalkLockUnlock(TRUE, \
|
|
&AtalkPgLkSection[ZIP_SECTION])
|
|
#define AtalkUnlockZipIfNecessary() AtalkLockUnlock(FALSE, \
|
|
&AtalkPgLkSection[ZIP_SECTION])
|
|
|
|
#define AtalkLockRouterIfNecessary() AtalkLockUnlock(TRUE, \
|
|
&AtalkPgLkSection[ROUTER_SECTION])
|
|
#define AtalkUnlockRouterIfNecessary() AtalkLockUnlock(FALSE, \
|
|
&AtalkPgLkSection[ROUTER_SECTION])
|
|
|
|
#define AtalkLockTdiIfNecessary() AtalkLockUnlock(TRUE, \
|
|
&AtalkPgLkSection[TDI_SECTION])
|
|
#define AtalkUnlockTdiIfNecessary() AtalkLockUnlock(FALSE, \
|
|
&AtalkPgLkSection[TDI_SECTION])
|
|
|
|
#define AtalkLockAspIfNecessary() AtalkLockUnlock(TRUE, \
|
|
&AtalkPgLkSection[ASP_SECTION])
|
|
#define AtalkUnlockAspIfNecessary() AtalkLockUnlock(FALSE, \
|
|
&AtalkPgLkSection[ASP_SECTION])
|
|
|
|
#define AtalkLockAspCIfNecessary() AtalkLockUnlock(TRUE, \
|
|
&AtalkPgLkSection[ASPC_SECTION])
|
|
#define AtalkUnlockAspCIfNecessary() AtalkLockUnlock(FALSE, \
|
|
&AtalkPgLkSection[ASPC_SECTION])
|
|
|
|
#define AtalkLockAtpIfNecessary() AtalkLockUnlock(TRUE, \
|
|
&AtalkPgLkSection[ATP_SECTION])
|
|
#define AtalkUnlockAtpIfNecessary() AtalkLockUnlock(FALSE, \
|
|
&AtalkPgLkSection[ATP_SECTION])
|
|
|
|
#define AtalkLockInitIfNecessary() AtalkLockUnlock(TRUE, \
|
|
&AtalkPgLkSection[INIT_SECTION])
|
|
#define AtalkUnlockInitIfNecessary() AtalkLockUnlock(FALSE, \
|
|
&AtalkPgLkSection[INIT_SECTION])
|
|
#define AtalkLockArapIfNecessary() AtalkLockUnlock(TRUE, \
|
|
&AtalkPgLkSection[ARAP_SECTION])
|
|
#define AtalkUnlockArapIfNecessary() AtalkLockUnlock(FALSE, \
|
|
&AtalkPgLkSection[ARAP_SECTION])
|
|
#define AtalkLockPPPIfNecessary() AtalkLockUnlock(TRUE, \
|
|
&AtalkPgLkSection[PPP_SECTION])
|
|
#define AtalkUnlockPPPIfNecessary() AtalkLockUnlock(FALSE, \
|
|
&AtalkPgLkSection[PPP_SECTION])
|
|
|
|
extern
|
|
VOID
|
|
AtalkLockInit(
|
|
IN PLOCK_SECTION pLs,
|
|
IN PVOID Address
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
AtalkLockUnlock(
|
|
IN BOOLEAN Lock,
|
|
IN PLOCK_SECTION pLs
|
|
);
|
|
|
|
#define ROUTER_SECTION 0
|
|
#define NBP_SECTION 1 // NBP & ZIP share the sections
|
|
#define ZIP_SECTION 1
|
|
#define TDI_SECTION 2
|
|
#define ATP_SECTION 3
|
|
#define ASP_SECTION 4
|
|
#define PAP_SECTION 5
|
|
#define ADSP_SECTION 6
|
|
#define ASPC_SECTION 7
|
|
#define INIT_SECTION 8
|
|
#define ARAP_SECTION 9
|
|
#define PPP_SECTION 10
|
|
#define LOCKABLE_SECTIONS 11
|
|
|
|
extern KMUTEX AtalkPgLkMutex;
|
|
extern ATALK_SPIN_LOCK AtalkPgLkLock;
|
|
extern LOCK_SECTION AtalkPgLkSection[LOCKABLE_SECTIONS];
|
|
|
|
// Used by AtalkLockUnlock & atalkQueuedLockUnlock to communicate. The latter is queued
|
|
// up by the former whenever it is called at DISPACTH to unlock
|
|
typedef struct
|
|
{
|
|
WORK_QUEUE_ITEM qlu_WQI;
|
|
PLOCK_SECTION qlu_pLockSection;
|
|
PPORT_DESCRIPTOR qlu_pPortDesc;
|
|
} QLU, *PQLU;
|
|
|
|
LOCAL VOID FASTCALL
|
|
atalkTdiSendDgramComplete(
|
|
IN NDIS_STATUS Status,
|
|
IN struct _SEND_COMPL_INFO * pSendInfo
|
|
);
|
|
|
|
LOCAL VOID
|
|
atalkTdiRecvDgramComplete(
|
|
IN ATALK_ERROR ErrorCode,
|
|
IN PAMDL pReadBuf,
|
|
IN USHORT ReadLen,
|
|
IN PATALK_ADDR pSrcAddr,
|
|
IN PIRP pIrp);
|
|
|
|
LOCAL VOID
|
|
atalkTdiActionComplete(
|
|
IN ATALK_ERROR ErrorCode,
|
|
IN PACTREQ pActReq
|
|
);
|
|
|
|
LOCAL VOID
|
|
atalkTdiGenericComplete(
|
|
IN ATALK_ERROR ErrorCode,
|
|
IN PIRP pIrp
|
|
);
|
|
|
|
LOCAL VOID
|
|
atalkTdiCloseAddressComplete(
|
|
IN ATALK_ERROR ErrorCode,
|
|
IN PIRP pIrp
|
|
);
|
|
|
|
LOCAL VOID
|
|
atalkTdiGenericReadComplete(
|
|
IN ATALK_ERROR ErrorCode,
|
|
IN PAMDL ReadBuf,
|
|
IN USHORT ReadLen,
|
|
IN ULONG ReadFlags,
|
|
IN PIRP pIrp
|
|
);
|
|
|
|
LOCAL VOID
|
|
atalkQueuedLockUnlock(
|
|
IN PQLU pQLU
|
|
);
|
|
|
|
VOID
|
|
atalkWaitDefaultPort(
|
|
VOID
|
|
);
|
|
|
|
#endif // _ATKTDI_
|
|
|
|
|