Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Para crear un objeto de dispositivo funcional (FDO) en el controlador de miniclase de batería y adjuntarlo a la pila de dispositivos, siga estos pasos:
Llame
IoCreateDevice
a para crear un FDO para el dispositivo actual:Status = IoCreateDevice( DriverObject, sizeof (DeviceExtension), NULL, FILE_DEVICE_BATTERY, 0, FALSE, &Fdo );
Los parámetros de entrada para IoCreateDevice son un puntero al objeto de controlador que se pasó a la rutina AddDevice , el tamaño de la extensión del dispositivo, NULL en lugar de un nombre de dispositivo y el tipo de dispositivo definido por el sistema (FILE_DEVICE_BATTERY). Los controladores de miniclase de batería pueden especificar cero para el parámetro DeviceCharacteristics , que es irrelevante para estos controladores. Más de un subproceso puede enviar solicitudes de E/S a la batería, por lo que el controlador de miniclase pasa FALSE como el parámetro Exclusive . IoCreateDevice devuelve un puntero al FDO creado.
Establezca marcas y el tamaño de la pila en el FDO devuelto:
Fdo->Flags |= DO_BUFFERED_IO; Fdo->Flags |= DO_POWER_PAGABLE; Fdo->StackSize = Pdo->StackSize + 2;
Establecer la marca DO_BUFFERED_IO permite que el controlador de miniclase use E/S almacenada en búfer para IRP. Establecer la marca DO_POWER_PAGABLE indica que el controlador es paginable y evita que obtenga IRP de energía en IRQL >= DISPATCH_LEVEL. Por último, dado que los IRP de batería requieren una ubicación de pila adicional, los controladores de miniclase deben establecer StackSize en el tamaño de pila PDO más dos, para que el controlador pueda pasar el IRP hacia abajo al PDO.
Almacene el puntero al PDO del dispositivo, el puntero al FDO, el tipo de dispositivo, el nombre del dispositivo y cualquier otro estado necesario en la extensión del dispositivo:
NewBatt = (PNEW_BATT) Fdo->DeviceExtension; NewBatt->Type = NEW_BATTERY_TYPE; NewBatt->Fdo = Fdo; NewBatt->Pdo = Pdo; NewBatt->IsCacheValid = FALSE;
En el ejemplo se almacenan los punteros a FDO y PDO en la extensión del dispositivo. (El Administrador de PnP proporcionó un puntero al PDO como entrada de puntero PhysicalDeviceObject a AddDevice). Además, el ejemplo anterior realiza un seguimiento de su propio tipo de batería (NEW_BATTERY_TYPE, definido en otro lugar de este controlador hipotético de miniclase) y si alguna información almacenada en caché es válida.
La información almacenada en la extensión de dispositivo se determina. Por ejemplo, un controlador de batería inteligente podría conservar el número de baterías, un valor booleano que indica si existe un selector de batería y, opcionalmente, información sobre ese selector de batería.
Llame
IoAttachDeviceToDeviceStack
a para asociar el FDO a la pila de dispositivos y almacenar el puntero devuelto:NewBatt->LowerDO = IoAttachDeviceToDeviceStack(Fdo,Pdo);
La llamada devuelve un puntero al objeto de dispositivo siguiente inferior, que este ejemplo almacena en la extensión del dispositivo.
Borre la marca DO_DEVICE_INITIALIZING en el FDO:
Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
Borrar la marca DO_DEVICE_INITIALIZING permite que los componentes superiores de la pila de dispositivos abran posteriormente el objeto de dispositivo.