mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-10-31 12:08:41 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			376 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			376 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /**
 | |
|  * @file ptfs.h
 | |
|  *
 | |
|  * @copyright 2015-2025 Bill Zissimopoulos
 | |
|  */
 | |
| /*
 | |
|  * This file is part of WinFsp.
 | |
|  *
 | |
|  * You can redistribute it and/or modify it under the terms of the GNU
 | |
|  * General Public License version 3 as published by the Free Software
 | |
|  * Foundation.
 | |
|  *
 | |
|  * Licensees holding a valid commercial license may use this software
 | |
|  * in accordance with the commercial license agreement provided in
 | |
|  * conjunction with the software.  The terms and conditions of any such
 | |
|  * commercial license agreement shall govern, supersede, and render
 | |
|  * ineffective any application of the GPLv3 license to this software,
 | |
|  * notwithstanding of any reference thereto in the software or
 | |
|  * associated repository.
 | |
|  */
 | |
| 
 | |
| #ifndef PTFS_H_INCLUDED
 | |
| #define PTFS_H_INCLUDED
 | |
| 
 | |
| #include <winfsp/winfsp.h>
 | |
| #include <strsafe.h>
 | |
| 
 | |
| #define PROGNAME                        "ptfs"
 | |
| 
 | |
| #define info(format, ...)               FspServiceLog(EVENTLOG_INFORMATION_TYPE, format, __VA_ARGS__)
 | |
| #define warn(format, ...)               FspServiceLog(EVENTLOG_WARNING_TYPE, format, __VA_ARGS__)
 | |
| #define fail(format, ...)               FspServiceLog(EVENTLOG_ERROR_TYPE, format, __VA_ARGS__)
 | |
| 
 | |
| 
 | |
| /*
 | |
|  * PTFS
 | |
|  */
 | |
| 
 | |
| enum
 | |
| {
 | |
|     PtfsReparsePoints = 0x00000010,
 | |
|     PtfsNamedStreams = 0x00000040,
 | |
|     PtfsExtendedAttributes = 0x00000100,
 | |
|     PtfsWslFeatures = 0x04000000,
 | |
|     PtfsFlushAndPurgeOnCleanup = 0x00004000,
 | |
|     PtfsSetAllocationSizeOnCleanup = 0x00010000,                // reuse UmFileContextIsUserContext2
 | |
|     PtfsAttributesMask =
 | |
|         PtfsReparsePoints |
 | |
|         PtfsNamedStreams |
 | |
|         PtfsExtendedAttributes |
 | |
|         PtfsWslFeatures |
 | |
|         PtfsFlushAndPurgeOnCleanup |
 | |
|         PtfsSetAllocationSizeOnCleanup,
 | |
| };
 | |
| typedef struct
 | |
| {
 | |
|     FSP_FILE_SYSTEM *FileSystem;
 | |
|     BOOLEAN HasSecurityPrivilege;
 | |
|     HANDLE RootHandle;
 | |
|     ULONG RootPrefixLength;
 | |
|     ULONG FsAttributeMask;
 | |
|     ULONG FsAttributes;
 | |
|     UINT64 AllocationUnit;
 | |
| } PTFS;
 | |
| NTSTATUS PtfsCreate(
 | |
|     PWSTR RootPath,
 | |
|     ULONG FileInfoTimeout,
 | |
|     ULONG FsAttributeMask,
 | |
|     PWSTR VolumePrefix,
 | |
|     PWSTR MountPoint,
 | |
|     UINT32 DebugFlags,
 | |
|     PTFS **PPtfs);
 | |
| VOID PtfsDelete(PTFS *Ptfs);
 | |
| 
 | |
| 
 | |
| /*
 | |
|  * Lower file system
 | |
|  */
 | |
| 
 | |
| NTSTATUS LfsCreateFile(
 | |
|     PHANDLE PHandle,
 | |
|     ACCESS_MASK DesiredAccess,
 | |
|     HANDLE RootHandle,
 | |
|     PWSTR FileName,
 | |
|     PSECURITY_DESCRIPTOR SecurityDescriptor,
 | |
|     PLARGE_INTEGER AllocationSize,
 | |
|     ULONG FileAttributes,
 | |
|     ULONG CreateDisposition,
 | |
|     ULONG CreateOptions,
 | |
|     PVOID EaBuffer,
 | |
|     ULONG EaLength);
 | |
