IRP_MJ_DIRECTORY_CONTROL(FS 및 필터 드라이버)

보낸 경우

I/O 관리자, 기타 운영 체제 구성 요소 및 기타 커널 모드 드라이버는 IRP_MJ_DIRECTORY_CONTROL 요청을 보냅니다. 예를 들어 사용자 모드 애플리케이션이 ReadDirectoryChangesW 또는 FindNextVolumeMountPoint와 같은 Win32 함수를 호출했거나 커널 모드 구성 요소가 ZwQueryDirectoryFile 또는 ZwQueryDirectoryFileEx를 호출한 경우 전송할 수 있습니다.

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

파일 시스템 드라이버는 부 함수 코드를 검사 요청된 디렉터리 제어 작업을 결정해야 합니다. 다음은 유효한 부 함수 코드입니다.

코드 Description
IRP_MN_QUERY_DIRECTORY 디렉터리 쿼리 요청을 나타냅니다. 쿼리할 수 있는 정보 유형은 파일 시스템에 따라 다르지만 일반적으로 FileBothDirectoryInformation, FileDirectoryInformation, FileFullDirectoryInformation, FileIdBothDirectoryInformation, FileIdFullDirectoryInformation, FileNamesInformation, FileNamesInformation, FileObjectIdInformation, FileReparsePointInformation 값을 포함합니다.
IRP_MN_NOTIFY_CHANGE_DIRECTORY 디렉터리에 대한 변경 내용 알림 요청을 나타냅니다. 일반적으로 파일 시스템 드라이버는 이 요청을 즉시 충족하는 대신 프라이빗 큐에 IRP를 보유합니다. 디렉터리가 변경되면 파일 시스템 드라이버가 알림을 수행하고 큐를 제거하고 IRP를 완료합니다. 파일 시스템 드라이버는 FILE_NOTIFY_INFORMATION 구조의 정보를 반환합니다.
IRP_MN_NOTIFY_CHANGE_DIRECTORY_EX 디렉터리에 대한 변경 내용 알림 요청을 나타냅니다. 일반적으로 파일 시스템 드라이버는 이 요청을 즉시 충족하는 대신 프라이빗 큐에 IRP를 보유합니다. 디렉터리가 변경되면 파일 시스템 드라이버가 알림을 수행하고 큐를 제거하고 IRP를 완료합니다. 파일 시스템 드라이버는 지정된 IrpSp-Parameters.NotifyDirectoryEx.DirectoryNotifyInformationClass>에 따라 정보를 반환합니다.

참고

FileQuotaInformation 정보 클래스는 사용되지 않습니다. 대신 IRP_MJ_QUERY_QUOTA 사용해야 합니다.

파일 시스템 드라이버는 요청된 작업을 수행한 후 IRP를 완료해야 합니다.

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

필터 드라이버는 이 IRP를 스택의 다음 하위 드라이버로 전달해야 합니다.

매개 변수

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

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

  • Irp->ASSOCIATedIrp.SystemBuffer는 요청된 작업에 대한 최종 완료 상태 및 정보를 수신하는 IO_STATUS_BLOCK 구조를 가리킵니다.

  • Irp->UserBuffer 는 디렉터리의 내용에 대한 요청된 정보를 수신하는 호출자가 제공한 출력 버퍼를 가리킵니다.

  • IrpSp->FileObjectDeviceObject와 연결된 파일 개체를 가리킵니다.

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

  • IrpSp->플래그 는 IRP_MN_QUERY_DIRECTORY 다음 값 중 하나 이상으로 설정할 수 있습니다.

플래그 의미
SL_INDEX_SPECIFIED IrpSp-Parameters.QueryDirectory.FileIndex>에서 인덱스를 제공하는 디렉터리의 항목에서 검사를 시작합니다.
SL_RESTART_SCAN 디렉터리의 첫 번째 항목에서 검사를 시작합니다. 이 플래그가 설정되지 않은 경우 이전 IRP_MN_QUERY_DIRECTORY 요청에서 검사를 다시 시작합니다.
SL_RETURN_SINGLE_ENTRY 찾은 첫 번째 항목만 반환합니다.
SL_RETURN_ON_DISK_ENTRIES_ONLY 디렉터리 가상화 또는 Just-In-Time 확장을 수행하는 필터에 요청을 파일 시스템으로 전달하고 현재 디스크에 있는 항목을 반환하도록 지시합니다.

IRP_MN_NOTIFY_CHANGE_DIRECTORY 대해 다음 플래그를 설정할 수 있습니다.

