IopErrorLogThread

VOID __stdcall IopErrorLogThread(PVOID StartContext){
  WCHAR v1; 
  UINT64 *v2; 
  INT64 v3; 
  INT64 v4; 
  UINT64 v5; 
  __int64 v6; 
  int v7; 
  unsigned __int16 Length; 
  wchar_t *Buffer; 
  __int16 v10; 
  char v11; 
  CHAR *p_P; 
  UINT64 v13; 
  UINT64 v14; 
  struct _DMA_ADAPTER *v15; 
  __int64 v16; 
  WCHAR v17; 
  __int64 v18; 
  int v19; 
  const WCHAR *v20; 
  __int16 v21; 
  UINT64 SidLength; 
  struct _UNICODE_STRING Name; 
  UINT64 PacketSize; 
  PVOID SidData; 
  struct _UNICODE_STRING v26; 
  __int64 v27; 
  struct _UNICODE_STRING DestinationString; 
  OBJECT_NAME_INFORMATION ObjectNameInfo; 
  wchar_t pszDest[256]; 
  wchar_t DeviceName[256]; 
  char P; 
  Name = 0i64;
  WORD2(SidLength) = 0;
  v26 = 0i64;
  SidData = 0i64;
  DestinationString = 0i64;
  if( ErrorLogSessionOpened )
  {
    while( 1 )
    {
LABEL_29:
      LODWORD(SidLength) = 0;
      IopErrorLogGetEntry();
      v18 = v16;
      if( !v16 )
        return;
      v6 = *(_QWORD *)(v16 + 24);
      v7 = *(unsigned __int16 *)(v16 - 6) - 48;
      v27 = v6;
      LODWORD(PacketSize) = v7;
      if( v6 )
      {
        RtlInitUnicodeString(&Name, 0i64, v17);
        if( *(_QWORD *)(v6 + 64) )
          Name = *(struct _UNICODE_STRING *)(v6 + 56);
        Length = Name.Length;
        if( Name.Length )
        {
LABEL_8:
          Buffer = &Name.Buffer[((unsigned __int64)Length >> 1) - 1];
          if( *Buffer == 92 )
            goto LABEL_12;
          do
          {
            if( Buffer == Name.Buffer )
              break;
            --Buffer;
          }
          while( *Buffer != 92 );
          if( *Buffer == 92 )
LABEL_12:
            ++Buffer;
          v10 = LOWORD(Name.Buffer) - (_WORD)Buffer;
          Name.Buffer = Buffer;
          Length += v10;
          Name.Length = Length;
          goto LABEL_14;
        }
        LODWORD(SidLength) = 0;
        if( (int)ObQueryNameStringMode((VOID *)v6, &ObjectNameInfo, 0x110ui64, &SidLength, 0) >= 0 && (_DWORD)SidLength )
        {
          Name = ObjectNameInfo.Name;
          goto LABEL_41;
        }
        v20 = &word_1407CF120;
      }
      else
      {
        v20 = L"Application Popup";
      }
      RtlInitUnicodeString(&Name, v20, v17);
LABEL_41:
      Length = Name.Length;
      if( Name.Length )
        goto LABEL_8;
      Buffer = Name.Buffer;
LABEL_14:
      LODWORD(SidLength) = 0;
      v11 = 0;
      p_P = &P;
      v13 = 272i64;
      if( !*(_QWORD *)(v18 + 16) )
        goto LABEL_15;
      while( 1 )
      {
        v19 = ObQueryNameStringMode(*(VOID **)(v18 + 16), (OBJECT_NAME_INFORMATION *)p_P, v13, &SidLength, 0);
        if( v19 != -1073741820 )
          break;
        if( v11 )
          goto LABEL_15;
        p_P = IopVerifierExAllocatePool_4(PagedPool, (unsigned int)SidLength);
        if( !p_P )
          goto LABEL_15;
        v13 = (unsigned int)SidLength;
        v11 = 1;
      }
      v14 = 0i64;
      if( v19 >= 0 && (_DWORD)SidLength )
      {
        v26 = *(struct _UNICODE_STRING *)p_P;
      }
      else
      {
LABEL_15:
        RtlInitUnicodeString(&v26, &word_1407CF120, v13);
        v14 = 0i64;
      }
      pszDest[0] = 0;
      DeviceName[0] = 0;
      if( Buffer )
        RtlStringCchCopyNW(pszDest, 0x100ui64, Buffer, (unsigned __int64)Length >> 1);
      if( v26.Buffer )
        RtlStringCchCopyNW(DeviceName, 0x100ui64, v26.Buffer, (unsigned __int64)v26.Length >> 1);
      if( v11 == 1 )
        ExFreePoolWithTag(p_P, 0);
      if( (unsigned int)(*(_DWORD *)(v18 + 52) - 1074004004) <= 1 && !wcsicmp(pszDest, L"NTFS") )
      {
        v21 = *(_WORD *)(v18 + 84);
        *(_WORD *)(v18 + 42) -= v21;
        WORD2(SidLength) = v21;
        SidData = (PVOID)(v18 + 120);
      }
      if( EtwWriteErrorLogEntry(
             v14,
             (_IO_ERROR_LOG_PACKET *)(v18 + 40),
             (unsigned int)PacketSize,
             (_LARGE_INTEGER *)(v18 + 32),
             pszDest,
             DeviceName,
             WORD2(SidLength),
             SidData) < 0 )
      {
        IopErrorLogRequeueEntry((_LIST_ENTRY *)v18);
        goto LABEL_49;
      }
      _InterlockedExchangeAdd(&IopErrorLogAllocation, -*(unsigned __int16 *)(v18 - 6));
      v15 = *(struct _DMA_ADAPTER **)(v18 + 16);
      if( v15 )
        HalPutDmaAdapter(v15);
      if( v27 )
        HalPutDmaAdapter(*(PADAPTER_OBJECT *)(v18 + 24));
      ExFreePoolWithTag((PVOID)(v18 - 8), 0);
    }
  }
  RtlInitUnicodeString(&DestinationString, L"Eventlog-System", v1);
  if( (int)EtwQueryTraceHandleByLoggerName(&DestinationString, (UINT64 *)IopErrorLogSession) >= 0 )
  {
    ErrorLogSessionOpened = 1;
    goto LABEL_29;
  }
LABEL_49:
  IopErrorLogQueueRequest(v3, v2, v4, v5);
}

Referenced by:

No references.