Fungsi CcPinRead (ntifs.h)

Rutinitas CcPinRead menyematkan rentang byte yang ditentukan dari file yang di-cache dan membaca data yang disematkan ke dalam buffer dalam memori.

Sintaks

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

Parameter

[in] FileObject

Penunjuk ke objek file untuk file yang di-cache tempat rentang data akan disematkan.

[in] FileOffset

Penunjuk ke variabel yang menentukan offset byte awal dalam file yang di-cache tempat data yang diinginkan berada.

[in] Length

Panjang data yang diinginkan dalam byte.

[in] Flags

Bitmask bendera yang menentukan bagaimana operasi penyematan akan dilakukan. Kombinasi ORed dari satu atau beberapa nilai berikut:

Nilai Makna
PIN_WAIT Pemanggil dapat dimasukkan ke dalam status tunggu hingga data telah disematkan.
PIN_EXCLUSIVE Blok kontrol buffer (BCB) akan diperoleh secara eksklusif. Jika bendera ini diatur, PIN_WAIT juga harus diatur.
PIN_NO_READ Hanya halaman yang sudah berada dalam memori yang akan disematkan. Jika bendera ini diatur, PIN_WAIT juga harus diatur.
PIN_IF_BCB Data akan disematkan hanya jika BCB sudah ada. Jika tidak, pin gagal dan Bcb diatur ke NULL.

[out] Bcb

Pada panggilan pertama ini mengembalikan penunjuk ke blok kontrol buffer (BCB). Pointer ini harus disediakan sebagai input pada semua panggilan berikutnya untuk buffer ini.

[out] Buffer

Penunjuk ke buffer yang berisi data yang disematkan.

Mengembalikan nilai

CcPinRead mengembalikan TRUE jika data untuk file yang di-cache disematkan dan berhasil dibaca, FALSE jika tidak.

Keterangan

Jika bendera PIN_WAIT diatur, CcPinRead dijamin akan menyelesaikan permintaan penyematan dan mengembalikan TRUE. Jika halaman yang diperlukan dari file yang di-cache sudah berada dalam memori, data segera disematkan dan tidak ada pemblokiran yang terjadi. Jika ada halaman yang diperlukan bukan penduduk, penelepon dimasukkan ke dalam status tunggu sampai semua halaman yang diperlukan telah dibuat sebagai residen dan data dapat disematkan. Jika bendera PIN_WAIT tidak diatur, tetapi data tidak dapat segera disematkan, CcPinRead mengembalikan FALSE, dan nilai parameter outputnya tidak ada artinya.

Jika penelepon kemudian memodifikasi data yang dibaca oleh CcPinRead, pemanggil juga harus memanggil CcSetDirtyPinnedData sehingga data yang dimodifikasi pada akhirnya akan ditulis ke disk.

Setiap panggilan yang berhasil ke CcPinRead harus dicocokkan dengan panggilan berikutnya ke CcUnpinData.

Penunjuk yang dikembalikan dalam Buffer valid hingga CcUnpinData dipanggil. Jika CcPinMappedData dipanggil saat pointer ini masih valid, pointer tetap valid setelah panggilan ke CcPinMappedData (tetapi hanya sampai CcUnpinData dipanggil).

CcPinRead tidak dapat menyematkan data di seluruh batas tampilan di manajer cache. Manajer cache mengelola file dalam sistem dalam tampilan selaras 256 KB. (Ukuran tampilan manajer cache ditentukan oleh VACB_MAPPING_GRANULARITY konstanta yang ditentukan sistem, yang diatur ke 256 KB dalam ntifs.h.) Wilayah yang disematkan tidak dapat menjangkau lebih dari satu tampilan 256 KB. Oleh karena itu, wilayah terbesar yang dapat disematkan adalah 256 KB, dimulai dari offset selaras 256 KB dalam file.

Menyematkan rentang byte dalam file yang di-cache tidak memastikan bahwa halaman tetap berada dalam memori. Selama halaman disematkan, rentang byte dijamin untuk tetap dipetakan ke ruang alamat virtual cache sistem, tetapi manajer memori dapat mem-page out halaman fisik sesuai kebutuhan memori sistem.

Jika terjadi kegagalan, CcPinRead menimbulkan pengecualian status untuk kegagalan tertentu tersebut. Misalnya, jika kegagalan alokasi kumpulan terjadi, CcPinRead menimbulkan pengecualian STATUS_INSUFFICIENT_RESOURCES; jika terjadi kesalahan I/O, CcPinRead menaikkan pengecualian status kesalahan I/O. Oleh karena itu, untuk mendapatkan kontrol jika kegagalan terjadi, driver harus membungkus panggilan ke CcPinRead dalam pernyataan try-except atau try-finally .

Untuk memetakan data untuk file yang di-cache, gunakan rutinitas CcMapData . Untuk menyimpan file, gunakan CcInitializeCacheMap.

Persyaratan

Persyaratan Nilai
Target Platform Universal
Header ntifs.h (termasuk Ntifs.h)
Pustaka NtosKrnl.lib
DLL NtosKrnl.exe
IRQL < DISPATCH_LEVEL

Lihat juga

CcInitializeCacheMap

CcMapData

CcPinMappedData

CcPreparePinWrite

CcSetDirtyPinnedData

CcUnpinData