Leaked source code of windows server 2003
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.

755 lines
25 KiB

  1. /*++
  2. Copyright (c) 1989 - 1999 Microsoft Corporation
  3. Module Name:
  4. SmbPse.h
  5. Abstract:
  6. This module defines the types and functions related to the SMB protocol
  7. selection engine: the component that translates minirdr calldowns into
  8. SMBs.
  9. --*/
  10. #ifndef _SMBPSE_H_
  11. #define _SMBPSE_H_
  12. IMPORTANT_STRUCTURE(SMB_PSE_ORDINARY_EXCHANGE);
  13. #define StorageType(co) ((co) & FILE_STORAGE_TYPE_MASK)
  14. #define StorageFlag(co) ((co) & FILE_STORAGE_TYPE_SPECIFIED)
  15. #define IsStorageTypeSpecified(co) (StorageFlag(co) == FILE_STORAGE_TYPE_SPECIFIED)
  16. #define MustBeDirectory(co) ((co) & FILE_DIRECTORY_FILE)
  17. #define MustBeFile(co) ((co) & FILE_NON_DIRECTORY_FILE)
  18. #define CLUSTER_SIZE 0x1000
  19. #define SMBPSE_ORDINARY_EXCHANGE_ARGUMENT_SIGNATURE \
  20. PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange, \
  21. PRX_CONTEXT RxContext
  22. #define SMBPSE_ORDINARY_EXCHANGE_ARGUMENTS \
  23. OrdinaryExchange,RxContext
  24. #if DBG
  25. #define OECHKLINKAGE_FLAG_NO_REQPCKT_CHECK 0x00000001
  26. VOID
  27. __SmbPseOEAssertConsistentLinkage(
  28. PSZ MsgPrefix,
  29. PSZ File,
  30. unsigned Line,
  31. PRX_CONTEXT RxContext,
  32. PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
  33. PSMBSTUFFER_BUFFER_STATE StufferState,
  34. ULONG Flags
  35. );
  36. #define SmbPseOEAssertConsistentLinkage(a) {\
  37. __SmbPseOEAssertConsistentLinkage(a,__FILE__,__LINE__,RxContext,OrdinaryExchange,StufferState,0);\
  38. }
  39. #define SmbPseOEAssertConsistentLinkageFromOE(a) {\
  40. ASSERT_ORDINARY_EXCHANGE(OrdinaryExchange); \
  41. __SmbPseOEAssertConsistentLinkage(a,__FILE__,__LINE__, \
  42. OrdinaryExchange->RxContext, \
  43. OrdinaryExchange, \
  44. &OrdinaryExchange->AssociatedStufferState,0); \
  45. }
  46. #define SmbPseOEAssertConsistentLinkageFromOEwithFlags(a,FLAGS) {\
  47. ASSERT_ORDINARY_EXCHANGE(OrdinaryExchange); \
  48. __SmbPseOEAssertConsistentLinkage(a,__FILE__,__LINE__, \
  49. OrdinaryExchange->RxContext, \
  50. OrdinaryExchange, \
  51. &OrdinaryExchange->AssociatedStufferState,FLAGS); \
  52. }
  53. #else
  54. #define SmbPseOEAssertConsistentLinkage(a) {NOTHING;}
  55. #define SmbPseOEAssertConsistentLinkageFromOE(a) {NOTHING;}
  56. #define SmbPseOEAssertConsistentLinkageFromOEwithFlags(a,b) {NOTHING;}
  57. #endif
  58. typedef
  59. NTSTATUS
  60. (*PSMB_PSE_OE_START_ROUTINE) (
  61. SMBPSE_ORDINARY_EXCHANGE_ARGUMENT_SIGNATURE
  62. );
  63. typedef
  64. NTSTATUS
  65. (*PSMB_PSE_CONTINUATION_ROUTINE) (
  66. PSMB_PSE_ORDINARY_EXCHANGE
  67. );
  68. #define SMBPSE_OE_HISTORY_SIZE 32
  69. typedef struct _SMBPSE_HISTORY {
  70. ULONG Next;
  71. ULONG Submits; //could be shortened....
  72. struct {
  73. ULONG Longs[2];
  74. } Markers[SMBPSE_OE_HISTORY_SIZE];
  75. } SMBPSE_HISTORY;
  76. #if DBG
  77. VOID SmbPseUpdateOEHistory(
  78. PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
  79. ULONG Tag1,
  80. ULONG Tag2
  81. );
  82. #define UPDATE_OE_HISTORY_LONG(a) {SmbPseUpdateOEHistory(OrdinaryExchange,a,0);}
  83. #define UPDATE_OE_HISTORY_2SHORTS(a,b) {SmbPseUpdateOEHistory(OrdinaryExchange,a,b);}
  84. #else
  85. #define UPDATE_OE_HISTORY_LONG(a)
  86. #define UPDATE_OE_HISTORY_2SHORTS(a,b)
  87. #endif //if DBG
  88. typedef enum _SMB_PSE_ORDINARY_EXCHANGE_TYPE {
  89. SMBPSE_OETYPE_LATENT_HEADEROPS,
  90. SMBPSE_OETYPE_CREATE,
  91. SMBPSE_OETYPE_COREOPEN,
  92. // SMBPSE_OETYPE_CLEANUP,
  93. SMBPSE_OETYPE_FINDCLOSE,
  94. SMBPSE_OETYPE_READ,
  95. SMBPSE_OETYPE_WRITE, SMBPSE_OETYPE_EXTEND_WRITE, SMBPSE_OETYPE_CORETRUNCATE,
  96. SMBPSE_OETYPE_LOCKS, SMBPSE_OETYPE_ASSERTBUFFEREDLOCKS,
  97. SMBPSE_OETYPE_FLUSH,
  98. SMBPSE_OETYPE_CLOSE, SMBPSE_OETYPE_CLOSEAFTERCORECREATE,
  99. //SMBPSE_OETYPE_SEARCH,
  100. SMBPSE_OETYPE_RENAME,
  101. SMBPSE_OETYPE_T2_FOR_NT_FILE_ALLOCATION_INFO, //MUST BE FIRST T2
  102. SMBPSE_OETYPE_T2_FOR_NT_DISKATTRIBUTES_INFO,
  103. SMBPSE_OETYPE_T2_FOR_ONE_FILE_DIRCTRL,
  104. SMBPSE_OETYPE_T2_FOR_LANMAN_DISKATTRIBUTES_INFO,
  105. SMBPSE_OETYPE_T2_FOR_LANMAN_VOLUMELABEL_INFO, //MUST BE LAST T2
  106. SMBPSE_OETYPE_GFA,
  107. // SMBPSE_OETYPE_GFA2,
  108. SMBPSE_OETYPE_COREINFO,
  109. SMBPSE_OETYPE_CORECREATE,
  110. SMBPSE_OETYPE_DELETEFORSUPERSEDEORCLOSE, SMBPSE_OETYPE_DELETE_FOR_RENAME,
  111. SMBPSE_OETYPE_CORECREATEDIRECTORY,
  112. SMBPSE_OETYPE_CORECHECKDIRECTORY,
  113. SMBPSE_OETYPE_SFA,
  114. SMBPSE_OETYPE_SFA2,
  115. SMBPSE_OETYPE_COREQUERYLABEL, SMBPSE_OETYPE_CORESEARCH, SMBPSE_OETYPE_CORESEARCHFORCHECKEMPTY,
  116. SMBPSE_OETYPE_COREQUERYDISKATTRIBUTES,
  117. SMBPSE_OETYPE_CREATEPRINTFILE,
  118. SMBPSE_OETYPE_IOCTL,
  119. SMBPSE_OETYPE_MAXIMUM
  120. } SMB_PSE_ORDINARY_EXCHANGE_TYPE;
  121. typedef enum _SMB_PSE_ORDINARY_EXCHANGE_ENTRYPOINTS {
  122. SMBPSE_OE_FROM_QUERYDIRECTORY,
  123. SMBPSE_OE_FROM_QUERYFILEINFO,
  124. SMBPSE_OE_FROM_SETFILEINFO,
  125. SMBPSE_OE_FROM_QUERYVOLUMEINFO,
  126. SMBPSE_OE_FROM_EXTENDFILEFORCACHEING,
  127. SMBPSE_OE_FROM_LOCKS,
  128. SMBPSE_OE_FROM_FLUSH,
  129. SMBPSE_OE_FROM_ASSERTBUFFEREDLOCKS,
  130. SMBPSE_OE_FROM_CLEANUPFOBX,
  131. SMBPSE_OE_FROM_CLOSESRVCALL,
  132. SMBPSE_OE_FROM_CREATE,
  133. SMBPSE_OE_FROM_RENAME,
  134. SMBPSE_OE_FROM_READ,
  135. SMBPSE_OE_FROM_WRITE,
  136. SMBPSE_OE_FROM_FAKESETDELETEDISPOSITION,
  137. SMBPSE_OE_FROM_MAXIMUM
  138. } SMB_PSE_ORDINARY_EXCHANGE_ENTRYPOINTS;
  139. #define SMBPSE_DEFINE_OE_FLAG(a,c) RX_DEFINE_FLAG(SMBPSE_OE_FLAG_##a,c,0xffff)
  140. typedef enum {
  141. SMBPSE_DEFINE_OE_FLAG(HEADER_ALREADY_PARSED, 0)
  142. SMBPSE_DEFINE_OE_FLAG(OE_ALREADY_RESUMED, 1)
  143. SMBPSE_DEFINE_OE_FLAG(VALIDATE_FID, 2)
  144. SMBPSE_DEFINE_OE_FLAG(OE_HDR_PARTIAL_INITIALIZED, 3)
  145. SMBPSE_DEFINE_OE_FLAG(OE_ALLOCATED_DATA_PARTIAL, 4)
  146. SMBPSE_DEFINE_OE_FLAG(OE_HDR_LOCKED, 5)
  147. //SMBPSE_DEFINE_OE_FLAG(SMBBUF_IS_A_MDL, 6)
  148. SMBPSE_DEFINE_OE_FLAG(NO_RESPONSE_EXPECTED, 7)
  149. SMBPSE_DEFINE_OE_FLAG(MUST_SUCCEED_ALLOCATED_OE, 8)
  150. SMBPSE_DEFINE_OE_FLAG(MUST_SUCCEED_ALLOCATED_SMBBUF, 9)
  151. SMBPSE_DEFINE_OE_FLAG(OE_AWAITING_DISPATCH, 10)
  152. SMBPSE_DEFINE_OE_FLAG(TURNON_DFS_FLAG, 11)
  153. //SMBPSE_DEFINE_OE_FLAG(NETROOT_GOOD, 15)
  154. } SMBPSE_OE_FLAGS;
  155. typedef enum _SMB_PSE_OE_INNERIO_STATE {
  156. SmbPseOEInnerIoStates_Initial = 0,
  157. SmbPseOEInnerIoStates_ReadyToSend,
  158. SmbPseOEInnerIoStates_OperationOutstanding,
  159. SmbPseOEInnerIoStates_OperationCompleted
  160. } SMB_PSE_OE_INNERIO_STATE;
  161. #define MAX_PAGES_SPANNED_BY_PARTIAL_DATA_MDL (20)
  162. #define MAX_PAGES_SPANNED_BY_PARTIAL_EXCHANGE_MDL (2)
  163. #define MAX_PARTIAL_DATA_MDL_BUFFER_SIZE \
  164. (MAX_PAGES_SPANNED_BY_PARTIAL_DATA_MDL * PAGE_SIZE)
  165. #define MAX_PARTIAL_EXCHANGE_MDL_BUFFER_SIZE \
  166. (MAX_PAGES_SPANNED_BY_PARTIAL_EXCHANGE_MDL * PAGE_SIZE)
  167. typedef struct _SMB_PSE_OE_READWRITE {
  168. union {
  169. PBYTE UserBufferBase;
  170. PLOWIO_LOCK_LIST LockList;
  171. };
  172. ULONG RemainingByteCount;
  173. ULONG ThisBytesRequested;
  174. ULONG ThisByteCount;
  175. ULONG ThisBufferOffset;
  176. LARGE_INTEGER ByteOffsetAsLI;
  177. ULONG BytesReturned;
  178. BOOLEAN PartialExchangeMdlInUse;
  179. BOOLEAN PartialDataMdlInUse;
  180. ULONG UserBufferPortionLength;
  181. ULONG ExchangeBufferPortionLength;
  182. union {
  183. MDL PartialDataMdl;
  184. BYTE ByteBuffer1[
  185. sizeof(MDL) +
  186. sizeof(ULONG) * MAX_PAGES_SPANNED_BY_PARTIAL_DATA_MDL];
  187. };
  188. union {
  189. MDL PartialExchangeMdl;
  190. BYTE PartialExchangeMdlBuffer[
  191. sizeof(MDL) +
  192. sizeof(ULONG) * MAX_PAGES_SPANNED_BY_PARTIAL_EXCHANGE_MDL];
  193. };
  194. } SMB_PSE_OE_READWRITE, *PSMB_PSE_OE_READWRITE;
  195. #define OE_RW_FLAG_SUCCESS_IN_COPYHANDLER (0x01)
  196. #define OE_RW_FLAG_REDUCE_RETURNCOUNT (0x20) //used in pipewrites to track rawmode
  197. #define OE_RW_FLAG_SUBSEQUENT_OPERATION (0x40) //used in pipewrites to distinguish the first
  198. #define OE_RW_FLAG_MSGMODE_PIPE_OPERATION (0x80) //MAX VALUE, it's just a byte.....
  199. #define SMB_PSE_OE_HDR_MDL_PAGES (2 + (ADDRESS_AND_SIZE_TO_SPAN_PAGES( (ULONG) 0, MAXIMUM_SMB_BUFFER_SIZE )))
  200. typedef struct _SMB_PSE_ORDINARY_EXCHANGE{
  201. union {
  202. SMB_EXCHANGE Exchange;
  203. SMB_EXCHANGE;
  204. };
  205. SMB_PSE_ORDINARY_EXCHANGE_TYPE OEType;
  206. SMB_PSE_ORDINARY_EXCHANGE_ENTRYPOINTS EntryPoint;
  207. ULONG SmbBufSize;
  208. ULONG StartEntryCount;
  209. PMDL DataPartialMdl;
  210. USHORT Flags;
  211. UCHAR OpSpecificFlags;
  212. UCHAR OpSpecificState;
  213. ULONG SendOptions;
  214. GENERIC_ANDX ParseResumeState;
  215. UCHAR LastSmbCommand;
  216. NTSTATUS NoCopyFinalStatus;
  217. ULONG MessageLength;
  218. PSMB_PSE_OE_START_ROUTINE AsyncResumptionRoutine;
  219. PSMB_PSE_OE_START_ROUTINE StartRoutine;
  220. PSMB_PSE_CONTINUATION_ROUTINE ContinuationRoutine;
  221. union {
  222. struct {
  223. SMBPSE_FILEINFO_BUNDLE FileInfo;
  224. PMRX_SMB_SRV_OPEN smbSrvOpen;
  225. RX_FILE_TYPE StorageTypeFromGFA;
  226. ///DO NOT CHANGE ABOVE HERE UNLESS YOU CHANGE THE INFO ARM AS WELL
  227. MRXSMB_CREATE_PARAMETERS SmbCp;
  228. BOOLEAN MustRegainExclusiveResource;
  229. BOOLEAN CreateWithEasSidsOrLongName;
  230. ULONG FidReturnedFromCreate;
  231. ULONG FidReturnedFromOpen;
  232. ULONG FileSizeReturnedFromOpen;
  233. BOOLEAN FileWasCreated;
  234. BOOLEAN FileWasTruncated;
  235. //UNICODE_STRING PathNameForCoreOperation;
  236. } Create;
  237. SMB_PSE_OE_READWRITE ReadWrite; //also used for locks
  238. struct {
  239. SMBPSE_FILEINFO_BUNDLE FileInfo;
  240. PMRX_SMB_SRV_OPEN smbSrvOpen;
  241. RX_FILE_TYPE StorageTypeFromGFA;
  242. ///DO NOT CHANGE ABOVE HERE UNLESS YOU CHANGE THE CREATE ARM AS WELL
  243. PVOID Buffer;
  244. PULONG pBufferLength;
  245. ULONG InfoClass;
  246. union {
  247. struct {
  248. UCHAR CoreLabel[13]; //right from smb.h
  249. } QFSVolInfo;
  250. struct {
  251. ULONG CountRemaining;
  252. ULONG CountRemainingInSmbbuf;
  253. PSMB_DIRECTORY_INFORMATION NextDirInfo;
  254. //there should be a union here
  255. PSMB_RESUME_KEY EmptyCheckResumeKey;
  256. SMB_RESUME_KEY EmptyCheckResumeKeyBuffer;
  257. } CoreSearch;
  258. };
  259. } Info;
  260. struct {
  261. LARGE_INTEGER AllocationSize;
  262. } Transact2;
  263. struct {
  264. PUCHAR PtrToLockType; //this must be here because the beginning of the
  265. //lockstart code sets the locklist to zero which will be this
  266. PMRX_SRV_OPEN SrvOpen;
  267. PRX_LOCK_ENUMERATOR LockEnumerator;
  268. PVOID ContinuationHandle;
  269. ULONG NumberOfLocksPlaced;
  270. LARGE_INTEGER NextLockOffset;
  271. LARGE_INTEGER NextLockRange;
  272. BOOLEAN NextLockIsExclusive;
  273. BOOLEAN LockAreaNonEmpty;
  274. BOOLEAN EndOfListReached;
  275. } AssertLocks;
  276. } ;
  277. PUNICODE_STRING pPathArgument1; // Unicode path
  278. union {
  279. PUNICODE_STRING pPathArgument2; // secondary unicode path
  280. PVOID Find32WithinSmbbuf;
  281. };
  282. PSMBSTUFFER_BUFFER_STATE StufferStateDbgPtr; //this is just for the debugger....get rid of it
  283. SMBSTUFFER_BUFFER_STATE AssociatedStufferState;
  284. struct {
  285. union {
  286. MDL;
  287. MDL Mdl;
  288. };
  289. ULONG Pages2[SMB_PSE_OE_HDR_MDL_PAGES];
  290. } HeaderMdl;
  291. struct {
  292. union {
  293. MDL;
  294. MDL Mdl;
  295. };
  296. ULONG Pages2[SMB_PSE_OE_HDR_MDL_PAGES];
  297. } HeaderPartialMdl;
  298. //#if DBG
  299. ULONG SerialNumber;
  300. SMBPSE_HISTORY History;
  301. PIRP RxContextCapturedRequestPacket;
  302. PMDL SaveDataMdlForDebug;
  303. ULONG SaveLengthForDebug;
  304. PMDL SaveIrpMdlForDebug;
  305. //#endif
  306. ULONG BytesAvailableCopy;
  307. ULONG BytesIndicatedCopy;
  308. } SMB_PSE_ORDINARY_EXCHANGE, *PSMB_PSE_ORDINARY_EXCHANGE;
  309. #define SmbPseDiscardProtocol(__STATUS__) { \
  310. *pBytesTaken = BytesAvailable; \
  311. pExchange->Status = (__STATUS__); \
  312. }
  313. NTSTATUS
  314. SmbPseOrdinaryExchange(
  315. SMBPSE_ORDINARY_EXCHANGE_ARGUMENT_SIGNATURE,
  316. IN SMB_PSE_ORDINARY_EXCHANGE_TYPE OEType
  317. );
  318. NTSTATUS
  319. SmbPseResumeOrdinaryExchange(
  320. IN OUT PRX_CONTEXT RxContext
  321. );
  322. #define ASSERT_ORDINARY_EXCHANGE(__p) ASSERT(NodeType(__p)==SMB_EXCHANGE_NTC(ORDINARY_EXCHANGE))
  323. NTSTATUS
  324. __SmbPseCreateOrdinaryExchange (
  325. IN PRX_CONTEXT RxContext,
  326. IN PMRX_V_NET_ROOT VNetRoot,
  327. IN SMB_PSE_ORDINARY_EXCHANGE_ENTRYPOINTS EntryPoint,
  328. IN PSMB_PSE_OE_START_ROUTINE StartRoutine,
  329. OUT PSMB_PSE_ORDINARY_EXCHANGE *OrdinaryExchangePtr
  330. );
  331. #define SmbPseCreateOrdinaryExchange(__rxcontext,__vnetroot,__entrypoint,__start,__ordinaryexchangeptr) \
  332. __SmbPseCreateOrdinaryExchange(__rxcontext,__vnetroot,__entrypoint,__start,__ordinaryexchangeptr)
  333. BOOLEAN
  334. SmbPseFinalizeOrdinaryExchange (
  335. IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange
  336. );
  337. #define SmbPseInitiateOrdinaryExchange(OrdinaryExchange) (SmbCeInitiateExchange(&OrdinaryExchange->Exchange))
  338. // this macro is used to do the async completion for read/write/locks. Note that the call to lowiocompletion
  339. // will try to complete the irp thereby freeing the user's mdl. so, we better get rid of the partial first.
  340. // we use this macro so that there will be only one version of this code. when we combine start routines,
  341. // this will be un macroed
  342. #define SmbPseAsyncCompletionIfNecessary(OE,RXCONTEXT) { \
  343. if (StartEntryCount>1) { \
  344. BOOLEAN FinalizationComplete; \
  345. if (FALSE) {DbgBreakPoint(); } \
  346. if ( (OE)->DataPartialMdl ) { \
  347. if (FlagOn((OE)->Flags, SMBPSE_OE_FLAG_MUST_SUCCEED_ALLOCATED_SMBBUF)){\
  348. MmPrepareMdlForReuse((OE)->DataPartialMdl); \
  349. } else { \
  350. IoFreeMdl((OE)->DataPartialMdl); \
  351. (OE)->DataPartialMdl = NULL; \
  352. ClearFlag((OE)->Flags,SMBPSE_OE_FLAG_OE_ALLOCATED_DATA_PARTIAL); \
  353. } \
  354. } \
  355. (RXCONTEXT)->StoredStatus = Status; \
  356. \
  357. RxLowIoCompletion((RXCONTEXT)); \
  358. FinalizationComplete = SmbPseFinalizeOrdinaryExchange((OE)); \
  359. ASSERT(!FinalizationComplete); \
  360. Status = STATUS_PENDING; \
  361. }}
  362. /* ------------------------------------------
  363. ------------------------------------------
  364. Receive Handler Stuff
  365. ------------------------------------------
  366. ------------------------------------------
  367. */
  368. VOID
  369. SmbPseInitializeTables(
  370. void
  371. );
  372. typedef
  373. NTSTATUS
  374. (*PSMBPSE_RECEIVE_HANDLER) (
  375. PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
  376. PBYTE Response
  377. );
  378. //boy, talk about a load of arguments
  379. typedef
  380. UCHAR
  381. (*PSMBPSE_NOCOPY_RECEIVE_HANDLER) (
  382. IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
  383. IN ULONG BytesIndicated,
  384. IN ULONG BytesAvailable,
  385. OUT ULONG *pBytesTaken,
  386. IN PSMB_HEADER pSmbHeader,
  387. OUT PMDL *pDataBufferPointer,
  388. OUT PULONG pDataSize,
  389. #if DBG
  390. IN UCHAR ThisIsAReenter,
  391. #endif
  392. IN PBYTE Response
  393. );
  394. #define SMBPSE_NOCOPYACTION_NORMALFINISH 0x00
  395. #define SMBPSE_NOCOPYACTION_MDLFINISH 0x01
  396. #define SMBPSE_NOCOPYACTION_DISCARD 0x02
  397. #define SMBPSE_NOCOPYACTION_COPY_FOR_RESUME 0x03
  398. #define SMBPSE_RMP_MODELED (0x00000001)
  399. #define SMBPSE_RMP_THIS_IS_ANDX (0x00000002)
  400. #define SMBPSE_RMP_WARNINGS_OK (0x00000004)
  401. #define SMBPSE_RMP_NOCOPY_HANDLER (0x00000008)
  402. typedef enum _SMBPSE_RECEIVE_HANDLER_TOKEN {
  403. SMBPSE_RECEIVE_HANDLER_TOKEN_READ_ANDX_HANDLER = 0,
  404. SMBPSE_RECEIVE_HANDLER_TOKEN_READ_HANDLER,
  405. SMBPSE_RECEIVE_HANDLER_TOKEN_WRITE_ANDX_HANDLER,
  406. SMBPSE_RECEIVE_HANDLER_TOKEN_WRITE_HANDLER,
  407. SMBPSE_RECEIVE_HANDLER_TOKEN_LOCKING_ANDX_HANDLER,
  408. SMBPSE_RECEIVE_HANDLER_TOKEN_OPEN_PRINTFILE_HANDLER,
  409. SMBPSE_RECEIVE_HANDLER_TOKEN_WRITE_PRINTFILE_HANDLER,
  410. SMBPSE_RECEIVE_HANDLER_TOKEN_CLOSE_HANDLER, //also close_print_file
  411. SMBPSE_RECEIVE_HANDLER_TOKEN_NTCREATE_ANDX_HANDLER,
  412. SMBPSE_RECEIVE_HANDLER_TOKEN_OPEN_ANDX_HANDLER,
  413. SMBPSE_RECEIVE_HANDLER_TOKEN_CREATE_HANDLER, //also create_new
  414. SMBPSE_RECEIVE_HANDLER_TOKEN_OPEN_HANDLER,
  415. SMBPSE_RECEIVE_HANDLER_TOKEN_TRANS2_ANDX_HANDLER,
  416. SMBPSE_RECEIVE_HANDLER_TOKEN_GFA_HANDLER,
  417. SMBPSE_RECEIVE_HANDLER_TOKEN_SEARCH_HANDLER,
  418. SMBPSE_RECEIVE_HANDLER_TOKEN_QUERYDISKINFO_HANDLER,
  419. SMBPSE_RECEIVE_HANDLER_TOKEN_IOCTL_HANDLER,
  420. SMBPSE_RECEIVE_HANDLER_TOKEN_MAXIMUM
  421. } SMBPSE_RECEIVE_HANDLER_TOKEN;
  422. PSMBPSE_RECEIVE_HANDLER SmbPseReceiveHandlers[SMBPSE_RECEIVE_HANDLER_TOKEN_MAXIMUM];
  423. typedef struct _SMBPSE_RECEIVE_MODEL_PARAMETERS {
  424. UCHAR Flags;
  425. UCHAR ReceiveHandlerToken;
  426. #if DBG
  427. USHORT Dummy;
  428. PSMBPSE_RECEIVE_HANDLER ReceiveHandler;
  429. PBYTE IndicationString;
  430. SMB_PSE_ORDINARY_EXCHANGE_TYPE LowType,HighType;
  431. #endif
  432. } SMBPSE_RECEIVE_MODEL_PARAMETERS, *PSMBPSE_RECEIVE_MODEL_PARAMETERS;
  433. SMBPSE_RECEIVE_MODEL_PARAMETERS SmbPseReceiveModelParameters[256]; //there are 256 possible smbs
  434. typedef struct _SMBPSE_VESTIGIAL_SMBBUF {
  435. NT_SMB_HEADER Header;
  436. union {
  437. REQ_WRITE Write;
  438. REQ_NT_WRITE_ANDX WriteAndX;
  439. REQ_FLUSH Flush;
  440. struct {
  441. REQ_LOCKING_ANDX LockingAndX;
  442. NTLOCKING_ANDX_RANGE Locks[20];
  443. };
  444. REQ_FIND_CLOSE2 FindClose;
  445. REQ_CLOSE Close;
  446. };
  447. ULONG Pad;
  448. } SMBPSE_VESTIGIAL_SMBBUF;
  449. // Finishing routines - these are all cast into the correct procedure type
  450. // so that the response will already have the correct SMB format
  451. // on entry to the routine
  452. NTSTATUS
  453. MRxSmbFinishNTCreateAndX (
  454. IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
  455. IN PRESP_NT_CREATE_ANDX Response
  456. );
  457. #define MRxSmbReceiveHandler_NTCreateAndX ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishNTCreateAndX)
  458. NTSTATUS
  459. MRxSmbFinishOpenAndX (
  460. IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
  461. IN PRESP_OPEN_ANDX Response
  462. );
  463. #define MRxSmbReceiveHandler_OpenAndX ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishOpenAndX)
  464. NTSTATUS
  465. MRxSmbFinishClose (
  466. IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
  467. IN PRESP_CLOSE Response
  468. );
  469. #define MRxSmbReceiveHandler_Close ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishClose)
  470. NTSTATUS
  471. MRxSmbFinishGFA (
  472. IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
  473. IN PVOID Response
  474. );
  475. #define MRxSmbReceiveHandler_GetFileAttributes ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishGFA)
  476. NTSTATUS
  477. MRxSmbFinishTransaction2 (
  478. IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
  479. IN PRESP_TRANSACTION Response
  480. );
  481. #define MRxSmbReceiveHandler_Transact2 ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishTransaction2)
  482. NTSTATUS
  483. MRxSmbFinishCoreOpen (
  484. IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
  485. IN PRESP_OPEN Response
  486. );
  487. #define MRxSmbReceiveHandler_CoreOpen ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishCoreOpen)
  488. NTSTATUS
  489. MRxSmbFinishCoreCreate (
  490. IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
  491. IN PRESP_CREATE Response
  492. );
  493. #define MRxSmbReceiveHandler_CoreCreate ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishCoreCreate)
  494. //NTSTATUS
  495. //MRxSmbFinishRead (
  496. // IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
  497. // IN PRESP_READ_ANDX Response
  498. // );
  499. //#define MRxSmbReceiveHandler_ReadAndX ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishRead)
  500. //NTSTATUS
  501. //MRxSmbFinishCoreRead (
  502. // IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
  503. // IN PRESP_READ Response
  504. // );
  505. //#define MRxSmbReceiveHandler_CoreRead ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishCoreRead)
  506. UCHAR
  507. MRxSmbReadHandler_NoCopy (
  508. IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
  509. IN ULONG BytesIndicated,
  510. IN ULONG BytesAvailable,
  511. OUT ULONG *pBytesTaken,
  512. IN PSMB_HEADER pSmbHeader,
  513. OUT PMDL *pDataBufferPointer,
  514. OUT PULONG pDataSize,
  515. #if DBG
  516. IN UCHAR ThisIsAReenter,
  517. #endif
  518. IN PRESP_READ_ANDX Response
  519. );
  520. #define MRxSmbReceiveHandler_Read_NoCopy ((PSMBPSE_RECEIVE_HANDLER)MRxSmbReadHandler_NoCopy)
  521. NTSTATUS
  522. MRxSmbFinishWrite (
  523. IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
  524. IN PBYTE Response
  525. );
  526. #define MRxSmbReceiveHandler_WritePrintFile ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishWrite)
  527. #define MRxSmbReceiveHandler_WriteAndX ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishWrite)
  528. #define MRxSmbReceiveHandler_CoreWrite ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishWrite)
  529. NTSTATUS
  530. MRxSmbFinishLocks (
  531. IN OUT PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
  532. IN PRESP_LOCKING_ANDX Response
  533. );
  534. #define MRxSmbReceiveHandler_LockingAndX ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishLocks)
  535. NTSTATUS
  536. MRxSmbFinishSearch (
  537. PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
  538. PRESP_SEARCH Response
  539. );
  540. #define MRxSmbReceiveHandler_Search ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishSearch)
  541. NTSTATUS
  542. MRxSmbFinishQueryDiskInfo (
  543. PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
  544. PRESP_QUERY_INFORMATION_DISK Response
  545. );
  546. #define MRxSmbReceiveHandler_QueryDiskInfo ((PSMBPSE_RECEIVE_HANDLER)MRxSmbFinishQueryDiskInfo)
  547. typedef
  548. NTSTATUS
  549. (*PSMB_PSE_OE_T2_FIXUP_ROUTINE) (
  550. PSMB_PSE_ORDINARY_EXCHANGE
  551. );
  552. NTSTATUS
  553. __MRxSmbSimpleSyncTransact2(
  554. SMBPSE_ORDINARY_EXCHANGE_ARGUMENT_SIGNATURE,
  555. IN SMB_PSE_ORDINARY_EXCHANGE_TYPE OEType,
  556. IN ULONG TransactSetupCode,
  557. IN PVOID Params,
  558. IN ULONG ParamsLength,
  559. IN PVOID Data,
  560. IN ULONG DataLength,
  561. IN PSMB_PSE_OE_T2_FIXUP_ROUTINE FixupRoutine
  562. );
  563. #define MRxSmbSimpleSyncTransact2(a,b,c,d,e,f,g) \
  564. __MRxSmbSimpleSyncTransact2(a,b,c,d,e,f,g,NULL);
  565. NTSTATUS
  566. MRxSmbDeferredCreate (
  567. IN OUT PRX_CONTEXT RxContext
  568. );
  569. NTSTATUS
  570. MRxSmbConstructDeferredOpenContext (
  571. IN OUT PRX_CONTEXT RxContext
  572. );
  573. //downlevel stuff....
  574. NTSTATUS
  575. MRxSmbPseudoOpenTailFromGFAResponse (
  576. PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange
  577. );
  578. NTSTATUS
  579. MRxSmbPseudoOpenTailFromFakeGFAResponse (
  580. PSMB_PSE_ORDINARY_EXCHANGE OrdinaryExchange,
  581. RX_FILE_TYPE StorageType
  582. );
  583. NTSTATUS
  584. MRxSmbCoreTruncate(
  585. SMBPSE_ORDINARY_EXCHANGE_ARGUMENT_SIGNATURE,
  586. ULONG Fid,
  587. ULONG FileTruncationPoint
  588. );
  589. NTSTATUS
  590. MRxSmbCoreInformation(
  591. IN OUT PRX_CONTEXT RxContext,
  592. IN ULONG InformationClass,
  593. IN OUT PVOID pBuffer,
  594. IN OUT PULONG pBufferLength,
  595. IN SMB_PSE_ORDINARY_EXCHANGE_ENTRYPOINTS EntryPoint
  596. );
  597. ULONG
  598. MRxSmbMapSmbAttributes (
  599. IN USHORT SmbAttribs
  600. );
  601. USHORT
  602. MRxSmbMapDisposition (
  603. IN ULONG Disposition
  604. );
  605. USHORT
  606. MRxSmbMapShareAccess (
  607. IN USHORT ShareAccess
  608. );
  609. USHORT
  610. MRxSmbMapDesiredAccess (
  611. IN ULONG DesiredAccess
  612. );
  613. USHORT
  614. MRxSmbMapFileAttributes (
  615. IN ULONG FileAttributes
  616. );
  617. ULONG
  618. MRxSmbUnmapDisposition (
  619. IN USHORT SmbDisposition,
  620. IN ULONG Disposition
  621. );
  622. LARGE_INTEGER
  623. MRxSmbConvertSmbTimeToTime (
  624. //IN PSMB_EXCHANGE Exchange OPTIONAL,
  625. IN PSMBCE_SERVER Server OPTIONAL,
  626. IN SMB_TIME Time,
  627. IN SMB_DATE Date
  628. );
  629. BOOLEAN
  630. MRxSmbConvertTimeToSmbTime (
  631. IN PLARGE_INTEGER InputTime,
  632. IN PSMB_EXCHANGE Exchange OPTIONAL,
  633. OUT PSMB_TIME Time,
  634. OUT PSMB_DATE Date
  635. );
  636. BOOLEAN
  637. MRxSmbTimeToSecondsSince1970 (
  638. IN PLARGE_INTEGER CurrentTime,
  639. IN PSMBCE_SERVER Server OPTIONAL,
  640. OUT PULONG SecondsSince1970
  641. );
  642. VOID
  643. MRxSmbSecondsSince1970ToTime (
  644. IN ULONG SecondsSince1970,
  645. IN PSMBCE_SERVER Server OPTIONAL,
  646. OUT PLARGE_INTEGER CurrentTime
  647. );
  648. VOID
  649. MRxSmbResumeAsyncReadWriteRequests(
  650. PRX_CONTEXT RxContext);
  651. #endif // _SMBPSE_H_