SmKmEtwAppendObjectName

__int64 __fastcall SmKmEtwAppendObjectName(__int64 a1, _DEVICE_OBJECT *DeviceAttachmentBaseRefWithTag){
  unsigned int v2; 
  unsigned int v4; 
  __int64 v6; 
  VOID *v7; 
  unsigned __int64 v8; 
  unsigned int v9; 
  _DEVICE_OBJECT *v10; 
  char v11; 
  char v12; 
  INT16 v13; 
  NTSTATUS v14; 
  __int128 *v15; 
  unsigned __int16 v16; 
  unsigned __int16 *v17; 
  unsigned int v18; 
  unsigned __int16 **v19; 
  __int64 v20; 
  __int64 result; 
  _QWORD *v22; 
  UINT64 ReturnLength; 
  __int128 Src[2]; 

  v2 = *(_DWORD *)(a1 + 24);
  v4 = *(_DWORD *)(a1 + 28) - v2;
  LODWORD(ReturnLength) = 0;
  v6 = *(_QWORD *)(a1 + 8) + v2;
  Src[0] = *(_OWORD *)L"\\Device\\Unknown";
  Src[1] = *(_OWORD *)L"Unknown";
  v7 = (VOID *)(v6 + 2);
  v8 = (v6 + 9) & 0xFFFFFFFFFFFFFFF8ui64;
  v9 = v6 + v4 - v8;
  *(_QWORD *)v8 = 0i64;
  *(_QWORD *)(v8 + 8) = 0i64;
  if( ((unsigned __int8)DeviceAttachmentBaseRefWithTag & 1) != 0 )
  {
    DeviceAttachmentBaseRefWithTag = IoGetDeviceAttachmentBaseRefWithTag(
                                       (_DEVICE_OBJECT *)((unsigned __int64)DeviceAttachmentBaseRefWithTag & 0xFFFFFFFFFFFFFFFEui64),
                                       0x746C6644ui64);
    v10 = DeviceAttachmentBaseRefWithTag;
  }
  else
  {
    v10 = 0i64;
  }
  if( DeviceAttachmentBaseRefWithTag )
  {
    IoSetThreadHardErrorMode(0);
    v12 = v11;
    v14 = ObQueryNameString(DeviceAttachmentBaseRefWithTag, (_OBJECT_NAME_INFORMATION *)v8, v9, &ReturnLength);
    if( v10 )
      ObfDereferenceObjectWithTag(v10, 0x746C6644ui64);
    LOBYTE(v13) = v12;
    IoSetThreadHardErrorMode(v13);
  }
  else
  {
    v14 = -1073741809;
  }
  if( v14 >= 0 && *(_WORD *)v8 )
  {
    v15 = *(__int128 **)(v8 + 8);
    v16 = *(_WORD *)v8 >> 1;
  }
  else
  {
    v15 = Src;
    v16 = 15;
  }
  memmove(v7, v15, 2 * v16);
  v17 = (unsigned __int16 *)(*(_QWORD *)(a1 + 8) + *(unsigned int *)(a1 + 24));
  v18 = 2 * v16;
  *v17 = v16;
  v19 = (unsigned __int16 **)(*(_QWORD *)a1 + 16i64 * *(unsigned int *)(a1 + 16));
  *v19 = v17;
  v19[1] = (unsigned __int16 *)2;
  v20 = (unsigned int)++*(_DWORD *)(a1 + 16);
  *(_DWORD *)(a1 + 24) += 2;
  result = *(_QWORD *)(a1 + 8) + *(unsigned int *)(a1 + 24);
  v22 = (_QWORD *)(*(_QWORD *)a1 + 16 * v20);
  *v22 = result;
  v22[1] = v18;
  ++*(_DWORD *)(a1 + 16);
  *(_DWORD *)(a1 + 24) += v18;
  return result;
}

Referenced by:

SmKmStoreTerminateWorker