IRP_MN_REGINFO_EX
WMI envía este IRP para consultar o actualizar la información de registro de un controlador después de que el controlador haya llamado IoWMIRegistrationControl. Un controlador puede controlar los IRP de WMI llamando a WmiSystemControl o controlando el PROPIO IRP, como se describe en Control de solicitudes WMI.
Si un controlador llama a WmiSystemControl para controlar una solicitud de IRP_MN_REGINFO_EX , WMI a su vez llama a la rutina DpWmiQueryReginfo del controlador.
En Microsoft Windows XP y sistemas operativos posteriores, los controladores que admiten WMI deben controlar este IRP. Los controladores que admiten Microsoft Windows 98 y Windows 2000 también deben controlar IRP_MN_REGINFO.
Código principal
Cuándo se envió
En Windows XP y versiones posteriores, WMI envía este IRP para consultar o actualizar la información de registro de un controlador después de que el controlador haya llamado IoWMIRegistrationControl. En Windows 98 y Windows 2000, WMI envía la solicitud de IRP_MN_REGINFO en su lugar.
WMI envía este IRP en IRQL = PASSIVE_LEVEL en el contexto de un subproceso del sistema.
Parámetros de entrada
Parameters.WMI.ProviderId apunta al objeto de dispositivo del controlador que debe responder a la solicitud. Este puntero se encuentra en la ubicación de la pila de E/S del controlador en irP.
Parameters.WMI.DataPath se establece en WMIREGISTER para consultar la información de registro o WMIUPDATE para actualizarla.
Parameters.WMI.BufferSize indica el tamaño máximo del búfer no paginado en Parameters.WMI.Buffer. El tamaño debe ser mayor o igual que el total de (sizeof(WMIREGINFO) + (GuidCount * sizeof(WMIREGGUID)), donde GuidCount es el número de bloques de datos y bloques de eventos registrados por el controlador, más espacio para los nombres de instancia estáticos, si existe.
Parámetros de salida
Si el controlador controla los IRP de WMI mediante una llamada a WmiSystemControl, WMI obtiene información de registro de los bloques de datos de un controlador llamando a su rutina DpWmiQueryReginfo .
De lo contrario, el controlador rellena una estructura WMIREGINFO en Parameters.WMI.Buffer como se indica a continuación:
Establece BufferSize en el tamaño en bytes de la estructura WMIREGINFO más los datos de registro asociados.
Si el controlador controla las solicitudes WMI en nombre de otro controlador, establece NextWmiRegInfo en el desplazamiento en bytes desde el principio de este WMIREGINFO hasta el principio de otra estructura WMIREGINFO que contiene información de registro del otro controlador.
Establece RegistryPath en la ruta de acceso del Registro que se pasó a la rutina DriverEntry del controlador.
Si Parameters.WMI.Datapath está establecido en WMIREGISTER, establece MofResourceName en el desplazamiento desde el principio de este WMIREGINFO en una cadena Unicode contada que contiene el nombre del recurso MOF del controlador en su archivo de imagen.
Establece GuidCount en el número de bloques de datos y bloques de eventos que se van a registrar o actualizar.
Escribe una matriz de estructuras WMIREGGUID , una para cada bloque de datos o bloque de eventos expuesto por el controlador, en WmiRegGuid.
El controlador rellena cada estructura WMIREGGUID de la siguiente manera:
Establece Guid en el GUID que identifica el bloque.
Establece marcas para proporcionar información sobre los nombres de instancia y otras características del bloque. Por ejemplo, si un bloque se está registrando con nombres de instancia estáticos , el controlador establece Marcas con la marca WMIREG_FLAG_INSTANCE_XXX adecuada.
Si el bloque se está registrando con nombres de instancia estáticos, el controlador:
Establece InstanceCount en el número de instancias.
Establece uno de los siguientes miembros en un desplazamiento en bytes en datos de nombre de instancia estáticos para el bloque:
Si el controlador establece Flags con WMIREG_FLAG_INSTANCE_LIST, establece InstanceNameList en un desplazamiento en una lista de cadenas de nombre de instancia estáticas. WMI especifica instancias en solicitudes posteriores por índice en esta lista.
Si el controlador establece Flags con WMIREG_FLAG_INSTANCE_BASENAME, establece BaseNameOffset en un desplazamiento en una cadena de nombre base. WMI usa esta cadena para generar nombres de instancia estáticos para el bloque.
Si el controlador establece Flags con WMIREG_FLAG_INSTANCE_PDO, establece Pdo en un desplazamiento en un puntero al PDO pasado a la rutina AddDevice del controlador. WMI usa la ruta de acceso de la instancia de dispositivo del PDO para generar nombres de instancia estáticos para el bloque. Los controladores deben llamar a ObReferenceObject en el objeto de dispositivo físico pasado en Pdo. El sistema llamará automáticamente a ObDereferenceObject para desreferenciar el objeto; el controlador no debe hacerlo. (Los controladores que usan WmiSystemControl para controlar irP no necesitan llamar a ObReferenceObject. WMI lo hace automáticamente antes de llamar a la rutina DpWmiQueryReginfo del controlador).
Escribe las cadenas de nombre de instancia, la cadena de nombre base o un puntero al PDO en el desplazamiento indicado por InstanceNameList, BaseName o Pdo, respectivamente.
Si el controlador controla el registro WMI en nombre de otro controlador (como una miniclase o un controlador de minipuerto), rellena otra estructura WMIREGINFO con la información de registro del otro controlador y la escribe en NextWmiRegInfo en la estructura anterior.
Si el búfer de Parameters.WMI.Buffer es demasiado pequeño para recibir todos los datos, un controlador escribe el tamaño necesario en bytes como un ULONG en Parameters.WMI.Buffer y produce un error en el IRP y devuelve STATUS_BUFFER_TOO_SMALL.
Bloque de estado de entrada/salida
Si el controlador controla el IRP mediante una llamada a WmiSystemControl, WMI establece Irp-IoStatus.Status> e Irp-IoStatus.Information> en el bloque de estado de E/S.
De lo contrario, el controlador establece Irp-IoStatus.Status> en STATUS_SUCCESS o en un estado de error adecuado, como el siguiente:
STATUS_BUFFER_TOO_SMALL
Si se ejecuta correctamente, un controlador establece Irp-IoStatus.Information> en el número de bytes escritos en el búfer en Parameters.WMI.Buffer.
Operación
Si un controlador controla una solicitud de IRP_MN_REGINFO_EX , solo debe hacerlo si Parameters.WMI.ProviderId apunta al mismo objeto de dispositivo que el puntero que el controlador pasó a IoWMIRegistrationControl. De lo contrario, el controlador debe reenviar la solicitud al controlador inferior siguiente.
Antes de controlar la solicitud, el controlador debe comprobar Parameters.WMI.DataPath para determinar si WMI está consultando información de registro (WMIREGISTER) o solicitando una actualización (WMIUPDATE).
WMI envía este IRP con WMIREGISTER después de que un controlador llame a IoWMIRegistrationControl con WMIREG_ACTION_REGISTER o WMIREG_ACTION_REREGISTER. En respuesta, un controlador debe rellenar el búfer en Parameters.WMI.Buffer con lo siguiente:
Estructura WMIREGINFO que indica la ruta de acceso del registro del controlador, el nombre de su recurso MOF y el número de bloques que se van a registrar.
Una estructuraWMIREGGUID para cada bloque que se va a registrar. Si se va a registrar un bloque con nombres de instancia estáticos, el controlador establece la marca WMIREG_FLAG_INSTANCE_XXX adecuada en la estructura WMIREGGUID de ese bloque.
Cualquier cadena WMI debe generar nombres de instancia estáticos.
WMI envía este IRP con WMIUPDATE después de que un controlador llame a IoWmiRegistrationControl con WMIREG_ACTION_UPDATE_GUIDS. En respuesta, un controlador debe rellenar el búfer en Parameters.WMI.Buffer con una estructura WMIREGINFO de la siguiente manera:
Para quitar un bloque, el controlador establece WMIREG_FLAG_REMOVE_GUID en su estructura WMIREGGUID .
Para agregar o actualizar un bloque (por ejemplo, para cambiar sus nombres de instancia estáticos), el controlador borra WMIREG_FLAG_REMOVE_GUID y proporciona valores de registro nuevos o actualizados para el bloque.
Para registrar un bloque nuevo o existente con nombres de instancia estáticos, el controlador establece el WMIREG_FLAG_INSTANCE_XXX adecuado y proporciona las cadenas que WMI necesita para generar nombres de instancia estáticos.
Un controlador puede usar las mismas estructuras WMIREGINFO para quitar, agregar o actualizar bloques que usó inicialmente para registrar todos sus bloques, cambiando solo las marcas y los datos de los bloques que se van a actualizar. Si un WMIREGGUID de tal estructura WMIREGINFO coincide exactamente con el WMIREGGUID pasado por el controlador cuando registró por primera vez ese bloque, WMI omite el procesamiento implicado en la actualización del bloque.
WMI no envía una solicitud de IRP_MN_REGINFO_EX después de que un controlador llame a IoWMIRegistrationControl con WMIREG_ACTION_DEREGISTER, ya que WMI no requiere más información del controlador. Normalmente, un controlador anula el registro de sus bloques en respuesta a una solicitud de IRP_MN_REMOVE_DEVICE .
Requisitos
Encabezado |
Wdm.h (incluya Wdm.h, Ntddk.h o Ntifs.h) |