Detección de daños en la memoria del grupo especial en el Comprobador de controladores

Daños en la memoria es un problema de controlador común. Los errores del controlador pueden provocar bloqueos mucho después de que se realicen los errores. El más común de estos errores es acceder a la memoria que ya se ha liberado, y asignar n bytes y, a continuación, acceder a n+1 bytes.

Para detectar daños en la memoria, el Comprobador de controladores puede asignar memoria del controlador desde un grupo especial y supervisar ese grupo para obtener acceso incorrecto. Se proporciona compatibilidad especial con grupos para rutinas proporcionadas por el sistema en modo kernel, como ExAllocatePoolWithTag y también para las rutinas proporcionadas por el sistema GDI, como EngAllocMem.

Grupo especial por alineaciones

Hay disponibles dos alineaciones del grupo especial:

  • La alineación Comprobar inicio es mejor para detectar las infraejecutaciones de acceso.
  • La alineación Comprobar finalización es mejor para detectar saturaciones de acceso.

Para obtener más información sobre cómo usar las opciones Comprobar inicio y Comprobar fin , vea Detección de saturaciones y subejecutaciones. Tenga en cuenta que la gran mayoría de los daños en la memoria se deben a saturaciones, no a las infraejecutaciones.

Cuando la característica Grupo especial está activa y se ha seleccionado Comprobar el final , cada asignación de memoria solicitada por el controlador se coloca en una página independiente. Se devuelve la dirección más alta posible que permite que la asignación se ajuste a la página, de modo que la memoria se alinee con el final de la página. La parte anterior de la página se escribe con patrones especiales. La página anterior y la página siguiente están marcadas como inaccesibles.

Si el controlador intenta acceder a la memoria después del final de la asignación, el Comprobador de controladores lo detectará inmediatamente y emitirá la comprobación de errores 0xCD. Si el controlador escribe en la memoria antes del principio del búfer, esto modificará (probablemente) los patrones. Cuando se libere el búfer, el Comprobador de controladores detectará la alteración y emitirá la comprobación de errores 0xC1.

Si el controlador lee o escribe en el búfer después de liberarlo, el comprobador de controladores emitirá la comprobación de errores 0xCC.

Cuando se selecciona Comprobar inicio , el búfer de memoria se alinea con el principio de la página. Con esta configuración, las subejecuciones provocan una comprobación de errores inmediata y las saturaciones provocan una comprobación de errores cuando se libera la memoria. De lo contrario, esta opción es idéntica a la opción Comprobar fin .

Compruebe que End es la alineación predeterminada, ya que los errores de saturación son mucho más comunes en los controladores que los errores de ejecución insuficiente.

Una asignación de memoria individual puede invalidar esta configuración y elegir su alineación llamando a ExAllocatePoolWithTagPriority con el parámetro Priority establecido en XxxSpecialPoolOverrun o XxxSpecialPoolUnderrun. (Esta rutina no puede activar ni desactivar la característica Grupo especial, ni solicitar el grupo especial para una asignación de memoria, que de lo contrario se asignaría desde el grupo normal. Solo se puede controlar la alineación desde esta rutina).

En Windows 7 y versiones posteriores del sistema operativo Windows, la opción Grupo especial admite memoria asignada mediante las siguientes API de kernel:

Grupo especial por etiqueta de grupo o tamaño de asignación

Además de la característica Grupo especial del Comprobador de controladores, que solicita un grupo especial para las asignaciones de un controlador especificado, hay otras dos maneras de usar el grupo especial:

  • Etiqueta de grupo. Solicite un grupo especial para todas las asignaciones con una etiqueta de grupo especificada.

  • Tamaño Solicite un grupo especial para todas las asignaciones dentro de un intervalo de tamaño especificado.

Para solicitar un grupo especial para una etiqueta o intervalo de tamaño de grupo, use Gflags, una herramienta incluida en Herramientas de depuración para Windows. Para obtener más información, consulte Uso de la utilidad Global Flags.

Puede usar la característica Grupo Especial del Comprobador de controladores y las características de grupo especiales de Gflags al mismo tiempo. Si lo hace, recuerde que el grupo especial está limitado, que no todos los intentos de asignación del grupo especial se realizan correctamente y que Windows devuelve un estado correcto para los intentos fallidos de asignar desde un grupo especial que se cumplen mediante asignaciones de los grupos de memoria normales.

Eficiencia especial del grupo

