FsRtlPrepareMdlWriteEx 함수(ntifs.h)

FsRtlPrepareMdlWriteEx 루틴은 캐시에 직접 데이터를 쓸 캐시된 파일 데이터의 지정된 범위를 가리키는 MDL(메모리 설명자 목록)의 연결된 목록을 반환합니다. 쓰기에 대한 캐시 지원을 사용할 수 없는 경우 루틴은 IRP 기반 MDL 쓰기 작업으로 되돌아갑니다.

구문

NTSTATUS FsRtlPrepareMdlWriteEx(
  [in]  PFILE_OBJECT     FileObject,
  [in]  PLARGE_INTEGER   FileOffset,
  [in]  ULONG            Length,
  [in]  ULONG            LockKey,
  [out] PMDL             *MdlChain,
  [out] PIO_STATUS_BLOCK IoStatus
);

매개 변수

[in] FileObject

파일 개체에 대한 포인터입니다.

[in] FileOffset

데이터를 보유하는 캐시 내의 시작 바이트 오프셋을 지정하는 값에 대한 포인터입니다.

[in] Length

캐시에 쓸 데이터의 길이(바이트)입니다.

[in] LockKey

잠글 바이트 범위와 연결된 값입니다. 잠금할 범위가 비클러스터적 잠금으로 이미 잠겨 있는 다른 범위와 겹치거나 읽을 범위가 이미 비결정적으로 잠겨 있는 다른 범위의 하위 범위인 경우 이 매개 변수의 값은 해당 존재하지 않는 잠금의 키여야 합니다. 잠금은 호출 스레드의 부모 프로세스에 의해 유지되어야 합니다. 그렇지 않으면 이 매개 변수가 적용되지 않습니다.

[out] MdlChain

출력에서 캐시된 데이터 내의 바이트 범위를 가리키는 MDL(메모리 설명자 목록)의 연결된 목록에 대한 포인터입니다.

[out] IoStatus

출력에서 전송의 상태 포함하는 IO_STATUS_BLOCK 구조체에 대한 포인터입니다. 작업이 성공하면 IoStatus.StatusSTATUS_SUCCESS 설정됩니다. 그렇지 않으면 적절한 NTSTATUS 오류 코드로 설정됩니다. IoStatus.Information 는 루틴이 성공적으로 잠근 실제 바이트 수로 설정됩니다.

반환 값

FsRtlPrepareMdlWriteExSTATUS_SUCCESS 또는 다음 중 하나와 같은 적절한 NTSTATUS 값을 반환합니다.

반환 코드 설명
STATUS_INSUFFICIENT_RESOURCES
IRP 기반 쓰기에 대한 IRP를 할당할 수 없습니다.

설명

파일 시스템에 빠른 I/O를 사용할 수 있는 경우 FsRtlPrepareMdlWriteEx 루틴은 일반적인 IRP 쓰기 메커니즘을 무시하고 호출자가 파일 캐시에 직접 데이터를 쓰는 데 사용할 수 있는 MDL(메모리 설명자 목록)의 연결된 목록을 반환합니다. 버퍼링된 데이터를 캐시에 복사하는 대신 호출자가 덮어쓸 실제 페이지는 메모리에 잠겨 있으며 직접 쓸 수 있습니다. FsRtlPrepareMdlWriteEx 는 지정된 바이트 범위를 가리키는 하나 이상의 MDL(메모리 설명자 목록)을 반환합니다.

빠른 I/O를 사용하도록 설정하지 않으면 FsRtlPrepareMdlWriteEx 는 동기 IRP 기반 MDL 쓰기 준비를 생성하고 요청에서 할당된 MDL을 반환합니다.

MDL이 가리키는 페이지는 메모리에 잠겨 있지만 시스템 공간에 매핑되지 않습니다. 호출자는 MmGetSystemAddressForMdlSafe를 호출하여 이 매핑을 수행할 수 있습니다.

FsRtlPrepareMdlWriteEx에 대한 각 호출 뒤에 CcMdlWriteComplete를 호출해야 합니다.

요구 사항

요구 사항
대상 플랫폼 유니버설
헤더 ntifs.h(Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL

추가 정보

CcMdlWriteComplete

CcPrepareMdlWrite

MmGetSystemAddressForMdlSafe