| NTSTATUS LfsOpenFile(
 | |
|     PHANDLE PHandle,
 | |
|     ACCESS_MASK DesiredAccess,
 | |
|     HANDLE RootHandle,
 | |
|     PWSTR FileName,
 | |
|     ULONG OpenOptions);
 | |
| NTSTATUS LfsGetFileInfo(
 | |
|     HANDLE Handle,
 | |
|     ULONG RootPrefixLength,
 | |
|     FSP_FSCTL_FILE_INFO *FileInfo);
 | |
| NTSTATUS LfsReadFile(
 | |
|     HANDLE Handle,
 | |
|     PVOID Buffer,
 | |
|     UINT64 Offset,
 | |
|     ULONG Length,
 | |
|     PULONG PBytesTransferred);
 | |
| NTSTATUS LfsWriteFile(
 | |
|     HANDLE Handle,
 | |
|     PVOID Buffer,
 | |
|     UINT64 Offset,
 | |
|     ULONG Length,
 | |
|     PULONG PBytesTransferred);
 | |
| NTSTATUS LfsQueryDirectoryFile(
 | |
|     HANDLE Handle,
 | |
|     PVOID Buffer,
 | |
|     ULONG Length,
 | |
|     FILE_INFORMATION_CLASS FileInformationClass,
 | |
|     BOOLEAN ReturnSingleEntry,
 | |
|     PWSTR FileName,
 | |
|     BOOLEAN RestartScan,
 | |
|     PULONG PBytesTransferred);
 | |
| NTSTATUS LfsFsControlFile(
 | |
|     HANDLE Handle,
 | |
|     ULONG FsControlCode,
 | |
|     PVOID InputBuffer,
 | |
|     ULONG InputBufferLength,
 | |
|     PVOID OutputBuffer,
 | |
|     ULONG OutputBufferLength,
 | |
|     PULONG PBytesTransferred);
 | |
| static inline
 | |
| ULONG LfsGetEaSize(ULONG EaSize)
 | |
| {
 | |
|     return 0 != EaSize ? EaSize - 4 : 0;
 | |
| }
 | |
| 
 | |
| 
 | |
| /*
 | |
|  * Missing NTDLL definitions
 | |
|  */
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
|     ACCESS_MASK AccessFlags;
 | |
| } FILE_ACCESS_INFORMATION;
 | |
| typedef struct
 | |
| {
 | |
|     ULONG AlignmentRequirement;
 | |
| } FILE_ALIGNMENT_INFORMATION;
 | |
| typedef struct
 | |
| {
 | |
|     LARGE_INTEGER AllocationSize;
 | |
| } FILE_ALLOCATION_INFORMATION;
 | |
| typedef struct
 | |
| {
 | |
|     ULONG FileAttributes;
 | |
|     ULONG ReparseTag;
 | |
| } FILE_ATTRIBUTE_TAG_INFORMATION;
 | |
| typedef struct
 | |
| {
 | |
|     LARGE_INTEGER CreationTime;
 | |
|     LARGE_INTEGER LastAccessTime;
 | |
|     LARGE_INTEGER LastWriteTime;
 | |
|     LARGE_INTEGER ChangeTime;
 | |
|     ULONG FileAttributes;
 | |
| } FILE_BASIC_INFORMATION;
 | |
| typedef struct
 | |
| {
 | |
|     BOOLEAN DeleteFile;
 | |
| } FILE_DISPOSITION_INFORMATION;
 | |
| typedef struct
 | |
| {
 | |
|     ULONG Flags;
 | |
| } FILE_DISPOSITION_INFORMATION_EX;
 | |
| typedef struct
 | |
| {
 | |
|     ULONG EaSize;
 | |
| } FILE_EA_INFORMATION;
 | |
| typedef struct
 | |
| {
 | |
|     LARGE_INTEGER EndOfFile;
 | |
| } FILE_END_OF_FILE_INFORMATION;
 | |
| typedef struct
 | |
| {
 | |
|     LARGE_INTEGER IndexNumber;
 | |
| } FILE_INTERNAL_INFORMATION;
 | |
| typedef struct
 | |
| {
 | |
|     ULONG Mode;
 | |
| } FILE_MODE_INFORMATION;
 | |
| typedef struct
 | |
| {
 | |
|     ULONG FileNameLength;
 | |
|     WCHAR FileName[1];
 | |
| } FILE_NAME_INFORMATION;
 | |
