X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=drivers%2Ffilters%2Ffltmgr%2FVolume.c;h=d4c21bb9997752fb0df6735e97aba7b578138005;hp=6a854f76a6409f5749b46c252065cd333ff1cbaa;hb=92dca372783529d8361f7a3c035d2dfd6a7e5bae;hpb=5bdd806fb9fdb6d8ddf092cb9ccc1a8953f4acc3 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 ******************************************************/