[FASTFAT] Add a wrapper around FsRtlNotifyFullReportChange

This commit is contained in:
Pierre Schweitzer 2018-01-07 14:16:11 +01:00
parent 168223aeb8
commit 8294118174
No known key found for this signature in database
GPG key ID: 7545556C3D585B0B
6 changed files with 82 additions and 125 deletions

View file

@ -124,16 +124,11 @@ VfatCleanupFile(
{ {
VfatDelEntry(DeviceExt, pFcb, NULL); VfatDelEntry(DeviceExt, pFcb, NULL);
FsRtlNotifyFullReportChange(DeviceExt->NotifySync, vfatReportChange(DeviceExt,
&(DeviceExt->NotifyList), pFcb,
(PSTRING)&pFcb->PathNameU,
pFcb->PathNameU.Length - pFcb->LongNameU.Length,
NULL,
NULL,
vfatFCBIsDirectory(pFcb) ? vfatFCBIsDirectory(pFcb) ?
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME, FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME,
FILE_ACTION_REMOVED, FILE_ACTION_REMOVED);
NULL);
} }
if (pFcb->OpenHandleCount != 0) if (pFcb->OpenHandleCount != 0)

View file

@ -1002,29 +1002,19 @@ VfatCreateFile(
if (Irp->IoStatus.Information == FILE_CREATED) if (Irp->IoStatus.Information == FILE_CREATED)
{ {
FsRtlNotifyFullReportChange(DeviceExt->NotifySync, vfatReportChange(DeviceExt,
&(DeviceExt->NotifyList), pFcb,
(PSTRING)&pFcb->PathNameU,
pFcb->PathNameU.Length - pFcb->LongNameU.Length,
NULL,
NULL,
(vfatFCBIsDirectory(pFcb) ? (vfatFCBIsDirectory(pFcb) ?
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME), FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
FILE_ACTION_ADDED, FILE_ACTION_ADDED);
NULL);
} }
else if (Irp->IoStatus.Information == FILE_OVERWRITTEN || else if (Irp->IoStatus.Information == FILE_OVERWRITTEN ||
Irp->IoStatus.Information == FILE_SUPERSEDED) Irp->IoStatus.Information == FILE_SUPERSEDED)
{ {
FsRtlNotifyFullReportChange(DeviceExt->NotifySync, vfatReportChange(DeviceExt,
&(DeviceExt->NotifyList), pFcb,
(PSTRING)&pFcb->PathNameU,
pFcb->PathNameU.Length - pFcb->LongNameU.Length,
NULL,
NULL,
FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE, FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE,
FILE_ACTION_MODIFIED, FILE_ACTION_MODIFIED);
NULL);
} }
pFcb->OpenHandleCount++; pFcb->OpenHandleCount++;

View file

@ -269,12 +269,10 @@ VfatSetBasicInformation(
if (NotifyFilter != 0) if (NotifyFilter != 0)
{ {
FsRtlNotifyFullReportChange(DeviceExt->NotifySync, vfatReportChange(DeviceExt,
&(DeviceExt->NotifyList), FCB,
(PSTRING)&FCB->PathNameU, NotifyFilter,
FCB->PathNameU.Length - FCB->LongNameU.Length, FILE_ACTION_MODIFIED);
NULL, NULL, NotifyFilter, FILE_ACTION_MODIFIED,
NULL);
} }
return STATUS_SUCCESS; return STATUS_SUCCESS;
@ -822,29 +820,19 @@ VfatSetRenameInformation(
if (FsRtlAreNamesEqual(&SourceFile, &NewFile, TRUE, NULL)) if (FsRtlAreNamesEqual(&SourceFile, &NewFile, TRUE, NULL))
{ {
FsRtlNotifyFullReportChange(DeviceExt->NotifySync, vfatReportChange(DeviceExt,
&(DeviceExt->NotifyList), FCB,
(PSTRING)&FCB->PathNameU,
FCB->PathNameU.Length - FCB->LongNameU.Length,
NULL,
NULL,
(vfatFCBIsDirectory(FCB) ? (vfatFCBIsDirectory(FCB) ?
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME), FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
FILE_ACTION_RENAMED_OLD_NAME, FILE_ACTION_RENAMED_OLD_NAME);
NULL);
Status = vfatRenameEntry(DeviceExt, FCB, &NewFile, TRUE); Status = vfatRenameEntry(DeviceExt, FCB, &NewFile, TRUE);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
FsRtlNotifyFullReportChange(DeviceExt->NotifySync, vfatReportChange(DeviceExt,
&(DeviceExt->NotifyList), FCB,
(PSTRING)&FCB->PathNameU,
FCB->PathNameU.Length - FCB->LongNameU.Length,
NULL,
NULL,
(vfatFCBIsDirectory(FCB) ? (vfatFCBIsDirectory(FCB) ?
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME), FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
FILE_ACTION_RENAMED_NEW_NAME, FILE_ACTION_RENAMED_NEW_NAME);
NULL);
} }
} }
else else
@ -865,44 +853,29 @@ VfatSetRenameInformation(
goto Cleanup; goto Cleanup;
} }
FsRtlNotifyFullReportChange(DeviceExt->NotifySync, vfatReportChange(DeviceExt,
&(DeviceExt->NotifyList), FCB,
(PSTRING)&FCB->PathNameU,
FCB->PathNameU.Length - FCB->LongNameU.Length,
NULL,
NULL,
(vfatFCBIsDirectory(FCB) ? (vfatFCBIsDirectory(FCB) ?
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME), FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
(DeletedTarget ? FILE_ACTION_REMOVED : FILE_ACTION_RENAMED_OLD_NAME), (DeletedTarget ? FILE_ACTION_REMOVED : FILE_ACTION_RENAMED_OLD_NAME));
NULL);
Status = vfatRenameEntry(DeviceExt, FCB, &NewFile, FALSE); Status = vfatRenameEntry(DeviceExt, FCB, &NewFile, FALSE);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
if (DeletedTarget) if (DeletedTarget)
{ {
FsRtlNotifyFullReportChange(DeviceExt->NotifySync, vfatReportChange(DeviceExt,
&(DeviceExt->NotifyList), FCB,
(PSTRING)&FCB->PathNameU,
FCB->PathNameU.Length - FCB->LongNameU.Length,
NULL,
NULL,
FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE
| FILE_NOTIFY_CHANGE_LAST_ACCESS | FILE_NOTIFY_CHANGE_CREATION | FILE_NOTIFY_CHANGE_EA, | FILE_NOTIFY_CHANGE_LAST_ACCESS | FILE_NOTIFY_CHANGE_CREATION | FILE_NOTIFY_CHANGE_EA,
FILE_ACTION_MODIFIED, FILE_ACTION_MODIFIED);
NULL);
} }
else else
{ {
FsRtlNotifyFullReportChange(DeviceExt->NotifySync, vfatReportChange(DeviceExt,
&(DeviceExt->NotifyList), FCB,
(PSTRING)&FCB->PathNameU,
FCB->PathNameU.Length - FCB->LongNameU.Length,
NULL,
NULL,
(vfatFCBIsDirectory(FCB) ? (vfatFCBIsDirectory(FCB) ?
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME), FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
FILE_ACTION_RENAMED_NEW_NAME, FILE_ACTION_RENAMED_NEW_NAME);
NULL);
} }
} }
} }
@ -936,44 +909,29 @@ VfatSetRenameInformation(
UNREFERENCED_PARAMETER(NewReferences); UNREFERENCED_PARAMETER(NewReferences);
#endif #endif
FsRtlNotifyFullReportChange(DeviceExt->NotifySync, vfatReportChange(DeviceExt,
&(DeviceExt->NotifyList), FCB,
(PSTRING)&FCB->PathNameU,
FCB->PathNameU.Length - FCB->LongNameU.Length,
NULL,
NULL,
(vfatFCBIsDirectory(FCB) ? (vfatFCBIsDirectory(FCB) ?
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME), FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
FILE_ACTION_REMOVED, FILE_ACTION_REMOVED);
NULL);
Status = VfatMoveEntry(DeviceExt, FCB, &NewFile, ParentFCB); Status = VfatMoveEntry(DeviceExt, FCB, &NewFile, ParentFCB);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
if (DeletedTarget) if (DeletedTarget)
{ {
FsRtlNotifyFullReportChange(DeviceExt->NotifySync, vfatReportChange(DeviceExt,
&(DeviceExt->NotifyList), FCB,
(PSTRING)&FCB->PathNameU,
FCB->PathNameU.Length - FCB->LongNameU.Length,
NULL,
NULL,
FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE
| FILE_NOTIFY_CHANGE_LAST_ACCESS | FILE_NOTIFY_CHANGE_CREATION | FILE_NOTIFY_CHANGE_EA, | FILE_NOTIFY_CHANGE_LAST_ACCESS | FILE_NOTIFY_CHANGE_CREATION | FILE_NOTIFY_CHANGE_EA,
FILE_ACTION_MODIFIED, FILE_ACTION_MODIFIED);
NULL);
} }
else else
{ {
FsRtlNotifyFullReportChange(DeviceExt->NotifySync, vfatReportChange(DeviceExt,
&(DeviceExt->NotifyList), FCB,
(PSTRING)&FCB->PathNameU,
FCB->PathNameU.Length - FCB->LongNameU.Length,
NULL,
NULL,
(vfatFCBIsDirectory(FCB) ? (vfatFCBIsDirectory(FCB) ?
FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME), FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME),
FILE_ACTION_ADDED, FILE_ACTION_ADDED);
NULL);
} }
} }
} }

