mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-10-29 19:18:39 -05:00 
			
		
		
		
	dll: FSP_FILE_SYSTEM_INTERFACE method changes and C++ support
This commit is contained in:
		| @@ -9,6 +9,10 @@ | ||||
|  | ||||
| #include <devioctl.h> | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| #define FSP_FSCTL_DISK_DEVICE_NAME      "WinFsp.Disk" | ||||
| #define FSP_FSCTL_NET_DEVICE_NAME       "WinFsp.Net" | ||||
|  | ||||
| @@ -191,7 +195,7 @@ static inline FSP_FSCTL_TRANSACT_REQ *FspFsctlTransactProduceRequest( | ||||
|     FSP_FSCTL_TRANSACT_REQ *Request, SIZE_T RequestSize) | ||||
| { | ||||
|     PVOID NextRequest = (PUINT8)Request + FSP_FSCTL_DEFAULT_ALIGN_UP(RequestSize); | ||||
|     return NextRequest; | ||||
|     return (FSP_FSCTL_TRANSACT_REQ *)NextRequest; | ||||
| } | ||||
| static inline FSP_FSCTL_TRANSACT_REQ *FspFsctlTransactConsumeRequest( | ||||
|     FSP_FSCTL_TRANSACT_REQ *Request, PVOID RequestBufEnd) | ||||
| @@ -200,7 +204,7 @@ static inline FSP_FSCTL_TRANSACT_REQ *FspFsctlTransactConsumeRequest( | ||||
|         sizeof(FSP_FSCTL_TRANSACT_REQ) > Request->Size) | ||||
|         return 0; | ||||
|     PVOID NextRequest = (PUINT8)Request + FSP_FSCTL_DEFAULT_ALIGN_UP(Request->Size); | ||||
|     return NextRequest <= RequestBufEnd ? NextRequest : 0; | ||||
|     return NextRequest <= RequestBufEnd ? (FSP_FSCTL_TRANSACT_REQ *)NextRequest : 0; | ||||
| } | ||||
| static inline BOOLEAN FspFsctlTransactCanProduceResponse( | ||||
|     FSP_FSCTL_TRANSACT_RSP *Response, PVOID ResponseBufEnd) | ||||
| @@ -211,7 +215,7 @@ static inline FSP_FSCTL_TRANSACT_RSP *FspFsctlTransactProduceResponse( | ||||
|     FSP_FSCTL_TRANSACT_RSP *Response, SIZE_T ResponseSize) | ||||
| { | ||||
|     PVOID NextResponse = (PUINT8)Response + FSP_FSCTL_DEFAULT_ALIGN_UP(ResponseSize); | ||||
|     return NextResponse; | ||||
|     return (FSP_FSCTL_TRANSACT_RSP *)NextResponse; | ||||
| } | ||||
| static inline FSP_FSCTL_TRANSACT_RSP *FspFsctlTransactConsumeResponse( | ||||
|     FSP_FSCTL_TRANSACT_RSP *Response, PVOID ResponseBufEnd) | ||||
| @@ -220,7 +224,7 @@ static inline FSP_FSCTL_TRANSACT_RSP *FspFsctlTransactConsumeResponse( | ||||
|         sizeof(FSP_FSCTL_TRANSACT_RSP) > Response->Size) | ||||
|         return 0; | ||||
|     PVOID NextResponse = (PUINT8)Response + FSP_FSCTL_DEFAULT_ALIGN_UP(Response->Size); | ||||
|     return NextResponse <= ResponseBufEnd ? NextResponse : 0; | ||||
|     return NextResponse <= ResponseBufEnd ? (FSP_FSCTL_TRANSACT_RSP *)NextResponse : 0; | ||||
| } | ||||
|  | ||||
| #if !defined(WINFSP_SYS_INTERNAL) | ||||
| @@ -233,4 +237,8 @@ FSP_API NTSTATUS FspFsctlTransact(HANDLE VolumeHandle, | ||||
|     PVOID RequestBuf, SIZE_T *PRequestBufSize); | ||||
| #endif | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -21,6 +21,10 @@ | ||||
|  | ||||
| #include <winfsp/fsctl.h> | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * File System | ||||
|  */ | ||||
| @@ -46,9 +50,12 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE | ||||
|         PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize); | ||||
|     NTSTATUS (*Create)(FSP_FILE_SYSTEM *FileSystem, | ||||
|         FSP_FSCTL_TRANSACT_REQ *Request, | ||||
|         PWSTR FileName, BOOLEAN CaseSensitive, DWORD CreateOptions, | ||||
|         DWORD FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, UINT64 AllocationSize, | ||||
|         FSP_FILE_NODE_INFO *Info); | ||||
|     NTSTATUS (*Open)(FSP_FILE_SYSTEM *FileSystem, | ||||
|         FSP_FSCTL_TRANSACT_REQ *Request, | ||||
|         PWSTR FileName, BOOLEAN CaseSensitive, DWORD CreateOptions, | ||||
|         FSP_FILE_NODE_INFO *Info); | ||||
|     NTSTATUS (*Overwrite)(FSP_FILE_SYSTEM *FileSystem, | ||||
|         FSP_FSCTL_TRANSACT_REQ *Request, | ||||
| @@ -179,4 +186,8 @@ FSP_API VOID FspPathCombine(PWSTR Prefix, PWSTR Suffix); | ||||
| FSP_API NTSTATUS FspNtStatusFromWin32(DWORD Error); | ||||
| FSP_API VOID FspDebugLog(const char *format, ...); | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -41,9 +41,9 @@ FSP_API NTSTATUS FspAccessCheck(FSP_FILE_SYSTEM *FileSystem, | ||||
|     FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN CheckParentDirectory, BOOLEAN AllowTraverseCheck, | ||||
|     DWORD DesiredAccess, PDWORD PGrantedAccess) | ||||
| { | ||||
|     if (0 == FileSystem->Interface->GetSecurity) | ||||
|     if (!Request->Req.Create.UserMode || 0 == FileSystem->Interface->GetSecurity) | ||||
|     { | ||||
|         *PGrantedAccess = DesiredAccess; | ||||
|         *PGrantedAccess = (MAXIMUM_ALLOWED & DesiredAccess) ? FILE_ALL_ACCESS : DesiredAccess; | ||||
|         return STATUS_SUCCESS; | ||||
|     } | ||||
|  | ||||
| @@ -223,7 +223,12 @@ static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem, | ||||
|     if (!NT_SUCCESS(Result)) | ||||
|         return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); | ||||
|  | ||||
|     Result = FileSystem->Interface->Create(FileSystem, Request, &NodeInfo); | ||||
|     Result = FileSystem->Interface->Create(FileSystem, Request, | ||||
|         (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, | ||||
|         Request->Req.Create.FileAttributes, | ||||
|         (PSECURITY_DESCRIPTOR)(Request->Buffer + Request->Req.Create.SecurityDescriptor.Offset), | ||||
|         Request->Req.Create.AllocationSize, | ||||
|         &NodeInfo); | ||||
|     if (!NT_SUCCESS(Result)) | ||||
|         return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); | ||||
|  | ||||
| @@ -242,7 +247,9 @@ static NTSTATUS FspFileSystemOpCreate_FileOpen(FSP_FILE_SYSTEM *FileSystem, | ||||
|     if (!NT_SUCCESS(Result)) | ||||
|         return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); | ||||
|  | ||||
|     Result = FileSystem->Interface->Open(FileSystem, Request, &NodeInfo); | ||||
|     Result = FileSystem->Interface->Open(FileSystem, Request, | ||||
|         (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, | ||||
|         &NodeInfo); | ||||
|     if (!NT_SUCCESS(Result)) | ||||
|         return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); | ||||
|  | ||||
| @@ -268,7 +275,9 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem, | ||||
|  | ||||
|     if (!Create) | ||||
|     { | ||||
|         Result = FileSystem->Interface->Open(FileSystem, Request, &NodeInfo); | ||||
|         Result = FileSystem->Interface->Open(FileSystem, Request, | ||||
|             (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, | ||||
|             &NodeInfo); | ||||
|         if (!NT_SUCCESS(Result)) | ||||
|         { | ||||
|             if (STATUS_OBJECT_NAME_NOT_FOUND != Result) | ||||
| @@ -283,7 +292,12 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem, | ||||
|         if (!NT_SUCCESS(Result)) | ||||
|             return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); | ||||
|  | ||||
|         Result = FileSystem->Interface->Create(FileSystem, Request, &NodeInfo); | ||||
|         Result = FileSystem->Interface->Create(FileSystem, Request, | ||||
|             (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, | ||||
|             Request->Req.Create.FileAttributes, | ||||
|             (PSECURITY_DESCRIPTOR)(Request->Buffer + Request->Req.Create.SecurityDescriptor.Offset), | ||||
|             Request->Req.Create.AllocationSize, | ||||
|             &NodeInfo); | ||||
|         if (!NT_SUCCESS(Result)) | ||||
|             return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); | ||||
|     } | ||||
| @@ -304,7 +318,9 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem, | ||||
|     if (!NT_SUCCESS(Result)) | ||||
|         return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); | ||||
|  | ||||
|     Result = FileSystem->Interface->Open(FileSystem, Request, &NodeInfo); | ||||
|     Result = FileSystem->Interface->Open(FileSystem, Request, | ||||
|         (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, | ||||
|         &NodeInfo); | ||||
|     if (!NT_SUCCESS(Result)) | ||||
|         return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); | ||||
|  | ||||
| @@ -330,7 +346,9 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSyste | ||||
|  | ||||
|     if (!Create) | ||||
|     { | ||||
|         Result = FileSystem->Interface->Open(FileSystem, Request, &NodeInfo); | ||||
|         Result = FileSystem->Interface->Open(FileSystem, Request, | ||||
|             (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, | ||||
|             &NodeInfo); | ||||
|         if (!NT_SUCCESS(Result)) | ||||
|         { | ||||
|             if (STATUS_OBJECT_NAME_NOT_FOUND != Result) | ||||
| @@ -345,7 +363,12 @@ static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSyste | ||||
|         if (!NT_SUCCESS(Result)) | ||||
|             return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); | ||||
|  | ||||
|         Result = FileSystem->Interface->Create(FileSystem, Request, &NodeInfo); | ||||
|         Result = FileSystem->Interface->Create(FileSystem, Request, | ||||
|             (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, | ||||
|             Request->Req.Create.FileAttributes, | ||||
|             (PSECURITY_DESCRIPTOR)(Request->Buffer + Request->Req.Create.SecurityDescriptor.Offset), | ||||
|             Request->Req.Create.AllocationSize, | ||||
|             &NodeInfo); | ||||
|         if (!NT_SUCCESS(Result)) | ||||
|             return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); | ||||
|     } | ||||
| @@ -369,7 +392,9 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *F | ||||
|         return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); | ||||
|  | ||||
|     FspPathSuffix((PWSTR)Request->Buffer, &Parent, &Suffix); | ||||
|     Result = FileSystem->Interface->Open(FileSystem, Request, &NodeInfo); | ||||
|     Result = FileSystem->Interface->Open(FileSystem, Request, | ||||
|         (PWSTR)Request->Buffer, Request->Req.Create.CaseSensitive, Request->Req.Create.CreateOptions, | ||||
|         &NodeInfo); | ||||
|     FspPathCombine((PWSTR)Request->Buffer, Suffix); | ||||
|     if (!NT_SUCCESS(Result)) | ||||
|         return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user