IopLiveDumpInitRegistrySettings

VOID __stdcall IopLiveDumpInitRegistrySettings(INT64 a1){
  _KEY_VALUE_FULL_INFORMATION *v2; 
  int v3; 
  NTSTATUS RegistryValue; 
  unsigned __int64 v5; 
  _UNICODE_STRING KeyName; 
  _KEY_VALUE_FULL_INFORMATION *Information; 
  PVOID Handle; 

  Handle = 0i64;
  KeyName.Buffer = L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\LiveDump";
  v2 = 0i64;
  *(_QWORD *)&KeyName.Length = 7864438i64;
  Information = 0i64;
  if( IopOpenRegistryKey(&Handle, 0i64, &KeyName, 0x20019ui64, 0) >= 0 )
  {
    if( IopGetRegistryValue(Handle, (PWCHAR)L"BufferAllocationScheme", 4ui64, &Information) >= 0
      && Information->Type == 4
      && Information->DataLength == 4 )
    {
      v3 = *(ULONG *)((char *)&Information->TitleIndex + Information->DataOffset);
      if( (unsigned int)(v3 - 1) > 3 )
        v3 = 2;
    }
    else
    {
      v3 = 2;
    }
    *(_DWORD *)(a1 + 1040) = v3;
    if( IopGetRegistryValue(Handle, (PWCHAR)L"MirrorSystemPartitionOnly", 4ui64, &Information) >= 0
      && Information->Type == 4
      && Information->DataLength == 4 )
    {
      *(_DWORD *)(a1 + 80) = *(_DWORD *)(a1 + 80) & 0xFFFFFFDF | (*(ULONG *)((char *)&Information->TitleIndex
                                                                           + Information->DataOffset) != 0 ? 0x20 : 0);
    }
    else
    {
      *(_DWORD *)(a1 + 80) &= ~0x20u;
    }
    if( IopGetRegistryValue(Handle, (PWCHAR)L"EnableInstrumentation", 4ui64, &Information) >= 0
      && Information->Type == 4
      && Information->DataLength == 4 )
    {
      *(_DWORD *)(a1 + 80) = *(_DWORD *)(a1 + 80) & 0xFFFFFF7F | (*(ULONG *)((char *)&Information->TitleIndex
                                                                           + Information->DataOffset) != 0 ? 0x80 : 0);
    }
    else
    {
      *(_DWORD *)(a1 + 80) &= ~0x80u;
    }
    if( IopGetRegistryValue(Handle, (PWCHAR)L"SkipDisablingInterrupts", 4ui64, &Information) >= 0
      && Information->Type == 4
      && Information->DataLength == 4 )
    {
      *(_DWORD *)(a1 + 80) = *(_DWORD *)(a1 + 80) & 0xFFFFFEFF | (*(ULONG *)((char *)&Information->TitleIndex
                                                                           + Information->DataOffset) != 0 ? 0x100 : 0);
    }
    else
    {
      *(_DWORD *)(a1 + 80) &= ~0x100u;
    }
    RegistryValue = IopGetRegistryValue(Handle, (PWCHAR)L"DumpFileSize", 4ui64, &Information);
    v2 = Information;
    if( RegistryValue >= 0 && Information->Type == 4 && Information->DataLength == 4 )
    {
      v5 = (unsigned __int64)*(unsigned int *)((char *)&Information->TitleIndex + Information->DataOffset) << 20;
      *(_DWORD *)(a1 + 80) |= 0x200u;
      *(_QWORD *)(a1 + 1048) = v5;
    }
    else
    {
      *(_DWORD *)(a1 + 80) &= ~0x200u;
    }
  }
  else
  {
    *(_DWORD *)(a1 + 80) &= 0xFFFFFC5F;
    *(_DWORD *)(a1 + 1040) = 2;
  }
  if( Handle )
    ZwClose((_HANDLE)Handle);
  if( v2 )
    ExFreePoolWithTag(v2, 0);
}

Referenced by:

IoCaptureLiveDump