| typedef struct
 | |
| {
 | |
|     LARGE_INTEGER CurrentByteOffset;
 | |
| } FILE_POSITION_INFORMATION;
 | |
| typedef struct
 | |
| {
 | |
|     union
 | |
|     {
 | |
|         BOOLEAN ReplaceIfExists;
 | |
|         ULONG Flags;
 | |
|     } DUMMYUNIONNAME;
 | |
|     HANDLE RootDirectory;
 | |
|     ULONG FileNameLength;
 | |
|     WCHAR FileName[1];
 | |
| } FILE_RENAME_INFORMATION;
 | |
| typedef struct
 | |
| {
 | |
|     LARGE_INTEGER AllocationSize;
 | |
|     LARGE_INTEGER EndOfFile;
 | |
|     ULONG NumberOfLinks;
 | |
|     BOOLEAN DeletePending;
 | |
|     BOOLEAN Directory;
 | |
| } FILE_STANDARD_INFORMATION;
 | |
| typedef struct
 | |
| {
 | |
|     ULONG NextEntryOffset;
 | |
|     ULONG StreamNameLength;
 | |
|     LARGE_INTEGER StreamSize;
 | |
|     LARGE_INTEGER StreamAllocationSize;
 | |
|     WCHAR StreamName[1];
 | |
| } FILE_STREAM_INFORMATION;
 | |
| typedef struct
 | |
| {
 | |
|     FILE_BASIC_INFORMATION BasicInformation;
 | |
|     FILE_STANDARD_INFORMATION StandardInformation;
 | |
|     FILE_INTERNAL_INFORMATION InternalInformation;
 | |
|     FILE_EA_INFORMATION EaInformation;
 | |
|     FILE_ACCESS_INFORMATION AccessInformation;
 | |
|     FILE_POSITION_INFORMATION PositionInformation;
 | |
|     FILE_MODE_INFORMATION ModeInformation;
 | |
|     FILE_ALIGNMENT_INFORMATION AlignmentInformation;
 | |
|     FILE_NAME_INFORMATION NameInformation;
 | |
| } FILE_ALL_INFORMATION;
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
|     ULONG NextEntryOffset;
 | |
|     ULONG FileIndex;
 | |
|     LARGE_INTEGER CreationTime;
 | |
|     LARGE_INTEGER LastAccessTime;
 | |
|     LARGE_INTEGER LastWriteTime;
 | |
|     LARGE_INTEGER ChangeTime;
 | |
|     LARGE_INTEGER EndOfFile;
 | |
|     LARGE_INTEGER AllocationSize;
 | |
|     ULONG FileAttributes;
 | |
|     ULONG FileNameLength;
 | |
|     ULONG EaSize;
 | |
|     CCHAR ShortNameLength;
 | |
|     WCHAR ShortName[12];
 | |
|     LARGE_INTEGER FileId;
 | |
|     WCHAR FileName[1];
 | |
| } FILE_ID_BOTH_DIR_INFORMATION;
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
|     ULONG FileSystemAttributes;
 | |
|     LONG MaximumComponentNameLength;
 | |
|     ULONG FileSystemNameLength;
 | |
|     WCHAR FileSystemName[1];
 | |
| } FILE_FS_ATTRIBUTE_INFORMATION;
 | |
| typedef struct
 | |
| {
 | |
|     LARGE_INTEGER TotalAllocationUnits;
 | |
|     LARGE_INTEGER AvailableAllocationUnits;
 | |
|     ULONG SectorsPerAllocationUnit;
 | |
|     ULONG BytesPerSector;
 | |
| } FILE_FS_SIZE_INFORMATION;
 | |
| 
 | |
| NTSTATUS NTAPI NtFlushBuffersFile(
 | |
|     HANDLE FileHandle,
 | |
|     PIO_STATUS_BLOCK IoStatusBlock);
 | |
| 
 | |
| NTSTATUS NTAPI NtFsControlFile(
 | |
|     HANDLE FileHandle,
 | |
|     HANDLE Event,
 | |
|     PIO_APC_ROUTINE ApcRoutine,
 | |
|     PVOID ApcContext,
 | |
|     PIO_STATUS_BLOCK IoStatusBlock,
 | |
|     ULONG FsControlCode,
 | |
|     PVOID InputBuffer,
 | |
|     ULONG InputBufferLength,
 | |
|     PVOID OutputBuffer,
 | |
|     ULONG OutputBufferLength);
 | |