플래그 의미
SL_WATCH_TREE 이 디렉터리의 모든 하위 디렉터리도 확인해야 하는 경우 TRUE 로 설정합니다. 디렉터리 자체만 감시할 경우 FALSE 로 설정합니다.
  • IrpSp->MajorFunction 은 IRP_MJ_DIRECTORY_CONTROL 설정됩니다.

  • IrpSp->MinorFunction은 다음 값 중 하나로 설정할 수 있습니다.

    • IRP_MN_QUERY_DIRECTORY
    • IRP_MN_NOTIFY_CHANGE_DIRECTORY
    • IRP_MN_NOTIFY_CHANGE_DIRECTORY_EX
  • IrpSp->Parameters.QueryDirectory.FileIndex 는 디렉터리 검사를 시작할 파일의 인덱스입니다. SL_INDEX_SPECIFIED 플래그가 설정되지 않은 경우 이 값은 무시됩니다. 이 매개 변수는 Win32 함수 또는 커널 모드 지원 루틴에서 지정할 수 없습니다. 현재는 32비트 NT 기반 플랫폼에만 존재하는 NT NTVDM(가상 DOS 머신)에서만 사용됩니다. 파일 인덱스는 부모 디렉터리 내의 파일 위치가 고정되지 않고 정렬 순서를 유지하기 위해 언제든지 변경할 수 있는 NTFS와 같은 파일 시스템에 대해 정의되지 않습니다.

  • IrpSp->Parameters.QueryDirectory.FileInformationClass 는 다음 값 중 하나로 설정됩니다.

    의미
    FileBothDirectoryInformation 각 파일에 대한 FILE_BOTH_DIR_INFORMATION 구조를 반환합니다.
    FileDirectoryInformation 각 파일에 대한 FILE_DIRECTORY_INFORMATION 구조를 반환합니다.
    FileFullDirectoryInformation 각 파일에 대한 FILE_FULL_DIR_INFORMATION" 구조를 반환합니다.
    FileIdBothDirectoryInformation 각 파일에 대한 FILE_ID_BOTH_DIR_INFORMATION 구조를 반환합니다.
    FileIdFullDirectoryInformation 각 파일에 대한 FILE_ID_FULL_DIR_INFORMATION 구조를 반환합니다.
    FileNamesInformation 각 파일에 대한 FILE_NAMES_INFORMATION 구조를 반환합니다.
    FileObjectIdInformation 각 파일에 대한 FILE_OBJECTID_INFORMATION 구조를 반환합니다.
    FileQuotaInformation 사용되지 않습니다. 대신 IRP_MJ_QUERY_QUOTA 사용합니다.
    FileReparsePointInformation 디렉터리에 대한 단일 FILE_REPARSE_POINT_INFORMATION 구조를 반환합니다.
  • IrpSp->Parameters.QueryDirectory.FileName 은 지정된 디렉터리 내에서 파일의 선택적 이름입니다.

  • IrpSp->Parameters.QueryDirectory.Length 는 Irp-UserBuffer가 가리키는 버퍼의 길이(바이트 )>입니다.

  • IrpSp->Parameters.NotifyDirectory.Length 는 Irp-UserBuffer가 가리키는 버퍼의 길이(바이트 )>입니다.

  • IrpSp->Parameters.NotifyDirectory.CompletionFilter: 자세한 내용은 FsRtlNotifyFullChangeDirectory에 대한 CompletionFilter 매개 변수에 대한 설명을 참조하세요.

  • IrpSp->Parameters.NotifyDirectoryEx.Length 는 Irp-UserBuffer가 가리키는 버퍼의 길이(바이트 )>입니다.

  • IrpSp->Parameters.NotifyDirectoryEx.CompletionFilter: 자세한 내용은 FsRtlNotifyFullChangeDirectory에 대한 CompletionFilter 매개 변수에 대한 설명을 참조하세요.

  • IrpSp->Parameters.NotifyDirectoryEx.DirectoryNotifyInformationClass 는 다음 값 중 하나입니다.

    의미
    DirectoryNotifyInformation 디렉터리 변경에 대한 FILE_NOTIFY_INFORMATION 구조를 반환합니다.
    DirectoryNotifyExtendedInformation 각 디렉터리 변경에 대한 FILE_NOTIFY_EXTENDED_INFORMATION 구조를 반환합니다.
    DirectoryNotifyFullInformation 각 디렉터리 변경에 대한 FILE_NOTIFY_FULL_INFORMATION 구조를 반환합니다.

추가 정보

FILE_BOTH_DIR_INFORMATION

FILE_DIRECTORY_INFORMATION

FILE_FULL_DIR_INFORMATION

FILE_ID_BOTH_DIR_INFORMATION

FILE_ID_FULL_DIR_INFORMATION

FILE_NAMES_INFORMATION

FILE_OBJECTID_INFORMATION

FILE_REPARSE_POINT_INFORMATION

FsRtlNotifyFullChangeDirectory

FILE_NOTIFY_INFORMATION

FILE_NOTIFY_EXTENDED_INFORMATION

FILE_NOTIFY_FULL_INFORMATION

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_QUERY_QUOTA

ZwQueryDirectoryFile

ZwQueryDirectoryFileEx