165 lines
6.3 KiB
C
165 lines
6.3 KiB
C
/*++
|
|
|
|
Copyright (c) 1990 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
nettrans.h
|
|
|
|
Abstract:
|
|
|
|
This module contains definitions used while exchanging SMB's over the
|
|
network
|
|
|
|
Author:
|
|
|
|
Larry Osterman (LarryO) 16-Jul-1990
|
|
|
|
Revision History:
|
|
|
|
16-Jul-1990 LarryO
|
|
|
|
Created
|
|
|
|
--*/
|
|
|
|
|
|
#ifndef _NETTRANS
|
|
#define _NETTRANS
|
|
|
|
struct _MPX_ENTRY;
|
|
|
|
typedef
|
|
NTSTATUS
|
|
(*PNETTRANCEIVE_CALLBACK)(
|
|
IN PSMB_HEADER Smb,
|
|
IN PULONG SmbLength,
|
|
IN struct _MPX_ENTRY *MpxTable,
|
|
IN PVOID Context,
|
|
IN PSERVERLISTENTRY Server,
|
|
IN BOOLEAN ErrorIndicator,
|
|
IN NTSTATUS NetworkErrorCode OPTIONAL,
|
|
IN OUT PIRP *Irp OPTIONAL,
|
|
IN ULONG ReceiveFlags
|
|
);
|
|
|
|
#define STANDARD_CALLBACK_HEADER(CallbackRoutineName) \
|
|
NTSTATUS \
|
|
CallbackRoutineName ( \
|
|
IN PSMB_HEADER Smb, \
|
|
IN PULONG SmbLength, \
|
|
IN struct _MPX_ENTRY *MpxEntry, \
|
|
IN PVOID Ctx, \
|
|
IN PSERVERLISTENTRY Server, \
|
|
IN BOOLEAN ErrorIndicator, \
|
|
IN NTSTATUS NetworkErrorCode OPTIONAL, \
|
|
IN OUT PIRP *Irp, \
|
|
IN ULONG ReceiveFlags \
|
|
)
|
|
|
|
//
|
|
// The ERROR_TYPE structure defines the status of a NetTranceive
|
|
// request. It can be in one of three states:
|
|
//
|
|
// NoError - The request has not yet encountered an error.
|
|
// NetError - There was a network error (TDI).
|
|
// SMBError - The incoming SMB indicated an error.
|
|
// ReceiveIrpProcessing - Error processing is postponed.
|
|
//
|
|
|
|
typedef enum _Error_Type {
|
|
NoError, // Request was successful
|
|
NetError, // Network failure in the request
|
|
SMBError, // The incoming SMB indicated an error
|
|
ReceiveIrpProcessing // Error processing is postponed
|
|
} ERROR_TYPE;
|
|
|
|
|
|
//
|
|
// The TRANCEIVE_HEADER structure provides common header information
|
|
// for SMB exchanges.
|
|
//
|
|
|
|
typedef struct _TranceiveHeader {
|
|
ULONG Type; // Type of context structure.
|
|
KEVENT KernelEvent; // Event to wait on for completion
|
|
NTSTATUS ErrorCode; // Error if ErrorType != NoError.
|
|
ERROR_TYPE ErrorType; // Type of error to wait
|
|
ULONG TransferSize; // Used to calculate timeout length.
|
|
struct _MPX_ENTRY *MpxTableEntry; // Mpx table entry used for I/O
|
|
} TRANCEIVE_HEADER, *PTRANCEIVE_HEADER;
|
|
|
|
//
|
|
// The redirector keeps an array of outstanding requests to the remote
|
|
// server. For historical reasons, this table is called an MPX_TABLE
|
|
// (or Multiplex Table). Entries in the table are MPX Table Entries,
|
|
// and this structure defines those entries.
|
|
//
|
|
// When a network request is initiated, an MPX table entry is allocated
|
|
// and the information needed to track the request is filled in. When
|
|
// the response from the remote server arrives, the redirector looks in
|
|
// the MPX table entry indicated in the SMB (in the smb_mid field).
|
|
//
|
|
//
|
|
typedef struct _MPX_ENTRY {
|
|
ULONG Signature; // Type of structure.
|
|
USHORT Mid; // MPX Id of outgoing request.
|
|
USHORT Tid;
|
|
USHORT Uid; // Save the TID and UID for cancel.
|
|
USHORT Pid; // Low 8 bits of the PID for cancel.
|
|
ULONG Flags; // Flags describing the request.
|
|
|
|
ULONG StartTime; // Time to start timeout
|
|
ULONG TimeoutTime; // Time to timeout the request.
|
|
ULONG TransferSize; // Used to calculate timeout length
|
|
ULONG ReferenceCount; // Used to synchronize with cancel
|
|
|
|
PIRP SendIrp; // I/O request packet for Send.
|
|
PIRP ReceiveIrp; // I/O request packet for Receive.
|
|
PIRP OriginatingIrp; // I/O request packet for user request.
|
|
PIRP SendIrpToFree; // IRP to be freed at end of tranceive.
|
|
|
|
KEVENT SendCompleteEvent; // Send completion event.
|
|
|
|
PFILE_OBJECT FileObject; // Used to cancel MTE's for a file.
|
|
ERESOURCE_THREAD RequestorsThread; // Thread that initiated I/O.
|
|
PSERVERLISTENTRY SLE; // ServerList Entry for request.
|
|
PTRANCEIVE_HEADER RequestContext; // Context information about request.
|
|
PNETTRANCEIVE_CALLBACK Callback;
|
|
} MPX_ENTRY, *PMPX_ENTRY;
|
|
|
|
typedef struct _MPX_TABLE {
|
|
PMPX_ENTRY Entry; // Actual entry.
|
|
USHORT Mid; // Mpx ID for entry
|
|
} MPX_TABLE, *PMPX_TABLE;
|
|
|
|
|
|
#define MPX_ENTRY_ALLOCATED 0x00000001 // MPX table entry is allocated.
|
|
#define MPX_ENTRY_SENDIRPGIVEN 0x00000002 // Send IRP was provided to request
|
|
#define MPX_ENTRY_SENDCOMPLETE 0x00000004 // Send completed.
|
|
#define MPX_ENTRY_OPLOCK 0x00000008 // This is the oplock MPX entry.
|
|
#define MPX_ENTRY_LONGTERM 0x00000010 // This is a longterm request.
|
|
#define MPX_ENTRY_ABANDONED 0x00000020 // This has been abandoned.
|
|
#define MPX_ENTRY_RECEIVE_GIVEN 0x00000040 // Receive provided to requestor
|
|
#define MPX_ENTRY_RECEIVE_COMPLETE 0x00000080 // Receive was completed.
|
|
#define MPX_ENTRY_CANCEL_RECEIVE 0x00000100 // Receive needs to be canceled
|
|
#define MPX_ENTRY_CANCEL_SEND 0x00000200 // Send needs to be canceled.
|
|
#define MPX_ENTRY_CANNOT_CANCEL 0x00000400 // Send cannot be canceled.
|
|
|
|
|
|
#define NT_NORMAL 0x00000000 // This is an "ordinary" exchange.
|
|
#define NT_DONTSCROUNGE 0x00000001 // Don't scrounge SMB on send.
|
|
#define NT_NOCONNECTLIST 0x00000002 // The connection is invalid.
|
|
#define NT_NORESPONSE 0x00000004 // There is no response for this request (T2)
|
|
#define NT_NOKNOWSEAS 0x00000008 // This app doesn't knows EAs.
|
|
#define NT_NOKNOWSLONGNAMES 0x00000010 // This app doesn't knows Long Names
|
|
#define NT_NOSENDRESPONSE 0x00000020 // This is a one-way SMB send.
|
|
#define NT_DFSFILE 0x00000040 // This SMB contains a Dfs pathname
|
|
#define NT_CANNOTCANCEL 0x08000000 // This request cannot be canceled.
|
|
#define NT_PREFER_LONGTERM 0x10000000 // This should be a longterm request if possible.
|
|
#define NT_RECONNECTING 0x20000000 // This is the initiation of a connection.
|
|
#define NT_LONGTERM 0x40000000 // This is a long term operation.
|
|
#define NT_NORECONNECT 0x80000000 // Don't reconnect on this connect
|
|
|
|
#endif
|