Creazione di un oggetto Device (piattaforma di filtro di Windows)

Un driver di callout deve creare un oggetto dispositivo prima di poter registrare i callout con il motore di filtro. In che modo un driver di callout crea un oggetto dispositivo dipende dal fatto che il driver di callout sia basato sul modello di driver Windows (WDM) o windows Driver Frameworks (WDF).

driver di callout WDM-Based

Se un driver di callout si basa su WDM, crea un oggetto dispositivo chiamando la funzione IoCreateDevice . Ad esempio:

PDEVICE_OBJECT deviceObject;

NTSTATUS
 DriverEntry(
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath
    )
{
  NTSTATUS status;

  ...

  // Create a device object
 status =
 IoCreateDevice(
 DriverObject,
      0,
      NULL,
      FILE_DEVICE_UNKNOWN,
      FILE_DEVICE_SECURE_OPEN,
      FALSE,
      &deviceObject
      );

  ...

 return status;
}

driver di callout WDF-Based

Se un driver di callout si basa su WDF, crea un oggetto dispositivo framework chiamando la funzione WdfDeviceCreate . Per registrare i callout con il motore di filtro, un driver di callout basato su WDF deve ottenere un puntatore all'oggetto dispositivo WDM associato all'oggetto dispositivo framework. Un driver di callout basato su WDF ottiene un puntatore a questo oggetto dispositivo WDM chiamando la funzione WdfDeviceWdmGetDeviceObject . Ad esempio:

WDFDEVICE wdfDevice;

NTSTATUS
 DriverEntry(
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath
    )
{
  WDFDRIVER driver;
  PWDFDEVICE_INIT deviceInit;
  PDEVICE_OBJECT deviceObject;
  NTSTATUS status;

  ...

  // Allocate a device initialization structure
 deviceInit =
 WdfControlDeviceInitAllocate(
    driver;
    &SDDL_DEVOBJ_KERNEL_ONLY
    );

  // Set the device characteristics
 WdfDeviceInitSetCharacteristics(
    deviceInit,
    FILE_DEVICE_SECURE_OPEN,
    FALSE
    );

  // Create a framework device object
 status =
 WdfDeviceCreate(
    &deviceInit,
    WDF_NO_OBJECT_ATTRIBUTES,
    &wdfDevice
    );

  // Check status
 if (status == STATUS_SUCCESS) {

    // Initialization of the framework device object is complete
    WdfControlFinishInitializing(
      wdfDevice
    );

    // Get the associated WDM device object
    deviceObject = WdfDeviceWdmGetDeviceObject(wdfDevice);
  }

  ...

 return status;
}