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