mirror of https://github.com/tongzx/nt5src
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.
232 lines
5.7 KiB
232 lines
5.7 KiB
/*++
|
|
|
|
Copyright (c) 1991 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
Stuffer.h
|
|
|
|
Abstract:
|
|
|
|
Prototypes for the SMBstuffer formating primitives
|
|
|
|
Author:
|
|
|
|
Joe Linn 3-3-95
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifndef _SMBSTUFFER_INCLUDED_
|
|
#define _SMBSTUFFER_INCLUDED_
|
|
|
|
//CODE.IMPROVEMENT (sweeping) all the routines in here that are defined as MRxSmb.... should be MRxSmb....
|
|
|
|
IMPORTANT_STRUCTURE(SMBSTUFFER_BUFFER_STATE);
|
|
|
|
#define COVERED_CALL(x) {\
|
|
Status = x; \
|
|
if (Status != RX_MAP_STATUS(SUCCESS)) { \
|
|
RxDbgTrace(0, Dbg,("nonSUCCESS covered status = %lx\n",Status)); \
|
|
goto FINALLY; \
|
|
} \
|
|
ASSERT (StufferState->SpecificProblem == 0); \
|
|
}
|
|
|
|
#define MRXSMB_PROCESS_ID_ZERO (MRXSMB_PROCESS_ID - 1)
|
|
#define MRXSMB_MULTIPLX_ID_ZERO (0xdead)
|
|
#define MRXSMB_USER_ID_ZERO ((USHORT)'jj')
|
|
#define MRXSMB_TREE_ID_ZERO (0xbaba)
|
|
|
|
#define GetServerMaximumBufferSize(SRVCALL) 4356
|
|
|
|
#define SMB_REQUEST_SIZE(___x) (FIELD_OFFSET(REQ_##___x,Buffer[0]))
|
|
#if DBG
|
|
#define SMB_OFFSET_CHECK(___x,___y) (FIELD_OFFSET(REQ_##___x,___y)),
|
|
#define SMB_WCTBCC_CHECK(___x,___y) ( ((0x8000|(___z))<<16)+(FIELD_OFFSET(REQ_##___x,ByteCount)) ),
|
|
#define SMB_WCT_CHECK(___z) ((0x8000|(___z))<<16),
|
|
#else
|
|
#define SMB_OFFSET_CHECK(___x,___y)
|
|
#define SMB_WCTBCC_CHECK(___x,___y,___z)
|
|
#define SMB_WCT_CHECK(___z)
|
|
#endif
|
|
|
|
typedef enum _SMBbuf_STATUS_DETAIL {
|
|
xSMBbufSTATUS_OK,
|
|
xSMBbufSTATUS_CANT_COMPOUND,
|
|
xSMBbufSTATUS_HEADER_OVERRUN,
|
|
xSMBbufSTATUS_BUFFER_OVERRUN,
|
|
xSMBbufSTATUS_SERVER_OVERRUN,
|
|
xSMBbufSTATUS_FLAGS_CONFLICT,
|
|
xSMBbufSTATUS_MAXIMUM
|
|
} SMBbuf_STATUS_DETAIL;
|
|
|
|
//#define STUFFER_STATE_SIGNATURE ('fftS')
|
|
typedef struct _SMBSTUFFER_BUFFER_STATE {
|
|
NODE_TYPE_CODE NodeTypeCode; // node type.
|
|
NODE_BYTE_SIZE NodeByteSize; // node size.
|
|
// this stuff is fixed
|
|
PMDL HeaderMdl;
|
|
PMDL HeaderPartialMdl; //used for breaking up writes to avoid reallocation
|
|
PBYTE ActualBufferBase;
|
|
PBYTE BufferBase;
|
|
PBYTE BufferLimit;
|
|
//this stuff is reinitialized
|
|
PRX_CONTEXT RxContext;
|
|
PSMB_EXCHANGE Exchange;
|
|
PMDL DataMdl;
|
|
ULONG DataSize;
|
|
//PRXCE_DATA_BUFFER FinalMdl; //for later with no chain-send rule
|
|
PBYTE CurrentPosition;
|
|
PBYTE CurrentWct;
|
|
PBYTE CurrentBcc;
|
|
PBYTE CurrentDataOffset;
|
|
PBYTE CurrentParamOffset;
|
|
UCHAR PreviousCommand;
|
|
UCHAR CurrentCommand;
|
|
UCHAR SpecificProblem; //SMBbuf_STATUS_DETAIL this is set to pass back what happened
|
|
BOOLEAN Started;
|
|
ULONG FlagsCopy;
|
|
ULONG Flags2Copy;
|
|
//ULONG FlagsMask;
|
|
//ULONG Flags2Mask;
|
|
#if DBG
|
|
ULONG Signature;
|
|
PDEBUG_TRACE_CONTROLPOINT ControlPoint;
|
|
BOOLEAN PrintFLoop;
|
|
BOOLEAN PrintCLoop;
|
|
#endif
|
|
} SMBSTUFFER_BUFFER_STATE;
|
|
|
|
|
|
typedef enum _SMB_STUFFER_CONTROLS {
|
|
STUFFER_CTL_NORMAL=1,
|
|
STUFFER_CTL_SKIP, // only w,d,b can be in a skip string
|
|
STUFFER_CTL_NOBYTES,
|
|
STUFFER_CTL_ENDOFARGUMENTS,
|
|
STUFFER_CTL_MAXIMUM
|
|
} SMB_STUFFER_CONTROLS;
|
|
|
|
#define StufferCondition(___c) ((___c)?STUFFER_CTL_NORMAL:STUFFER_CTL_SKIP)
|
|
|
|
#if DBG
|
|
NTSTATUS
|
|
MRxSmbStufferDebug(
|
|
IN PRX_CONTEXT RxContext
|
|
);
|
|
|
|
NTSTATUS
|
|
MRxSmbBuildSmbHeaderTestSurrogate(
|
|
PSMB_EXCHANGE pExchange,
|
|
PVOID pBuffer,
|
|
ULONG BufferLength,
|
|
PULONG pBufferConsumed,
|
|
PUCHAR pLastCommandInHeader,
|
|
PUCHAR *pCommandPtr
|
|
);
|
|
|
|
#endif //if DBG
|
|
|
|
|
|
|
|
NTSTATUS
|
|
SmbMrxInitializeStufferFacilities(
|
|
void
|
|
);
|
|
|
|
NTSTATUS
|
|
SmbMrxFinalizeStufferFacilities(
|
|
void
|
|
);
|
|
|
|
#ifdef RDBSSTRACE
|
|
|
|
#define STUFFERTRACE(CONTROLPOINT,__b__) ,(&RxDTPrefixRx CONTROLPOINT),(__b__)
|
|
#define STUFFERTRACE_NOPREFIX(CONTROLPOINT,__b__) ,(CONTROLPOINT),(__b__)
|
|
#define STUFFERTRACE_CONTROLPOINT_ARGS \
|
|
,IN PDEBUG_TRACE_CONTROLPOINT ControlPoint,IN ULONG EnablePrints
|
|
|
|
#else
|
|
|
|
#define STUFFERTRACE(__a__,__b__)
|
|
#define STUFFERTRACE_NOPREFIX(__a__,__b__)
|
|
#define STUFFERTRACE_CONTROLPOINT_ARGS
|
|
|
|
#endif
|
|
|
|
NTSTATUS
|
|
MRxSmbSetInitialSMB (
|
|
IN OUT PSMBSTUFFER_BUFFER_STATE StufferState
|
|
STUFFERTRACE_CONTROLPOINT_ARGS
|
|
);
|
|
|
|
#define NO_EXTRA_DATA 0
|
|
#define SMB_BEST_ALIGNMENT(__x,__y) ((__x<<16)|__y)
|
|
#define NO_SPECIAL_ALIGNMENT 0
|
|
#define RESPONSE_HEADER_SIZE_NOT_SPECIFIED 0
|
|
|
|
typedef enum _INITIAL_SMBBUF_DISPOSITION {
|
|
SetInitialSMB_yyUnconditionally, //no one should be using this right now!
|
|
SetInitialSMB_ForReuse,
|
|
SetInitialSMB_Never
|
|
} INITIAL_SMBBUG_DISPOSITION;
|
|
|
|
NTSTATUS
|
|
MRxSmbStartSMBCommand (
|
|
IN OUT PSMBSTUFFER_BUFFER_STATE StufferState,
|
|
IN INITIAL_SMBBUG_DISPOSITION InitialSMBDisposition,
|
|
IN UCHAR Command, //joejoe this next four params could come from a table...2offset and you're smaller
|
|
IN ULONG MaximumBufferUsed,
|
|
IN ULONG MaximumSize,
|
|
IN ULONG InitialAlignment,
|
|
IN ULONG MaximumResponseHeader,
|
|
IN UCHAR Flags,
|
|
IN UCHAR FlagsMask,
|
|
IN USHORT Flags2,
|
|
IN USHORT Flags2Mask
|
|
STUFFERTRACE_CONTROLPOINT_ARGS
|
|
);
|
|
|
|
NTSTATUS
|
|
MRxSmbStuffSMB (
|
|
IN OUT PSMBSTUFFER_BUFFER_STATE StufferState,
|
|
...
|
|
);
|
|
|
|
VOID
|
|
MRxSmbStuffAppendRawData(
|
|
IN OUT PSMBSTUFFER_BUFFER_STATE StufferState,
|
|
IN PMDL Mdl
|
|
);
|
|
|
|
VOID
|
|
MRxSmbStuffAppendSmbData(
|
|
IN OUT PSMBSTUFFER_BUFFER_STATE StufferState,
|
|
IN PMDL Mdl
|
|
);
|
|
|
|
VOID
|
|
MRxSmbStuffSetByteCount(
|
|
IN OUT PSMBSTUFFER_BUFFER_STATE StufferState
|
|
);
|
|
|
|
BOOLEAN
|
|
MrxSMBWillThisFit(
|
|
IN PSMBSTUFFER_BUFFER_STATE StufferState,
|
|
IN ULONG AlignmentUnit,
|
|
IN ULONG DataSize
|
|
);
|
|
|
|
#if DBG
|
|
VOID
|
|
MRxSmbDumpStufferState (
|
|
IN ULONG PrintLevel,
|
|
IN PSZ Msg,
|
|
IN PSMBSTUFFER_BUFFER_STATE StufferState //IN OUT for debug
|
|
);
|
|
#else
|
|
#define MRxSmbDumpStufferState(a,b,c)
|
|
#endif
|
|
#endif // ifndef _SMBSTUFFER_INCLUDED_
|
|
|