summaryrefslogtreecommitdiffstats
path: root/private/inc/smbmacro.h
diff options
context:
space:
mode:
authorAdam <you@example.com>2020-05-17 05:51:50 +0200
committerAdam <you@example.com>2020-05-17 05:51:50 +0200
commite611b132f9b8abe35b362e5870b74bce94a1e58e (patch)
treea5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/inc/smbmacro.h
downloadNT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip
Diffstat (limited to 'private/inc/smbmacro.h')
-rw-r--r--private/inc/smbmacro.h240
1 files changed, 240 insertions, 0 deletions
diff --git a/private/inc/smbmacro.h b/private/inc/smbmacro.h
new file mode 100644
index 000000000..791af6be6
--- /dev/null
+++ b/private/inc/smbmacro.h
@@ -0,0 +1,240 @@
+/*++
+
+Copyright (c) 1989 Microsoft Corporation
+
+Module Name:
+
+ smbmacro.h
+
+Abstract:
+
+ This module defines macros related to SMB processing.
+
+Author:
+
+ Chuck Lenzmeier (chuckl) 1-Dec-1989
+ David Treadwell (davidtr)
+
+Revision History:
+
+--*/
+
+#ifndef _SMBMACRO_
+#define _SMBMACRO_
+
+//#include <nt.h>
+
+
+//
+// PVOID
+// ALIGN_SMB_WSTR(
+// IN PVOID Pointer
+// )
+//
+// Routine description:
+//
+// This macro aligns the input pointer to the next 2-byte boundary.
+// Used to align Unicode strings in SMBs.
+//
+// Arguments:
+//
+// Pointer - A pointer
+//
+// Return Value:
+//
+// PVOID - Pointer aligned to next 2-byte boundary.
+//
+
+#define ALIGN_SMB_WSTR( Pointer ) \
+ (PVOID)( ((ULONG)Pointer + 1) & ~1 )
+
+//
+// Macro to find the size of an SMB parameter block. This macro takes
+// as input the type of a parameter block and a byte count. It finds
+// the offset of the Buffer field, which appears at the end of all
+// parameter blocks, and adds the byte count to find the total size.
+// The type of the returned offset is USHORT.
+//
+// Note that this macro does NOT pad to a word or longword boundary.
+//
+
+#define SIZEOF_SMB_PARAMS(type,byteCount) \
+ (USHORT)( (CLONG)&((type *)0)->Buffer[0] + (byteCount) )
+
+//
+// Macro to find the next location after an SMB parameter block. This
+// macro takes as input the address of the current parameter block, its
+// type, and a byte count. It finds the address of the Buffer field,
+// which appears at the end of all parameter blocks, and adds the byte
+// count to find the next available location. The type of the returned
+// pointer is PVOID.
+//
+// The byte count is passed in even though it is available through
+// base->ByteCount. The reason for this is that this number will be a
+// compile-time constant in most cases, so the resulting code will be
+// simpler and faster.
+//
+// !!! This macro does not round to a longword boundary when packing
+// is turned off. Pre-LM 2.0 DOS redirectors cannot handle having
+// too much data sent to them; the exact amount must be sent.
+// We may want to make this macro such that the first location
+// AFTER the returned value (WordCount field of the SMB) is aligned,
+// since most of the fields are misaligned USHORTs. This would
+// result in a minor performance win on the 386 and other CISC
+// machines.
+//
+
+#ifndef NO_PACKING
+
+#define NEXT_LOCATION(base,type,byteCount) \
+ (PVOID)( (ULONG)( (PUCHAR)( &((type *)(base))->Buffer[0] ) ) + \
+ (byteCount) )
+
+#else
+
+#define NEXT_LOCATION(base,type,byteCount) \
+ (PVOID)(( (ULONG)( (PUCHAR)( &((type *)(base))->Buffer[0] ) ) + \
+ (byteCount) + 3) & ~3)
+
+#endif
+
+//
+// Macro to find the offset of a followon command to an and X command.
+// This offset is the number of bytes from the start of the SMB header
+// to where the followon command's parameters should start.
+//
+
+#define GET_ANDX_OFFSET(header,params,type,byteCount) \
+ (USHORT)( (PCHAR)(params) - (PCHAR)(header) + \
+ SIZEOF_SMB_PARAMS( type,(byteCount) ) )
+
+//
+// The following are macros to assist in converting OS/2 1.2 EAs to
+// NT style and vice-versa.
+//
+
+//++
+//
+// ULONG
+// SmbGetNtSizeOfFea (
+// IN PFEA Fea
+// )
+//
+// Routine Description:
+//
+// This macro gets the size that would be required to hold the FEA
+// in NT format. The length is padded to account for the fact that
+// each FILE_FULL_EA_INFORMATION structure must start on a
+// longword boundary.
+//
+// Arguments:
+//
+// Fea - a pointer to the OS/2 1.2 FEA structure to evaluate.
+//
+// Return Value:
+//
+// ULONG - number of bytes the FEA would require in NT format.
+//
+//--
+
+//
+// The +1 is for the zero terminator on the name, the +3 is for padding.
+//
+
+#define SmbGetNtSizeOfFea( Fea ) \
+ (ULONG)(( FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName[0]) + \
+ (Fea)->cbName + 1 + SmbGetUshort( &(Fea)->cbValue ) + \
+ 3 ) & ~3 )
+
+//++
+//
+// ULONG
+// SmbGetNtSizeOfGea (
+// IN PFEA Gea
+// )
+//
+// Routine Description:
+//
+// This macro gets the size that would be required to hold the GEA
+// in NT format. The length is padded to account for the fact that
+// each FILE_FULL_EA_INFORMATION structure must start on a
+// longword boundary.
+//
+// Arguments:
+//
+// Gea - a pointer to the OS/2 1.2 GEA structure to evaluate.
+//
+// Return Value:
+//
+// ULONG - number of bytes the GEA would require in NT format.
+//
+//--
+
+//
+// The +1 is for the zero terminator on the name, the +3 is for padding.
+//
+
+#define SmbGetNtSizeOfGea( Gea ) \
+ (ULONG)(( FIELD_OFFSET(FILE_FULL_EA_INFORMATION, EaName[0]) + \
+ (Gea)->cbName + 1 + 3 ) & ~3 )
+
+//++
+//
+// ULONG
+// SmbGetOs2SizeOfNtFullEa (
+// IN PFILE_FULL_EA_INFORMATION NtFullEa;
+// )
+//
+// Routine Description:
+//
+// This macro gets the size a FILE_FULL_EA_INFORMATION structure would
+// require to be represented in a OS/2 1.2 style FEA.
+//
+// Arguments:
+//
+// NtFullEa - a pointer to the NT FILE_FULL_EA_INFORMATION structure
+// to evaluate.
+//
+// Return Value:
+//
+// ULONG - number of bytes requires for the FEA.
+//
+//--
+
+#define SmbGetOs2SizeOfNtFullEa( NtFullEa ) \
+ (ULONG)( sizeof(FEA) + (NtFullEa)->EaNameLength + 1 + \
+ (NtFullEa)->EaValueLength )
+
+//++
+//
+// ULONG
+// SmbGetOs2SizeOfNtGetEa (
+// IN PFILE_GET_EA_INFORMATION NtGetEa;
+// )
+//
+// Routine Description:
+//
+// This macro gets the size a FILE_GET_EA_INFORMATION structure would
+// require to be represented in a OS/2 1.2 style GEA.
+//
+// Arguments:
+//
+// NtGetEa - a pointer to the NT FILE_GET_EA_INFORMATION structure
+// to evaluate.
+//
+// Return Value:
+//
+// ULONG - number of bytes requires for the GEA.
+//
+//--
+
+//
+// The zero terminator on the name is accounted for by the szName[0]
+// field in the GEA definition.
+//
+
+#define SmbGetOs2SizeOfNtGetEa( NtGetEa ) \
+ (ULONG)( sizeof(GEA) + (NtGetEa)->EaNameLength )
+
+#endif // def _SMBMACRO_
+