sys: oplocks: WIP

This commit is contained in:
Bill Zissimopoulos
2016-11-07 20:42:32 -08:00
parent 809505d8a3
commit 8395b22ddc
4 changed files with 275 additions and 0 deletions

View File

@ -67,6 +67,11 @@ NTSTATUS FspNotifyFullReportChange(
ULONG FilterMatch,
ULONG Action,
PVOID TargetContext);
NTSTATUS FspOplockFsctrlEx(
POPLOCK Oplock,
PIRP Irp,
ULONG OpenCount,
BOOLEAN Create);
VOID FspInitializeSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem,
PWORKER_THREAD_ROUTINE Routine, PVOID Context);
VOID FspExecuteSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem);
@ -104,6 +109,7 @@ NTSTATUS FspIrpHookNext(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context);
#pragma alloc_text(PAGE, FspNotifyInitializeSync)
#pragma alloc_text(PAGE, FspNotifyFullChangeDirectory)
#pragma alloc_text(PAGE, FspNotifyFullReportChange)
#pragma alloc_text(PAGE, FspOplockFsctrlEx)
#pragma alloc_text(PAGE, FspInitializeSynchronousWorkItem)
#pragma alloc_text(PAGE, FspExecuteSynchronousWorkItem)
#pragma alloc_text(PAGE, FspExecuteSynchronousWorkItemRoutine)
@ -640,6 +646,42 @@ NTSTATUS FspNotifyFullReportChange(
return Result;
}
NTSTATUS FspOplockFsctrlEx(
POPLOCK Oplock,
PIRP Irp,
ULONG OpenCount,
BOOLEAN Create)
{
PAGED_CODE();
NTSTATUS Result;
try
{
ASSERT(
(Create && IRP_MJ_CREATE == IoGetCurrentIrpStackLocation(Irp)->MajorFunction) ||
(!Create && IRP_MJ_FILE_SYSTEM_CONTROL == IoGetCurrentIrpStackLocation(Irp)->MajorFunction));
Result = FsRtlOplockFsctrl(
Oplock,
Irp,
OpenCount);
/*
* When the IRP is IRP_MJ_FILE_SYSTEM_CONTROL, FsRtlOplockFsctrl always completes the IRP
* (unless it raises). So return STATUS_SUCCESS in that case.
*/
if (!Create)
Result = STATUS_SUCCESS;
}
except (EXCEPTION_EXECUTE_HANDLER)
{
Result = GetExceptionCode();
}
return Result;
}
VOID FspInitializeSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem,
PWORKER_THREAD_ROUTINE Routine, PVOID Context)
{