mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 08:53:01 -05:00
sys: FspFsvolFileSystemControlOplock: WIP
This commit is contained in:
parent
2d98cda607
commit
154aa28381
@ -329,20 +329,8 @@ static NTSTATUS FspFsvolFileSystemControlOplock(
|
|||||||
ULONG OplockCount;
|
ULONG OplockCount;
|
||||||
FSP_FSVOL_FILESYSTEM_CONTROL_OPLOCK_COMPLETION_CONTEXT *CompletionContext;
|
FSP_FSVOL_FILESYSTEM_CONTROL_OPLOCK_COMPLETION_CONTEXT *CompletionContext;
|
||||||
|
|
||||||
if (FSCTL_REQUEST_OPLOCK == FsControlCode)
|
|
||||||
{
|
|
||||||
if (sizeof(REQUEST_OPLOCK_INPUT_BUFFER) > InputBufferLength ||
|
|
||||||
sizeof(REQUEST_OPLOCK_OUTPUT_BUFFER) > OutputBufferLength)
|
|
||||||
return STATUS_BUFFER_TOO_SMALL;
|
|
||||||
|
|
||||||
if (FileNode->IsDirectory && !FsRtlOplockIsSharedRequest(Irp))
|
|
||||||
return STATUS_INVALID_PARAMETER;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (FileNode->IsDirectory)
|
if (FileNode->IsDirectory)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* As per FastFat:
|
* As per FastFat:
|
||||||
@ -353,6 +341,20 @@ static NTSTATUS FspFsvolFileSystemControlOplock(
|
|||||||
|
|
||||||
switch (FsControlCode)
|
switch (FsControlCode)
|
||||||
{
|
{
|
||||||
|
case FSCTL_REQUEST_OPLOCK:
|
||||||
|
if (sizeof(REQUEST_OPLOCK_INPUT_BUFFER) > InputBufferLength ||
|
||||||
|
sizeof(REQUEST_OPLOCK_OUTPUT_BUFFER) > OutputBufferLength)
|
||||||
|
return STATUS_BUFFER_TOO_SMALL;
|
||||||
|
if (FlagOn(((PREQUEST_OPLOCK_INPUT_BUFFER)InputBuffer)->Flags,
|
||||||
|
REQUEST_OPLOCK_INPUT_FLAG_REQUEST))
|
||||||
|
goto exclusive;
|
||||||
|
if (FlagOn(((PREQUEST_OPLOCK_INPUT_BUFFER)InputBuffer)->Flags,
|
||||||
|
REQUEST_OPLOCK_INPUT_FLAG_ACK))
|
||||||
|
goto shared;
|
||||||
|
|
||||||
|
/* one of REQUEST_OPLOCK_INPUT_FLAG_REQUEST or REQUEST_OPLOCK_INPUT_FLAG_ACK required */
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
case FSCTL_REQUEST_OPLOCK_LEVEL_1:
|
case FSCTL_REQUEST_OPLOCK_LEVEL_1:
|
||||||
case FSCTL_REQUEST_OPLOCK_LEVEL_2:
|
case FSCTL_REQUEST_OPLOCK_LEVEL_2:
|
||||||
case FSCTL_REQUEST_BATCH_OPLOCK:
|
case FSCTL_REQUEST_BATCH_OPLOCK:
|
||||||
@ -366,13 +368,28 @@ static NTSTATUS FspFsvolFileSystemControlOplock(
|
|||||||
FspFsvolDeviceUnlockContextTable(FsvolDeviceObject);
|
FspFsvolDeviceUnlockContextTable(FsvolDeviceObject);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
|
||||||
if (!FileNode->IsDirectory)
|
|
||||||
/* ???: Win8 and FsRtlCheckLockForOplockRequest? see FastFat */
|
|
||||||
OplockCount = FsRtlAreThereCurrentOrInProgressFileLocks(&FileNode->FileLock);
|
OplockCount = FsRtlAreThereCurrentOrInProgressFileLocks(&FileNode->FileLock);
|
||||||
else
|
break;
|
||||||
|
|
||||||
|
case FSCTL_OPLOCK_BREAK_ACKNOWLEDGE:
|
||||||
|
case FSCTL_OPBATCH_ACK_CLOSE_PENDING:
|
||||||
|
case FSCTL_OPLOCK_BREAK_NOTIFY:
|
||||||
|
case FSCTL_OPLOCK_BREAK_ACK_NO_2:
|
||||||
|
shared:
|
||||||
|
FspFileNodeAcquireShared(FileNode, Main);
|
||||||
OplockCount = 0;
|
OplockCount = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The FileNode is acquired exclusive or shared.
|
||||||
|
* Make sure to release it before exiting!
|
||||||
|
*/
|
||||||
|
|
||||||
if (FSCTL_REQUEST_FILTER_OPLOCK == FsControlCode ||
|
if (FSCTL_REQUEST_FILTER_OPLOCK == FsControlCode ||
|
||||||
FSCTL_REQUEST_BATCH_OPLOCK == FsControlCode ||
|
FSCTL_REQUEST_BATCH_OPLOCK == FsControlCode ||
|
||||||
(FSCTL_REQUEST_OPLOCK == FsControlCode &&
|
(FSCTL_REQUEST_OPLOCK == FsControlCode &&
|
||||||
@ -385,41 +402,10 @@ static NTSTATUS FspFsvolFileSystemControlOplock(
|
|||||||
MemoryBarrier();
|
MemoryBarrier();
|
||||||
if (DeletePending)
|
if (DeletePending)
|
||||||
{
|
{
|
||||||
FspFileNodeRelease(FileNode, Main);
|
Result = STATUS_DELETE_PENDING;
|
||||||
return STATUS_DELETE_PENDING;
|
goto unlock_exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
case FSCTL_OPLOCK_BREAK_ACKNOWLEDGE:
|
|
||||||
case FSCTL_OPBATCH_ACK_CLOSE_PENDING:
|
|
||||||
case FSCTL_OPLOCK_BREAK_NOTIFY:
|
|
||||||
case FSCTL_OPLOCK_BREAK_ACK_NO_2:
|
|
||||||
shared:
|
|
||||||
FspFileNodeAcquireShared(FileNode, Main);
|
|
||||||
OplockCount = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FSCTL_REQUEST_OPLOCK:
|
|
||||||
if (FlagOn(((PREQUEST_OPLOCK_INPUT_BUFFER)InputBuffer)->Flags,
|
|
||||||
REQUEST_OPLOCK_INPUT_FLAG_REQUEST))
|
|
||||||
goto exclusive;
|
|
||||||
if (FlagOn(((PREQUEST_OPLOCK_INPUT_BUFFER)InputBuffer)->Flags,
|
|
||||||
REQUEST_OPLOCK_INPUT_FLAG_ACK))
|
|
||||||
goto shared;
|
|
||||||
|
|
||||||
/* one of REQUEST_OPLOCK_INPUT_FLAG_REQUEST or REQUEST_OPLOCK_INPUT_FLAG_ACK required */
|
|
||||||
return STATUS_INVALID_PARAMETER;
|
|
||||||
|
|
||||||
default:
|
|
||||||
ASSERT(0);
|
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The FileNode is acquired exclusive or shared.
|
|
||||||
* Make sure to release it before exiting!
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This IRP will be completed by the FSRTL package and therefore
|
* This IRP will be completed by the FSRTL package and therefore
|
||||||
|
Loading…
x
Reference in New Issue
Block a user