windows-nt/Source/XPSP1/NT/base/fs/rdr2/rdbss/smb.mrx/transact.h
2020-09-26 16:20:57 +08:00

386 lines
15 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++ BUILD Version: 0009 // Increment this if a change has global effects
Copyright (c) 1987-1993 Microsoft Corporation
Module Name:
smbcxchng.h
Abstract:
This is the include file that defines all constants and types for
SMB exchange implementation.
Author:
Balan Sethu Raman (SethuR) 06-Feb-95 Created
--*/
#ifndef _TRANSACT_H_
#define _TRANSACT_H_
typedef enum _TRANSACT_EXCHANGE_STATE_ {
TRANSACT_EXCHANGE_START,
TRANSACT_EXCHANGE_ERROR,
TRANSACT_EXCHANGE_SUCCESS,
TRANSACT_EXCHANGE_TRANSMITTED_PRIMARY_REQUEST,
TRANSACT_EXCHANGE_RECEIVED_INTERIM_RESPONSE,
TRANSACT_EXCHANGE_TRANSMITTED_SECONDARY_REQUESTS,
TRANSACT_EXCHANGE_RECEIVED_PRIMARY_RESPONSE
} TRANSACT_EXCHANGE_STATE, *PTRANSACT_EXCHANGE_STATE;
typedef struct _SMB_TRANSACTION_RESUMPTION_CONTEXT{
struct _SMB_TRANSACT_EXCHANGE *pTransactExchange;
SMBCE_RESUMPTION_CONTEXT SmbCeResumptionContext;
ULONG SetupBytesReceived;
ULONG DataBytesReceived;
ULONG ParameterBytesReceived;
NTSTATUS FinalStatusFromServer;
ULONG ServerVersion;
} SMB_TRANSACTION_RESUMPTION_CONTEXT, *PSMB_TRANSACTION_RESUMPTION_CONTEXT;
#define TRAILING_BYTES_BUFFERSIZE 8
typedef struct _SMB_TRANSACT_EXCHANGE {
SMB_EXCHANGE;
TRANSACT_EXCHANGE_STATE State;
// Client supplied parameters for the transact exchange
//PRX_CONTEXT RxContext;
PMDL pSendDataMdl;
ULONG SendDataBufferSize;
ULONG DataBytesSent;
PMDL pReceiveDataMdl;
ULONG ReceiveDataBufferSize;
ULONG DataBytesReceived;
PMDL pSendParamMdl; //used if we cannot subsume
PVOID pSendParamBuffer;
ULONG SendParamBufferSize;
ULONG ParamBytesSent;
PMDL pReceiveParamMdl;
ULONG ReceiveParamBufferSize;
ULONG ParamBytesReceived;
PVOID pSendSetupMdl;
ULONG SendSetupBufferSize;
PMDL pReceiveSetupMdl;
ULONG ReceiveSetupBufferSize;
ULONG SetupBytesReceived;
// Transact exchange intrinsic fields
ULONG PrimaryRequestSmbSize;
PVOID pActualPrimaryRequestSmbHeader; // Original buffer allocated
PSMB_HEADER pPrimaryRequestSmbHeader; // Start of header
ULONG ParameterBytesSeen;
ULONG DataBytesSeen;
LONG PendingCopyRequests; //CODE.IMPROVEMENT this field is useless
BOOLEAN fParamsSubsumedInPrimaryRequest;
UCHAR TransactSmbCommand;
USHORT Flags;
USHORT NtTransactFunction;
SMB_FILE_ID Fid; //CODE.IMPROVEMENT is this used?
ULONG TransactionNameLength;
ULONG MaximumTransmitSmbBufferSize;
//used to cache value and also to force
//smaller value for testing
PSMB_TRANSACTION_RESUMPTION_CONTEXT pResumptionContext;
struct {
MDL TrailingBytesMdl;
ULONG Pages[3]; //you need 2...one pad; this must cover an smbbuf
};
NTSTATUS SaveTheRealStatus;
PVOID DiscardBuffer;
struct {
ULONG Bytes[TRAILING_BYTES_BUFFERSIZE/sizeof(ULONG)];
} TrailingBytesBuffer;
} SMB_TRANSACT_EXCHANGE, *PSMB_TRANSACT_EXCHANGE;
typedef struct SMB_TRANSACTION_PARAMETERS {
USHORT Flags;
USHORT SetupLength; // the steup buffer length
union {
PVOID pSetup; // the setup buffer
PMDL pSetupMdl; // the MDL version of the buffer
};
ULONG ParamLength;
PVOID pParam; //you need the bufptr is you're subsuming
PMDL pParamMdl; //you need the MDL is you can't subsume
PMDL pDataMdl; // the data buffer
ULONG DataLength; // this is total length...not the length
// of the 1st mdl in the chain
} SMB_TRANSACTION_PARAMETERS, *PSMB_TRANSACTION_PARAMETERS;
typedef SMB_TRANSACTION_PARAMETERS SMB_TRANSACTION_SEND_PARAMETERS;
typedef SMB_TRANSACTION_SEND_PARAMETERS* PSMB_TRANSACTION_SEND_PARAMETERS;
typedef SMB_TRANSACTION_PARAMETERS SMB_TRANSACTION_RECEIVE_PARAMETERS;
typedef SMB_TRANSACTION_RECEIVE_PARAMETERS* PSMB_TRANSACTION_RECEIVE_PARAMETERS;
#define SMBCE_DEFAULT_TRANSACTION_TIMEOUT (0xffffffff)
#define SMBCE_TRANSACTION_TIMEOUT_NOT_USED (0x0)
typedef struct SMB_TRANSACTION_OPTIONS {
USHORT NtTransactFunction;
USHORT Flags;
PUNICODE_STRING pTransactionName;
ULONG TimeoutIntervalInMilliSeconds;
ULONG MaximumTransmitSmbBufferSize;
} SMB_TRANSACTION_OPTIONS, *PSMB_TRANSACTION_OPTIONS;
#define DEFAULT_TRANSACTION_OPTIONS {0,0,NULL,SMBCE_TRANSACTION_TIMEOUT_NOT_USED,0xffff}
extern SMB_TRANSACTION_OPTIONS RxDefaultTransactionOptions;
#define TRANSACTION_SEND_PARAMETERS_FLAG (0x1)
#define TRANSACTION_RECEIVE_PARAMETERS_FLAG (0x2)
// xact and xact_options have the same flags so we have to be careful to strip off these bits
// when we format up the smb ( the flags field is a USHORT)
#define SMB_XACT_FLAGS_REPARSE (0x8000)
#define SMB_XACT_FLAGS_FID_NOT_NEEDED (0x4000)
#define SMB_XACT_FLAGS_CALLERS_SENDDATAMDL (0x2000)
#define SMB_XACT_FLAGS_TID_FOR_FID (0x1000)
#define SMB_XACT_FLAGS_MAILSLOT_OPERATION (0x0800)
#define SMB_XACT_FLAGS_INDEFINITE_DELAY_IN_RESPONSE (0x0400)
#define SMB_XACT_FLAGS_DFS_AWARE (0x0200)
#define SMB_XACT_FLAGS_ASYNCHRONOUS (0x0100)
//#define SMB_XACT_FLAGS_COPY_ON_ERROR (0x080)
#define SMB_XACT_INTERNAL_FLAGS_MASK \
( SMB_XACT_FLAGS_REPARSE \
| SMB_XACT_FLAGS_FID_NOT_NEEDED \
| SMB_XACT_FLAGS_CALLERS_SENDDATAMDL \
| SMB_XACT_FLAGS_TID_FOR_FID \
| SMB_XACT_FLAGS_MAILSLOT_OPERATION \
| SMB_XACT_FLAGS_INDEFINITE_DELAY_IN_RESPONSE \
| SMB_XACT_FLAGS_DFS_AWARE \
| SMB_XACT_FLAGS_ASYNCHRONOUS \
)
#if 0
//CODE.IMROVEMENT.POSTPDC the constant SMB_TRANSACTION_VALID_FLAGS should be
//in smb.h. SMB_TRANSACTION_RECONNECTING and SMB_TRANSACTION_DFSFILE should NOT
//be in SMB.h. here is what's there now
#define SMB_TRANSACTION_DISCONNECT 1
#define SMB_TRANSACTION_NO_RESPONSE 2
#define SMB_TRANSACTION_RECONNECTING 4
#define SMB_TRANSACTION_DFSFILE 8
#endif
#define SMB_TRANSACTION_VALID_FLAGS (\
SMB_TRANSACTION_DISCONNECT \
| SMB_TRANSACTION_NO_RESPONSE \
)
#if ((SMB_XACT_INTERNAL_FLAGS_MASK & SMB_TRANSACTION_VALID_FLAGS) != 0)
#error SMB_XACT_INTERNAL_FLAGS_MASK has overrun the transact flags
#endif
extern NTSTATUS
SmbCeInitializeTransactionParameters(
PVOID pSetup,
USHORT SetupLength,
PVOID pParam,
ULONG ParamLength,
PVOID pData,
ULONG DataLength,
PSMB_TRANSACTION_PARAMETERS pTransactionParameters);
#define SmbCeProvideTransactionDataAsMdl(pTransactionParameters,pMdl,Length) { \
ASSERT( (pTransactionParameters)->DataLength == 0 ); \
ASSERT( (pTransactionParameters)->pDataMdl == NULL ); \
ASSERT( FlagOn((pTransactionParameters)->Flags,TRANSACTION_SEND_PARAMETERS_FLAG) ); \
(pTransactionParameters)->DataLength = Length; \
(pTransactionParameters)->pDataMdl = pMdl; \
(pTransactionParameters)->Flags |= SMB_XACT_FLAGS_CALLERS_SENDDATAMDL; \
}
extern VOID
SmbCeUninitializeTransactionParameters(
PSMB_TRANSACTION_PARAMETERS pTransactionParameters);
extern VOID
SmbCeDiscardTransactExchange(PSMB_TRANSACT_EXCHANGE pTransactExchange);
INLINE NTSTATUS
SmbCeInitializeTransactionSendParameters(
PVOID pSetup,
USHORT SetupLength,
PVOID pParam,
ULONG ParamLength,
PVOID pData,
ULONG DataLength,
PSMB_TRANSACTION_SEND_PARAMETERS pSendParameters)
{
((PSMB_TRANSACTION_PARAMETERS)pSendParameters)->Flags = TRANSACTION_SEND_PARAMETERS_FLAG;
return SmbCeInitializeTransactionParameters(
pSetup,SetupLength,pParam,ParamLength,pData,DataLength,pSendParameters);
}
INLINE NTSTATUS
SmbCeInitializeTransactionReceiveParameters(
PVOID pSetup,
USHORT SetupLength,
PVOID pParam,
ULONG ParamLength,
PVOID pData,
ULONG DataLength,
PSMB_TRANSACTION_RECEIVE_PARAMETERS pReceiveParameters)
{
((PSMB_TRANSACTION_PARAMETERS)pReceiveParameters)->Flags = TRANSACTION_RECEIVE_PARAMETERS_FLAG;
return SmbCeInitializeTransactionParameters(
pSetup,SetupLength,pParam,ParamLength,pData,DataLength,pReceiveParameters);
}
#define SmbCeUninitializeTransactionSendParameters(pSendParameters) \
ASSERT((pSendParameters)->Flags & TRANSACTION_SEND_PARAMETERS_FLAG); \
SmbCeUninitializeTransactionParameters(pSendParameters);
#define SmbCeUninitializeTransactionReceiveParameters(pReceiveParameters) \
ASSERT((pReceiveParameters)->Flags & TRANSACTION_RECEIVE_PARAMETERS_FLAG); \
SmbCeUninitializeTransactionParameters(pReceiveParameters)
INLINE VOID
SmbCeInitializeTransactionResumptionContext(
PSMB_TRANSACTION_RESUMPTION_CONTEXT ptResumptionContext)
{
SmbCeInitializeResumptionContext(&(ptResumptionContext)->SmbCeResumptionContext);
ptResumptionContext->SetupBytesReceived = 0;
ptResumptionContext->DataBytesReceived = 0;
ptResumptionContext->ParameterBytesReceived = 0;
ptResumptionContext->FinalStatusFromServer = (STATUS_SUCCESS);
}
INLINE VOID
SmbCeInitializeAsynchronousTransactionResumptionContext(
PSMB_TRANSACTION_RESUMPTION_CONTEXT ptResumptionContext,
PRX_WORKERTHREAD_ROUTINE pResumptionRoutine,
PVOID pResumptionRoutineParam)
{
SmbCeInitializeAsynchronousResumptionContext(
&ptResumptionContext->SmbCeResumptionContext,
pResumptionRoutine,
pResumptionRoutineParam);
ptResumptionContext->SetupBytesReceived = 0;
ptResumptionContext->DataBytesReceived = 0;
ptResumptionContext->ParameterBytesReceived = 0;
ptResumptionContext->FinalStatusFromServer = (STATUS_SUCCESS);
}
INLINE VOID
SmbCeWaitOnTransactionResumptionContext(
PSMB_TRANSACTION_RESUMPTION_CONTEXT pTransactionResumptionContext)
{
SmbCeSuspend(&pTransactionResumptionContext->SmbCeResumptionContext);
}
extern UNICODE_STRING s_NamedPipeTransactionName;
extern UNICODE_STRING s_MailSlotTransactionName;
extern NTSTATUS
SmbCeSubmitTransactionRequest(
PRX_CONTEXT RxContext,
PSMB_TRANSACTION_OPTIONS pOptions,
PSMB_TRANSACTION_PARAMETERS pSendParameters,
PSMB_TRANSACTION_PARAMETERS pReceiveParameters,
PSMB_TRANSACTION_RESUMPTION_CONTEXT pResumptionContext );
extern NTSTATUS
_SmbCeTransact(
PRX_CONTEXT RxContext,
PSMB_TRANSACTION_OPTIONS pOptions,
PVOID pInputSetupBuffer,
ULONG InputSetupBufferlength,
PVOID pOutputSetupBuffer,
ULONG OutputSetupBufferLength,
PVOID pInputParamBuffer,
ULONG InputParamBufferLength,
PVOID pOutputParamBuffer,
ULONG OutputParamBufferLength,
PVOID pInputDataBuffer,
ULONG InputDataBufferLength,
PVOID pOutputDataBuffer,
ULONG OutputDataBufferLength,
PSMB_TRANSACTION_RESUMPTION_CONTEXT pResumptionContext);
INLINE NTSTATUS
SmbCeTransact(
PRX_CONTEXT RxContext,
PSMB_TRANSACTION_OPTIONS pOptions,
PVOID pInputSetupBuffer,
ULONG InputSetupBufferlength,
PVOID pOutputSetupBuffer,
ULONG OutputSetupBufferLength,
PVOID pInputParamBuffer,
ULONG InputParamBufferLength,
PVOID pOutputParamBuffer,
ULONG OutputParamBufferLength,
PVOID pInputDataBuffer,
ULONG InputDataBufferLength,
PVOID pOutputDataBuffer,
ULONG OutputDataBufferLength,
PSMB_TRANSACTION_RESUMPTION_CONTEXT pResumptionContext)
{
SmbCeInitializeTransactionResumptionContext(pResumptionContext);
return _SmbCeTransact(
RxContext,
pOptions,
pInputSetupBuffer,
InputSetupBufferlength,
pOutputSetupBuffer,
OutputSetupBufferLength,
pInputParamBuffer,
InputParamBufferLength,
pOutputParamBuffer,
OutputParamBufferLength,
pInputDataBuffer,
InputDataBufferLength,
pOutputDataBuffer,
OutputDataBufferLength,
pResumptionContext);
}
INLINE NTSTATUS
SmbCeAsynchronousTransact(
PRX_CONTEXT RxContext,
PSMB_TRANSACTION_OPTIONS pOptions,
PVOID pInputSetupBuffer,
ULONG InputSetupBufferlength,
PVOID pOutputSetupBuffer,
ULONG OutputSetupBufferLength,
PVOID pInputParamBuffer,
ULONG InputParamBufferLength,
PVOID pOutputParamBuffer,
ULONG OutputParamBufferLength,
PVOID pInputDataBuffer,
ULONG InputDataBufferLength,
PVOID pOutputDataBuffer,
ULONG OutputDataBufferLength,
PSMB_TRANSACTION_RESUMPTION_CONTEXT pResumptionContext)
{
pOptions->Flags |= SMB_XACT_FLAGS_ASYNCHRONOUS;
return _SmbCeTransact(
RxContext,
pOptions,
pInputSetupBuffer,
InputSetupBufferlength,
pOutputSetupBuffer,
OutputSetupBufferLength,
pInputParamBuffer,
InputParamBufferLength,
pOutputParamBuffer,
OutputParamBufferLength,
pInputDataBuffer,
InputDataBufferLength,
pOutputDataBuffer,
OutputDataBufferLength,
pResumptionContext);
}
#endif // _TRANSACT_H_