WmipSetTraceNotify

VOID __stdcall WmipSetTraceNotify(_DEVICE_OBJECT *DeviceObject, UINT64 TraceClass){
  __int64 *v3; 
  INT8 v4; 
  IRP *Irp; 
  _IRP *v6; 
  ULONG v7; 
  UINT64 BufferLength; 
  __int64 Buffer[2]; 
  *(_OWORD *)Buffer = 0i64;
  switch( (_DWORD)TraceClass )
  {
    case 0x100000:
      v3 = &EtwpDiskIoNotifyRoutines;
LABEL_3:
      LODWORD(Buffer[0]) = 1;
LABEL_4:
      Buffer[1] = (__int64)v3;
      break;
    case 0x200000:
      v3 = *(__int64 **)EtwpTdiIoNotify;
      goto LABEL_3;
    case 0x400000:
      LODWORD(Buffer[0]) = 2;
      v3 = (__int64 *)&EtwpFileIoNotifyRoutines;
      goto LABEL_4;
    case 0x800000:
      v3 = &EtwpSplitIoNotifyRoutines;
      goto LABEL_3;
  }
  KeWaitForSingleObject(&WmipSMMutex, Executive, 0, 0, 0i64);
  v4 = *((_BYTE *)WmipServiceDeviceObject + 76) + 1;
  KeReleaseMutex(&WmipSMMutex, 0);
  Irp = IoAllocateIrp(v4, 0);
  v6 = Irp;
  if( Irp )
  {
    *((_QWORD *)Irp + 23) -= 72i64;
    --*((_BYTE *)Irp + 67);
    *(_QWORD *)(*((_QWORD *)Irp + 23) + 40i64) = WmipServiceDeviceObject;
    v7 = IoWMIDeviceObjectToProviderId(DeviceObject);
    LODWORD(BufferLength) = 16;
    WmipForwardWmiIrp(v6, 0xDu, v7, 0i64, BufferLength, Buffer);
    IoFreeIrp(v6);
  }
}

Referenced by:

IoWMIRegistrationControl