다음을 통해 공유


CcPinRead 함수(ntifs.h)

CcPinRead 루틴은 캐시된 파일의 지정된 바이트 범위를 고정하고 고정된 데이터를 메모리의 버퍼로 읽습니다.

통사론

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

매개 변수

[in] FileObject

데이터 범위를 고정할 캐시된 파일의 파일 개체에 대한 포인터입니다.

[in] FileOffset

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

[in] Length

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

[in] Flags

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

의미
PIN_WAIT 데이터가 고정될 때까지 호출자를 대기 상태로 전환할 수 있습니다.
PIN_EXCLUSIVE 버퍼 제어 블록(BCB)은 단독으로 획득해야 합니다. 이 플래그가 설정되면 PIN_WAIT 설정해야 합니다.
PIN_NO_READ 메모리에 이미 상주하는 페이지만 고정해야 합니다. 이 플래그가 설정되면 PIN_WAIT 설정해야 합니다.
PIN_IF_BCB BCB가 이미 있는 경우에만 데이터를 고정해야 합니다. 그렇지 않으면 핀이 실패하고 bcb NULL설정됩니다.

[out] Bcb

첫 번째 호출에서 BCB(버퍼 제어 블록)에 대한 포인터를 반환합니다. 이 포인터는 이 버퍼에 대한 모든 후속 호출에 대한 입력으로 제공되어야 합니다.

[out] Buffer

고정된 데이터를 포함하는 버퍼에 대한 포인터입니다.

반환 값

CcPinRead 캐시된 파일의 데이터가 고정되어 성공적으로 읽은 경우 TRUE 반환하고, 그렇지 않으면 FALSE .

발언

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

이후에 호출자가 CcPinRead읽은 데이터를 수정하는 경우 수정된 데이터가 결국 디스크에 기록되도록 CcSetDirtyPinnedData 호출해야 합니다.

CcPinRead 대한 모든 성공적인 호출은 CcUnpinData대한 후속 호출과 일치해야 합니다.

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

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

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

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

캐시된 파일에 대한 데이터를 매핑하려면 CcMapData 루틴을 사용합니다. 파일을 캐시하려면 CcInitializeCacheMap사용합니다.

요구 사항

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

참고 항목

ccInitializeCacheMap

CcMapData

CcPinMappedData

CcPreparePinWrite

CcSetDirtyPinnedData

CcUnpinData