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.
386 lines
15 KiB
386 lines
15 KiB
/*++ 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_
|
|
|
|
|