From b3f9e7e32d53ff099c4a863771b2639e4c8287b7 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Sun, 3 Jan 2016 15:08:05 -0800 Subject: [PATCH] dll: WIP --- inc/winfsp/winfsp.h | 8 ++++++++ src/dll/create.c | 29 ++++++++++++++++++----------- src/dll/loop.c | 2 +- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h index 7f7a4249..73118e6c 100644 --- a/inc/winfsp/winfsp.h +++ b/inc/winfsp/winfsp.h @@ -33,6 +33,8 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE FSP_FSCTL_TRANSACT_REQ *, DWORD, PDWORD); NTSTATUS (*QuerySecurity)(FSP_FILE_SYSTEM *, PWSTR, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, SIZE_T *); + NTSTATUS (*FileCreate)(FSP_FILE_SYSTEM *, + FSP_FSCTL_TRANSACT_REQ *, PVOID *File); } FSP_FILE_SYSTEM_INTERFACE; typedef struct _FSP_FILE_SYSTEM { @@ -113,6 +115,12 @@ FSP_API NTSTATUS FspFileSystemSendResponse(FSP_FILE_SYSTEM *FileSystem, FSP_API NTSTATUS FspFileSystemSendResponseWithStatus(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, NTSTATUS Result); +/* + * File System Operations + */ +FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem, + FSP_FSCTL_TRANSACT_REQ *Request); + /* * Access Checks */ diff --git a/src/dll/create.c b/src/dll/create.c index a831eb06..ce013e4b 100644 --- a/src/dll/create.c +++ b/src/dll/create.c @@ -6,22 +6,27 @@ #include -#if 0 static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request) { + if (0 == FileSystem->Interface->FileCreate) + return FspFileSystemSendResponseWithStatus(FileSystem, Request, STATUS_NOT_IMPLEMENTED); + NTSTATUS Result; DWORD GrantedAccess; PVOID File; FSP_FSCTL_TRANSACT_RSP Response; - Result = FspAccessCheck(FileSystem, Request, TRUE, &GrantedAccess); + Result = FspAccessCheck(FileSystem, Request, TRUE, + (Request->Req.Create.CreateOptions & FILE_DIRECTORY_FILE) ? + FILE_ADD_SUBDIRECTORY : FILE_ADD_FILE, + &GrantedAccess); if (!NT_SUCCESS(Result)) - return FspSendResponseWithStatus(FileSystem, Request, Result); + return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); - Result = FileSystem->FileCreate(FileSystem, Request, &File); + Result = FileSystem->Interface->FileCreate(FileSystem, Request, &File); if (!NT_SUCCESS(Result)) - return FspSendResponseWithStatus(FileSystem, Request, Result); + return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); /* !!!: set share access */ @@ -33,12 +38,14 @@ static NTSTATUS FspFileSystemOpCreate_FileCreate(FSP_FILE_SYSTEM *FileSystem, Response.IoStatus.Information = FILE_CREATED; Response.Rsp.Create.Opened.UserContext = (UINT_PTR)File; Response.Rsp.Create.Opened.GrantedAccess = GrantedAccess; - return FspSendResponse(FileSystem, &Response); + return FspFileSystemSendResponse(FileSystem, &Response); } static NTSTATUS FspFileSystemOpCreate_FileOpen(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request) { + return STATUS_NOT_IMPLEMENTED; +#if 0 NTSTATUS Result; DWORD GrantedAccess; PVOID File; @@ -68,24 +75,25 @@ static NTSTATUS FspFileSystemOpCreate_FileOpen(FSP_FILE_SYSTEM *FileSystem, Response.Rsp.Create.Opened.UserContext = (UINT_PTR)File; Response.Rsp.Create.Opened.GrantedAccess = GrantedAccess; return FspSendResponse(FileSystem, &Response); +#endif } static NTSTATUS FspFileSystemOpCreate_FileOpenIf(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request) { - return STATUS_INVALID_PARAMETER; + return STATUS_NOT_IMPLEMENTED; } static NTSTATUS FspFileSystemOpCreate_FileOverwrite(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN Supersede) { - return STATUS_INVALID_PARAMETER; + return STATUS_NOT_IMPLEMENTED; } static NTSTATUS FspFileSystemOpCreate_FileOverwriteIf(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request) { - return STATUS_INVALID_PARAMETER; + return STATUS_NOT_IMPLEMENTED; } FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem, @@ -106,7 +114,6 @@ FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem, case FILE_OVERWRITE_IF: return FspFileSystemOpCreate_FileOverwriteIf(FileSystem, Request); default: - return FspSendResponseWithStatus(FileSystem, Request, STATUS_INVALID_PARAMETER); + return FspFileSystemSendResponseWithStatus(FileSystem, Request, STATUS_INVALID_PARAMETER); } } -#endif diff --git a/src/dll/loop.c b/src/dll/loop.c index 5150f636..b93829df 100644 --- a/src/dll/loop.c +++ b/src/dll/loop.c @@ -40,7 +40,7 @@ FSP_API NTSTATUS FspFileSystemCreate(PWSTR DevicePath, } FileSystem->Dispatcher = FspFileSystemDirectDispatcher; - FileSystem->Operations[FspFsctlTransactCreateKind] = 0; + FileSystem->Operations[FspFsctlTransactCreateKind] = FspFileSystemOpCreate; // !!!: ... FileSystem->Interface = Interface;