Source code of Windows XP (NT5)
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

/*++
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_