ETW (Event Tracing for Windows)


Cuando creamos, eliminamos o editamos algún archivo(documento en pdf, foto, archivos de audio...) el sistema operativo necesita leer el contenido del disco duro, localizarlo y hacer  algún proceso requerido. Si creamos un archivo se produce un evento de tipo escritura o lectura(I/O) que puede contener información por ejemplo, en que partición del disco esta localizada o el sector ubicado. Windows produce mas eventos, cuando se crea un proceso, se lee el registro, fallos de memoria etc. Todos esos eventos se pueden capturar creando un driver que se ejecute en modo kernel y notifique al espacio de usuario que ocurrió algo, este proceso es bastante tedioso ya que se tiene que programar un driver en modo kernel, firmarlo pero windows en el año 2000 introduce una nueva manera de hacer y es event trancing for windows(ETW). Etw es una forma de trazar eventos del kernel con una mayor eficiencia y facilidad basados en eventos(tiempo real) o en log files. 


En la siguiente imagen se muestra la arquitectura en como esta compuesto etw.

Controllers: Aquellos que pueden parar o iniciar  las sesiones,  habilitar proveedores.

Providers: Son los que proporcionan los eventos.

Consumers: Que consumen dicho evento ya sea realtime o en log files.

Session: Graba los eventos de los proveedores.

Un controlador establece datos de la sesión(si es real time, tamaño del buffer, habilitar propiedades de la sesión, que tipo de eventos recibirá).

Se establecen las callbacks que se llamaran cuando se produce el evento. 

DiskMom

Es una herramienta por parte de la suite sysinternals de microsoft permite el análisis de la actividad que produce los eventos del disco duro.



DiskMon esta basado en etw, usando su api en C/C++.

Primero  StartTraceA función establece y arranca un event tracing session, recibe como parámetro 
EVENT_TRACE_PROPERTIES que es  una estructura que contiene  las propiedades para comportamiento de la  sesión.

Están establecidas de la siguiente manera




  properties->Wnode.Flags = 0x20000; // -> WNODE_FLAG_TRACED_GUID
  properties->FlushTimer = 1;
  properties->LogFileMode = 256; // -> EVENT_TRACE_REAL_TIME_MODE  
  properties->LoggerNameOffset = 120;  -> sizeof(EVENT_TRACE_PROPERTIES)
  properties->EnableFlags |= 0x101u; -> EVENT_TRACE_FLAG_DISK_IO |  EVENT_TRACE_TYPE_START
  properties->Wnode.Guid =  SystemTraceControlGuid;

Son las configuraciones que internamente mantiene DiskMon, podemos deducir que va a consumir eventos en tiempo real y que va a recibir eventos de tipo Disk IO en especial(Write and Read)
La siguiente clase es la que representa

[EventType{10,11}, EventTypeName{"Read","Write"}] class DiskIo_TypeGroup1 : DiskIo { uint32 DiskNumber; uint32 IrpFlags; uint32 TransferSize; uint32 Reserved; sint64 ByteOffset; uint32 FileObject; uint32 Irp; uint64 HighResResponseTime; uint32 IssuingThreadId; }; https://docs.microsoft.com/en-us/windows/win32/etw/diskio-typegrou






Comentarios