Почему в драйвере функция вызывается без указания параметров?

VOID DriverUnload(PDRIVER_OBJECT driver) {
UNREFERENCED_PARAMETER(driver);
printf("-- unloading\n");

for (DWORD i = 0; i < SWAPS.Length; ++i) {
    PSWAP s = (PSWAP)&SWAPS.Buffer[i];
    if (s->Swap && s->Original) {
        InterlockedExchangePointer(s->Swap, s->Original);
        printf("reverted %wZ swap\n", &s->Name);
    }
}
 printf("-- unloaded\n");
}

NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING registry_path)
{
  UNREFERENCED_PARAMETER(registry_path);
  driver->DriverUnload = DriverUnload;
  ...

Уже не первый рах вижу как вот так используют функции:driver->DriverUnload = DriverUnload; Как так можно,почему мы не указываем параметры в скобках?И как мы можем функцию типы void чему то присваивать?Что вообще происходит в этой строке?

P.s

typedef struct _DRIVER_OBJECT {
CSHORT Type;
CSHORT Size;
PDEVICE_OBJECT DeviceObject;
ULONG Flags;
PVOID DriverStart;
ULONG DriverSize;
PVOID DriverSection;
PDRIVER_EXTENSION DriverExtension;
UNICODE_STRING DriverName;
PUNICODE_STRING HardwareDatabase;
PFAST_IO_DISPATCH FastIoDispatch;
PDRIVER_INITIALIZE DriverInit;
PDRIVER_STARTIO DriverStartIo;
PDRIVER_UNLOAD DriverUnload;
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];

} DRIVER_OBJECT;
typedef struct _DRIVER_OBJECT* PDRIVER_OBJECT;

Ответы (1 шт):

Автор решения: HolyBlackCat

Здесь функция не вызывается. Она автоматически преобразуется к указателю на себя, и этот указатель записывается в переменную driver->DriverUnload.

→ Ссылка