232 lines
5.7 KiB
C
232 lines
5.7 KiB
C
/*++
|
||
|
||
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_
|
||
|