다음을 통해 공유


CcPreparePinWrite 함수(ntifs.h)

CcPreparePinWrite 루틴은 쓰기 액세스를 위해 캐시된 파일의 지정된 바이트 범위를 고정합니다.

통사론

BOOLEAN CcPreparePinWrite(
  [in]  PFILE_OBJECT   FileObject,
  [in]  PLARGE_INTEGER FileOffset,
  [in]  ULONG          Length,
  [in]  BOOLEAN        Zero,
  [in]  ULONG          Flags,
  [out] PVOID          *Bcb,
  [out] PVOID          *Buffer
);

매개 변수

[in] FileObject

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

[in] FileOffset

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

[in] Length

원하는 데이터의 길이(바이트)입니다.

[in] Zero

반환 시 버퍼를 0으로 설정하려면 TRUE 설정합니다. PIN_CALLER_TRACKS_DIRTY_DATA 플래그가 Flags 매개 변수에 설정된 경우 이 매개 변수는 무시됩니다.

[in] Flags

고정 작업을 수행하는 방법을 지정하는 플래그의 비트 마스크입니다. 다음 값 중 하나 이상의 ORed 조합:

의미
PIN_WAIT 데이터가 고정될 때까지 호출자를 대기 상태로 전환할 수 있습니다.
PIN_EXCLUSIVE 버퍼 제어 블록(BCB)은 단독으로 획득해야 합니다.
PIN_NO_READ 메모리에 이미 상주하는 페이지만 고정해야 합니다. 이 플래그가 설정되면 PIN_WAIT 설정해야 합니다.
PIN_IF_BCB BCB가 이미 있는 경우에만 데이터를 고정해야 합니다. 그렇지 않으면 핀이 실패하고 BCB가 반환되지 않습니다.
PIN_CALLER_TRACKS_DIRTY_DATA 호출자는 더티 페이지를 추적할 책임이 있습니다. 이 플래그를 설정하면 다른 모든 플래그가 무시됩니다. 이 플래그는 Microsoft Windows Server 2003 SP1 이상에서 사용할 수 있습니다.

[out] Bcb

고정된 버퍼 제어 블록(BCB)에 대한 불투명 포인터입니다. 이 포인터는 이 버퍼에 대해 CcPreparePinWrite 또는 CcUnpinData 후속 호출에 대한 입력으로 제공되어야 합니다.

[out] Buffer

버퍼가 고정 해제되거나 해제될 때까지 유효한 원하는 데이터에 대한 포인터를 반환합니다.

반환 값

CcPreparePinWrite 캐시된 파일이 성공적으로 고정된 경우 TRUE 반환하고, 그렇지 않으면 FALSE .

발언

ccPreparePinWrite 시스템 캐시에 지정된 파일 페이지를 고정합니다. 완전히 덮어쓸 페이지는 0 페이지로 만족할 수 있습니다.

PIN_WAIT 플래그가 설정된 경우 CcPreparePinWrite 준비 요청을 완료하고 TRUE반환합니다. 모든 페이지를 즉시 준비할 수 있으면 차단이 발생하지 않습니다. 필요한 페이지가 상주하지 않으면 모든 필수 페이지가 상주하고 페이지를 준비할 수 있을 때까지 발신자가 대기 상태가 됩니다. PIN_WAIT 플래그가 설정되지 않았지만 모든 페이지를 즉시 준비할 수 없는 경우 ccPreparePinWrite FALSE반환하며 출력 매개 변수 값은 의미가 없습니다.

microsoft Windows Server 2003 SP1 이상 : PIN_CALLER_TRACKS_DIRTY_DATA 플래그는 파일 시스템에서 기록되었지만 읽지 않은 로그 파일을 관리하는 경우에 일반적으로 사용됩니다. 기존 파일 데이터는 덮어쓰여지고 읽지 않으므로 캐시 관리자는 디스크에서 파일 데이터의 실제 페이지에 오류가 발생하는 대신 0의 페이지를 반환할 수 있습니다. 이 플래그를 설정하면 캐시 관리자가 더티 페이지를 추적하지 않습니다. 호출자는 더티 페이지를 추적할 책임이 있습니다. CcPreparePinWrite 버퍼가 결국 디스크에 플러시되는 경우에만 이러한 방식으로 데이터를 고정하는 데만 사용해야 합니다. CcFlushCache 호출하여 버퍼를 디스크에 플러시하기 전에 호출자는 먼저 MmSetAddressRangeModified 호출하여 메모리 관리자에게 시스템 캐시 버퍼의 지정된 페이지가 더럽고 기록되어야 임을 알려야 합니다.

ccPreparePinWrite 성공한 모든 호출은 CcUnpinData후속 호출과 일치해야 합니다. CcPreparePinWrite 동일한 데이터에 대해 여러 번 호출되는 경우 CcUnpinData 동일한 횟수만큼 호출해야 합니다.

Buffer 반환된 포인터는 CcUnpinData 호출될 때까지 유효합니다. 이 포인터가 유효한 동안 CcPinMappedData 호출되는 경우 CcPinMappedData 호출한 후에도 포인터가 유효한 상태로 유지됩니다(하지만 CcUnpinData 호출될 때까지만).

CcPreparePinWrite 캐시 관리자의 보기 경계를 넘어 데이터를 고정할 수 없습니다. 캐시 관리자는 256KB로 정렬된 보기로 시스템의 파일을 관리합니다. (캐시 관리자의 뷰 크기는 ntifs.h에서 256KB로 설정된 시스템 정의 상수 VACB_MAPPING_GRANULARITY 의해 지정됩니다. 고정된 영역은 둘 이상의 256KB 보기를 확장할 수 없습니다. 따라서 고정할 수 있는 가장 큰 영역은 파일의 256KB 정렬 오프셋부터 시작하여 256KB입니다.

캐시된 파일에 바이트 범위를 고정해도 페이지가 메모리에 남아 있는 것은 아닙니다. 페이지가 고정되어 있는 한 바이트 범위는 시스템 캐시 가상 주소 공간에 매핑된 상태를 유지하지만 메모리 관리자는 시스템의 메모리 요구 사항에 따라 실제 페이지를 페이징할 수 있습니다.

CcPreparePinWrite호출한 후에는 CcSetDirtyPinnedData 호출할 필요가 없습니다. CcPreparePinWrite true반환하는 경우 BCB는 이미 더티로 표시됩니다.

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

요구 사항

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

참고 항목

ccFlushCache

CcMapData

CcPinMappedData

CcPinRead

CcSetDirtyPinnedData

CcUnpinData

MmSetAddressRangeModified