La gran pregunta es cómo consumir 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í.¿Cómo consumir eventos ETW en tiempo real del proveedor Microsoft-Windows-NDIS-PacketCapture?
estoy usando el siguiente código como la 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
cambios que he hecho son: StartTrace
Call para iniciar la sesión de NDIS-PC antes de hacer cualquier cosa más. 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}};
Llamando 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 anterior.
Una vez más, dejando todo lo demás con el establecido en el ejemplo de MSDN
Utilizando el código idéntico a un solo cambio del proveedor de a ningún otro elemento como Microsoft-Windows-Winsock-AFD o Microsoft-Windows-TCPIP me llama en la devolución de llamada de registro 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 examinado TODAS las estructuras de datos involucradas en este proceso y las comparé entre cada proveedor, y todas parecían correctas y lo mismo. 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 mirado en las propiedades de la sesión llamando "ets "" logman" Mi sesión de seguimiento de 04 y se ve idéntico para NDIS-PC y TCPIP:
C: \ windows \ system32> logman "Mi sesión de seguimiento de 04" -ets
Nombre: Mi sesión de seguimiento de 04 Estado:
Correr Ruta raíz:% systemdrive% \ PerfLogs \ Segmento de administración:
Off Horarios: EnNombre: Mi sesión de seguimiento 04 \ M Y de sesión de seguimiento 04 Tipo:
traza Anexar: Off Circular: Off sobrescritura:
Off Tamaño de búfer: 64 Los tampones perdidos: 0 Los tampones Escrito: 0 Buffer temporizador de purga: 1 Tipo de reloj: Modo de ejecución del archivo: en tiempo realProveedor: Nombre: Microsoft-Windows-NDIS-PacketCapture Proveedor Guid: {2ED6006E-4729 a 4.609-B423-3EE7BCD678EF} Nivel:
5 (ganar: detallado) KeywordsAll: 0x0 KeywordsAny:
0xffffffffffffffff (Ethernet802. 3, WirelessWAN, Tunnel, Nativ e802.11, PacketStart, PacketEnd, ut: SendPath, ut: ReceivePath, ut: L3ConnectPath, ut: L 2C onnectPath, ut: ClosePath, ut: Autenticación, ut: Configuración, ut: Global, ut: Anulado, 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ó correctamente.
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 las Internets que tenían que ver con el consumo de ETW en tiempo real (MSDN, Google search, Stackoverflow, etc.) y I 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 se realicen 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 cualquier problema de alineación como todos los demás proveedores funcionan bien:
Windows ETW: Kernel consumer receives no EventCallback or BufferCallback events
siento que me falta algo pequeño y trivial y esto se debe simplemente trabajo. Agradecería cualquier ayuda.
Hola, he verificado esto ejecutando "captura de inicio netsh trace = yes" a continuación, ejecutar mi programa. ¡Ahora estoy recibiendo eventos NDIS-PC! Sin embargo, en mi función EventRecordCallback, la llamada TdhGetEventInformation en el pasado en la estructura PEVENT_RECORD está fallando cada vez con ERROR_NOT_FOUND ... Estaba escribiendo sobre esto pero me encontré con el límite de caracteres en los comentarios, lo que prolly significa que debería crear una nueva publicación al respecto. ¡Gracias por la ayuda! –
Acabo de descubrir esto también gracias a esta publicación: http://social.msdn.microsoft.com/Forums/en-US/etw/thread/473ac036-b4a6-464a-9b49-96e11b88c01c/ –
Más ideas sobre esto (No hay devolución de llamada de eventos cuando se usa el proveedor Microsoft-NDIS-PacketCapture) Estoy intentando usar este fragmento de código https://blogs.msdn.microsoft.com/vancem/2013/03/09/using-traceevent-to-mine -información-en-os-registrado-etw-proveedores /. ¿Intentó iniciar traza netsh externamente pero todavía no hay salida? –