IRP_MJ_QUERY_QUOTA (FS и драйверы фильтров)
При отправке
Диспетчер ввода-вывода отправляет запрос IRP_MJ_QUERY_QUOTA. Этот запрос можно отправить, например, если приложение пользовательского режима вызывает метод Win32, например IDiskQuotaControl::GetQuotaState.
Операция: драйверы файловой системы
Если файловая система поддерживает дисковые квоты, драйвер файловой системы должен извлечь и декодировать объект файла, чтобы определить, представляет ли он пользователя, открытого для файла или каталога. Если это так, драйвер должен обработать запрос и завершить IRP. В противном случае драйвер должен завершить IRP соответствующим образом, не обрабатывая запрос.
Операция: устаревшие драйверы фильтров файловой системы
Драйвер фильтра должен передать этот IRP в следующий драйвер в стеке, если ему не нужно явно переопределить поведение квоты.
Параметры
Драйвер файловой системы или фильтра вызывает IoGetCurrentIrpStackLocation для заданного IRP, чтобы получить указатель на собственное расположение стека в IRP. В следующих параметрах Irp указывает на IRP , а IrpSp — на IO_STACK_LOCATION. Драйвер может использовать сведения, заданные в следующих элементах IRP и расположении стека IRP, для обработки запроса сведений о квоте:
DeviceObject — это указатель на целевой объект устройства.
DeviceObject->Флаги. Флаги DO_BUFFERED_IO и DO_DIRECT_IO используются следующим образом, чтобы указать метод, с помощью которого данные передаются в драйвер.
Параметр флага Метод ввода-вывода ~DO_BUFFERED_IO ~DO_DIRECT_IO METHOD_NEITHER ~DO_BUFFERED_IO DO_DIRECT_IO METHOD_DIRECT DO_BUFFERED_IO ~DO_DIRECT_IO METHOD_BUFFERED DO_BUFFERED_IO DO_DIRECT_IO METHOD_BUFFERED Irp->AssociatedIrp.SystemBuffer указывает на предоставленный системой буфер, который будет использоваться в качестве промежуточного системного буфера, если флаг DO_BUFFERED_IO установлен в DeviceObject-Flags>. В противном случае этому элементу присваивается значение NULL.
Irp->IoStatus указывает на структуру IO_STATUS_BLOCK , которая получает окончательное состояние завершения и сведения о запрошенной операции.
*Irp->UserBuffer указывает на предоставленный вызывающим FILE_QUOTA_INFORMATION структурированный выходной буфер, который получает сведения о квоте для тома.
IrpSp->FileObject указывает на объект файла, связанный с DeviceObject.
Параметр IrpSp-FileObject> содержит указатель на поле RelatedFileObject, которое также является FILE_OBJECT структурой. Поле RelatedFileObject структуры FILE_OBJECT недопустимо во время обработки IRP_MJ_QUERY_QUOTA и не должно использоваться.
IrpSp->Флаги могут иметь одно или несколько из следующих значений:
Flag | Значение |
---|---|
SL_INDEX_SPECIFIED | Начните сканирование с записи в списке квот, индекс которой задан IrpSp-Parameters.QueryQuota.StartSid> |
SL_RESTART_SCAN | Начните сканирование с первой записи в списке. Если этот флаг не установлен, возобновите проверку из предыдущего запроса IRP_MJ_QUERY_QUOTA. |
SL_RETURN_SINGLE_ENTRY | Возвращает только первую найденную запись. |
IrpSp->MajorFunction имеет значение IRP_MJ_QUERY_QUOTA.
IrpSp->Parameters.QueryQuota.Length — это длина (в байтах) буфера, на который указывает Irp-UserBuffer>.
IrpSp->Parameters.QueryQuota.SidList — это необязательный указатель на список идентификаторов безопасности, для которых необходимо вернуть сведения о квоте. Каждая запись в списке представляет собой FILE_GET_QUOTA_INFORMATION структуру. Эта структура определяется следующим образом:
typedef struct _FILE_GET_QUOTA_INFORMATION { ULONG NextEntryOffset; ULONG SidLength; SID Sid; } FILE_GET_QUOTA_INFORMATION, *PFILE_GET_QUOTA_INFORMATION;
Член | Значение |
---|---|
NextEntryOffset | Байтовое смещение следующей записи FILE_GET_QUOTA_INFORMATION, если в буфере присутствует несколько записей. Этот элемент равен нулю, если другие записи не следуют за этим элементом. |
SidLength | Длина элемента Sid в байтах. |
Sid | Идентификатор безопасности (SID) |
IrpSp->Parameters.QueryQuota.SidListLength — это длина в байтах списка идентификаторов безопасности, если он указан.
IrpSp->Parameters.QueryQuota.StartSid — необязательный указатель на идентификатор безопасности, который указывает, что возвращаемые сведения должны начинаться с записи, отличной от первой. Этот параметр игнорируется, если указан список SID.