Mendaftar untuk Pemberitahuan Driver Sinkron
Untuk menggunakan pemberitahuan driver sinkron, driver perangkat menerapkan fungsi panggilan balik yang dipanggil sistem operasi saat Anda secara dinamis menambahkan prosesor baru ke partisi perangkat keras. Contoh kode berikut adalah prototipe untuk fungsi panggilan balik seperti itu:
// Prototype for the synchronous
// notification callback function
VOID
SyncProcessorCallback(
IN PVOID CallbackContext,
IN PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext,
IN PNTSTATUS OperationStatus
);
Driver perangkat mendaftar untuk pemberitahuan driver sinkron dengan memanggil fungsi KeRegisterProcessorChangeCallback . Driver perangkat biasanya memanggil fungsi KeRegisterProcessorChangeCallback dari dalam fungsi DriverEntry-nya . Jika driver perangkat menentukan bendera KE_PROCESSOR_CHANGE_ADD_EXISTING, fungsi panggilan balik segera dipanggil untuk setiap prosesor aktif yang saat ini ada di partisi perangkat keras, selain dipanggil ketika prosesor baru ditambahkan ke partisi perangkat keras. Contoh kode berikut menunjukkan cara mendaftar untuk pemberitahuan driver sinkron:
PVOID CallbackRegistrationHandle;
NTSTATUS CallbackStatus = STATUS_SUCCESS;
// The driver's DriverEntry routine
NTSTATUS DriverEntry(
PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath
)
{
...
// Register the callback function
CallbackRegistrationHandle =
KeRegisterProcessorChangeCallback(
SyncProcessorCallback,
&CallbackStatus,
KE_PROCESSOR_CHANGE_ADD_EXISTING
);
// Check the result
if (CallbackRegistrationHandle == NULL)
{
// Perform any necessary cleanup
...
// Check the callback status
if (CallbackStatus != STATUS_SUCCESS)
{
// Return the error status from the callback function
return CallbackStatus;
}
else
{
// Return a generic error status
return STATUS_UNSUCCESSFUL;
}
}
...
return STATUS_SUCCESS;
}
Ketika driver perangkat harus berhenti menerima pemberitahuan driver sinkron, seperti ketika sedang dibongkar, driver harus membatalkan pendaftaran fungsi panggilan balik dengan memanggil fungsi KeDeregisterProcessorChangeCallback . Driver perangkat biasanya memanggil fungsi KeDeregisterProcessorChangeCallback dari dalam fungsi Unload-nya . Contoh kode berikut menunjukkan cara membatalkan pendaftaran fungsi panggilan balik:
// The driver's Unload routine
VOID
Unload(
IN PDRIVER_OBJECT DriverObject
);
{
...
// Unregister the callback function
KeDeregisterProcessorChangeCallback(
CallbackRegistrationHandle
);
...
}