Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Beberapa driver harus memanipulasi objek yang diteruskan kepada mereka oleh penelepon atau harus menangani dua objek file secara bersamaan. Misalnya, driver modem mungkin menerima handel ke objek peristiwa, atau driver jaringan mungkin menerima handel ke dua objek file yang berbeda. Pengemudi harus memvalidasi penanganan ini. Karena mereka diteruskan oleh penelepon, dan bukan melalui manajer I/O, manajer I/O tidak dapat melakukan pemeriksaan validasi apa pun.
Misalnya, dalam cuplikan kode berikut, driver telah melewati handel AscInfo-AddressHandle>, tetapi belum memvalidasinya sebelum memanggil ObReferenceObjectByHandle:
//
// This handle is embedded in a buffered request.
//
status = ObReferenceObjectByHandle(
AscInfo->AddressHandle,
0,
NULL,
KernelMode,
&fileObject,
NULL);
if (NT_SUCCESS(status)) {
if ( (fileObject->DeviceObject == DeviceObject) &&
(fileObject->FsContext2 == TRANSPORT_SOCK) ) {
Meskipun panggilan ke ObReferenceObjectByHandle berhasil, kode gagal memastikan bahwa pointer yang dikembalikan mereferensikan objek file; ini mempercayai pemanggil untuk meneruskan informasi yang benar.
Bahkan jika semua parameter untuk panggilan ke ObReferenceObjectByHandle sudah benar, dan panggilan berhasil, driver masih bisa mendapatkan hasil yang tidak terduga jika objek file tidak ditujukan untuk drivernya. Dalam fragmen kode berikut, driver mengasumsikan bahwa panggilan yang berhasil mengembalikan penunjuk ke objek file yang diharapkan:
status = ObReferenceObjectByHandle (
AcpInfo->Handle,
0L,
DesiredAccess,
*IoFileObjectType,
Irp->RequestorMode,
(PVOID *)&AcpEndpointFileObject,
NULL);
if ( !NT_SUCCESS(status) ) {
goto complete;
}
AcpEndpoint = AcpEndpointFileObject->FsContext;
if ( AcpEndpoint->Type != BlockTypeEndpoint )
Meskipun ObReferenceObjectByHandle mengembalikan pointer ke objek file, driver tidak memiliki jaminan bahwa pointer mereferensikan objek file yang diharapkan. Dalam hal ini, driver harus memvalidasi pointer sebelum mengakses data khusus driver di AcpEndpointFileObject-FsContext>.
Untuk menghindari masalah tersebut, driver harus memeriksa data yang valid, sebagai berikut:
Periksa jenis objek untuk memastikan itu adalah apa yang diharapkan driver.
Pastikan bahwa akses yang diminta sesuai untuk jenis objek dan tugas yang diperlukan. Jika driver Anda melakukan salinan file yang cepat, misalnya, pastikan handle memiliki akses baca.
Pastikan untuk menentukan mode akses yang benar (UserMode atau KernelMode) dan bahwa mode akses kompatibel dengan akses yang diminta.
Jika driver mengharapkan handle ke objek file yang dibuat oleh driver itu sendiri, validasi handle tersebut terhadap objek perangkat atau driver itu. Namun, berhati-hatilah untuk tidak merusak filter yang mengirim permintaan I/O untuk perangkat aneh.
Jika driver Anda mendukung beberapa jenis objek file (seperti saluran kontrol, objek alamat, dan koneksi driver TDI atau Volume, Direktori, dan Objek file sistem file), pastikan Anda memiliki cara untuk membedakannya.