dll: create

This commit is contained in:
Bill Zissimopoulos 2016-01-04 17:42:25 -08:00
parent 3acb6da4ba
commit 5eaa6b03ae
3 changed files with 15 additions and 9 deletions

View File

@ -60,8 +60,6 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE **PFileNode); FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE **PFileNode);
NTSTATUS (*Open)(FSP_FILE_SYSTEM *FileSystem, NTSTATUS (*Open)(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE **PFileNode); FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE **PFileNode);
NTSTATUS (*OpenParentDirectory)(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FILE_NODE **PFileNode, PBOOLEAN PFileExists);
NTSTATUS (*Overwrite)(FSP_FILE_SYSTEM *FileSystem, NTSTATUS (*Overwrite)(FSP_FILE_SYSTEM *FileSystem,
FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN ReplaceFileAttributes, FSP_FILE_NODE *FileNode); FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN ReplaceFileAttributes, FSP_FILE_NODE *FileNode);
NTSTATUS (*Cleanup)(FSP_FILE_SYSTEM *FileSystem, NTSTATUS (*Cleanup)(FSP_FILE_SYSTEM *FileSystem,

View File

@ -87,7 +87,7 @@ FSP_API NTSTATUS FspAccessCheck(FSP_FILE_SYSTEM *FileSystem,
} }
Prefix = L'\0' == Prefix[0] ? L"\\" : (PWSTR)Request->Buffer; Prefix = L'\0' == Prefix[0] ? L"\\" : (PWSTR)Request->Buffer;
Result = FspGetSecurity(FileSystem, Prefix, &FileAttributes, Result = FspGetSecurity(FileSystem, Prefix, 0,
&SecurityDescriptor, &SecurityDescriptorSize); &SecurityDescriptor, &SecurityDescriptorSize);
FspPathCombine((PWSTR)Request->Buffer, Path); FspPathCombine((PWSTR)Request->Buffer, Path);

View File

@ -271,17 +271,19 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *F
return STATUS_ACCESS_DENIED; return STATUS_ACCESS_DENIED;
NTSTATUS Result; NTSTATUS Result;
PWSTR Parent, Suffix;
DWORD GrantedAccess; DWORD GrantedAccess;
FSP_FILE_NODE *FileNode; FSP_FILE_NODE *FileNode;
BOOLEAN FileExists; UINT_PTR Information;
Result = FspAccessCheck(FileSystem, Request, TRUE, TRUE, Result = FspAccessCheck(FileSystem, Request, TRUE, TRUE,
Request->Req.Create.DesiredAccess, &GrantedAccess); Request->Req.Create.DesiredAccess, &GrantedAccess);
if (!NT_SUCCESS(Result)) if (!NT_SUCCESS(Result))
return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result);
Result = FileSystem->Interface->OpenParentDirectory(FileSystem, Request, FspPathSuffix((PWSTR)Request->Buffer, &Parent, &Suffix);
&FileNode, &FileExists); Result = FileSystem->Interface->Open(FileSystem, Request, &FileNode);
FspPathCombine((PWSTR)Request->Buffer, Suffix);
if (!NT_SUCCESS(Result)) if (!NT_SUCCESS(Result))
return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result);
@ -293,8 +295,15 @@ static NTSTATUS FspFileSystemOpCreate_FileOpenTargetDirectory(FSP_FILE_SYSTEM *F
return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result); return FspFileSystemSendResponseWithStatus(FileSystem, Request, Result);
} }
Information = FILE_OPENED;
if (0 == FileSystem->Interface->GetSecurity)
{
Result = FileSystem->Interface->GetSecurity(FileSystem, (PWSTR)Request->Buffer, 0, 0, 0);
Information = NT_SUCCESS(Result) ? FILE_EXISTS : FILE_DOES_NOT_EXIST;
}
return FspFileSystemSendCreateResponse(FileSystem, Request, return FspFileSystemSendCreateResponse(FileSystem, Request,
FileExists ? FILE_EXISTS : FILE_DOES_NOT_EXIST, FileNode, GrantedAccess); Information, FileNode, GrantedAccess);
} }
FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem, FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem,
@ -302,8 +311,7 @@ FSP_API NTSTATUS FspFileSystemOpCreate(FSP_FILE_SYSTEM *FileSystem,
{ {
if (0 == FileSystem->Interface->Create || if (0 == FileSystem->Interface->Create ||
0 == FileSystem->Interface->Open || 0 == FileSystem->Interface->Open ||
0 == FileSystem->Interface->Overwrite || 0 == FileSystem->Interface->Overwrite)
0 == FileSystem->Interface->OpenParentDirectory)
return FspFileSystemSendResponseWithStatus(FileSystem, Request, STATUS_INVALID_DEVICE_REQUEST); return FspFileSystemSendResponseWithStatus(FileSystem, Request, STATUS_INVALID_DEVICE_REQUEST);
if (Request->Req.Create.OpenTargetDirectory) if (Request->Req.Create.OpenTargetDirectory)