685 lines
18 KiB
C
685 lines
18 KiB
C
/*++
|
|
|
|
Copyright (c) 1989 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
mrxglbl.h
|
|
|
|
Abstract:
|
|
|
|
The global include file for SMB mini redirector
|
|
|
|
|
|
--*/
|
|
|
|
#ifndef _MRXGLBL_H_
|
|
#define _MRXGLBL_H_
|
|
|
|
#include "align.h"
|
|
|
|
#define INCLUDE_SMB_ALL
|
|
|
|
#include "status.h"
|
|
#include "smbtypes.h"
|
|
#include "smbmacro.h"
|
|
#include "smb.h"
|
|
#include "smbtrans.h"
|
|
#include "smbtrace.h"
|
|
#include "smbtrsup.h"
|
|
#include "smbgtpt.h"
|
|
|
|
typedef struct _SMBCE_CONTEXT_ {
|
|
UNICODE_STRING ComputerName;
|
|
UNICODE_STRING OperatingSystem;
|
|
UNICODE_STRING LanmanType;
|
|
UNICODE_STRING Transports;
|
|
} SMBCE_CONTEXT,*PSMBCE_CONTEXT;
|
|
|
|
// The following enum type defines the various states associated with the IFS
|
|
// mini redirector. This is used during initialization
|
|
|
|
typedef enum _MRXIFS_STATE_ {
|
|
MRXIFS_STARTABLE,
|
|
MRXIFS_START_IN_PROGRESS,
|
|
MRXIFS_STARTED
|
|
} MRXIFS_STATE,*PMRXIFS_STATE;
|
|
|
|
extern MRXIFS_STATE MRxIfsState;
|
|
|
|
extern SMBCE_CONTEXT SmbCeContext;
|
|
|
|
extern RXCE_ADDRESS_EVENT_HANDLER MRxSmbVctAddressEventHandler;
|
|
extern RXCE_CONNECTION_EVENT_HANDLER MRxSmbVctConnectionEventHandler;
|
|
|
|
extern PBYTE s_pNegotiateSmb;
|
|
extern ULONG s_NegotiateSmbLength;
|
|
extern PMDL s_pNegotiateSmbBuffer;
|
|
|
|
extern PBYTE s_pEchoSmb;
|
|
extern ULONG s_EchoSmbLength;
|
|
extern PMDL s_pEchoSmbMdl;
|
|
|
|
extern FAST_MUTEX MRxIfsSerializationMutex;
|
|
|
|
typedef REDIR_STATISTICS MRX_IFS_STATISTICS;
|
|
typedef PREDIR_STATISTICS PMRX_IFS_STATISTICS;
|
|
|
|
extern MRX_IFS_STATISTICS MRxIfsStatistics;
|
|
|
|
// Miscellanous definitions
|
|
|
|
extern PBYTE MRxSmb_pPaddingData;
|
|
|
|
#define NETBIOS_NAMESIZE (16)
|
|
#define SMBCE_PADDING_DATA_SIZE (32)
|
|
|
|
// All the pool tag definitions related to the IFS mini redirector are as follows.
|
|
// The mechanism is intended to balance the number of pool tags to be used with the
|
|
// total number of tags available in the system.
|
|
//
|
|
// By specifying special flags the total number of tags consumed by the mini redirector
|
|
// can be controlled. For most builds the tags should be aliased such that about
|
|
// 6 tags are consumed by the mini redirector. In special builds the aliasing of tags
|
|
// will be suppressed, thereby consuming more tags to track down memory leaks easily.
|
|
//
|
|
// The following are the five major tags ....
|
|
//
|
|
// 1) IfCe -- the IFS Mini Redirector connection engine.
|
|
//
|
|
// 2) IfOe -- the IFS Mini redirector ordinary exchange related allocation.
|
|
//
|
|
// 3) IfAd -- the IFS Mini redirector ADMIN exchange/session setup/tree connect etc.
|
|
//
|
|
// 4) IfRw -- the IFS mini redirector read/write paths
|
|
//
|
|
// 5) IfMs -- the miscellanous category.
|
|
|
|
#define MRXSMB_CE_POOLTAG ('eCfI')
|
|
#define MRXSMB_MM_POOLTAG ('mMfI')
|
|
#define MRXSMB_ADMIN_POOLTAG ('dAfI')
|
|
#define MRXSMB_RW_POOLTAG ('wRfI')
|
|
#define MRXIFS_MISC_POOLTAG ('sMfI')
|
|
#define MRXSMB_TRANSPORT_POOLTAG ('pTfI')
|
|
|
|
extern ULONG MRxIfsExplodePoolTags;
|
|
|
|
#define MRXSMB_DEFINE_POOLTAG(ExplodedPoolTag,DefaultPoolTag) \
|
|
((MRxIfsExplodePoolTags == 0) ? (DefaultPoolTag) : (ExplodedPoolTag))
|
|
|
|
#define MRXSMB_FSCTL_POOLTAG MRXSMB_DEFINE_POOLTAG('cFfI',MRXIFS_MISC_POOLTAG)
|
|
#define MRXSMB_DIRCTL_POOLTAG MRXSMB_DEFINE_POOLTAG('cDfI',MRXIFS_MISC_POOLTAG)
|
|
#define MRXSMB_PIPEINFO_POOLTAG MRXSMB_DEFINE_POOLTAG('iPfI',MRXIFS_MISC_POOLTAG)
|
|
|
|
#define MRXSMB_SERVER_POOLTAG MRXSMB_DEFINE_POOLTAG('rSfI',MRXSMB_CE_POOLTAG)
|
|
#define MRXSMB_SESSION_POOLTAG MRXSMB_DEFINE_POOLTAG('eSfI',MRXSMB_CE_POOLTAG)
|
|
#define MRXSMB_NETROOT_POOLTAG MRXSMB_DEFINE_POOLTAG('rNfI',MRXSMB_CE_POOLTAG)
|
|
|
|
#define MRXSMB_MIDATLAS_POOLTAG MRXSMB_DEFINE_POOLTAG('aMfI', MRXSMB_CE_POOLTAG)
|
|
|
|
#define MRXSMB_MAILSLOT_POOLTAG MRXSMB_DEFINE_POOLTAG('tMfI', MRXSMB_CE_POOLTAG)
|
|
#define MRXSMB_VC_POOLTAG MRXSMB_DEFINE_POOLTAG('cVfI',MRXSMB_CE_POOLTAG)
|
|
|
|
#define MRXSMB_ECHO_POOLTAG MRXSMB_DEFINE_POOLTAG('cEfI',MRXSMB_ADMIN_POOLTAG)
|
|
|
|
#define MRXSMB_KERBEROS_POOLTAG MRXSMB_DEFINE_POOLTAG('sKfI',MRXSMB_ADMIN_POOLTAG)
|
|
|
|
|
|
// NodeType Codes
|
|
|
|
#define SMB_EXCHANGE_CATEGORY (0xed)
|
|
#define SMB_CONNECTION_ENGINE_DB_CATEGORY (0xea)
|
|
#define SMB_SERVER_TRANSPORT_CATEGORY (0xeb)
|
|
|
|
|
|
#define SMB_EXCHANGE_NTC(x) ((SMB_EXCHANGE_CATEGORY << 8) | (x))
|
|
|
|
#define SMB_NTC_STUFFERSTATE 0xed80
|
|
|
|
|
|
#undef RxCaptureRequestPacket
|
|
#undef RxCaptureParamBlock
|
|
|
|
|
|
extern PEPROCESS RDBSSProcessPtr;
|
|
extern PRDBSS_DEVICE_OBJECT MRxIfsDeviceObject;
|
|
#define RxNetNameTable (*(*___MINIRDR_IMPORTS_NAME).pRxNetNameTable)
|
|
#define RxStrucSupSpinLock (*(*___MINIRDR_IMPORTS_NAME).pRxStrucSupSpinLock)
|
|
|
|
#define MAXIMUM_PARTIAL_BUFFER_SIZE 65535 // Maximum size of a partial MDL
|
|
|
|
#define MAXIMUM_SMB_BUFFER_SIZE 4356
|
|
|
|
//
|
|
// forward declarations for all dispatch vector methods.
|
|
//
|
|
|
|
extern NTSTATUS
|
|
MRxIfsStart (
|
|
IN OUT struct _RX_CONTEXT * RxContext,
|
|
IN OUT PRDBSS_DEVICE_OBJECT RxDeviceObject
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsStop (
|
|
IN OUT struct _RX_CONTEXT * RxContext,
|
|
IN OUT PRDBSS_DEVICE_OBJECT RxDeviceObject
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsMinirdrControl (
|
|
IN OUT PRX_CONTEXT RxContext,
|
|
IN OUT PVOID pContext,
|
|
IN OUT PUCHAR SharedBuffer,
|
|
IN ULONG InputBufferLength,
|
|
IN ULONG OutputBufferLength,
|
|
OUT PULONG CopyBackLength
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsDevFcb (
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsDevFcbXXXControlFile (
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsCreate (
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsCollapseOpen (
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsRead (
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsWrite (
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsLocks(
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsFlush(
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsFsCtl(
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
NTSTATUS
|
|
MRxIfsIoCtl(
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsNotifyChangeDirectory(
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
|
|
extern NTSTATUS
|
|
MRxIfsComputeNewBufferingState(
|
|
IN OUT PMRX_SRV_OPEN pSrvOpen,
|
|
IN PVOID pMRxContext,
|
|
OUT ULONG *pNewBufferingState);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsFlush (
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsCloseWithDelete (
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsZeroExtend (
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsTruncate (
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsCleanupFobx (
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsCloseSrvOpen (
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsClosedSrvOpenTimeOut (
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsQueryDirectory (
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsQueryEaInformation (
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsSetEaInformation (
|
|
IN OUT struct _RX_CONTEXT * RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsQuerySecurityInformation (
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsSetSecurityInformation (
|
|
IN OUT struct _RX_CONTEXT * RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsQueryVolumeInformation (
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsSetVolumeInformation (
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsLowIOSubmit (
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsCreateVNetRoot(
|
|
IN OUT PMRX_V_NET_ROOT pVirtualNetRoot,
|
|
IN OUT PMRX_CREATENETROOT_CONTEXT pContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsFinalizeVNetRoot(
|
|
IN OUT PMRX_V_NET_ROOT pVirtualNetRoot,
|
|
IN PBOOLEAN ForceDisconnect);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsFinalizeNetRoot(
|
|
IN OUT PMRX_NET_ROOT pNetRoot,
|
|
IN PBOOLEAN ForceDisconnect);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsUpdateNetRootState(
|
|
IN PMRX_NET_ROOT pNetRoot);
|
|
|
|
VOID
|
|
MRxIfsExtractNetRootName(
|
|
IN PUNICODE_STRING FilePathName,
|
|
IN PMRX_SRV_CALL SrvCall,
|
|
OUT PUNICODE_STRING NetRootName,
|
|
OUT PUNICODE_STRING RestOfName OPTIONAL
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsCreateSrvCall(
|
|
PMRX_SRV_CALL pSrvCall,
|
|
PMRX_SRVCALL_CALLBACK_CONTEXT pCallbackContext);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsFinalizeSrvCall(
|
|
PMRX_SRV_CALL pSrvCall,
|
|
BOOLEAN Force);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsSrvCallWinnerNotify(
|
|
IN OUT PMRX_SRV_CALL pSrvCall,
|
|
IN BOOLEAN ThisMinirdrIsTheWinner,
|
|
IN OUT PVOID pSrvCallContext);
|
|
|
|
|
|
extern NTSTATUS
|
|
MRxIfsQueryFileInformation (
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsQueryNamedPipeInformation (
|
|
IN OUT PRX_CONTEXT RxContext,
|
|
IN FILE_INFORMATION_CLASS FileInformationClass,
|
|
IN OUT PVOID Buffer,
|
|
IN OUT PULONG pLengthRemaining
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsSetFileInformation (
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsSetNamedPipeInformation (
|
|
IN OUT PRX_CONTEXT RxContext,
|
|
IN FILE_INFORMATION_CLASS FileInformationClass,
|
|
IN PVOID pBuffer,
|
|
IN ULONG BufferLength
|
|
);
|
|
|
|
NTSTATUS
|
|
MRxIfsSetFileInformationAtCleanup(
|
|
IN OUT PRX_CONTEXT RxContext
|
|
);
|
|
|
|
NTSTATUS
|
|
MRxIfsDeallocateForFcb (
|
|
IN OUT PMRX_FCB pFcb
|
|
);
|
|
|
|
NTSTATUS
|
|
MRxIfsDeallocateForFobx (
|
|
IN OUT PMRX_FOBX pFobx
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsForcedClose (
|
|
IN OUT PMRX_SRV_OPEN SrvOpen
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsExtendFile (
|
|
IN OUT struct _RX_CONTEXT * RxContext,
|
|
IN OUT PLARGE_INTEGER pNewFileSize,
|
|
OUT PLARGE_INTEGER pNewAllocationSize
|
|
);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsCompleteBufferingStateChangeRequest (
|
|
IN OUT PRX_CONTEXT RxContext,
|
|
IN OUT PMRX_SRV_OPEN SrvOpen,
|
|
IN PVOID pContext
|
|
);
|
|
|
|
|
|
extern NTSTATUS
|
|
MRxIfsExtendForCache (
|
|
IN OUT PRX_CONTEXT RxContext,
|
|
IN OUT PFCB Fcb,
|
|
OUT PLONGLONG pNewFileSize
|
|
);
|
|
|
|
extern
|
|
NTSTATUS
|
|
MRxIfsInitializeSecurity (VOID);
|
|
|
|
extern
|
|
NTSTATUS
|
|
MRxIfsUninitializeSecurity (VOID);
|
|
|
|
extern
|
|
NTSTATUS
|
|
MRxIfsInitializeTransport(VOID);
|
|
|
|
extern
|
|
NTSTATUS
|
|
MRxIfsUninitializeTransport(VOID);
|
|
|
|
extern
|
|
NTSTATUS
|
|
GetSmbResponseNtStatus(PSMB_HEADER pSmbHeader);
|
|
|
|
extern NTSTATUS
|
|
MRxIfsTransportUpdateHandler(
|
|
PRXCE_TRANSPORT_NOTIFICATION pTransportNotification);
|
|
|
|
extern NTSTATUS
|
|
SmbCeEstablishConnection(
|
|
IN PMRX_V_NET_ROOT pVNetRoot,
|
|
IN PMRX_CREATENETROOT_CONTEXT pCreateNetRootContext);
|
|
|
|
extern NTSTATUS
|
|
SmbCeReconnect(
|
|
IN PMRX_V_NET_ROOT pVNetRoot);
|
|
|
|
//
|
|
// the SMB protocol tree connections are identified by a Tree Id., each
|
|
// file opened on a tree connection by a File Id. and each outstanding request
|
|
// on that connection by a Multiplex Id.
|
|
//
|
|
|
|
|
|
typedef USHORT SMB_TREE_ID;
|
|
typedef USHORT SMB_FILE_ID;
|
|
typedef USHORT SMB_MPX_ID;
|
|
|
|
|
|
//
|
|
// Each user w.r.t a particular connection is identified by a User Id. and each
|
|
// process on the client side is identified by a Process id.
|
|
//
|
|
|
|
typedef USHORT SMB_USER_ID;
|
|
typedef USHORT SMB_PROCESS_ID;
|
|
|
|
//
|
|
// All exchanges are identified with a unique id. assigned on creation of the exchange
|
|
// which is used to track it.
|
|
//
|
|
|
|
typedef ULONG SMB_EXCHANGE_ID;
|
|
|
|
typedef struct _MRX_SMB_FCB_ {
|
|
ULONG MFlags;
|
|
SMB_TREE_ID Tid;
|
|
} MRX_SMB_FCB, *PMRX_SMB_FCB;
|
|
|
|
#define MRxIfsGetFcbExtension(pFcb) \
|
|
(((pFcb) == NULL) ? NULL : (PMRX_SMB_FCB)((pFcb)->Context))
|
|
|
|
#define SMB_FCB_FLAG_SENT_DISPOSITION_INFO 0x00000001
|
|
|
|
typedef struct _SMBPSE_FILEINFO_BUNDLE {
|
|
FILE_BASIC_INFORMATION Basic;
|
|
FILE_STANDARD_INFORMATION Standard;
|
|
} SMBPSE_FILEINFO_BUNDLE, *PSMBPSE_FILEINFO_BUNDLE;
|
|
|
|
typedef struct _MRX_SMB_SRV_OPEN_ {
|
|
ULONG Flags;
|
|
ULONG Version;
|
|
SMB_FILE_ID Fid;
|
|
UCHAR OplockLevel;
|
|
|
|
// the following fields are used for to save the results of a GetFileAttributes
|
|
// and to validate whether the fields should be reused or not
|
|
|
|
ULONG RxContextSerialNumber;
|
|
LARGE_INTEGER TimeStampInTicks;
|
|
SMBPSE_FILEINFO_BUNDLE FileInfo;
|
|
} MRX_SMB_SRV_OPEN, *PMRX_SMB_SRV_OPEN;
|
|
|
|
#define MRxIfsGetSrvOpenExtension(pSrvOpen) \
|
|
(((pSrvOpen) == NULL) ? NULL : (PMRX_SMB_SRV_OPEN)((pSrvOpen)->Context))
|
|
|
|
#define SMB_SRVOPEN_FLAG_NOT_REALLY_OPEN 0x00000001
|
|
#define SMB_SRVOPEN_FLAG_CANT_REALLY_OPEN 0x00000002
|
|
#define SMB_SRVOPEN_FLAG_CANT_GETATTRIBS 0x00000004
|
|
|
|
typedef USHORT SMB_SEARCH_HANDLE;
|
|
|
|
typedef struct _MRX_SMB_DIRECTORY_RESUME_INFO {
|
|
REQ_FIND_NEXT2 FindNext2_Request;
|
|
//now we have to include space for a resume name........
|
|
WCHAR NameSpace[MAXIMUM_FILENAME_LENGTH+1]; //trailing null
|
|
USHORT ParametersLength;
|
|
} MRX_SMB_DIRECTORY_RESUME_INFO, *PMRX_SMB_DIRECTORY_RESUME_INFO;
|
|
|
|
typedef struct _MRX_SMB_FOBX_ {
|
|
union {
|
|
struct {
|
|
struct {
|
|
SMB_SEARCH_HANDLE SearchHandle;
|
|
ULONG Version;
|
|
union {
|
|
//the close code will try to free this!
|
|
PMRX_SMB_DIRECTORY_RESUME_INFO ResumeInfo;
|
|
PSMB_RESUME_KEY CoreResumeKey;
|
|
};
|
|
struct {
|
|
//unaligned direntry sidebuffering params
|
|
PBYTE UnalignedDirEntrySideBuffer; //close will try to free this too
|
|
ULONG SerialNumber;
|
|
BOOLEAN EndOfSearchReached;
|
|
BOOLEAN IsUnicode;
|
|
BOOLEAN IsNonNtT2Find;
|
|
ULONG FilesReturned;
|
|
ULONG EntryOffset;
|
|
ULONG TotalDataBytesReturned;
|
|
};
|
|
};
|
|
NTSTATUS ErrorStatus;
|
|
USHORT Flags;
|
|
USHORT FileNameOffset;
|
|
USHORT FileNameLengthOffset;
|
|
BOOLEAN WildCardsFound;
|
|
} Enumeration;
|
|
};
|
|
union {
|
|
struct {
|
|
//dont do this yet
|
|
//ULONG MaximumReadBufferLength;
|
|
//ULONG MaximumWriteBufferLength;
|
|
USHORT Flags;
|
|
} File;
|
|
};
|
|
} MRX_SMB_FOBX, *PMRX_SMB_FOBX;
|
|
|
|
#define MRxIfsGetFileObjectExtension(pFobx) \
|
|
(((pFobx) == NULL) ? NULL : (PMRX_SMB_FOBX)((pFobx)->Context))
|
|
|
|
#define SMBFOBX_ENUMFLAG_SEARCH_NOT_THE_FIRST 0x0001
|
|
#define SMBFOBX_ENUMFLAG_SEARCH_HANDLE_OPEN 0x0002
|
|
#define SMBFOBX_ENUMFLAG_FAST_RESUME 0x0004
|
|
#define SMBFOBX_ENUMFLAG_CORE_SEARCH_IN_PROGRESS 0x0008
|
|
#define SMBFOBX_ENUMFLAG_LOUD_FINALIZE 0x0010
|
|
|
|
typedef
|
|
NTSTATUS
|
|
(NTAPI *PMRXSMB_CANCEL_ROUTINE) (
|
|
PRX_CONTEXT pRxContext);
|
|
|
|
typedef struct _MRXIFS_RX_CONTEXT {
|
|
PMRXSMB_CANCEL_ROUTINE pCancelRoutine;
|
|
PVOID pCancelContext;
|
|
struct _SMB_EXCHANGE *pExchange;
|
|
struct _SMBSTUFFER_BUFFER_STATE *pStufferState;
|
|
} MRXIFS_RX_CONTEXT, *PMRXIFS_RX_CONTEXT;
|
|
|
|
|
|
#define MRxSmbGetMinirdrContext(pRxContext) \
|
|
((PMRXIFS_RX_CONTEXT)(&(pRxContext)->MRxContext[0]))
|
|
|
|
#define MRxIfsMakeSrvOpenKey(Tid,Fid) \
|
|
(PVOID)(((ULONG)(Tid) << 16) | (ULONG)(Fid))
|
|
|
|
|
|
#define NETBIOS_NAMESIZE (16)
|
|
#define SMBCE_PADDING_DATA_SIZE (32)
|
|
|
|
//this better not be paged!
|
|
|
|
|
|
typedef struct _MRXIFS_GLOBAL_PADDING {
|
|
MDL Mdl;
|
|
ULONG Pages[2]; //this can't possibly span more than two pages
|
|
UCHAR Pad[SMBCE_PADDING_DATA_SIZE];
|
|
} MRXIFS_GLOBAL_PADDING, *PMRXIFS_GLOBAL_PADDING;
|
|
|
|
extern MRXIFS_GLOBAL_PADDING MrxIfsCeGlobalPadding;
|
|
|
|
|
|
#define RxBuildPartialMdlUsingOffset(SourceMdl,DestinationMdl,Offset,Length) \
|
|
IoBuildPartialMdl(SourceMdl,\
|
|
DestinationMdl,\
|
|
(PBYTE)MmGetMdlVirtualAddress(SourceMdl)+Offset,\
|
|
Length)
|
|
|
|
#define RxBuildPaddingPartialMdl(DestinationMdl,Length) \
|
|
RxBuildPartialMdlUsingOffset(&MrxSmbCeGlobalPadding.Mdl,DestinationMdl,0,Length)
|
|
|
|
|
|
//we turn away async operations that are not wait by posting. if we can wait
|
|
//then we turn off the sync flag so that things will just act synchronous
|
|
#define TURN_BACK_ASYNCHRONOUS_OPERATIONS() { \
|
|
if (FlagOn(RxContext->Flags,RX_CONTEXT_FLAG_ASYNC_OPERATION)) { \
|
|
if (FlagOn(RxContext->Flags,RX_CONTEXT_FLAG_WAIT)) { \
|
|
ClearFlag(RxContext->Flags,RX_CONTEXT_FLAG_ASYNC_OPERATION) \
|
|
} else { \
|
|
RxContext->PostRequest = TRUE; \
|
|
return(STATUS_PENDING); \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
|
|
typedef struct _MRXIFS_CONFIGURATION_DATA_ {
|
|
ULONG NamedPipeDataCollectionTimeInterval;
|
|
ULONG NamedPipeDataCollectionSize;
|
|
ULONG MaximumNumberOfCommands;
|
|
ULONG SessionTimeoutInterval;
|
|
ULONG LockQuota;
|
|
ULONG LockIncrement;
|
|
ULONG MaximumLock;
|
|
ULONG PipeIncrement;
|
|
ULONG PipeMaximum;
|
|
ULONG CachedFileTimeout;
|
|
ULONG DormantFileTimeout;
|
|
ULONG NumberOfMailslotBuffers;
|
|
ULONG MaximumNumberOfThreads;
|
|
ULONG ConnectionTimeoutInterval;
|
|
ULONG CharBufferSize;
|
|
|
|
BOOLEAN UseOplocks;
|
|
BOOLEAN UseUnlocksBehind;
|
|
BOOLEAN UseCloseBehind;
|
|
BOOLEAN BufferNamedPipes;
|
|
BOOLEAN UseLockReadUnlock;
|
|
BOOLEAN UtilizeNtCaching;
|
|
BOOLEAN UseRawRead;
|
|
BOOLEAN UseRawWrite;
|
|
BOOLEAN UseEncryption;
|
|
|
|
} MRXIFS_CONFIGURATION, *PMRXIFS_CONFIGURATION;
|
|
|
|
extern MRXIFS_CONFIGURATION MRxIfsConfiguration;
|
|
|
|
|
|
#include "smbce.h"
|
|
#include "midatlas.h"
|
|
#include "smbcedbp.h"
|
|
#include "smbcedb.h"
|
|
#include "smbxchng.h"
|
|
#include "stuffer.h"
|
|
#include "smbpse.h"
|
|
#include "transprt.h"
|
|
#include "ifsprocs.h" // crossreferenced routines
|
|
|
|
#endif _MRXGLBL_H_
|