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