VfIrpLogRecordEvent

VOID __stdcall VfIrpLogRecordEvent(UINT64 VerifierSettings, _DEVICE_OBJECT *DeviceObject, _IRP *Irp){
  _WORK_QUEUE_ITEM *PoolWithTag; 
  unsigned __int64 v6; 
  _IRPLOG_DATA *Pointer; 
  _IRPLOG_HEAD *v8; 
  VOID **v9; 
  _QWORD *v10; 
  unsigned int DeviceType; 
  _QWORD *v12; 
  __int64 v13; 
  int v14; 
  unsigned int v15; 
  __int64 v16; 
  _IRPLOG_HEAD *HashHead; 
  __int128 v18; 
  __int128 v19; 
  VOID *v20; 

  HashHead = 0i64;
  v20 = 0i64;
  v18 = 0i64;
  v19 = 0i64;
  if( (VerifierSettings & 0x400) != 0 )
  {
    if( ViIrpLogDdiLock != 2 && !_InterlockedCompareExchange(&ViIrpLogDdiLock, 1, 0) )
    {
      PoolWithTag = (_WORK_QUEUE_ITEM *)ExAllocatePoolWithTag(0x200ui64, 0x20ui64, 2001299030i64);
      if( PoolWithTag )
      {
        PoolWithTag->List.Flink = 0i64;
        PoolWithTag->WorkerRoutine = (void(__fastcall *)(void *))ViIrpLogExposeWmiCallback;
        PoolWithTag->Parameter = PoolWithTag;
        ExQueueWorkItem(PoolWithTag, DelayedWorkQueue);
      }
      else
      {
        ViIrpLogDdiLock = 0;
      }
    }
    v6 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc(&ViIrpLogDatabaseLock);
    if( (unsigned int)IovUtilIsDeviceObjectMarked(DeviceObject, 0) )
      goto LABEL_21;
    Pointer = ViIrpLogDatabaseFindPointer(DeviceObject, &HashHead);
    v8 = HashHead;
    v9 = (VOID **)Pointer;
    if( *HashHead )
      goto LABEL_21;
    if( !Pointer )
    {
      v9 = ExAllocatePoolWithTag(0x200ui64, 0x348ui64, 1699309142i64);
      if( !v9 )
      {
LABEL_21:
        KxReleaseSpinLock(&ViIrpLogDatabaseLock);
        __writecr8(v6);
        return;
      }
      ObfReferenceObject(DeviceObject);
      *((_DWORD *)v9 + 6) = 0;
      v10 = v8 + 2;
      *v9 = DeviceObject;
      DeviceType = DeviceObject->DeviceType;
      *((_DWORD *)v9 + 9) = 0;
      *((_DWORD *)v9 + 7) = DeviceType;
      v12 = v9 + 1;
      *((_DWORD *)v9 + 8) = 20;
      v13 = *((_QWORD *)v8 + 1);
      if( *(_IRPLOG_HEAD **)(v13 + 8) != v8 + 2 )
        __fastfail(3u);
      *v12 = v13;
      v9[2] = v10;
      *(_QWORD *)(v13 + 8) = v12;
      *v10 = v12;
    }
    v14 = *((_DWORD *)v9 + 6);
    if( (v14 & 6) == 0 )
    {
      if( v14 == 1 )
        v15 = *((_DWORD *)v9 + 8);
      else
        v15 = *((_DWORD *)v9 + 9);
      if( (unsigned int)VfMajorBuildIrpLogEntry(
                           (__int64)Irp,
                           v15,
                           (__int64)&v9[5 * *((unsigned int *)v9 + 9) + 5],
                           (__int64)&v18) )
      {
        v16 = 5 * (*((unsigned int *)v9 + 9) + 1i64);
        *(_OWORD *)&v9[v16] = v18;
        *(_OWORD *)&v9[v16 + 2] = v19;
        v9[v16 + 4] = v20;
        if( ++*((_DWORD *)v9 + 9) == *((_DWORD *)v9 + 8) )
        {
          *((_DWORD *)v9 + 6) |= 1u;
          *((_DWORD *)v9 + 9) = 0;
        }
      }
    }
    goto LABEL_21;
  }
}

Referenced by:

IovpCallDriver1