Création d’un objet Device (plateforme de filtrage Windows)
Un pilote de légende doit créer un objet d’appareil avant de pouvoir inscrire ses légendes auprès du moteur de filtre. La façon dont un pilote de légende crée un objet d’appareil dépend si le pilote de légende est basé sur le modèle de pilote Windows (WDM) ou les frameworks de pilotes Windows (WDF).
pilotes de légende WDM-Based
Si un pilote de légende est basé sur WDM, il crée un objet d’appareil en appelant la fonction IoCreateDevice . Par exemple :
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;
}
pilotes de légende WDF-Based
Si un pilote de légende est basé sur WDF, il crée un objet d’appareil framework en appelant la fonction WdfDeviceCreate . Pour inscrire ses légendes auprès du moteur de filtre, un pilote de légende WDF doit obtenir un pointeur vers l’objet de périphérique WDM associé à l’objet d’appareil framework. Un pilote de légende WDF obtient un pointeur vers cet objet d’appareil WDM en appelant la fonction WdfDeviceWdmGetDeviceObject . Par exemple :
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;
}