From: Pierre Schweitzer Date: Sun, 28 Oct 2018 08:26:12 +0000 (+0100) Subject: [FLTMGR] Implement FltEnumerateVolumes() X-Git-Tag: 0.4.12-dev~337 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=92dca372783529d8361f7a3c035d2dfd6a7e5bae;hp=5bdd806fb9fdb6d8ddf092cb9ccc1a8953f4acc3 [FLTMGR] Implement FltEnumerateVolumes() --- diff --git a/drivers/filters/fltmgr/Volume.c b/drivers/filters/fltmgr/Volume.c index 6a854f76a64..d4c21bb9997 100644 --- a/drivers/filters/fltmgr/Volume.c +++ b/drivers/filters/fltmgr/Volume.c @@ -107,4 +107,77 @@ FltGetVolumeProperties( } -/* INTERNAL FUNCTIONS ******************************************************/ \ No newline at end of file +NTSTATUS +FLTAPI +FltEnumerateVolumes( + _In_ PFLT_FILTER Filter, + _Out_writes_to_opt_(VolumeListSize,*NumberVolumesReturned) PFLT_VOLUME *VolumeList, + _In_ ULONG VolumeListSize, + _Out_ PULONG NumberVolumesReturned) +{ + ULONG i; + PFLTP_FRAME Frame; + PFLT_VOLUME Volume; + PLIST_ENTRY ListEntry; + ULONG NumberOfVolumes = 0; + NTSTATUS Status = STATUS_SUCCESS; + + PAGED_CODE(); + + Frame = Filter->Frame; + + /* Lock the attached volumes list */ + KeEnterCriticalRegion(); + ExAcquireResourceSharedLite(&Frame->AttachedVolumes.rLock, TRUE); + + /* If it's not empty */ + if (!IsListEmpty(&Frame->AttachedVolumes.rList)) + { + /* Browse every entry */ + for (ListEntry = Frame->AttachedVolumes.rList.Flink; + ListEntry != &Frame->AttachedVolumes.rList; + ListEntry = ListEntry->Flink) + { + /* Get the volume */ + Volume = CONTAINING_RECORD(ListEntry, FLT_VOLUME, Base.PrimaryLink); + + /* If there's still room in the output buffer */ + if (NumberOfVolumes < VolumeListSize) + { + /* Reference the volume and return it */ + FltObjectReference(Volume); + VolumeList[NumberOfVolumes] = Volume; + } + + /* We returned one more volume */ + ++NumberOfVolumes; + } + } + + /* Release the list */ + ExReleaseResourceLite(&Frame->AttachedVolumes.rLock); + KeLeaveCriticalRegion(); + + /* If we want to return more volumes than we can */ + if (NumberOfVolumes > VolumeListSize) + { + /* We will clear output */ + for (i = 0; i < VolumeListSize; ++i) + { + FltObjectDereference(VolumeList[i]); + VolumeList[i] = NULL; + } + + /* And set failure status */ + Status = STATUS_BUFFER_TOO_SMALL; + } + + /* Always return the max amount of volumes we want to return */ + *NumberVolumesReturned = NumberOfVolumes; + + /* Done */ + return Status; +} + + +/* INTERNAL FUNCTIONS ******************************************************/ diff --git a/drivers/filters/fltmgr/fltmgr.spec b/drivers/filters/fltmgr/fltmgr.spec index e3c88de91db..916d742ac6e 100644 --- a/drivers/filters/fltmgr/fltmgr.spec +++ b/drivers/filters/fltmgr/fltmgr.spec @@ -10,4 +10,5 @@ @ stdcall FltGetVolumeProperties(ptr ptr long ptr) @ stdcall FltObjectDereference(ptr) @ stdcall FltSendMessage(ptr ptr ptr long ptr ptr ptr) + @ stdcall FltEnumerateVolumes(ptr ptr long ptr)