diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h index 98ef9871..c8334a98 100644 --- a/inc/winfsp/fsctl.h +++ b/inc/winfsp/fsctl.h @@ -9,6 +9,10 @@ #include +#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 diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h index c0bed788..ca74ebfb 100644 --- a/inc/winfsp/winfsp.h +++ b/inc/winfsp/winfsp.h @@ -21,6 +21,10 @@ #include +#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 diff --git a/src/dll/create.c b/src/dll/create.c index 5ff2f3e9..46fb4c4a 100644 --- a/src/dll/create.c +++ b/src/dll/create.c @@ -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);