View file

@ -1070,15 +1070,7 @@ Metadata:
Filter = FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_ATTRIBUTES; Filter = FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_ATTRIBUTES;
if (ByteOffset.QuadPart != OldFileSize.QuadPart) Filter |= FILE_NOTIFY_CHANGE_SIZE; if (ByteOffset.QuadPart != OldFileSize.QuadPart) Filter |= FILE_NOTIFY_CHANGE_SIZE;
FsRtlNotifyFullReportChange(IrpContext->DeviceExt->NotifySync, vfatReportChange(IrpContext->DeviceExt, Fcb, Filter, FILE_ACTION_MODIFIED);
&(IrpContext->DeviceExt->NotifyList),
(PSTRING)&Fcb->PathNameU,
Fcb->PathNameU.Length - Fcb->LongNameU.Length,
NULL,
NULL,
Filter,
FILE_ACTION_MODIFIED,
NULL);
} }
} }

View file

@ -602,6 +602,21 @@ vfatVolumeIsFatX(PDEVICE_EXTENSION DeviceExt)
return BooleanFlagOn(DeviceExt->Flags, VCB_IS_FATX); return BooleanFlagOn(DeviceExt->Flags, VCB_IS_FATX);
} }
FORCEINLINE
VOID
vfatReportChange(
IN PDEVICE_EXTENSION DeviceExt,
IN PVFATFCB Fcb,
IN ULONG FilterMatch,
IN ULONG Action)
{
FsRtlNotifyFullReportChange(DeviceExt->NotifySync,
&(DeviceExt->NotifyList),
(PSTRING)&Fcb->PathNameU,
Fcb->PathNameU.Length - Fcb->LongNameU.Length,
NULL, NULL, FilterMatch, Action, NULL);
}
#define vfatAddToStat(Vcb, Stat, Inc) \ #define vfatAddToStat(Vcb, Stat, Inc) \
{ \ { \
PSTATISTICS Stats = &(Vcb)->Statistics[KeGetCurrentProcessorNumber() % VfatGlobalData->NumberProcessors]; \ PSTATISTICS Stats = &(Vcb)->Statistics[KeGetCurrentProcessorNumber() % VfatGlobalData->NumberProcessors]; \
@ -1033,6 +1048,13 @@ VfatCheckForDismount(
IN PDEVICE_EXTENSION DeviceExt, IN PDEVICE_EXTENSION DeviceExt,
IN BOOLEAN Create); IN BOOLEAN Create);
VOID
vfatReportChange(
IN PDEVICE_EXTENSION DeviceExt,
IN PVFATFCB Fcb,
IN ULONG FilterMatch,
IN ULONG Action);
/* pnp.c */ /* pnp.c */
NTSTATUS NTSTATUS