WindowsXP-SP1/ds/ese98/eximport/ifsurtl.h
2020-09-30 16:53:49 +02:00

621 lines
16 KiB
C

/*++
Copyright (c) 1999 Microsoft Corporation
Module Name:
ifsurtl.h
Abstract:
This module defines all EXIFS shared routines exported to user-mode.
Author:
Rajeev Rajan [RajeevR] 2-June-1999
Rohan Phillips [Rohanp] 23-June-1999 - Added provider functions
Revision History:
--*/
#ifndef _IFSURTL_H_
#define _IFSURTL_H_
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _IFSURTL_IMPLEMENTATION_
#ifndef IFSURTL_EXPORT
#define IFSURTL_EXPORT __declspec( dllexport )
#endif
#else
#ifndef IFSURTL_EXPORT
#define IFSURTL_EXPORT __declspec( dllimport )
#endif
#endif
#ifndef IFSURTL_CALLTYPE
#define IFSURTL_CALLTYPE __stdcall
#endif
///////////////////////////////////////////////////////////////////////////////
//
// Callback for IFS functions
//
///////////////////////////////////////////////////////////////////////////////
typedef void (WINAPI *PFN_IFSCALLBACK)(PVOID);
///////////////////////////////////////////////////////////////////////////////
//
// Following are the structures / definitions for the large buffer package
//
///////////////////////////////////////////////////////////////////////////////
#define IFS_LARGE_BUFFER_SIGNATURE (ULONG) 'fubL'
#define IFS_CURSOR_SIGNATURE (ULONG) 'rsrC'
#define IFS_LARGE_BUFFER_SHARED_VIEWSIZE (256*1024)
//
// An IFS_LARGE_BUFFER object encapsulates a temp file containing
// data that can be passed around and used like a buffer. Typically,
// a producer would make one of these objects and stream in large
// amounts of data. A consumer would read different chunks of the
// data. The object will maintain a single mapping/view of the first
// 256K of the file.
//
// Consumers will need to access data using IFS_CURSORS that specify
// the <offset,len> pair for the span of data they are interested in.
// In the most common case, this should lie in the first 256K region,
// which would yield the default view. If it is beyond this region,
// views will be mapped/unmapped on demand.
//
typedef struct _IFS_LARGE_BUFFER {
//
// Signature
//
ULONG m_Signature;
//
// Handle
//
HANDLE m_FileContext1;
//
// FileObject
//
PVOID m_FileContext2;
//
// FileMapping context for first 256K or filesize
//
HANDLE m_MappingContext;
//
// Process context (optional)
//
PVOID m_ProcessContext;
//
// Memory pointer for first 256K or filesize
//
PBYTE m_MemoryPtr;
//
// Ref count - the lower WORD will count cursor refs
// the higher WORD will count object refs
//
ULONG m_ReferenceCount;
//
// Is this a reference or a live object ?
// If this is a reference, the fields above are NULL and
// the m_TempFileName should be used to make a new object !
//
BOOL m_IsThisAReference;
//
// Current ValidDataLength
//
LARGE_INTEGER m_ValidDataLength;
//
// Name of temp file - we will use fixed
// names so we can make simplyfying assumptions
// about the filename len !
//
WCHAR m_TempFileName [MAX_PATH+1];
} IFS_LARGE_BUFFER,*PIFS_LARGE_BUFFER;
#define IsScatterListLarge( s ) FlagOn((s)->Flags, IFS_SLIST_FLAGS_LARGE_BUFFER)
#define EXIFS_EA_LEN_LARGE_SCATTER_LIST \
LongAlign(FIELD_OFFSET( FILE_FULL_EA_INFORMATION, EaName[0] ) + \
sizeof(EXIFS_EA_NAME_SCATTER_LIST) + \
LongAlign(sizeof(SCATTER_LIST) + sizeof(IFS_LARGE_BUFFER) ))
#define EXIFS_EA_VALUE_LEN_LARGE_SCATTER_LIST \
LongAlign(sizeof(SCATTER_LIST) + sizeof(IFS_LARGE_BUFFER) )
//
// An IFS_CURSOR object provides a view into a large buffer.
// Usage is as follows:
// + Call IfsStartCursor() to init a cursor and get a pointer
// + Use the pointer to read/write data via IfsConsumeCursor()
// + Call IfsFinishCursor() to close the cursor
//
// NOTE: Cursor usage will bump ref counts on the LARGE_BUFFER
// object. If the LARGE_BUFFER object passed in is NOT live it
// will instantiate one from the reference !
//
typedef struct _IFS_CURSOR {
//
// Signature
//
ULONG m_Signature;
//
// Owning large buffer object
//
PIFS_LARGE_BUFFER m_pLargeBuffer;
//
// Current Offset to start of data
//
LARGE_INTEGER m_Offset;
//
// Current Span of data
//
ULONG m_Length;
//
// Append mode - if TRUE client can cursor beyond EOF
//
BOOL m_AppendMode;
//
// Is this a shared view
//
BOOL m_IsViewShared;
//
// Did we open the buffer
//
HANDLE m_OwnBufferOpen;
//
// Did we attach to the large buffer process
//
BOOL m_AttachedToProcess;
//
// The following fields are relevant only if the view is not shared.
// The first 256K view is shared via the mapping in the large buffer object.
// Cursors that extend beyond 256K make their own mapping - See Below.
//
//
// FileMapping context for this cursor
//
HANDLE m_MappingContext;
//
// Memory pointer for this cursor
//
PBYTE m_MemoryPtr;
} IFS_CURSOR,*PIFS_CURSOR;
//
// Returns a pointer to data that can be used to
// read/write. The pointer is valid only for the length
// requested !
// NOTE: If AppendMode is TRUE, cursors will be allowed
// beyond EOF. This should be used by clients that wish
// to append data to the large buffer.
//
PBYTE
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsGetFirstCursor(
IN PIFS_LARGE_BUFFER pLargeBuffer,
IN PIFS_CURSOR pCursor,
IN ULONG StartOffsetHigh,
IN ULONG StartOffsetLow,
IN ULONG StartLength,
IN BOOL fAppendMode
);
//
// Consume bytes within current cursor
// returns next pointer at which to read/write data !
//
// NOTE: If all the data in the cursor is consumed, returns NULL
//
PBYTE
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsConsumeCursor(
IN PIFS_CURSOR pCursor,
IN ULONG Length
);
//
// Returns a pointer to data that can be used to
// read/write. The pointer is valid only for the length
// requested relative to the current cursor !
//
// NOTE: This call advances the cursor in the large buffer
//
PBYTE
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsGetNextCursor(
IN PIFS_CURSOR pCursor,
IN ULONG NextLength
);
//
// Should be called for every matching GetFirstCursor() call.
//
VOID
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsFinishCursor(
IN PIFS_CURSOR pCursor
);
//
// Should be called to truncate the large buffer's valid data length
//
VOID
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsTruncateLargeBuffer(
IN PIFS_LARGE_BUFFER pLargeBuffer,
IN PLARGE_INTEGER pSizeToTruncate
);
//
// Rules for passing around IFS_LARGE_BUFFERs:
// 1. These objects should be passed around by reference. eg passing
// between user & kernel or between kernel and the namecache.
// 2. Use IfsCopyBufferByReference() to create a reference.
// 3. If a reference exists, there should always be a live object whose
// lifetime encapsulates the reference. This allows the consumer of the
// reference to make a *real* copy using the reference.
// 4. A reference can be converted into a live object. It is the responsibility
// of the module that does this conversion to close the live object.
// 5. Example: When EA is checked in to the namecache during CLOSE,
// it will be passed in as a reference. During checkin, the namecache should
// call IfsOpenBufferToReference() to hold on to the buffer. Thus,
// when the namecache blob is finalized, it needs to call IfsCloseBuffer()
// to close the large buffer !
//
//
// IN: pLargeBuffer should be allocated by caller of the function
// IN: Len of the buffer required - zero if len is not known apriori
//
// NOTE: Object needs to be closed via IfsCloseBuffer()
//
// USAGE: Should be used when caller needs to instantiate a large buffer
//
NTSTATUS
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsCreateNewBuffer(
IN PIFS_LARGE_BUFFER pLargeBuffer,
IN DWORD dwSizeHigh,
IN DWORD dwSizeLow,
IN PVOID ProcessContext // optional
);
//
// IN: pLargeBuffer should be allocated by caller of the function
// IN: Len of the buffer required - zero if len is not known apriori
//
// NOTE: Object needs to be closed via IfsCloseBuffer()
//
// USAGE: Should be used when caller needs to instantiate a large buffer
//
NTSTATUS
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsCreateNewBufferEx(
IN PIFS_LARGE_BUFFER pLargeBuffer,
IN DWORD dwSizeHigh,
IN DWORD dwSizeLow,
IN PVOID ProcessContext, // optional
IN PUNICODE_STRING FilePath // optional
);
//
// IN: pSrcLargeBuffer points to a live large buffer object
// IN OUT: pDstLargeBuffer is initialized as a reference to the Src
//
// USAGE: Should be used to pass large buffers between user/kernel
//
VOID
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsCopyBufferToReference(
IN PIFS_LARGE_BUFFER pSrcLargeBuffer,
IN OUT PIFS_LARGE_BUFFER pDstLargeBuffer
);
//
// IN: pSrcLargeBuffer points to a large buffer object (or reference)
// IN OUT: pDstLargeBuffer will be initialized as a live object based on
// the reference passed in
//
// USAGE: Should be used to pass large buffers between user/kernel
//
NTSTATUS
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsCopyReferenceToBuffer(
IN PIFS_LARGE_BUFFER pSrcLargeBuffer,
IN PVOID ProcessContext, // optional
IN OUT PIFS_LARGE_BUFFER pDstLargeBuffer
);
//
// IN: pLargeBuffer points to a large buffer object (or reference)
//
// NOTE: Object needs to be closed via IfsCloseBuffer()
// OpenBuffer will always assume that the buffer len is fixed !
//
// USAGE: Should be used when caller needs to convert a reference to a
// live object. If the object is already live, this will bump
// a reference on the object !
//
NTSTATUS
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsOpenBufferToReference(
IN PIFS_LARGE_BUFFER pLargeBuffer
);
//
// IN: pLargeBuffer coming in points to a live large buffer
// OUT: pLargeBuffer going out points to a NEW live large buffer
// The functions does a (deep) copy of the buffer data.
//
// NOTE: Since the incoming object is live, it is closed and a
// new object is instantiated in its place. Thus, IfsCloseBuffer()
// needs to be called as usual on this !
//
NTSTATUS
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsCopyBufferToNewBuffer(
IN OUT PIFS_LARGE_BUFFER pLargeBuffer
);
//
// IN: Object should have been initialized by IfsCreateNewBuffer() or
// IfsOpenBufferToReference() or IfsCopyReferenceToBuffer()
//
VOID
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsCloseBuffer(
IN PIFS_LARGE_BUFFER pLargeBuffer
);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsInitializeProvider(DWORD OsType);
DWORD
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsCloseProvider(void);
HANDLE
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsCreateFileProv(WCHAR * FileName, DWORD DesiredAccess, DWORD ShareMode, PVOID
lpSecurityAttributes, DWORD CreateDisposition, DWORD FlagsAndAttributes,
PVOID EaBuffer, DWORD EaBufferSize);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsInitializeRoot(HANDLE hFileHandle, WCHAR * szRootName, WCHAR * SlvFileName, DWORD InstanceId,
DWORD AllocationUnit, DWORD FileFlags);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsSpaceGrantRoot(HANDLE hFileHandle, WCHAR * szRootName, PSCATTER_LIST pSList, size_t cbListSize);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsSetEndOfFileRoot(HANDLE hFileHandle, WCHAR * szRootName, LONGLONG EndOfFile);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsSpaceRequestRoot(HANDLE hFileHandle, WCHAR * szRootName, PFN_IFSCALLBACK pfnIfsCallBack,
PVOID pContext, PVOID Ov);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsQueryEaFile(HANDLE hFileHandle, WCHAR * szFileName, WCHAR * NetRootName, PVOID EaBufferIn, DWORD EaBufferInSize,
PVOID EaBufferOut, DWORD EaBufferOutSize, DWORD * RequiredLength);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsSetEaFile(HANDLE hFileHandle, WCHAR * szFileName, PVOID EaBufferIn, DWORD EaBufferInSize);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsTerminateRoot(HANDLE hFileHandle, WCHAR *szRootName, ULONG Mode);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsGetOverlappedResult(HANDLE hFileHandle, PVOID Ov, DWORD * BytesReturned, BOOL Wait);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsReadFile(HANDLE hFileHandle, BYTE * InputBuffer, DWORD BytesToRead, PFN_IFSCALLBACK IfsCallBack,
PVOID Overlapped);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsWriteFile(HANDLE hFileHandle, BYTE * InputBuffer, DWORD BytesToWrite, PFN_IFSCALLBACK IfsCallBack,
PVOID Overlapped);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsDeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInputBuffer, DWORD cbInBufferSize,
LPVOID lpOutBuffer, DWORD cbOutBufferSize, LPDWORD lpBytesReturned, PVOID Overlapped);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsExpungName(HANDLE hFileHandle, WCHAR * szRootName, WCHAR * szFileName, ULONG cbPath);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsDirChangeReport(HANDLE hFileHandle, WCHAR * szRootName, ULONG ulFilterMatch,
ULONG ulAction, PWSTR pwszPath, ULONG cbPath);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsQueryRootStats(HANDLE hFileHandle, WCHAR * szRootName, PVOID Buffer, DWORD BuffSize);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsRegisterUmrThread(HANDLE hFileHandle, PFN_IFSCALLBACK pfnIfsCallBack);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsUmrEnableNetRoot(HANDLE hFileHandle, WCHAR * szRootName, DWORD * InstanceId);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsUmrDisableNetRoot(HANDLE hFileHandle, WCHAR * szRootName);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsStopUmrEngine(HANDLE hFileHandle, WCHAR * szRootName);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsStartUmrEngine(HANDLE hFileHandle, WCHAR * szRootName);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsCloseHandle(HANDLE hFileHandle);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsSetRootMap(HANDLE hFileHandle, WCHAR * szRootName, PSCATTER_LIST pSList, size_t cbListSize);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsResetRootMap(HANDLE hFileHandle, WCHAR * szRootName);
NTSTATUS
IFSURTL_EXPORT
NTAPI
IfsNtCreateFile(
OUT PHANDLE FileHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PLARGE_INTEGER AllocationSize OPTIONAL,
IN ULONG FileAttributes,
IN ULONG ShareAccess,
IN ULONG CreateDisposition,
IN ULONG CreateOptions,
IN PVOID EaBuffer OPTIONAL,
IN ULONG EaLength
);
NTSTATUS
IFSURTL_EXPORT
NTAPI
IfsNtQueryEaFile(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID Buffer,
IN ULONG Length,
IN BOOLEAN ReturnSingleEntry,
IN PVOID EaList OPTIONAL,
IN ULONG EaListLength,
IN PULONG EaIndex OPTIONAL,
IN BOOLEAN RestartScan
);
VOID
IFSURTL_EXPORT
NTAPI
IfsRtlInitUnicodeString(
PUNICODE_STRING DestinationString,
PCWSTR SourceString
);
LONG
IFSURTL_EXPORT
NTAPI
IfsRtlCompareUnicodeString(
PUNICODE_STRING String1,
PUNICODE_STRING String2,
BOOLEAN CaseInSensitive
);
BOOL
IFSURTL_EXPORT
IFSURTL_CALLTYPE
IfsFlushHandle(HANDLE hFileHandle,
WCHAR * szFileName,
WCHAR * NetRootName,
PVOID EaBufferIn,
DWORD EaBufferInSize
);
#ifdef __cplusplus
}
#endif
#endif // _IFSURTL_H_