mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 08:23:05 -05:00
1803 lines
53 KiB
Plaintext
1803 lines
53 KiB
Plaintext
= winfsp/winfsp.h
|
|
:author: (C) 2015-2018 Bill Zissimopoulos
|
|
:toc: preamble
|
|
:toc-title:
|
|
|
|
WinFsp User Mode API.
|
|
|
|
In order to use the WinFsp API the user mode file system must include <winfsp/winfsp.h>
|
|
and link with the winfsp$$_$$x64.dll (or winfsp$$_$$x86.dll) library.
|
|
|
|
== File System
|
|
|
|
A user mode file system is a program that uses the WinFsp API to expose a file system to
|
|
Windows. The user mode file system must implement the operations in FSP$$_$$FILE$$_$$SYSTEM$$_$$INTERFACE,
|
|
create a file system object using FspFileSystemCreate and start its dispatcher using
|
|
FspFileSystemStartDispatcher. At that point it will start receiving file system requests on the
|
|
FSP$$_$$FILE$$_$$SYSTEM$$_$$INTERFACE operations.
|
|
|
|
=== Classes
|
|
|
|
*FSP$$_$$FILE$$_$$SYSTEM$$_$$INTERFACE* - File system interface.
|
|
|
|
*Discussion*
|
|
|
|
The operations in this interface must be implemented by the user mode
|
|
file system. Not all operations need be implemented. For example,
|
|
a user mode file system that does not wish to support reparse points,
|
|
need not implement the reparse point operations.
|
|
|
|
Most of the operations accept a FileContext parameter. This parameter
|
|
has different meanings depending on the value of the FSP$$_$$FSCTL$$_$$VOLUME$$_$$PARAMS
|
|
flags UmFileContextIsUserContext2 and UmFileContextIsFullContext.
|
|
|
|
There are three cases to consider:
|
|
|
|
- When both of these flags are unset (default), the FileContext parameter
|
|
represents the file node. The file node is a void pointer (or an integer
|
|
that can fit in a pointer) that is used to uniquely identify an open file.
|
|
Opening the same file name should always yield the same file node value
|
|
for as long as the file with that name remains open anywhere in the system.
|
|
|
|
|
|
- When the UmFileContextIsUserContext2 is set, the FileContext parameter
|
|
represents the file descriptor. The file descriptor is a void pointer (or
|
|
an integer that can fit in a pointer) that is used to identify an open
|
|
instance of a file. Opening the same file name may yield a different file
|
|
descriptor.
|
|
|
|
|
|
- When the UmFileContextIsFullContext is set, the FileContext parameter
|
|
is a pointer to a FSP$$_$$FSCTL$$_$$TRANSACT$$_$$FULL$$_$$CONTEXT. This allows a user mode
|
|
file system to access the low-level UserContext and UserContext2 values.
|
|
The UserContext is used to store the file node and the UserContext2 is
|
|
used to store the file descriptor for an open file.
|
|
|
|
==== Member Functions
|
|
|
|
*CanDelete* - Determine whether a file or directory can be deleted.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *CanDelete)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PVOID FileContext,
|
|
PWSTR FileName);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileContext_ - The file context of the file or directory to test for deletion.
|
|
- _FileName_ - The name of the file or directory to test for deletion.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
*Discussion*
|
|
|
|
This function tests whether a file or directory can be safely deleted. This function does
|
|
not need to perform access checks, but may performs tasks such as check for empty
|
|
directories, etc.
|
|
|
|
This function should *NEVER* delete the file or directory in question. Deletion should
|
|
happen during Cleanup with the FspCleanupDelete flag set.
|
|
|
|
This function gets called when Win32 API's such as DeleteFile or RemoveDirectory are used.
|
|
It does not get called when a file or directory is opened with FILE$$_$$DELETE$$_$$ON$$_$$CLOSE.
|
|
|
|
*See Also*
|
|
|
|
- Cleanup
|
|
|
|
|
|
*Cleanup* - Cleanup a file.
|
|
|
|
[source,c]
|
|
----
|
|
VOID ( *Cleanup)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PVOID FileContext,
|
|
PWSTR FileName,
|
|
ULONG Flags);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileContext_ - The file context of the file or directory to cleanup.
|
|
- _FileName_ - The name of the file or directory to cleanup. Sent only when a Delete is requested.
|
|
- _Flags_ - These flags determine whether the file was modified and whether to delete the file.
|
|
|
|
*Discussion*
|
|
|
|
When CreateFile is used to open or create a file the kernel creates a kernel mode file
|
|
object (type FILE$$_$$OBJECT) and a handle for it, which it returns to user-mode. The handle may
|
|
be duplicated (using DuplicateHandle), but all duplicate handles always refer to the same
|
|
file object. When all handles for a particular file object get closed (using CloseHandle)
|
|
the system sends a Cleanup request to the file system.
|
|
|
|
There will be a Cleanup operation for every Create or Open operation posted to the user mode
|
|
file system. However the Cleanup operation is *not* the final close operation on a file.
|
|
The file system must be ready to receive additional operations until close time. This is true
|
|
even when the file is being deleted!
|
|
|
|
The Flags parameter contains information about the cleanup operation:
|
|
|
|
- FspCleanupDelete -
|
|
An important function of the Cleanup operation is to complete a delete operation. Deleting
|
|
a file or directory in Windows is a three-stage process where the file is first opened, then
|
|
tested to see if the delete can proceed and if the answer is positive the file is then
|
|
deleted during Cleanup.
|
|
|
|
When this flag is set, this is the last outstanding cleanup for this particular file node.
|
|
|
|
|
|
- FspCleanupSetAllocationSize -
|
|
The NTFS and FAT file systems reset a file's allocation size when they receive the last
|
|
outstanding cleanup for a particular file node. User mode file systems that implement
|
|
allocation size and wish to duplicate the NTFS and FAT behavior can use this flag.
|
|
|
|
|
|
- FspCleanupSetArchiveBit -
|
|
File systems that support the archive bit should set the file node's archive bit when this
|
|
flag is set.
|
|
|
|
|
|
- FspCleanupSetLastAccessTime, FspCleanupSetLastWriteTime, FspCleanupSetChangeTime - File
|
|
systems should set the corresponding file time when each one of these flags is set. Note that
|
|
updating the last access time is expensive and a file system may choose to not implement it.
|
|
|
|
|
|
|
|
There is no way to report failure of this operation. This is a Windows limitation.
|
|
|
|
As an optimization a file system may specify the FSP$$_$$FSCTL$$_$$VOLUME$$_$$PARAMS $$::$$
|
|
PostCleanupWhenModifiedOnly flag. In this case the FSD will only post Cleanup requests when
|
|
the file was modified/deleted.
|
|
|
|
*See Also*
|
|
|
|
- Close
|
|
- CanDelete
|
|
|
|
|
|
*Close* - Close a file.
|
|
|
|
[source,c]
|
|
----
|
|
VOID ( *Close)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PVOID FileContext);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileContext_ - The file context of the file or directory to be closed.
|
|
|
|
|
|
*Create* - Create new file or directory.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *Create)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PWSTR FileName,
|
|
UINT32 CreateOptions,
|
|
UINT32 GrantedAccess,
|
|
UINT32 FileAttributes,
|
|
PSECURITY_DESCRIPTOR SecurityDescriptor,
|
|
UINT64 AllocationSize,
|
|
PVOID *PFileContext,
|
|
FSP_FSCTL_FILE_INFO *FileInfo);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileName_ - The name of the file or directory to be created.
|
|
- _CreateOptions_ - Create options for this request. This parameter has the same meaning as the
|
|
CreateOptions parameter of the NtCreateFile API. User mode file systems should typically
|
|
only be concerned with the flag FILE$$_$$DIRECTORY$$_$$FILE, which is an instruction to create a
|
|
directory rather than a file. Some file systems may also want to pay attention to the
|
|
FILE$$_$$NO$$_$$INTERMEDIATE$$_$$BUFFERING and FILE$$_$$WRITE$$_$$THROUGH flags, although these are
|
|
typically handled by the FSD component.
|
|
- _GrantedAccess_ - Determines the specific access rights that have been granted for this request. Upon
|
|
receiving this call all access checks have been performed and the user mode file system
|
|
need not perform any additional checks. However this parameter may be useful to a user
|
|
mode file system; for example the WinFsp-FUSE layer uses this parameter to determine
|
|
which flags to use in its POSIX open() call.
|
|
- _FileAttributes_ - File attributes to apply to the newly created file or directory.
|
|
- _SecurityDescriptor_ - Security descriptor to apply to the newly created file or directory. This security
|
|
descriptor will always be in self-relative format. Its length can be retrieved using the
|
|
Windows GetSecurityDescriptorLength API. Will be NULL for named streams.
|
|
- _AllocationSize_ - Allocation size for the newly created file.
|
|
- _PFileContext_ - [out]
|
|
Pointer that will receive the file context on successful return from this call.
|
|
- _FileInfo_ - [out]
|
|
Pointer to a structure that will receive the file information on successful return
|
|
from this call. This information includes file attributes, file times, etc.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
|
|
*DeleteReparsePoint* - Delete reparse point.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *DeleteReparsePoint)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PVOID FileContext,
|
|
PWSTR FileName,
|
|
PVOID Buffer,
|
|
SIZE_T Size);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileContext_ - The file context of the reparse point.
|
|
- _FileName_ - The file name of the reparse point.
|
|
- _Buffer_ - Pointer to a buffer that contains the data for this operation.
|
|
- _Size_ - Size of data to write.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
|
|
*Flush* - Flush a file or volume.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *Flush)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PVOID FileContext,
|
|
FSP_FSCTL_FILE_INFO *FileInfo);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileContext_ - The file context of the file to be flushed. When NULL the whole volume is being flushed.
|
|
- _FileInfo_ - [out]
|
|
Pointer to a structure that will receive the file information on successful return
|
|
from this call. This information includes file attributes, file times, etc. Used when
|
|
flushing file (not volume).
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
*Discussion*
|
|
|
|
Note that the FSD will also flush all file/volume caches prior to invoking this operation.
|
|
|
|
|
|
*GetDirInfoByName* - Get directory information for a single file or directory within a parent directory.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *GetDirInfoByName)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PVOID FileContext,
|
|
PWSTR FileName,
|
|
FSP_FSCTL_DIR_INFO *DirInfo);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileContext_ - The file context of the parent directory.
|
|
- _FileName_ - The name of the file or directory to get information for. This name is relative
|
|
to the parent directory and is a single path component.
|
|
- _DirInfo_ - [out]
|
|
Pointer to a structure that will receive the directory information on successful
|
|
return from this call. This information includes the file name, but also file
|
|
attributes, file times, etc.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
|
|
*GetFileInfo* - Get file or directory information.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *GetFileInfo)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PVOID FileContext,
|
|
FSP_FSCTL_FILE_INFO *FileInfo);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileContext_ - The file context of the file or directory to get information for.
|
|
- _FileInfo_ - [out]
|
|
Pointer to a structure that will receive the file information on successful return
|
|
from this call. This information includes file attributes, file times, etc.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
|
|
*GetReparsePoint* - Get reparse point.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *GetReparsePoint)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PVOID FileContext,
|
|
PWSTR FileName,
|
|
PVOID Buffer,
|
|
PSIZE_T PSize);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileContext_ - The file context of the reparse point.
|
|
- _FileName_ - The file name of the reparse point.
|
|
- _Buffer_ - Pointer to a buffer that will receive the results of this operation. If
|
|
the function returns a symbolic link path, it should not be NULL terminated.
|
|
- _PSize_ - [in,out]
|
|
Pointer to the buffer size. On input it contains the size of the buffer.
|
|
On output it will contain the actual size of data copied.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
*See Also*
|
|
|
|
- SetReparsePoint
|
|
|
|
|
|
*GetSecurity* - Get file or directory security descriptor.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *GetSecurity)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PVOID FileContext,
|
|
PSECURITY_DESCRIPTOR SecurityDescriptor,
|
|
SIZE_T *PSecurityDescriptorSize);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileContext_ - The file context of the file or directory to get the security descriptor for.
|
|
- _SecurityDescriptor_ - Pointer to a buffer that will receive the file security descriptor on successful return
|
|
from this call. May be NULL.
|
|
- _PSecurityDescriptorSize_ - [in,out]
|
|
Pointer to the security descriptor buffer size. On input it contains the size of the
|
|
security descriptor buffer. On output it will contain the actual size of the security
|
|
descriptor copied into the security descriptor buffer. Cannot be NULL.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
|
|
*GetSecurityByName* - Get file or directory attributes and security descriptor given a file name.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *GetSecurityByName)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PWSTR FileName,
|
|
PUINT32 PFileAttributes/* or ReparsePointIndex */,
|
|
PSECURITY_DESCRIPTOR SecurityDescriptor,
|
|
SIZE_T *PSecurityDescriptorSize);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileName_ - The name of the file or directory to get the attributes and security descriptor for.
|
|
- _PFileAttributes_ - Pointer to a memory location that will receive the file attributes on successful return
|
|
from this call. May be NULL.
|
|
|
|
If this call returns STATUS$$_$$REPARSE, the file system MAY place here the index of the
|
|
first reparse point within FileName. The file system MAY also leave this at its default
|
|
value of 0.
|
|
- _SecurityDescriptor_ - Pointer to a buffer that will receive the file security descriptor on successful return
|
|
from this call. May be NULL.
|
|
- _PSecurityDescriptorSize_ - [in,out]
|
|
Pointer to the security descriptor buffer size. On input it contains the size of the
|
|
security descriptor buffer. On output it will contain the actual size of the security
|
|
descriptor copied into the security descriptor buffer. May be NULL.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS, STATUS$$_$$REPARSE or error code.
|
|
|
|
STATUS$$_$$REPARSE should be returned by file systems that support reparse points when
|
|
they encounter a FileName that contains reparse points anywhere but the final path
|
|
component.
|
|
|
|
|
|
*GetStreamInfo* - Get named streams information.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *GetStreamInfo)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PVOID FileContext,
|
|
PVOID Buffer,
|
|
ULONG Length,
|
|
PULONG PBytesTransferred);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileContext_ - The file context of the file or directory to get stream information for.
|
|
- _Buffer_ - Pointer to a buffer that will receive the stream information.
|
|
- _Length_ - Length of buffer.
|
|
- _PBytesTransferred_ - [out]
|
|
Pointer to a memory location that will receive the actual number of bytes stored.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
*See Also*
|
|
|
|
- FspFileSystemAddStreamInfo
|
|
|
|
|
|
*GetVolumeInfo* - Get volume information.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *GetVolumeInfo)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
FSP_FSCTL_VOLUME_INFO *VolumeInfo);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _VolumeInfo_ - [out]
|
|
Pointer to a structure that will receive the volume information on successful return
|
|
from this call.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
|
|
*Open* - Open a file or directory.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *Open)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PWSTR FileName,
|
|
UINT32 CreateOptions,
|
|
UINT32 GrantedAccess,
|
|
PVOID *PFileContext,
|
|
FSP_FSCTL_FILE_INFO *FileInfo);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileName_ - The name of the file or directory to be opened.
|
|
- _CreateOptions_ - Create options for this request. This parameter has the same meaning as the
|
|
CreateOptions parameter of the NtCreateFile API. User mode file systems typically
|
|
do not need to do anything special with respect to this parameter. Some file systems may
|
|
also want to pay attention to the FILE$$_$$NO$$_$$INTERMEDIATE$$_$$BUFFERING and FILE$$_$$WRITE$$_$$THROUGH
|
|
flags, although these are typically handled by the FSD component.
|
|
- _GrantedAccess_ - Determines the specific access rights that have been granted for this request. Upon
|
|
receiving this call all access checks have been performed and the user mode file system
|
|
need not perform any additional checks. However this parameter may be useful to a user
|
|
mode file system; for example the WinFsp-FUSE layer uses this parameter to determine
|
|
which flags to use in its POSIX open() call.
|
|
- _PFileContext_ - [out]
|
|
Pointer that will receive the file context on successful return from this call.
|
|
- _FileInfo_ - [out]
|
|
Pointer to a structure that will receive the file information on successful return
|
|
from this call. This information includes file attributes, file times, etc.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
|
|
*Overwrite* - Overwrite a file.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *Overwrite)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PVOID FileContext,
|
|
UINT32 FileAttributes,
|
|
BOOLEAN ReplaceFileAttributes,
|
|
UINT64 AllocationSize,
|
|
FSP_FSCTL_FILE_INFO *FileInfo);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileContext_ - The file context of the file to overwrite.
|
|
- _FileAttributes_ - File attributes to apply to the overwritten file.
|
|
- _ReplaceFileAttributes_ - When TRUE the existing file attributes should be replaced with the new ones.
|
|
When FALSE the existing file attributes should be merged (or'ed) with the new ones.
|
|
- _AllocationSize_ - Allocation size for the overwritten file.
|
|
- _FileInfo_ - [out]
|
|
Pointer to a structure that will receive the file information on successful return
|
|
from this call. This information includes file attributes, file times, etc.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
|
|
*Read* - Read a file.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *Read)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PVOID FileContext,
|
|
PVOID Buffer,
|
|
UINT64 Offset,
|
|
ULONG Length,
|
|
PULONG PBytesTransferred);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileContext_ - The file context of the file to be read.
|
|
- _Buffer_ - Pointer to a buffer that will receive the results of the read operation.
|
|
- _Offset_ - Offset within the file to read from.
|
|
- _Length_ - Length of data to read.
|
|
- _PBytesTransferred_ - [out]
|
|
Pointer to a memory location that will receive the actual number of bytes read.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code. STATUS$$_$$PENDING is supported allowing for asynchronous
|
|
operation.
|
|
|
|
|
|
*ReadDirectory* - Read a directory.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *ReadDirectory)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PVOID FileContext,
|
|
PWSTR Pattern,
|
|
PWSTR Marker,
|
|
PVOID Buffer,
|
|
ULONG Length,
|
|
PULONG PBytesTransferred);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileContext_ - The file context of the directory to be read.
|
|
- _Pattern_ - The pattern to match against files in this directory. Can be NULL. The file system
|
|
can choose to ignore this parameter as the FSD will always perform its own pattern
|
|
matching on the returned results.
|
|
- _Marker_ - A file name that marks where in the directory to start reading. Files with names
|
|
that are greater than (not equal to) this marker (in the directory order determined
|
|
by the file system) should be returned. Can be NULL.
|
|
- _Buffer_ - Pointer to a buffer that will receive the results of the read operation.
|
|
- _Length_ - Length of data to read.
|
|
- _PBytesTransferred_ - [out]
|
|
Pointer to a memory location that will receive the actual number of bytes read.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code. STATUS$$_$$PENDING is supported allowing for asynchronous
|
|
operation.
|
|
|
|
*See Also*
|
|
|
|
- FspFileSystemAddDirInfo
|
|
|
|
|
|
*Rename* - Renames a file or directory.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *Rename)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PVOID FileContext,
|
|
PWSTR FileName,
|
|
PWSTR NewFileName,
|
|
BOOLEAN ReplaceIfExists);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileContext_ - The file context of the file or directory to be renamed.
|
|
- _FileName_ - The current name of the file or directory to rename.
|
|
- _NewFileName_ - The new name for the file or directory.
|
|
- _ReplaceIfExists_ - Whether to replace a file that already exists at NewFileName.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
*Discussion*
|
|
|
|
The kernel mode FSD provides certain guarantees prior to posting a rename operation:
|
|
|
|
- A file cannot be renamed if a file with the same name exists and has open handles.
|
|
|
|
|
|
- A directory cannot be renamed if it or any of its subdirectories contains a file that
|
|
has open handles.
|
|
|
|
|
|
*ResolveReparsePoints* - Resolve reparse points.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *ResolveReparsePoints)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PWSTR FileName,
|
|
UINT32 ReparsePointIndex,
|
|
BOOLEAN ResolveLastPathComponent,
|
|
PIO_STATUS_BLOCK PIoStatus,
|
|
PVOID Buffer,
|
|
PSIZE_T PSize);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileName_ - The name of the file or directory to have its reparse points resolved.
|
|
- _ReparsePointIndex_ - The index of the first reparse point within FileName.
|
|
- _ResolveLastPathComponent_ - If FALSE, the last path component of FileName should not be resolved, even
|
|
if it is a reparse point that can be resolved. If TRUE, all path components
|
|
should be resolved if possible.
|
|
- _PIoStatus_ - Pointer to storage that will receive the status to return to the FSD. When
|
|
this function succeeds it must set PIoStatus->Status to STATUS$$_$$REPARSE and
|
|
PIoStatus->Information to either IO$$_$$REPARSE or the reparse tag.
|
|
- _Buffer_ - Pointer to a buffer that will receive the resolved file name (IO$$_$$REPARSE) or
|
|
reparse data (reparse tag). If the function returns a file name, it should
|
|
not be NULL terminated.
|
|
- _PSize_ - [in,out]
|
|
Pointer to the buffer size. On input it contains the size of the buffer.
|
|
On output it will contain the actual size of data copied.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$REPARSE or error code.
|
|
|
|
*Discussion*
|
|
|
|
Reparse points are a general mechanism for attaching special behavior to files.
|
|
A file or directory can contain a reparse point. A reparse point is data that has
|
|
special meaning to the file system, Windows or user applications. For example, NTFS
|
|
and Windows use reparse points to implement symbolic links. As another example,
|
|
a particular file system may use reparse points to emulate UNIX FIFO's.
|
|
|
|
This function is expected to resolve as many reparse points as possible. If a reparse
|
|
point is encountered that is not understood by the file system further reparse point
|
|
resolution should stop; the reparse point data should be returned to the FSD with status
|
|
STATUS$$_$$REPARSE/reparse-tag. If a reparse point (symbolic link) is encountered that is
|
|
understood by the file system but points outside it, the reparse point should be
|
|
resolved, but further reparse point resolution should stop; the resolved file name
|
|
should be returned to the FSD with status STATUS$$_$$REPARSE/IO$$_$$REPARSE.
|
|
|
|
|
|
*SetBasicInfo* - Set file or directory basic information.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *SetBasicInfo)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PVOID FileContext,
|
|
UINT32 FileAttributes,
|
|
UINT64 CreationTime,
|
|
UINT64 LastAccessTime,
|
|
UINT64 LastWriteTime,
|
|
UINT64 ChangeTime,
|
|
FSP_FSCTL_FILE_INFO *FileInfo);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileContext_ - The file context of the file or directory to set information for.
|
|
- _FileAttributes_ - File attributes to apply to the file or directory. If the value INVALID$$_$$FILE$$_$$ATTRIBUTES
|
|
is sent, the file attributes should not be changed.
|
|
- _CreationTime_ - Creation time to apply to the file or directory. If the value 0 is sent, the creation
|
|
time should not be changed.
|
|
- _LastAccessTime_ - Last access time to apply to the file or directory. If the value 0 is sent, the last
|
|
access time should not be changed.
|
|
- _LastWriteTime_ - Last write time to apply to the file or directory. If the value 0 is sent, the last
|
|
write time should not be changed.
|
|
- _ChangeTime_ - Change time to apply to the file or directory. If the value 0 is sent, the change time
|
|
should not be changed.
|
|
- _FileInfo_ - [out]
|
|
Pointer to a structure that will receive the file information on successful return
|
|
from this call. This information includes file attributes, file times, etc.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
|
|
*SetFileSize* - Set file/allocation size.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *SetFileSize)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PVOID FileContext,
|
|
UINT64 NewSize,
|
|
BOOLEAN SetAllocationSize,
|
|
FSP_FSCTL_FILE_INFO *FileInfo);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileContext_ - The file context of the file to set the file/allocation size for.
|
|
- _NewSize_ - New file/allocation size to apply to the file.
|
|
- _SetAllocationSize_ - If TRUE, then the allocation size is being set. if FALSE, then the file size is being set.
|
|
- _FileInfo_ - [out]
|
|
Pointer to a structure that will receive the file information on successful return
|
|
from this call. This information includes file attributes, file times, etc.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
*Discussion*
|
|
|
|
This function is used to change a file's sizes. Windows file systems maintain two kinds
|
|
of sizes: the file size is where the End Of File (EOF) is, and the allocation size is the
|
|
actual size that a file takes up on the "disk".
|
|
|
|
The rules regarding file/allocation size are:
|
|
|
|
- Allocation size must always be aligned to the allocation unit boundary. The allocation
|
|
unit is the product `(UINT64)SectorSize $$*$$ (UINT64)SectorsPerAllocationUnit` from
|
|
the FSP$$_$$FSCTL$$_$$VOLUME$$_$$PARAMS structure. The FSD will always send properly aligned allocation
|
|
sizes when setting the allocation size.
|
|
|
|
|
|
- Allocation size is always greater or equal to the file size.
|
|
|
|
|
|
- A file size of more than the current allocation size will also extend the allocation
|
|
size to the next allocation unit boundary.
|
|
|
|
|
|
- An allocation size of less than the current file size should also truncate the current
|
|
file size.
|
|
|
|
|
|
*SetReparsePoint* - Set reparse point.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *SetReparsePoint)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PVOID FileContext,
|
|
PWSTR FileName,
|
|
PVOID Buffer,
|
|
SIZE_T Size);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileContext_ - The file context of the reparse point.
|
|
- _FileName_ - The file name of the reparse point.
|
|
- _Buffer_ - Pointer to a buffer that contains the data for this operation. If this buffer
|
|
contains a symbolic link path, it should not be assumed to be NULL terminated.
|
|
- _Size_ - Size of data to write.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
*See Also*
|
|
|
|
- GetReparsePoint
|
|
|
|
|
|
*SetSecurity* - Set file or directory security descriptor.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *SetSecurity)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PVOID FileContext,
|
|
SECURITY_INFORMATION SecurityInformation,
|
|
PSECURITY_DESCRIPTOR ModificationDescriptor);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileContext_ - The file context of the file or directory to set the security descriptor for.
|
|
- _SecurityInformation_ - Describes what parts of the file or directory security descriptor should
|
|
be modified.
|
|
- _ModificationDescriptor_ - Describes the modifications to apply to the file or directory security descriptor.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
*See Also*
|
|
|
|
- FspSetSecurityDescriptor
|
|
- FspDeleteSecurityDescriptor
|
|
|
|
|
|
*SetVolumeLabel* - Set volume label.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *SetVolumeLabel)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PWSTR VolumeLabel,
|
|
FSP_FSCTL_VOLUME_INFO *VolumeInfo);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _VolumeLabel_ - The new label for the volume.
|
|
- _VolumeInfo_ - [out]
|
|
Pointer to a structure that will receive the volume information on successful return
|
|
from this call.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
|
|
*Write* - Write a file.
|
|
|
|
[source,c]
|
|
----
|
|
NTSTATUS ( *Write)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PVOID FileContext,
|
|
PVOID Buffer,
|
|
UINT64 Offset,
|
|
ULONG Length,
|
|
BOOLEAN WriteToEndOfFile,
|
|
BOOLEAN ConstrainedIo,
|
|
PULONG PBytesTransferred,
|
|
FSP_FSCTL_FILE_INFO *FileInfo);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system on which this request is posted.
|
|
- _FileContext_ - The file context of the file to be written.
|
|
- _Buffer_ - Pointer to a buffer that contains the data to write.
|
|
- _Offset_ - Offset within the file to write to.
|
|
- _Length_ - Length of data to write.
|
|
- _WriteToEndOfFile_ - When TRUE the file system must write to the current end of file. In this case the Offset
|
|
parameter will contain the value -1.
|
|
- _ConstrainedIo_ - When TRUE the file system must not extend the file (i.e. change the file size).
|
|
- _PBytesTransferred_ - [out]
|
|
Pointer to a memory location that will receive the actual number of bytes written.
|
|
- _FileInfo_ - [out]
|
|
Pointer to a structure that will receive the file information on successful return
|
|
from this call. This information includes file attributes, file times, etc.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code. STATUS$$_$$PENDING is supported allowing for asynchronous
|
|
operation.
|
|
|
|
|
|
|
|
=== Functions
|
|
|
|
*FspDeleteSecurityDescriptor* - Delete security descriptor.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API VOID FspDeleteSecurityDescriptor(
|
|
PSECURITY_DESCRIPTOR SecurityDescriptor,
|
|
NTSTATUS (*CreateFunc)());
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _SecurityDescriptor_ - The security descriptor to be deleted.
|
|
- _CreateFunc_ - Function used to create the security descriptor. This parameter should be
|
|
set to FspSetSecurityDescriptor for the public API.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
*Discussion*
|
|
|
|
This is a helper for implementing the SetSecurity operation.
|
|
|
|
*See Also*
|
|
|
|
- SetSecurity
|
|
- FspSetSecurityDescriptor
|
|
|
|
|
|
*FspFileSystemAddDirInfo* - Add directory information to a buffer.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API BOOLEAN FspFileSystemAddDirInfo(
|
|
FSP_FSCTL_DIR_INFO *DirInfo,
|
|
PVOID Buffer,
|
|
ULONG Length,
|
|
PULONG PBytesTransferred);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _DirInfo_ - The directory information to add. A value of NULL acts as an EOF marker for a ReadDirectory
|
|
operation.
|
|
- _Buffer_ - Pointer to a buffer that will receive the results of the read operation. This should contain
|
|
the same value passed to the ReadDirectory Buffer parameter.
|
|
- _Length_ - Length of data to read. This should contain the same value passed to the ReadDirectory
|
|
Length parameter.
|
|
- _PBytesTransferred_ - [out]
|
|
Pointer to a memory location that will receive the actual number of bytes read. This should
|
|
contain the same value passed to the ReadDirectory PBytesTransferred parameter.
|
|
FspFileSystemAddDirInfo uses the value pointed by this parameter to track how much of the
|
|
buffer has been used so far.
|
|
|
|
*Return Value*
|
|
|
|
TRUE if the directory information was added, FALSE if there was not enough space to add it.
|
|
|
|
*Discussion*
|
|
|
|
This is a helper for implementing the ReadDirectory operation.
|
|
|
|
*See Also*
|
|
|
|
- ReadDirectory
|
|
|
|
|
|
*FspFileSystemAddStreamInfo* - Add named stream information to a buffer.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API BOOLEAN FspFileSystemAddStreamInfo(
|
|
FSP_FSCTL_STREAM_INFO *StreamInfo,
|
|
PVOID Buffer,
|
|
ULONG Length,
|
|
PULONG PBytesTransferred);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _StreamInfo_ - The stream information to add. A value of NULL acts as an EOF marker for a GetStreamInfo
|
|
operation.
|
|
- _Buffer_ - Pointer to a buffer that will receive the stream information. This should contain
|
|
the same value passed to the GetStreamInfo Buffer parameter.
|
|
- _Length_ - Length of buffer. This should contain the same value passed to the GetStreamInfo
|
|
Length parameter.
|
|
- _PBytesTransferred_ - [out]
|
|
Pointer to a memory location that will receive the actual number of bytes stored. This should
|
|
contain the same value passed to the GetStreamInfo PBytesTransferred parameter.
|
|
|
|
*Return Value*
|
|
|
|
TRUE if the stream information was added, FALSE if there was not enough space to add it.
|
|
|
|
*Discussion*
|
|
|
|
This is a helper for implementing the GetStreamInfo operation.
|
|
|
|
*See Also*
|
|
|
|
- GetStreamInfo
|
|
|
|
|
|
*FspFileSystemCanReplaceReparsePoint* - Test whether reparse data can be replaced.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API NTSTATUS FspFileSystemCanReplaceReparsePoint(
|
|
PVOID CurrentReparseData,
|
|
SIZE_T CurrentReparseDataSize,
|
|
PVOID ReplaceReparseData,
|
|
SIZE_T ReplaceReparseDataSize);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _CurrentReparseData_ - Pointer to the current reparse data.
|
|
- _CurrentReparseDataSize_ - Pointer to the current reparse data size.
|
|
- _ReplaceReparseData_ - Pointer to the replacement reparse data.
|
|
- _ReplaceReparseDataSize_ - Pointer to the replacement reparse data size.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
*Discussion*
|
|
|
|
This is a helper for implementing the SetReparsePoint/DeleteReparsePoint operation
|
|
in file systems that support reparse points.
|
|
|
|
*See Also*
|
|
|
|
- SetReparsePoint
|
|
- DeleteReparsePoint
|
|
|
|
|
|
*FspFileSystemCreate* - Create a file system object.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API NTSTATUS FspFileSystemCreate(
|
|
PWSTR DevicePath,
|
|
const FSP_FSCTL_VOLUME_PARAMS *VolumeParams,
|
|
const FSP_FILE_SYSTEM_INTERFACE *Interface,
|
|
FSP_FILE_SYSTEM **PFileSystem);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _DevicePath_ - The name of the control device for this file system. This must be either
|
|
FSP$$_$$FSCTL$$_$$DISK$$_$$DEVICE$$_$$NAME or FSP$$_$$FSCTL$$_$$NET$$_$$DEVICE$$_$$NAME.
|
|
- _VolumeParams_ - Volume parameters for the newly created file system.
|
|
- _Interface_ - A pointer to the actual operations that actually implement this user mode file system.
|
|
- _PFileSystem_ - [out]
|
|
Pointer that will receive the file system object created on successful return from this
|
|
call.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
|
|
*FspFileSystemDelete* - Delete a file system object.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API VOID FspFileSystemDelete(
|
|
FSP_FILE_SYSTEM *FileSystem);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system object.
|
|
|
|
|
|
*FspFileSystemFindReparsePoint* - Find reparse point in file name.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API BOOLEAN FspFileSystemFindReparsePoint(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
NTSTATUS (*GetReparsePointByName)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PVOID Context,
|
|
PWSTR FileName,
|
|
BOOLEAN IsDirectory,
|
|
PVOID Buffer,
|
|
PSIZE_T PSize),
|
|
PVOID Context,
|
|
PWSTR FileName,
|
|
PUINT32 PReparsePointIndex);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system object.
|
|
- _GetReparsePointByName_ - Pointer to function that can retrieve reparse point information by name. The
|
|
FspFileSystemFindReparsePoint will call this function with the Buffer and PSize
|
|
arguments set to NULL. The function should return STATUS$$_$$SUCCESS if the passed
|
|
FileName is a reparse point or STATUS$$_$$NOT$$_$$A$$_$$REPARSE$$_$$POINT (or other error code)
|
|
otherwise.
|
|
- _Context_ - User context to supply to GetReparsePointByName.
|
|
- _FileName_ - The name of the file or directory.
|
|
- _PReparsePointIndex_ - Pointer to a memory location that will receive the index of the first reparse point
|
|
within FileName. A value is only placed in this memory location if the function returns
|
|
TRUE. May be NULL.
|
|
|
|
*Return Value*
|
|
|
|
TRUE if a reparse point was found, FALSE otherwise.
|
|
|
|
*Discussion*
|
|
|
|
Given a file name this function returns an index to the first path component that is a reparse
|
|
point. The function will call the supplied GetReparsePointByName function for every path
|
|
component until it finds a reparse point or the whole path is processed.
|
|
|
|
This is a helper for implementing the GetSecurityByName operation in file systems
|
|
that support reparse points.
|
|
|
|
*See Also*
|
|
|
|
- GetSecurityByName
|
|
|
|
|
|
*FspFileSystemGetOpenFileInfo* - Get open information buffer.
|
|
|
|
[source,c]
|
|
----
|
|
static inline FSP_FSCTL_OPEN_FILE_INFO *FspFileSystemGetOpenFileInfo(
|
|
FSP_FSCTL_FILE_INFO *FileInfo)
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileInfo_ - The FileInfo parameter as passed to Create or Open operation.
|
|
|
|
*Return Value*
|
|
|
|
A pointer to the open information buffer for this Create or Open operation.
|
|
|
|
*Discussion*
|
|
|
|
This is a helper for implementing the Create and Open operations. It cannot be used with
|
|
any other operations.
|
|
|
|
The FileInfo parameter to Create and Open is typed as pointer to FSP$$_$$FSCTL$$_$$FILE$$_$$INFO. The
|
|
true type of this parameter is pointer to FSP$$_$$FSCTL$$_$$OPEN$$_$$FILE$$_$$INFO. This simple function
|
|
converts from one type to the other.
|
|
|
|
The FSP$$_$$FSCTL$$_$$OPEN$$_$$FILE$$_$$INFO type contains a FSP$$_$$FSCTL$$_$$FILE$$_$$INFO as well as the fields
|
|
NormalizedName and NormalizedNameSize. These fields can be used for file name normalization.
|
|
File name normalization is used to ensure that the FSD and the OS know the correct case
|
|
of a newly opened file name.
|
|
|
|
For case-sensitive file systems this functionality should be ignored. The FSD will always
|
|
assume that the normalized file name is the same as the file name used to open the file.
|
|
|
|
For case-insensitive file systems this functionality may be ignored. In this case the FSD
|
|
will assume that the normalized file name is the upper case version of the file name used
|
|
to open the file. The file system will work correctly and the only way an application will
|
|
be able to tell that the file system does not preserve case in normalized file names is by
|
|
issuing a GetFinalPathNameByHandle API call (or NtQueryInformationFile with
|
|
FileNameInformation/FileNormalizedNameInformation).
|
|
|
|
For case-insensitive file systems this functionality may also be used. In this case the
|
|
user mode file system may use the NormalizedName and NormalizedNameSize parameters to
|
|
report to the FSD the normalized file name. It should be noted that the normalized file
|
|
name may only differ in case from the file name used to open the file. The NormalizedName
|
|
field will point to a buffer that can receive the normalized file name. The
|
|
NormalizedNameSize field will contain the size of the normalized file name buffer. On
|
|
completion of the Create or Open operation it should contain the actual size of the
|
|
normalized file name copied into the normalized file name buffer. The normalized file name
|
|
should not contain a terminating zero.
|
|
|
|
*See Also*
|
|
|
|
- Create
|
|
- Open
|
|
|
|
|
|
*FspFileSystemGetOperationContext* - Get the current operation context.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API FSP_FILE_SYSTEM_OPERATION_CONTEXT *FspFileSystemGetOperationContext(
|
|
VOID);
|
|
----
|
|
|
|
*Return Value*
|
|
|
|
The current operation context.
|
|
|
|
*Discussion*
|
|
|
|
This function may be used only when servicing one of the FSP$$_$$FILE$$_$$SYSTEM$$_$$INTERFACE operations.
|
|
The current operation context is stored in thread local storage. It allows access to the
|
|
Request and Response associated with this operation.
|
|
|
|
|
|
*FspFileSystemOperationProcessId* - Gets the originating process ID.
|
|
|
|
[source,c]
|
|
----
|
|
static inline UINT32 FspFileSystemOperationProcessId(
|
|
VOID)
|
|
----
|
|
|
|
*Discussion*
|
|
|
|
Valid only during Create, Open and Rename requests when the target exists.
|
|
|
|
|
|
*FspFileSystemPreflight* - Check whether creating a file system object is possible.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API NTSTATUS FspFileSystemPreflight(
|
|
PWSTR DevicePath,
|
|
PWSTR MountPoint);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _DevicePath_ - The name of the control device for this file system. This must be either
|
|
FSP$$_$$FSCTL$$_$$DISK$$_$$DEVICE$$_$$NAME or FSP$$_$$FSCTL$$_$$NET$$_$$DEVICE$$_$$NAME.
|
|
- _MountPoint_ - The mount point for the new file system. A value of NULL means that the file system should
|
|
use the next available drive letter counting downwards from Z: as its mount point.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
|
|
*FspFileSystemRemoveMountPoint* - Remove the mount point for a file system.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API VOID FspFileSystemRemoveMountPoint(
|
|
FSP_FILE_SYSTEM *FileSystem);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system object.
|
|
|
|
|
|
*FspFileSystemResolveReparsePoints* - Resolve reparse points.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API NTSTATUS FspFileSystemResolveReparsePoints(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
NTSTATUS (*GetReparsePointByName)(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PVOID Context,
|
|
PWSTR FileName,
|
|
BOOLEAN IsDirectory,
|
|
PVOID Buffer,
|
|
PSIZE_T PSize),
|
|
PVOID Context,
|
|
PWSTR FileName,
|
|
UINT32 ReparsePointIndex,
|
|
BOOLEAN ResolveLastPathComponent,
|
|
PIO_STATUS_BLOCK PIoStatus,
|
|
PVOID Buffer,
|
|
PSIZE_T PSize);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system object.
|
|
- _GetReparsePointByName_ - Pointer to function that can retrieve reparse point information by name. The function
|
|
should return STATUS$$_$$SUCCESS if the passed FileName is a reparse point or
|
|
STATUS$$_$$NOT$$_$$A$$_$$REPARSE$$_$$POINT (or other error code) otherwise.
|
|
- _Context_ - User context to supply to GetReparsePointByName.
|
|
- _FileName_ - The name of the file or directory to have its reparse points resolved.
|
|
- _ReparsePointIndex_ - The index of the first reparse point within FileName.
|
|
- _ResolveLastPathComponent_ - If FALSE, the last path component of FileName should not be resolved, even
|
|
if it is a reparse point that can be resolved. If TRUE, all path components
|
|
should be resolved if possible.
|
|
- _PIoStatus_ - Pointer to storage that will receive the status to return to the FSD. When
|
|
this function succeeds it must set PIoStatus->Status to STATUS$$_$$REPARSE and
|
|
PIoStatus->Information to either IO$$_$$REPARSE or the reparse tag.
|
|
- _Buffer_ - Pointer to a buffer that will receive the resolved file name (IO$$_$$REPARSE) or
|
|
reparse data (reparse tag). If the function returns a file name, it should
|
|
not be NULL terminated.
|
|
- _PSize_ - [in,out]
|
|
Pointer to the buffer size. On input it contains the size of the buffer.
|
|
On output it will contain the actual size of data copied.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$REPARSE or error code.
|
|
|
|
*Discussion*
|
|
|
|
Given a file name (and an index where to start resolving) this function will attempt to
|
|
resolve as many reparse points as possible. The function will call the supplied
|
|
GetReparsePointByName function for every path component until it resolves the reparse points
|
|
or the whole path is processed.
|
|
|
|
This is a helper for implementing the ResolveReparsePoints operation in file systems
|
|
that support reparse points.
|
|
|
|
*See Also*
|
|
|
|
- ResolveReparsePoints
|
|
|
|
|
|
*FspFileSystemSendResponse* - Send a response to the FSD.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API VOID FspFileSystemSendResponse(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
FSP_FSCTL_TRANSACT_RSP *Response);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system object.
|
|
- _Response_ - The response buffer.
|
|
|
|
*Discussion*
|
|
|
|
This call is not required when the user mode file system performs synchronous processing of
|
|
requests. It is possible however for the following FSP$$_$$FILE$$_$$SYSTEM$$_$$INTERFACE operations to be
|
|
processed asynchronously:
|
|
|
|
- Read
|
|
|
|
|
|
- Write
|
|
|
|
|
|
- ReadDirectory
|
|
|
|
|
|
|
|
These operations are allowed to return STATUS$$_$$PENDING to postpone sending a response to the FSD.
|
|
At a later time the file system can use FspFileSystemSendResponse to send the response.
|
|
|
|
|
|
*FspFileSystemSetMountPoint* - Set the mount point for a file system.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API NTSTATUS FspFileSystemSetMountPoint(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
PWSTR MountPoint);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system object.
|
|
- _MountPoint_ - The mount point for the new file system. A value of NULL means that the file system should
|
|
use the next available drive letter counting downwards from Z: as its mount point.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
*Discussion*
|
|
|
|
This function supports drive letters (X:) or directories as mount points:
|
|
|
|
- Drive letters: Refer to the documentation of the DefineDosDevice Windows API
|
|
to better understand how they are created.
|
|
|
|
|
|
- Directories: They can be used as mount points for disk based file systems. They cannot
|
|
be used for network file systems. This is a limitation that Windows imposes on junctions.
|
|
|
|
|
|
*FspFileSystemSetOperationGuardStrategy* - Set file system locking strategy.
|
|
|
|
[source,c]
|
|
----
|
|
static inline VOID FspFileSystemSetOperationGuardStrategy(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY GuardStrategy)
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system object.
|
|
- _GuardStrategy_ - The locking (guard) strategy.
|
|
|
|
*See Also*
|
|
|
|
- FSP$$_$$FILE$$_$$SYSTEM$$_$$OPERATION$$_$$GUARD$$_$$STRATEGY
|
|
|
|
|
|
*FspFileSystemStartDispatcher* - Start the file system dispatcher.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API NTSTATUS FspFileSystemStartDispatcher(
|
|
FSP_FILE_SYSTEM *FileSystem,
|
|
ULONG ThreadCount);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system object.
|
|
- _ThreadCount_ - The number of threads for the file system dispatcher. A value of 0 will create a default
|
|
number of threads and should be chosen in most cases.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
*Discussion*
|
|
|
|
The file system dispatcher is used to dispatch operations posted by the FSD to the user mode
|
|
file system. Once this call starts executing the user mode file system will start receiving
|
|
file system requests from the kernel.
|
|
|
|
|
|
*FspFileSystemStopDispatcher* - Stop the file system dispatcher.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API VOID FspFileSystemStopDispatcher(
|
|
FSP_FILE_SYSTEM *FileSystem);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _FileSystem_ - The file system object.
|
|
|
|
|
|
*FspSetSecurityDescriptor* - Modify security descriptor.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API NTSTATUS FspSetSecurityDescriptor(
|
|
PSECURITY_DESCRIPTOR InputDescriptor,
|
|
SECURITY_INFORMATION SecurityInformation,
|
|
PSECURITY_DESCRIPTOR ModificationDescriptor,
|
|
PSECURITY_DESCRIPTOR *PSecurityDescriptor);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _InputDescriptor_ - The input security descriptor to be modified.
|
|
- _SecurityInformation_ - Describes what parts of the InputDescriptor should be modified. This should contain
|
|
the same value passed to the SetSecurity SecurityInformation parameter.
|
|
- _ModificationDescriptor_ - Describes the modifications to apply to the InputDescriptor. This should contain
|
|
the same value passed to the SetSecurity ModificationDescriptor parameter.
|
|
- _PSecurityDescriptor_ - [out]
|
|
Pointer to a memory location that will receive the resulting security descriptor.
|
|
This security descriptor can be later freed using FspDeleteSecurityDescriptor.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
*Discussion*
|
|
|
|
This is a helper for implementing the SetSecurity operation.
|
|
|
|
*See Also*
|
|
|
|
- SetSecurity
|
|
- FspDeleteSecurityDescriptor
|
|
|
|
|
|
=== Typedefs
|
|
|
|
*FSP$$_$$FILE$$_$$SYSTEM$$_$$OPERATION$$_$$GUARD$$_$$STRATEGY* - User mode file system locking strategy.
|
|
|
|
[source,c]
|
|
----
|
|
typedef enum {
|
|
FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY_FINE = 0,
|
|
FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY_COARSE,
|
|
} FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY;
|
|
----
|
|
|
|
*Discussion*
|
|
|
|
Two concurrency models are provided:
|
|
|
|
1. A fine-grained concurrency model where file system NAMESPACE accesses
|
|
are guarded using an exclusive-shared (read-write) lock. File I/O is not
|
|
guarded and concurrent reads/writes/etc. are possible. [Note that the FSD
|
|
will still apply an exclusive-shared lock PER INDIVIDUAL FILE, but it will
|
|
not limit I/O operations for different files.]
|
|
The fine-grained concurrency model applies the exclusive-shared lock as
|
|
follows:
|
|
|
|
- EXCL: SetVolumeLabel, Flush(Volume),
|
|
Create, Cleanup(Delete), SetInformation(Rename)
|
|
|
|
|
|
- SHRD: GetVolumeInfo, Open, SetInformation(Disposition), ReadDirectory
|
|
|
|
|
|
- NONE: all other operations
|
|
|
|
|
|
|
|
2. A coarse-grained concurrency model where all file system accesses are
|
|
guarded by a mutually exclusive lock.
|
|
|
|
*See Also*
|
|
|
|
- FspFileSystemSetOperationGuardStrategy
|
|
|
|
|
|
== Service Framework
|
|
|
|
User mode file systems typically are run as Windows services. WinFsp provides an API to make
|
|
the creation of Windows services easier. This API is provided for convenience and is not
|
|
necessary to expose a user mode file system to Windows.
|
|
|
|
=== Functions
|
|
|
|
*FspServiceAcceptControl* - Configure the control codes that a service accepts.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API VOID FspServiceAcceptControl(
|
|
FSP_SERVICE *Service,
|
|
ULONG Control);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _Service_ - The service object.
|
|
- _Control_ - The control codes to accept. Note that the SERVICE$$_$$ACCEPT$$_$$PAUSE$$_$$CONTINUE code is silently
|
|
ignored.
|
|
|
|
*Discussion*
|
|
|
|
This API should be used prior to Start operations.
|
|
|
|
|
|
*FspServiceAllowConsoleMode* - Allow a service to run in console mode.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API VOID FspServiceAllowConsoleMode(
|
|
FSP_SERVICE *Service);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _Service_ - The service object.
|
|
|
|
*Discussion*
|
|
|
|
A service that is run in console mode runs with a console attached and outside the control of
|
|
the Service Control Manager. This is useful for debugging and testing a service during
|
|
development.
|
|
|
|
User mode file systems that wish to use the WinFsp Launcher functionality must also use this
|
|
call. The WinFsp Launcher is a Windows service that can be configured to launch and manage
|
|
multiple instances of a user mode file system.
|
|
|
|
|
|
*FspServiceContextCheck* - Check if the supplied token is from the service context.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API NTSTATUS FspServiceContextCheck(
|
|
HANDLE Token,
|
|
PBOOLEAN PIsLocalSystem);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _Token_ - Token to check. Pass NULL to check the current process token.
|
|
- _PIsLocalSystem_ - Pointer to a boolean that will receive a TRUE value if the token belongs to LocalSystem
|
|
and FALSE otherwise. May be NULL.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS if the token is from the service context. STATUS$$_$$ACCESS$$_$$DENIED if it is not.
|
|
Other error codes are possible.
|
|
|
|
|
|
*FspServiceCreate* - Create a service object.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API NTSTATUS FspServiceCreate(
|
|
PWSTR ServiceName,
|
|
FSP_SERVICE_START *OnStart,
|
|
FSP_SERVICE_STOP *OnStop,
|
|
FSP_SERVICE_CONTROL *OnControl,
|
|
FSP_SERVICE **PService);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _ServiceName_ - The name of the service.
|
|
- _OnStart_ - Function to call when the service starts.
|
|
- _OnStop_ - Function to call when the service stops.
|
|
- _OnControl_ - Function to call when the service receives a service control code.
|
|
- _PService_ - [out]
|
|
Pointer that will receive the service object created on successful return from this
|
|
call.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
|
|
*FspServiceDelete* - Delete a service object.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API VOID FspServiceDelete(
|
|
FSP_SERVICE *Service);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _Service_ - The service object.
|
|
|
|
|
|
*FspServiceGetExitCode* - Get the service process exit code.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API ULONG FspServiceGetExitCode(
|
|
FSP_SERVICE *Service);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _Service_ - The service object.
|
|
|
|
*Return Value*
|
|
|
|
Service process exit code.
|
|
|
|
|
|
*FspServiceIsInteractive* - Determine if the current process is running in user interactive mode.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API BOOLEAN FspServiceIsInteractive(
|
|
VOID);
|
|
----
|
|
|
|
*Return Value*
|
|
|
|
TRUE if the process is running in running user interactive mode.
|
|
|
|
|
|
*FspServiceLog* - Log a service message.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API VOID FspServiceLog(
|
|
ULONG Type,
|
|
PWSTR Format,
|
|
...);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _Type_ - One of EVENTLOG$$_$$INFORMATION$$_$$TYPE, EVENTLOG$$_$$WARNING$$_$$TYPE, EVENTLOG$$_$$ERROR$$_$$TYPE.
|
|
- _Format_ - Format specification. This function uses the Windows wsprintf API for formatting. Refer to
|
|
that API's documentation for details on the format specification.
|
|
|
|
*Discussion*
|
|
|
|
This function can be used to log an arbitrary message to the Windows Event Log or to the current
|
|
console if running in user interactive mode.
|
|
|
|
|
|
*FspServiceLoop* - Run a service main loop.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API NTSTATUS FspServiceLoop(
|
|
FSP_SERVICE *Service);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _Service_ - The service object.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
*Discussion*
|
|
|
|
This function starts and runs a service. It executes the Windows StartServiceCtrlDispatcher API
|
|
to connect the service process to the Service Control Manager. If the Service Control Manager is
|
|
not available (and console mode is allowed) it will enter console mode.
|
|
|
|
|
|
*FspServiceRequestTime* - Request additional time from the Service Control Manager.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API VOID FspServiceRequestTime(
|
|
FSP_SERVICE *Service,
|
|
ULONG Time);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _Service_ - The service object.
|
|
- _Time_ - Additional time (in milliseconds).
|
|
|
|
*Discussion*
|
|
|
|
This API should be used during Start and Stop operations only.
|
|
|
|
|
|
*FspServiceRunEx* - Run a service.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API ULONG FspServiceRunEx(
|
|
PWSTR ServiceName,
|
|
FSP_SERVICE_START *OnStart,
|
|
FSP_SERVICE_STOP *OnStop,
|
|
FSP_SERVICE_CONTROL *OnControl,
|
|
PVOID UserContext);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _ServiceName_ - The name of the service.
|
|
- _OnStart_ - Function to call when the service starts.
|
|
- _OnStop_ - Function to call when the service stops.
|
|
- _OnControl_ - Function to call when the service receives a service control code.
|
|
|
|
*Return Value*
|
|
|
|
Service process exit code.
|
|
|
|
*Discussion*
|
|
|
|
This function wraps calls to FspServiceCreate, FspServiceLoop and FspServiceDelete to create,
|
|
run and delete a service. It is intended to be used from a service's main/wmain function.
|
|
|
|
This function runs a service with console mode allowed.
|
|
|
|
|
|
*FspServiceSetExitCode* - Set the service process exit code.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API VOID FspServiceSetExitCode(
|
|
FSP_SERVICE *Service,
|
|
ULONG ExitCode);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _Service_ - The service object.
|
|
- _ExitCode_ - Service process exit code.
|
|
|
|
|
|
*FspServiceStop* - Stops a running service.
|
|
|
|
[source,c]
|
|
----
|
|
FSP_API VOID FspServiceStop(
|
|
FSP_SERVICE *Service);
|
|
----
|
|
|
|
*Parameters*
|
|
|
|
- _Service_ - The service object.
|
|
|
|
*Return Value*
|
|
|
|
STATUS$$_$$SUCCESS or error code.
|
|
|
|
*Discussion*
|
|
|
|
Stopping a service usually happens when the Service Control Manager instructs the service to
|
|
stop. In some situations (e.g. fatal errors) the service may wish to stop itself. It can do so
|
|
in a clean manner by calling this function.
|
|
|
|
|
|
|