CcPrepareMdlWrite 함수(ntifs.h)

CcPrepareMdlWrite 루틴은 호출자가 파일에 데이터를 쓸 수 있도록 캐시된 파일 메모리에 대한 직접 액세스를 제공합니다.

구문

void CcPrepareMdlWrite(
  [in]  PFILE_OBJECT     FileObject,
  [in]  PLARGE_INTEGER   FileOffset,
  [in]  ULONG            Length,
  [out] PMDL             *MdlChain,
  [out] PIO_STATUS_BLOCK IoStatus
);

매개 변수

[in] FileObject

캐시된 파일의 파일 개체에 대한 포인터입니다.

[in] FileOffset

데이터를 쓸 캐시된 파일 내의 시작 바이트 오프셋을 지정하는 변수에 대한 포인터입니다.

[in] Length

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

[out] MdlChain

데이터를 쓸 페이지를 설명하는 하나 이상의 MDL(메모리 설명자 목록) 체인입니다.

[out] IoStatus

IO_STATUS_BLOCK 구조체에 대한 포인터입니다. CcPrepareMdlWrite 호출이 성공하면 IoStatus.Status가 STATUS_SUCCESS 설정됩니다. 그렇지 않으면 적절한 NTSTATUS 오류 코드로 설정됩니다. IoStatus.Information 는 MDL 체인에서 성공적으로 잠긴 실제 바이트 수로 설정됩니다.

반환 값

없음

설명

CcPrepareMdlWrite 는 데이터가 캐시된 파일에 복사되지 않는다는 점을 제외하고 CcCopyWrite와 유사합니다. 대신 시스템 캐시에서 덮어쓸 실제 페이지는 메모리에 잠기고 CcPrepareMdlWrite 는 지정된 바이트 범위를 설명하는 하나 이상의 MDL(메모리 설명자 목록)을 반환합니다. 이러한 페이지는 CcMdlWriteComplete 또는 CcMdlWriteAbort 가 호출될 때까지 메모리에 잠겨 있습니다. 따라서 CcPrepareMdlWrite 에 대한 각 호출 뒤에 CcMdlWriteComplete 또는 CcMdlWriteAbort를 호출해야 합니다.

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

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

오류가 발생하면 CcPrepareMdlWrite는 해당 특정 오류에 대한 상태 예외를 발생합니다. 예를 들어 풀 할당 오류가 발생하면 CcPrepareMdlWrite에서 STATUS_INSUFFICIENT_RESOURCES 예외가 발생합니다. I/O 오류가 발생하면 CcPrepareMdlWrite는 I/O 오류의 상태 예외를 발생합니다. 따라서 오류가 발생하는 경우 제어를 얻으려면 드라이버는 try-except 또는 try-finally 문에서 CcPrepareMdlWrite에 대한 호출을 래핑해야 합니다.

파일을 캐시하려면 CcInitializeCacheMap을 사용합니다.

요구 사항

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

추가 정보

CcCopyWrite

CcInitializeCacheMap

CcMdlWriteAbort

CcMdlWriteComplete

IoAllocateMdl

IoBuildPartialMdl

MmGetMdlByteCount

MmGetMdlByteOffset

MmGetMdlPfnArray

MmGetMdlVirtualAddress

MmGetSystemAddressForMdl

MmGetSystemAddressForMdlSafe

MmInitializeMdl

MmMapLockedPages

MmPrepareMdlForReuse

MmProbeAndLockPages

MmUnlockPages

MmUnmapLockedPages