IRP_MJ_QUERY_QUOTA(FS 및 필터 드라이버)

보낸 경우

I/O 관리자는 IRP_MJ_QUERY_QUOTA 요청을 보냅니다. 예를 들어 사용자 모드 애플리케이션이 IDiskQuotaControl::GetQuotaState와 같은 Win32 메서드를 호출한 경우 이 요청을 보낼 수 있습니다.

작업: 파일 시스템 드라이버

파일 시스템에서 디스크 할당량을 지원하는 경우 파일 시스템 드라이버는 파일 개체를 추출하고 디코딩하여 파일 또는 디렉터리를 여는 사용자를 나타내는지 여부를 결정해야 합니다. 이 경우 드라이버는 쿼리를 처리하고 IRP를 완료해야 합니다. 그렇지 않으면 드라이버는 쿼리를 처리하지 않고 IRP를 적절하게 완료해야 합니다.

작업: 레거시 파일 시스템 필터 드라이버

필터 드라이버는 할당량 동작을 명시적으로 재정의해야 하는 경우가 아니면 이 IRP를 스택의 다음 하위 드라이버로 전달해야 합니다.

매개 변수

파일 시스템 또는 필터 드라이버는 지정된 IRP에 대해 IoGetCurrentIrpStackLocation 을 호출하여 IRP의 자체 스택 위치에 대한 포인터를 가져옵니다. 다음 매개 변수에서 IrpIRP 를 가리키고 IrpSpIO_STACK_LOCATION 가리킵니다. 드라이버는 IRP 및 IRP 스택 위치의 다음 멤버에 설정된 정보를 사용하여 쿼리 할당량 정보 요청을 처리할 수 있습니다.

  • DeviceObject 는 대상 디바이스 개체에 대한 포인터입니다.

  • DeviceObject->플래그: DO_BUFFERED_IO 및 DO_DIRECT_IO 플래그는 다음과 같이 데이터를 드라이버에 전달하는 메서드를 지정하는 데 사용됩니다.

    플래그 설정 I/O 메서드
    ~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->FileObjectDeviceObject와 연결된 파일 개체를 가리킵니다.

    IrpSp-FileObject> 매개 변수에는 relatedFileObject 필드에 대한 포인터가 포함되어 있으며 이는 FILE_OBJECT 구조체이기도 합니다. FILE_OBJECT 구조체의 RelatedFileObject 필드는 IRP_MJ_QUERY_QUOTA 처리하는 동안 유효하지 않으므로 사용하면 안 됩니다.

  • IrpSp->플래그 는 다음 값 중 하나 이상일 수 있습니다.

플래그 의미
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 는 할당량 정보를 반환할 SID 목록에 대한 선택적 포인터입니다. 목록의 각 항목은 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 항목의 바이트 오프셋입니다. 다른 항목이 이 항목을 따르지 않는 경우 이 멤버는 0입니다.
SidLength Sid 멤버의 길이(바이트)입니다.
Sid SID(보안 식별자)
  • IrpSp->Parameters.QueryQuota.SidListLength 는 SID 목록이 지정된 경우 SID 목록의 길이(바이트)입니다.

  • IrpSp->Parameters.QueryQuota.StartSid 는 반환된 정보가 첫 번째 항목이 아닌 항목으로 시작됨을 나타내는 SID에 대한 선택적 포인터입니다. SID 목록이 지정된 경우 이 매개 변수는 무시됩니다.

추가 정보

FILE_GET_QUOTA_INFORMATION

FILE_QUOTA_INFORMATION

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoCheckQuotaBufferValidity

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_SET_QUOTA