mirror of
https://github.com/winfsp/winfsp.git
synced 2025-06-08 04:52:10 -05:00
sys,dll: reparse point testing
This commit is contained in:
parent
5dcbbaa4e7
commit
0c07be9628
@ -906,8 +906,12 @@ FSP_API NTSTATUS FspFileSystemOpFileSystemControl(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
(PVOID)Request->Req.FileSystemControl.UserContext,
|
(PVOID)Request->Req.FileSystemControl.UserContext,
|
||||||
(PWSTR)Request->Buffer, ReparseData, &Size);
|
(PWSTR)Request->Buffer, ReparseData, &Size);
|
||||||
if (NT_SUCCESS(Result))
|
if (NT_SUCCESS(Result))
|
||||||
|
{
|
||||||
|
Response->Size = (UINT16)(sizeof *Response + Size);
|
||||||
|
Response->Rsp.FileSystemControl.Buffer.Offset = 0;
|
||||||
Response->Rsp.FileSystemControl.Buffer.Size = (UINT16)Size;
|
Response->Rsp.FileSystemControl.Buffer.Size = (UINT16)Size;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case FSCTL_SET_REPARSE_POINT:
|
case FSCTL_SET_REPARSE_POINT:
|
||||||
if (0 != FileSystem->Interface->SetReparsePoint)
|
if (0 != FileSystem->Interface->SetReparsePoint)
|
||||||
@ -937,7 +941,7 @@ FSP_API NTSTATUS FspFileSystemOpFileSystemControl(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
FSP_API NTSTATUS FspFileSystemOpQuerySecurity(FSP_FILE_SYSTEM *FileSystem,
|
FSP_API NTSTATUS FspFileSystemOpQuerySecurity(FSP_FILE_SYSTEM *FileSystem,
|
||||||
|
@ -174,24 +174,24 @@ static NTSTATUS FspFsvolFileSystemControlReparsePoint(
|
|||||||
;
|
;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FspFileNodeAcquireExclusive(FileNode, Full);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (0 != InputBuffer || 0 != InputBufferLength ||
|
if (0 == OutputBuffer || 0 == OutputBufferLength)
|
||||||
0 == OutputBuffer || 0 == OutputBufferLength)
|
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
Result = FspBufferUserBuffer(Irp, OutputBufferLength, IoWriteAccess);
|
/*
|
||||||
if (!NT_SUCCESS(Result))
|
* NtFsControlFile (IopXxxControlFile) will setup Irp->AssociatedIrp.SystemBuffer
|
||||||
return Result;
|
* with enough space for either InputBufferLength or OutputBufferLength. There is
|
||||||
|
* no need to call FspBufferUserBuffer ourselves.
|
||||||
|
*/
|
||||||
|
|
||||||
|
FspFileNodeAcquireShared(FileNode, Full);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsWrite)
|
Result = FspIopCreateRequestEx(Irp, &FileNode->FileName, IsWrite ? InputBufferLength : 0,
|
||||||
FspFileNodeAcquireExclusive(FileNode, Full);
|
|
||||||
else
|
|
||||||
FspFileNodeAcquireShared(FileNode, Full);
|
|
||||||
|
|
||||||
Result = FspIopCreateRequestEx(Irp, &FileNode->FileName, InputBufferLength,
|
|
||||||
FspFsvolFileSystemControlRequestFini, &Request);
|
FspFsvolFileSystemControlRequestFini, &Request);
|
||||||
if (!NT_SUCCESS(Result))
|
if (!NT_SUCCESS(Result))
|
||||||
{
|
{
|
||||||
@ -225,12 +225,12 @@ static NTSTATUS FspFsvolFileSystemControlReparsePointComplete(
|
|||||||
{
|
{
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
if (!IsWrite)
|
if (IsWrite)
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
|
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
||||||
PVOID OutputBuffer = Irp->AssociatedIrp.SystemBuffer; /* see FspBufferUserBuffer call */
|
PVOID OutputBuffer = Irp->AssociatedIrp.SystemBuffer;
|
||||||
ULONG OutputBufferLength = IrpSp->Parameters.FileSystemControl.OutputBufferLength;
|
ULONG OutputBufferLength = IrpSp->Parameters.FileSystemControl.OutputBufferLength;
|
||||||
|
|
||||||
if (Response->Buffer + Response->Rsp.FileSystemControl.Buffer.Offset +
|
if (Response->Buffer + Response->Rsp.FileSystemControl.Buffer.Offset +
|
||||||
@ -302,6 +302,7 @@ NTSTATUS FspFsvolFileSystemControlComplete(
|
|||||||
FSP_FILE_NODE *FileNode = FileObject->FsContext;
|
FSP_FILE_NODE *FileNode = FileObject->FsContext;
|
||||||
FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp);
|
FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp);
|
||||||
|
|
||||||
|
Result = STATUS_INVALID_DEVICE_REQUEST;
|
||||||
switch (IrpSp->MinorFunction)
|
switch (IrpSp->MinorFunction)
|
||||||
{
|
{
|
||||||
case IRP_MN_USER_FS_REQUEST:
|
case IRP_MN_USER_FS_REQUEST:
|
||||||
@ -314,18 +315,12 @@ NTSTATUS FspFsvolFileSystemControlComplete(
|
|||||||
case FSCTL_DELETE_REPARSE_POINT:
|
case FSCTL_DELETE_REPARSE_POINT:
|
||||||
Result = FspFsvolFileSystemControlReparsePointComplete(Irp, Response, TRUE);
|
Result = FspFsvolFileSystemControlReparsePointComplete(Irp, Response, TRUE);
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
ASSERT(0);
|
|
||||||
Result = STATUS_INVALID_PARAMETER;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
ASSERT(0);
|
|
||||||
Result = STATUS_INVALID_PARAMETER;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ASSERT(STATUS_INVALID_DEVICE_REQUEST != Result);
|
||||||
|
|
||||||
FspIopRequestContext(Request, RequestFileNode) = 0;
|
FspIopRequestContext(Request, RequestFileNode) = 0;
|
||||||
FspFileNodeReleaseOwner(FileNode, Full, Request);
|
FspFileNodeReleaseOwner(FileNode, Full, Request);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user