다음을 통해 공유


FsRtlPrepareMdlWriteDev 함수(ntifs.h)

FsRtlPrepareMdlWriteDev 루틴은 캐시에 직접 데이터를 쓰기 위해 캐시된 파일 데이터의 지정된 범위를 가리키는 연결된 MDL(메모리 설명자 목록) 목록을 반환합니다.

통사론

BOOLEAN FsRtlPrepareMdlWriteDev(
  [in]             PFILE_OBJECT     FileObject,
  [in]             PLARGE_INTEGER   FileOffset,
  [in]             ULONG            Length,
  [in]             ULONG            LockKey,
  [out]            PMDL             *MdlChain,
  [out]            PIO_STATUS_BLOCK IoStatus,
  [ in, optional ] PDEVICE_OBJECT   DeviceObject
);

매개 변수

[in] FileObject

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

[in] FileOffset

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

[in] Length

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

[in] LockKey

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

[out] MdlChain

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

[out] IoStatus

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

[ in, optional ] DeviceObject

파일이 열려 있는 디바이스 개체에 대한 포인터입니다.

반환 값

FsRtlPrepareMdlWriteDev 루틴은 작업이 성공하면 TRUE 반환하고 작업이 실패하면 FALSE .

발언

FsRtlPrepareMdlWriteDevFsRtlCopyWrite비슷합니다. 단, FsRtlPrepareMdlWriteDev 캐시에 데이터를 복사하지 않습니다. 대신 호출자가 덮어쓰는 실제 페이지는 메모리에 잠기고 FsRtlPrepareMdlWriteDev 지정된 바이트 범위를 가리키는 하나 이상의 MDL(메모리 설명자 목록)을 반환합니다. 잠긴 페이지는 호출자가 FsRtlMdlWriteCompleteDev호출할 때까지 잠겨 있습니다.

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

FsRtlPrepareMdlWriteDev 호출에 실패하더라도 하나 이상의 MDL이 할당되었을 수 있습니다. 호출자는 IoStatus.Information 값을 검사하여 이 문제가 발생했는지 확인할 수 있습니다. 있는 경우 호출자는 FsRtlMdlWriteCompleteDev 호출하여 할당된 MDL을 해제해야 합니다.

요구 사항

요구
대상 플랫폼 보편적
헤더 ntifs.h(Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL

참고 항목

FsRtlMdlWriteCompleteDev

FsRtlCopyWrite

MmGetSystemAddressForMdlSafe