¿Cómo consumir eventos ETW en tiempo real del proveedor Microsoft-Windows-NDIS-PacketCapture?
network-programming (4)
La pregunta más importante es cómo consumir los eventos de la pila de red ETW en tiempo real en general, pero estoy particularmente interesado en el proveedor de Microsoft-Windows-NDIS-PacketCapture . Todos los demás proveedores de la pila de red funcionan parcialmente, pero el NDIS-PacketCapture (NDIS-PC) no funciona del todo, así que esta es probablemente la pregunta más simple que puedo hacer aquí.
Estoy usando el siguiente código como base y modificado muy poco para que funcione en tiempo real: http://msdn.microsoft.com/en-us/library/windows/desktop/ee441325(v=vs.85) .aspx
Los cambios que he hecho son:
Llame a StartTrace para iniciar la sesión de NDIS-PC antes de hacer cualquier otra cosa. En la propiedad struct EVENT_TRACE_PROPERTIES, estableciendo LogFileMode = EVENT_TRACE_REAL_TIME_MODE, LogFileNameOffset = 0 y Wnode.Guid = algo GUID aleatorio que inventé.
Estado de llamada = EnableTraceEx2 (hSession, & Current_Guid, EVENT_CONTROL_CODE_ENABLE_PROVIDER, TRACE_LEVEL_VERBOSE, 0, 0, 0, NULL); donde hSession es la sesión comenzó a usar StartTrace y y Current_Guid es
{0x2ED6006E, 0x4729,0x4609, {0xB4,0x23,0x3E, 0xE7,0xBC, 0xD6,0x78,0xEF}};
Luego, se llama a OpenTrace con LoggerName = una cadena ancha, LogFileName = NULL y LogFileMode = EVENT_TRACE_REAL_TIME_MODE;
Finalmente, llame a ProcessTrace en el identificador de seguimiento que se acaba de abrir.
De nuevo, dejando todo lo demás igual que el proporcionado en el ejemplo de MSDN
El uso del código idéntico con un solo cambio del proveedor a cualquier otra cosa, como Microsoft-Windows-Winsock-AFD o Microsoft-Windows-TCPIP, me permite realizar llamadas a la devolución de llamada que había definido (sin embargo, todavía no puedo recuperar las propiedades, pero no voy a profundizar aún más para mantener este problema tan simple como pueda). Cuando uso NDIS-PC, obtengo 0 devoluciones de llamada. Intenté enjuagar manualmente con ControlTrace sin éxito. También intenté definir "EventCallback" en lugar de "EventRecordCallback" sin éxito.
He analizado TODAS las estructuras de datos involucradas en este proceso y las comparé entre cada proveedor, y todas se veían correctas e iguales. He revisado todos los valores devueltos por las funciones y las estructuras de datos devueltos, y también tienen el mismo aspecto entre los proveedores que he probado.
He visto las propiedades de la sesión llamando a "logman" My Trace Session 04 "-ets" y parece idéntica para NDIS-PC y TCPIP:
C: / windows / system32> logman "My Trace Session 04" -ets
Nombre: My Trace Session 04 Estado:
Ejecución de la ruta de acceso raíz:% systemdrive% / PerfLogs / Admin Segment:
Off Schedules: enNombre: My Trace Session 04 / My Trace Session 04 Tipo:
Trace Append: Off Circular: Off Overwrite:
Desactivado Tamaño del búfer: 64 búferes perdidos: 0 búferes escritos: 0 Temporizador de descarga del búfer: 1 Tipo de reloj: Modo de archivo de rendimiento: en tiempo realProveedor: Nombre: Guía del proveedor Microsoft-Windows-NDIS-PacketCapture: {2ED6006E-4729-4609-B423-3EE7BCD678EF} Nivel:
5 (ganar: detallado) Palabras claveTodo: 0x0 Palabras clave:
0xffffffffffffffff (Ethernet802.3, WirelessWAN, Tunnel, Nativ e802.11, PacketStart, PacketEnd, ut: SendPath, ut: ReceivePath, ut: L3ConnectPath, ut: L2C onnectPath, ut: ClosePath, ut: Autenticación, ut: Configuración, ut: Global, ut: descartado, ut: PiiPresent, ut: paquete, ut: dirección, ut: StdTemplateHint, ut: StateTransition, win: Res ponseTime, Microsoft-Windows-NDIS-PacketCapture / Diagnostic, 0x2,0x4,0x8,0x10,0x20 , 0x40,0x80,0x100,0x400,0x800,0x1000,0x2000,0x4000,0x20000,0x40000,0x80000,0x10000 0,0x200000,0x400000,0x800000,0x1000000,0x2000000,0x4000000,0x8000000,0x10000000, 0x20000000,0x400000000000,0x800000000000,0x2000000000000, 0x4000000000000,0x80000 00000000,0x10000000000000,0x20000000000000,0x40000000000000,0x80000000000000,0x1 00000000000000,0x200000000000000,0x400000000000000,0x800000000000000,0x100000000 0000000,0x2000000000000000,0x4000000000000000) Propiedades: 0 Tipo de filtro: 0El comando se completó con éxito.
También intenté iniciar las sesiones manualmente usando logman y simplemente abriéndolo en código para procesarlo, pero tampoco me funcionó. También intenté escribir en un archivo ETL y tampoco funciona. Hay muchas más cosas que he intentado pero nada está funcionando.
He devorado todo en Internets que tenía que ver con el consumo de ETW en tiempo real (MSDN, búsqueda de Google, Stackoverflow, etc.) y no he visto un solo ejemplo completo de consumos de eventos ETW en tiempo real . Todos los ejemplos muestran el consumo de eventos desde un archivo ETL o la exportación de eventos grabados a un archivo ETL y luego dice que realice algunos cambios de parámetros para que funcione el consumo en tiempo real. Creo que los cambios de código que resumí anteriormente reflejan esos cambios.
Estoy en Win7 Ultimate usando VS2010 SP1 creando una aplicación de consola de 32 bits. También intenté crear aplicaciones de 64 bits sin ninguna mejora.
Follwing dos publicaciones son relevantes pero no hicieron ninguna diferencia para mí cuando intenté / forcé. En modo de tiempo real, el código copia el nombre de la sesión al final de la estructura de la propiedad y el desplazamiento del archivo de registro debe ser 0 de todos modos. No creo que tenga problemas de alineación ya que todos los demás proveedores funcionan bien:
Windows ETW: el consumidor Kernel no recibe eventos EventCallback o BufferCallback Windows ETW: StartTrace falla con el error 87 (ERROR_INVALID_PARAMETER)
Siento que me falta algo pequeño y trivial, y esto debería funcionar. Agradecería cualquier ayuda.
Aquí hay una aplicación de ejemplo c ++ comentada que muestra sesiones ETW simultáneas en tiempo real para la captura de paquetes y eventos del kernel.
En lugar de ejecutar netsh trace start, etc. podrías probar esto:
net start ndiscap
Cuando ejecute netsh trace etc. hará esto por usted, y creo que esa es la parte que falta aquí, que el controlador de filtro ligero que se inyecta en ndis para capturar paquetes (es decir, el proveedor de etw) no se está ejecutando y emitiendo eventos.
Cuando hayas terminado, puedes detenerlo usando:
net stop ndiscap
Por lo que vale, encontré un ejemplo de un consumidor ETW en tiempo real (el ejemplo es para el servidor web IIS): http://blogs.iis.net/eokim/archive/2009/05/15/consume-iis -etw-tracing.aspx
Si observa internamente lo que hacen los comandos "netsh trace", verá que adjuntan un controlador de filtro liviano NDIS a las diversas interfaces de red. Solo con este filtro adjunto y activado obtendrás eventos de este proveedor. Los detalles de este servicio no están documentados y están sujetos a cambios. Toda la lógica de los comandos netsh trace se implementa en nettrace.dll, que puede realizar ingeniería inversa con la ayuda de los símbolos públicos de Microsoft. Específicamente, la clase CInboxCapture tiene un código que determina si el controlador se ha iniciado, lo vincula a las interfaces de red apropiadas y lo inicia. Si inicia el controlador de filtro de captura de la misma manera que lo hace nettrace.dll, obtendrá los eventos de captura de paquetes.
Buena suerte.