Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Gdy system operacyjny wywołuje zarejestrowaną funkcję wywołania zwrotnego, przekazuje wskaźnik do struktury DEVICE_INTERFACE_CHANGE_NOTIFICATION w parametrze NotificationStructure .
Poniższy przykład kodu przedstawia implementację funkcji wywołania zwrotnego, która przetwarza asynchroniczne powiadomienia sterowników dla procesorów:
// Asynchronous processor notification callback function
NTSTATUS
AsyncProcessorCallback(
IN PVOID NotificationStructure,
IN PVOID Context
)
{
PDEVICE_INTERFACE_CHANGE_NOTIFICATION Notification;
ULONG ProcessorCount;
KAFFINITY ActiveProcessors;
Notification =
(PDEVICE_INTERFACE_CHANGE_NOTIFICATION)
NotificationStructure;
// Verify that this notification is about a processor
// that is being added to the hardware partition.
if (IsEqualGUID(
&Notification->Event,
&GUID_DEVICE_INTERFACE_ARRIVAL
))
{
// Get the current processor count and affinity
ProcessorCount =
KeQueryActiveProcessorCount(
&ActiveProcessors
);
// Adjust any resource allocations that are based
// on the number of processors.
...
// Adjust the assignment of resources that are
// assigned to specific processors.
...
// Begin scheduling any per processor threads
// on the new processor.
...
// Adjust the scheduling of DPCs and other threads
...
// Adjust any load balancing algorithms
...
}
// Always return success status
return STATUS_SUCCESS;
}
Poniższy przykład kodu przedstawia implementację funkcji wywołania zwrotnego, która przetwarza asynchroniczne powiadomienia sterowników dla pamięci:
// Asynchronous memory notification callback function
NTSTATUS
AsyncMemoryCallback(
IN PVOID NotificationStructure,
IN PVOID Context
)
{
PDEVICE_INTERFACE_CHANGE_NOTIFICATION Notification;
Notification =
(PDEVICE_INTERFACE_CHANGE_NOTIFICATION)
NotificationStructure;
// Verify that this notification is about memory
// that is being added to the hardware partition.
if (IsEqualGUID(
&Notification->Event,
&GUID_DEVICE_INTERFACE_ARRIVAL
))
{
// Increase the size of any memory buffers
// for optimal performance of the driver.
...
}
// Always return success status
return STATUS_SUCCESS;
}