No se cumplen todas las solicitudes de grupo especiales. Cada asignación del grupo especial usa una página de memoria física no paginable y dos páginas del espacio de direcciones virtuales. Si se agota el grupo, la memoria se asigna de forma estándar hasta que el grupo especial vuelva a estar disponible. Cuando se rellena una solicitud de grupo especial desde el grupo estándar, la función solicitante no devuelve un error, ya que la solicitud del grupo se ha realizado correctamente. Por lo tanto, no se recomienda comprobar varios controladores al mismo tiempo si se activa la característica Grupo especial.

Un único controlador que realiza muchas solicitudes de memoria pequeñas también puede agotar este grupo. Si esto ocurre, puede ser preferible asignar etiquetas de grupo a las asignaciones de memoria del controlador y dedicar el grupo especial a una etiqueta de grupo a la vez.

El tamaño del grupo especial aumenta con la cantidad de memoria física en el sistema; idealmente, debe ser al menos 1 Gigabyte (GB). En las máquinas x86, dado que se consume espacio virtual (además de físico), no use la opción de arranque /3GB . También es una buena idea aumentar las cantidades mínimas o máximas del archivo de páginas por un factor de dos o tres.

Para asegurarse de que se están probando todas las asignaciones de un controlador, se recomienda hacer hincapié en el controlador durante largos períodos de tiempo.

Supervisión del grupo especial

Se pueden supervisar las estadísticas relacionadas con las asignaciones de grupos. Puede mostrarlos el Administrador de comprobadores de controladores, la línea de comandos Verifier.exe o en un archivo de registro. Consulte Supervisión de contadores globales para obtener más información.

Si el contador Asignaciones de grupo se realizó correctamente en grupo especial es igual al contador Asignaciones de grupo correctos , el grupo especial ha sido suficiente para cubrir todas las asignaciones de memoria. Si el contador anterior es inferior al segundo, el grupo especial se ha agotado al menos una vez.

Estos contadores no realizan un seguimiento de las asignaciones cuyo tamaño es una página o mayor, ya que el grupo especial no es aplicable a ellas.

Si la característica Grupo especial está habilitada, pero se ha asignado menos del 95 % de todas las asignaciones de grupo desde el grupo especial, aparecerá una advertencia en el Administrador de comprobadores de controladores. En Windows 2000, esta advertencia aparecerá en la pantalla Estado del controlador . En Windows XP y versiones posteriores, esta advertencia aparecerá en la pantalla Contadores globales . Si esto ocurre, debe comprobar una lista más corta de controladores, comprobar grupos individuales por etiqueta de grupo o agregar más memoria física al sistema.

La extensión del depurador de kernel !comprobador también se puede usar para supervisar el uso del grupo especial. Presenta información similar a la del Administrador de comprobadores de controladores. Para obtener información sobre las extensiones del depurador, vea Depuración de Windows.

Activación de la opción de grupo especial

Puede activar la característica Grupo especial para uno o varios controladores mediante el Administrador de comprobadores de controladores o la línea de comandos Verifier.exe. Para obtener más información, vea Seleccionar opciones del comprobador de controladores.

Nota

Para activar la característica Grupo especial por etiqueta de grupo o tamaño de asignación, o para establecer las alineaciones Comprobar inicio (detectar subejecutaciones) y Comprobar fin (detectar saturaciones), use la utilidad Marcas globales; esta configuración de alineación se aplica a todas las asignaciones de grupos especiales.

  • En la línea de comandos

    En la línea de comandos, la opción Grupo especial se representa mediante bit 0 (0x1). Para activar grupo especial, use un valor de marca de 0x1 o agregue 0x1 al valor de marca. Por ejemplo:

    verifier /flags 0x1 /driver MyDriver.sys
    

    La característica estará activa después del siguiente arranque.

    También puede activar y desactivar el grupo especial sin reiniciar el equipo agregando el parámetro /volatile al comando. Por ejemplo:

    verifier /volatile /flags 0x1 /adddriver MyDriver.sys
    

    Esta configuración es efectiva inmediatamente, pero se pierde al apagar o reiniciar el equipo. Para obtener más información, consulte Uso de la configuración volátil.

    La característica Grupo especial también se incluye en la configuración estándar. Por ejemplo:

    verifier /standard /driver MyDriver.sys
    
  • Uso del Administrador de comprobadores de controladores

    1. Seleccione Crear configuración personalizada (para desarrolladores de código) y haga clic en Siguiente.
    2. Seleccione Seleccionar configuración individual en una lista completa.
    3. Seleccione (comprobar) Grupo especial.

    La característica Grupo especial también se incluye en la configuración estándar. Para usar esta característica, en el Administrador de comprobadores de controladores, haga clic en Crear configuración estándar.