NtEnableLastKnownGood

INT64 __fastcall NtEnableLastKnownGood(){
  int CachedContextBaseKey; 
  char v1; 
  WCHAR v2; 
  WCHAR v3; 
  WCHAR v4; 
  WCHAR v5; 
  struct _UNICODE_STRING ValueName; 
  OBJECT_ATTRIBUTES v8; 
  PVOID P; 
  UNICODE_STRING SourceString; 
  UNICODE_STRING Directory; 
  struct _UNICODE_STRING DestinationString; 
  struct _UNICODE_STRING v13; 
  struct _OBJECT_ATTRIBUTES ObjectAttributes; 
  void *KeyHandle; 
  HANDLE Handle; 
  HANDLE v17; 
  void *v18; 
  KeyHandle = 0i64;
  Handle = 0i64;
  v17 = 0i64;
  v18 = 0i64;
  P = 0i64;
  DestinationString = 0i64;
  SourceString = 0i64;
  v13 = 0i64;
  Directory = 0i64;
  memset(&v8, 0, sizeof(v8));
  ValueName = 0i64;
  if( *((_BYTE *)KeGetCurrentThread() + 562) == 1 )
  {
    if( SeSinglePrivilegeCheck(*(_QWORD *)&SeTcbPrivilege, 1) )
    {
      CachedContextBaseKey = PnpCtxGetCachedContextBaseKey(PiPnpRtlCtx, 4, (__int64 *)&v18);
      if( CachedContextBaseKey >= 0 )
      {
        *(&ObjectAttributes.Length + 1) = 0;
        memset(&ObjectAttributes.Attributes + 1, 0, 20);
        ValueName.Buffer = (wchar_t *)L"Control\\Pnp";
        ObjectAttributes.RootDirectory = v18;
        *(_DWORD *)&ValueName.Length = 1572886;
        ObjectAttributes.ObjectName = &ValueName;
        ObjectAttributes.Length = 48;
        ObjectAttributes.Attributes = 576;
        CachedContextBaseKey = ZwOpenKey(&KeyHandle, 0xF003Fu, &ObjectAttributes);
        if( CachedContextBaseKey >= 0 )
        {
          v1 = 0;
          if( IopGetRegistryValue(KeyHandle, (PWCHAR)L"DisableLKG", 0i64, (KEY_VALUE_FULL_INFORMATION **)&P) < 0 )
            goto LABEL_25;
          if( *((_DWORD *)P + 1) == 4 && *((_DWORD *)P + 3) == 4 )
            v1 = *((_BYTE *)P + *((unsigned int *)P + 2));
          ExFreePoolWithTag(P, 0);
          if( v1 )
          {
            *(_DWORD *)&ValueName.Length = 1441812;
            ValueName.Buffer = (wchar_t *)L"DisableLKG";
            CachedContextBaseKey = ZwDeleteValueKey(KeyHandle, &ValueName);
            if( CachedContextBaseKey >= 0 )
            {
              RtlInitUnicodeString(
                &DestinationString,
                L"\\Registry\\Machine\\System\\LastKnownGoodRecovery\\LastGood",
                v2);
              v8.RootDirectory = 0i64;
              v8.ObjectName = &DestinationString;
              v8.Length = 48;
              v8.Attributes = 576;
              *(_OWORD *)&v8.SecurityDescriptor = 0i64;
              if( ZwOpenKey(&Handle, 0xF003Fu, &v8) >= 0 )
                ZwDeleteKey(Handle);
              RtlInitUnicodeString(&v13, L"\\Registry\\Machine\\System\\LastKnownGoodRecovery\\LastGood.Tmp", v3);
              v8.RootDirectory = 0i64;
              v8.ObjectName = &v13;
              v8.Length = 48;
              v8.Attributes = 576;
              *(_OWORD *)&v8.SecurityDescriptor = 0i64;
              if( ZwOpenKey(&v17, 0xF003Fu, &v8) >= 0 )
                ZwDeleteKey(v17);
              RtlInitUnicodeString(&SourceString, L"\\SystemRoot\\LastGood", v4);
              IopFileUtilWalkDirectoryTreeBottomUp(&SourceString);
              v8.RootDirectory = 0i64;
              v8.ObjectName = &SourceString;
              v8.Length = 48;
              v8.Attributes = 64;
              *(_OWORD *)&v8.SecurityDescriptor = 0i64;
              ZwDeleteFile(&v8);
              RtlInitUnicodeString(&Directory, L"\\SystemRoot\\LastGood.Tmp", v5);
              IopFileUtilWalkDirectoryTreeBottomUp(&Directory);
              v8.RootDirectory = 0i64;
              v8.ObjectName = &Directory;
              v8.Length = 48;
              *(_OWORD *)&v8.SecurityDescriptor = 0i64;
              v8.Attributes = 64;
              ZwDeleteFile(&v8);
              CachedContextBaseKey = 0;
            }
          }
          else
          {
LABEL_25:
            CachedContextBaseKey = -1073741823;
          }
        }
      }
    }
    else
    {
      CachedContextBaseKey = -1073741727;
    }
    if( Handle )
      ZwClose(Handle);
    if( v17 )
      ZwClose(v17);
    if( KeyHandle )
      ZwClose(KeyHandle);
  }
  else
  {
    return(unsigned int)-1073741790;
  }
  return(unsigned int)CachedContextBaseKey;
}

Referenced by:

No references.