註冊同步驅動程式通知
若要使用同步驅動程式通知,設備磁碟機會實作作業系統在動態新增處理器至硬體磁碟分割時所呼叫的回呼函式。 下列程式碼範例是這類回呼函式的原型:
// Prototype for the synchronous
// notification callback function
VOID
SyncProcessorCallback(
IN PVOID CallbackContext,
IN PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext,
IN PNTSTATUS OperationStatus
);
裝置驅動程式會藉由呼叫 KeRegisterProcessorChangeCallback 函式來註冊同步驅動程式通知。 設備磁碟機通常會從其DriverEntry函式內呼叫KeRegisterProcessorChangeCallback函式。 如果設備磁碟機指定KE_PROCESSOR_CHANGE_ADD_EXISTING旗標,除了將新的處理器新增至硬體磁碟分割時,還會針對目前存在於硬體分割區中的每個作用中處理器立即呼叫回呼函式。 下列程式碼範例示範如何註冊同步驅動程式通知:
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;
}
當設備磁碟機必須停止接收同步驅動程式通知時,例如卸載時,它必須呼叫 KeDeregisterProcessorChangeCallback 函式來取消註冊回呼函式。 設備磁碟機通常會從其Unload函式內呼叫KeDeregisterProcessorChangeCallback函式。 下列程式碼範例示範如何取消註冊回呼函式:
// The driver's Unload routine
VOID
Unload(
IN PDRIVER_OBJECT DriverObject
);
{
...
// Unregister the callback function
KeDeregisterProcessorChangeCallback(
CallbackRegistrationHandle
);
...
}