smbpse.h
来自「winddk src目录下的文件系统驱动源码压缩!」· C头文件 代码 · 共 757 行 · 第 1/2 页
H
757 行
BOOLEAN
SmbPseFinalizeOrdinaryExchange (
IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange
);
#define SmbPseInitiateOrdinaryExchange(OrdinaryExchange) (SmbCeInitiateExchange(&OrdinaryExchange->Exchange))
// this macro is used to do the async completion for read/write/locks. Note that the call to lowiocompletion
// will try to complete the irp thereby freeing the user's mdl. so, we better get rid of the partial first.
// we use this macro so that there will be only one version of this code. when we combine start routines,
// this will be un macroed
#define SmbPseAsyncCompletionIfNecessary(OE,RXCONTEXT) { \
if (StartEntryCount>1) { \
BOOLEAN FinalizationComplete; \
if (FALSE) {DbgBreakPoint(); } \
if ( (OE)->DataPartialMdl ) { \
if (FlagOn((OE)->Flags, SMBPSE_OE_FLAG_MUST_SUCCEED_ALLOCATED_SMBBUF)){\
MmPrepareMdlForReuse((OE)->DataPartialMdl); \
} else { \
IoFreeMdl((OE)->DataPartialMdl); \
(OE)->DataPartialMdl = NULL; \
ClearFlag((OE)->Flags,SMBPSE_OE_FLAG_OE_ALLOCATED_DATA_PARTIAL); \
} \
} \
(RXCONTEXT)->StoredStatus = Status; \
\
RxLowIoCompletion((RXCONTEXT)); \
FinalizationComplete = SmbPseFinalizeOrdinaryExchange((OE)); \
ASSERT(!FinalizationComplete); \
Status = STATUS_PENDING; \
}}
/* ------------------------------------------
------------------------------------------
Receive Handler Stuff
------------------------------------------
------------------------------------------
*/
VOID
SmbPseInitializeTables(
void
);
typedef
NTSTATUS
(*PSMBPSE_RECEIVE_HANDLER) (
PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
PBYTE Response
);
//boy, talk about a load of arguments
typedef
UCHAR
(*PSMBPSE_NOCOPY_RECEIVE_HANDLER) (
IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
IN ULONG BytesIndicated,
IN ULONG BytesAvailable,
OUT ULONG *pBytesTaken,
IN PSMB_HEADER pSmbHeader,
OUT PMDL *pDataBufferPointer,
OUT PULONG pDataSize,
#if DBG
IN UCHAR ThisIsAReenter,
#endif
IN PBYTE Response
);
#define SMBPSE_NOCOPYACTION_NORMALFINISH 0x00
#define SMBPSE_NOCOPYACTION_MDLFINISH 0x01
#define SMBPSE_NOCOPYACTION_DISCARD 0x02
#define SMBPSE_NOCOPYACTION_COPY_FOR_RESUME 0x03
#define SMBPSE_RMP_MODELED (0x00000001)
#define SMBPSE_RMP_THIS_IS_ANDX (0x00000002)
#define SMBPSE_RMP_WARNINGS_OK (0x00000004)
#define SMBPSE_RMP_NOCOPY_HANDLER (0x00000008)
typedef enum _SMBPSE_RECEIVE_HANDLER_TOKEN {
SMBPSE_RECEIVE_HANDLER_TOKEN_READ_ANDX_HANDLER = 0,
SMBPSE_RECEIVE_HANDLER_TOKEN_READ_HANDLER,
SMBPSE_RECEIVE_HANDLER_TOKEN_WRITE_ANDX_HANDLER,
SMBPSE_RECEIVE_HANDLER_TOKEN_WRITE_HANDLER,
SMBPSE_RECEIVE_HANDLER_TOKEN_LOCKING_ANDX_HANDLER,
SMBPSE_RECEIVE_HANDLER_TOKEN_OPEN_PRINTFILE_HANDLER,
SMBPSE_RECEIVE_HANDLER_TOKEN_WRITE_PRINTFILE_HANDLER,
SMBPSE_RECEIVE_HANDLER_TOKEN_CLOSE_HANDLER, //also close_print_file
SMBPSE_RECEIVE_HANDLER_TOKEN_NTCREATE_ANDX_HANDLER,
SMBPSE_RECEIVE_HANDLER_TOKEN_OPEN_ANDX_HANDLER,
SMBPSE_RECEIVE_HANDLER_TOKEN_CREATE_HANDLER, //also create_new
SMBPSE_RECEIVE_HANDLER_TOKEN_OPEN_HANDLER,
SMBPSE_RECEIVE_HANDLER_TOKEN_TRANS2_ANDX_HANDLER,
SMBPSE_RECEIVE_HANDLER_TOKEN_GFA_HANDLER,
SMBPSE_RECEIVE_HANDLER_TOKEN_SEARCH_HANDLER,
SMBPSE_RECEIVE_HANDLER_TOKEN_QUERYDISKINFO_HANDLER,
SMBPSE_RECEIVE_HANDLER_TOKEN_IOCTL_HANDLER,
SMBPSE_RECEIVE_HANDLER_TOKEN_MAXIMUM
} SMBPSE_RECEIVE_HANDLER_TOKEN;
PSMBPSE_RECEIVE_HANDLER SmbPseReceiveHandlers[SMBPSE_RECEIVE_HANDLER_TOKEN_MAXIMUM];
typedef struct _SMBPSE_RECEIVE_MODEL_PARAMETERS {
UCHAR Flags;
UCHAR ReceiveHandlerToken;
#if DBG
USHORT Dummy;
PSMBPSE_RECEIVE_HANDLER ReceiveHandler;
PBYTE IndicationString;
SMB_PSE_ORDINARY_EXCHANGE_TYPE LowType,HighType;
#endif
} SMBPSE_RECEIVE_MODEL_PARAMETERS, *PSMBPSE_RECEIVE_MODEL_PARAMETERS;
SMBPSE_RECEIVE_MODEL_PARAMETERS SmbPseReceiveModelParameters[256]; //there are 256 possible smbs
typedef struct _SMBPSE_VESTIGIAL_SMBBUF {
NT_SMB_HEADER Header;
union {
REQ_WRITE Write;
REQ_NT_WRITE_ANDX WriteAndX;
REQ_FLUSH Flush;
struct {
REQ_LOCKING_ANDX LockingAndX;
NTLOCKING_ANDX_RANGE Locks[20];
};
REQ_FIND_CLOSE2 FindClose;
REQ_CLOSE Close;
};
ULONG Pad;
} SMBPSE_VESTIGIAL_SMBBUF;
// Finishing routines - these are all cast into the correct procedure type
// so that the response will already have the correct SMB format
// on entry to the routine
NTSTATUS
MRxSmbFinishNTCreateAndX (
IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
IN PRESP_NT_CREATE_ANDX Response
);
#define MRxSmbReceiveHandler_NTCreateAndX ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishNTCreateAndX)
NTSTATUS
MRxSmbFinishOpenAndX (
IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
IN PRESP_OPEN_ANDX Response
);
#define MRxSmbReceiveHandler_OpenAndX ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishOpenAndX)
NTSTATUS
MRxSmbFinishClose (
IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
IN PRESP_CLOSE Response
);
#define MRxSmbReceiveHandler_Close ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishClose)
NTSTATUS
MRxSmbFinishGFA (
IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
IN PVOID Response
);
#define MRxSmbReceiveHandler_GetFileAttributes ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishGFA)
NTSTATUS
MRxSmbFinishTransaction2 (
IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
IN PRESP_TRANSACTION Response
);
#define MRxSmbReceiveHandler_Transact2 ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishTransaction2)
NTSTATUS
MRxSmbFinishCoreOpen (
IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
IN PRESP_OPEN Response
);
#define MRxSmbReceiveHandler_CoreOpen ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishCoreOpen)
NTSTATUS
MRxSmbFinishCoreCreate (
IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
IN PRESP_CREATE Response
);
#define MRxSmbReceiveHandler_CoreCreate ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishCoreCreate)
//NTSTATUS
//MRxSmbFinishRead (
// IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
// IN PRESP_READ_ANDX Response
// );
//#define MRxSmbReceiveHandler_ReadAndX ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishRead)
//NTSTATUS
//MRxSmbFinishCoreRead (
// IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
// IN PRESP_READ Response
// );
//#define MRxSmbReceiveHandler_CoreRead ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishCoreRead)
UCHAR
MRxSmbReadHandler_NoCopy (
IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
IN ULONG BytesIndicated,
IN ULONG BytesAvailable,
OUT ULONG *pBytesTaken,
IN PSMB_HEADER pSmbHeader,
OUT PMDL *pDataBufferPointer,
OUT PULONG pDataSize,
#if DBG
IN UCHAR ThisIsAReenter,
#endif
IN PRESP_READ_ANDX Response
);
#define MRxSmbReceiveHandler_Read_NoCopy ((PSMBPSE_RECEIVE_HANDLER)MRxSmbReadHandler_NoCopy)
NTSTATUS
MRxSmbFinishWrite (
IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
IN PBYTE Response
);
#define MRxSmbReceiveHandler_WritePrintFile ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishWrite)
#define MRxSmbReceiveHandler_WriteAndX ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishWrite)
#define MRxSmbReceiveHandler_CoreWrite ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishWrite)
NTSTATUS
MRxSmbFinishLocks (
IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
IN PRESP_LOCKING_ANDX Response
);
#define MRxSmbReceiveHandler_LockingAndX ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishLocks)
NTSTATUS
MRxSmbFinishSearch (
PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
PRESP_SEARCH Response
);
#define MRxSmbReceiveHandler_Search ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishSearch)
NTSTATUS
MRxSmbFinishQueryDiskInfo (
PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
PRESP_QUERY_INFORMATION_DISK Response
);
#define MRxSmbReceiveHandler_QueryDiskInfo ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishQueryDiskInfo)
typedef
NTSTATUS
(*PSMB_PSE_OE_T2_FIXUP_ROUTINE) (
PSMB_PSE_ORDINARY_EXCHANGE
);
NTSTATUS
__MRxSmbSimpleSyncTransact2(
SMBPSE_ORDINARY_EXCHANGE_ARGUMENT_SIGNATURE,
IN SMB_PSE_ORDINARY_EXCHANGE_TYPE OEType,
IN ULONG TransactSetupCode,
IN PVOID Params,
IN ULONG ParamsLength,
IN PVOID Data,
IN ULONG DataLength,
IN PSMB_PSE_OE_T2_FIXUP_ROUTINE FixupRoutine
);
#define MRxSmbSimpleSyncTransact2(a,b,c,d,e,f,g) \
__MRxSmbSimpleSyncTransact2(a,b,c,d,e,f,g,NULL);
NTSTATUS
MRxSmbDeferredCreate (
IN OUT PRX_CONTEXT RxContext
);
NTSTATUS
MRxSmbConstructDeferredOpenContext (
IN OUT PRX_CONTEXT RxContext
);
//downlevel stuff....
NTSTATUS
MRxSmbPseudoOpenTailFromGFAResponse (
PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange
);
NTSTATUS
MRxSmbPseudoOpenTailFromFakeGFAResponse (
PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
RX_FILE_TYPE StorageType
);
NTSTATUS
MRxSmbCoreTruncate(
SMBPSE_ORDINARY_EXCHANGE_ARGUMENT_SIGNATURE,
ULONG Fid,
ULONG FileTruncationPoint
);
NTSTATUS
MRxSmbCoreInformation(
IN OUT PRX_CONTEXT RxContext,
IN ULONG InformationClass,
IN OUT PVOID pBuffer,
IN OUT PULONG pBufferLength,
IN SMB_PSE_ORDINARY_EXCHANGE_ENTRYPOINTS EntryPoint
);
ULONG
MRxSmbMapSmbAttributes (
IN USHORT SmbAttribs
);
USHORT
MRxSmbMapDisposition (
IN ULONG Disposition
);
USHORT
MRxSmbMapShareAccess (
IN USHORT ShareAccess
);
USHORT
MRxSmbMapDesiredAccess (
IN ULONG DesiredAccess
);
USHORT
MRxSmbMapFileAttributes (
IN ULONG FileAttributes
);
ULONG
MRxSmbUnmapDisposition (
IN USHORT SmbDisposition,
IN ULONG Disposition
);
LARGE_INTEGER
MRxSmbConvertSmbTimeToTime (
//IN PSMB_EXCHANGE Exchange OPTIONAL,
IN PSMBCE_SERVER Server OPTIONAL,
IN SMB_TIME Time,
IN SMB_DATE Date
);
BOOLEAN
MRxSmbConvertTimeToSmbTime (
IN PLARGE_INTEGER InputTime,
IN PSMB_EXCHANGE Exchange OPTIONAL,
OUT PSMB_TIME Time,
OUT PSMB_DATE Date
);
BOOLEAN
MRxSmbTimeToSecondsSince1970 (
IN PLARGE_INTEGER CurrentTime,
IN PSMBCE_SERVER Server OPTIONAL,
OUT PULONG SecondsSince1970
);
VOID
MRxSmbSecondsSince1970ToTime (
IN ULONG SecondsSince1970,
IN PSMBCE_SERVER Server OPTIONAL,
OUT PLARGE_INTEGER CurrentTime
);
VOID
MRxSmbResumeAsyncReadWriteRequests(
PRX_CONTEXT RxContext);
#endif // _SMBPSE_H_
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?