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 또는
[out] Buffer
버퍼가 고정 해제되거나 해제될 때까지 유효한 원하는 데이터에 대한 포인터를 반환합니다.
반환 값
발언
ccPreparePinWrite
PIN_WAIT 플래그가 설정된 경우 CcPreparePinWrite 준비 요청을 완료하고 TRUE반환합니다. 모든 페이지를 즉시 준비할 수 있으면 차단이 발생하지 않습니다. 필요한 페이지가 상주하지 않으면 모든 필수 페이지가 상주하고 페이지를 준비할 수 있을 때까지 발신자가 대기 상태가 됩니다. PIN_WAIT 플래그가 설정되지 않았지만 모든 페이지를 즉시 준비할 수 없는 경우 ccPreparePinWrite FALSE반환하며 출력 매개 변수 값은 의미가 없습니다.
microsoft Windows Server 2003 SP1 이상 : PIN_CALLER_TRACKS_DIRTY_DATA 플래그는 파일 시스템에서 기록되었지만 읽지 않은 로그 파일을 관리하는 경우에 일반적으로 사용됩니다. 기존 파일 데이터는 덮어쓰여지고 읽지 않으므로 캐시 관리자는 디스크에서 파일 데이터의 실제 페이지에 오류가 발생하는 대신 0의 페이지를 반환할 수 있습니다. 이 플래그를 설정하면 캐시 관리자가 더티 페이지를 추적하지 않습니다. 호출자는 더티 페이지를 추적할 책임이 있습니다. CcPreparePinWrite 버퍼가 결국 디스크에 플러시되는 경우에만 이러한 방식으로 데이터를 고정하는 데만 사용해야 합니다. CcFlushCache 호출하여 버퍼를 디스크에 플러시하기 전에 호출자는 먼저 MmSetAddressRangeModified 호출하여 메모리 관리자에게 시스템 캐시 버퍼의 지정된 페이지가 더럽고 기록되어야 임을 알려야 합니다.
ccPreparePinWrite
Buffer 반환된 포인터는 CcUnpinData 호출될 때까지 유효합니다. 이 포인터가 유효한 동안 CcPinMappedData 호출되는 경우 CcPinMappedData 호출한 후에도 포인터가 유효한 상태로 유지됩니다(하지만 CcUnpinData 호출될 때까지만).
CcPreparePinWrite 캐시 관리자의 보기 경계를 넘어 데이터를 고정할 수 없습니다. 캐시 관리자는 256KB로 정렬된 보기로 시스템의 파일을 관리합니다. (캐시 관리자의 뷰 크기는 ntifs.h에서 256KB로 설정된 시스템 정의 상수 VACB_MAPPING_GRANULARITY 의해 지정됩니다. 고정된 영역은 둘 이상의 256KB 보기를 확장할 수 없습니다. 따라서 고정할 수 있는 가장 큰 영역은 파일의 256KB 정렬 오프셋부터 시작하여 256KB입니다.
캐시된 파일에 바이트 범위를 고정해도 페이지가 메모리에 남아 있는 것은 아닙니다. 페이지가 고정되어 있는 한 바이트 범위는 시스템 캐시 가상 주소 공간에 매핑된 상태를 유지하지만 메모리 관리자는 시스템의 메모리 요구 사항에 따라 실제 페이지를 페이징할 수 있습니다.
CcPreparePinWrite호출한 후에는 CcSetDirtyPinnedData 호출할 필요가 없습니다.
오류가 발생하면 ccPreparePinWrite
요구 사항
요구 | 값 |
---|---|
대상 플랫폼 | 보편적 |
헤더 | ntifs.h(Ntifs.h 포함) |
라이브러리 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL |
PASSIVE_LEVEL |
참고 항목
ccFlushCache
CcMapData
CcPinMappedData
CcPinRead
CcUnpinData