| 
 | |
| NTSTATUS NTAPI NtQueryEaFile(
 | |
|     HANDLE FileHandle,
 | |
|     PIO_STATUS_BLOCK IoStatusBlock,
 | |
|     PVOID Buffer,
 | |
|     ULONG Length,
 | |
|     BOOLEAN ReturnSingleEntry,
 | |
|     PVOID EaList,
 | |
|     ULONG EaListLength,
 | |
|     PULONG EaIndex,
 | |
|     BOOLEAN RestartScan);
 | |
| 
 | |
| NTSTATUS NTAPI NtQueryDirectoryFile(
 | |
|     HANDLE FileHandle,
 | |
|     HANDLE Event,
 | |
|     PIO_APC_ROUTINE ApcRoutine,
 | |
|     PVOID ApcContext,
 | |
|     PIO_STATUS_BLOCK IoStatusBlock,
 | |
|     PVOID FileInformation,
 | |
|     ULONG Length,
 | |
|     FILE_INFORMATION_CLASS FileInformationClass,
 | |
|     BOOLEAN ReturnSingleEntry,
 | |
|     PUNICODE_STRING FileName,
 | |
|     BOOLEAN RestartScan);
 | |
| 
 | |
| NTSTATUS NTAPI NtQueryInformationFile(
 | |
|     HANDLE FileHandle,
 | |
|     PIO_STATUS_BLOCK IoStatusBlock,
 | |
|     PVOID FileInformation,
 | |
|     ULONG Length,
 | |
|     FILE_INFORMATION_CLASS FileInformationClass);
 | |
| 
 | |
| NTSTATUS NTAPI NtQuerySecurityObject(
 | |
|     HANDLE Handle,
 | |
|     SECURITY_INFORMATION SecurityInformation,
 | |
|     PSECURITY_DESCRIPTOR SecurityDescriptor,
 | |
|     ULONG Length,
 | |
|     PULONG LengthNeeded);
 | |
| 
 | |
| NTSTATUS NTAPI NtQueryVolumeInformationFile(
 | |
|     HANDLE FileHandle,
 | |
|     PIO_STATUS_BLOCK IoStatusBlock,
 | |
|     PVOID FsInformation,
 | |
|     ULONG Length,
 | |
|     ULONG FsInformationClass);
 | |
| 
 | |
| NTSTATUS NTAPI NtReadFile(
 | |
|     HANDLE FileHandle,
 | |
|     HANDLE Event,
 | |
|     PIO_APC_ROUTINE ApcRoutine,
 | |
|     PVOID ApcContext,
 | |
|     PIO_STATUS_BLOCK IoStatusBlock,
 | |
|     PVOID Buffer,
 | |
|     ULONG Length,
 | |
|     PLARGE_INTEGER ByteOffset,
 | |
|     PULONG Key);
 | |
| 
 | |
| NTSTATUS NTAPI NtSetEaFile(
 | |
|     HANDLE FileHandle,
 | |
|     PIO_STATUS_BLOCK IoStatusBlock,
 | |
|     PVOID Buffer,
 | |
|     ULONG Length);
 | |
| 
 | |
| NTSTATUS NTAPI NtSetInformationFile(
 | |
|     HANDLE FileHandle,
 | |
|     PIO_STATUS_BLOCK IoStatusBlock,
 | |
|     PVOID FileInformation,
 | |
|     ULONG Length,
 | |
|     FILE_INFORMATION_CLASS FileInformationClass);
 | |
| 
 | |
| NTSTATUS NTAPI NtSetSecurityObject(
 | |
|     HANDLE Handle,
 | |
|     SECURITY_INFORMATION SecurityInformation,
 | |
|     PSECURITY_DESCRIPTOR SecurityDescriptor);
 | |
| 
 | |
| NTSTATUS NTAPI NtWriteFile(
 | |
|     HANDLE FileHandle,
 | |
|     HANDLE Event,
 | |
|     PIO_APC_ROUTINE ApcRoutine,
 | |
|     PVOID ApcContext,
 | |
|     PIO_STATUS_BLOCK IoStatusBlock,
 | |
|     PVOID Buffer,
 | |
|     ULONG Length,
 | |
|     PLARGE_INTEGER ByteOffset,
 | |
|     PULONG Key);
 | |
| 
 | |
| #endif
 |