NtOpenKeyTransactedEx

NTSTATUS __stdcall NtOpenKeyTransactedEx(
        PVOID *KeyHandle,
        UINT64 DesiredAccess,
        OBJECT_ATTRIBUTES *ObjectAttributes,
        UINT64 OpenOptions,
        PVOID TransactionHandle){
  _ETHREAD *CurrentThread; 
  unsigned int v6; 
  unsigned int v8; 
  bool v10; 
  _ETHREAD *v11; 
  KPROCESSOR_MODE v12; 
  NTSTATUS v13; 
  INT64 v14; 
  NTSTATUS v15; 
  NTSTATUS v16; 
  INT64 v18; 
  PVOID Object; 
  PVOID v20; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v6 = OpenOptions;
  v8 = DesiredAccess;
  --*((_WORD *)CurrentThread + 242);
  v10 = ExAcquireRundownProtection((PEX_RUNDOWN_REF)&CmpShutdownRundown);
  v11 = (_ETHREAD *)KeGetCurrentThread();
  if( !v10 )
  {
    KeLeaveCriticalRegionThread((__int64)v11);
    return -1073741431;
  }
  v12 = *((_BYTE *)v11 + 562);
  Object = 0i64;
  v13 = ObReferenceObjectByHandle(TransactionHandle, 4u, CmRegistryTransactionType, v12, &Object, 0i64);
  v14 = (INT64)Object;
  v15 = v13;
  if( v13 == -1073741788 )
  {
    v20 = 0i64;
    v16 = ObReferenceObjectByHandle(
            TransactionHandle,
            4u,
            (POBJECT_TYPE)TmTransactionObjectType,
            *((_BYTE *)KeGetCurrentThread() + 562),
            &v20,
            0i64);
    v14 = (INT64)v20;
    v15 = v16;
    goto LABEL_4;
  }
  if( v13 >= 0 )
  {
    v14 = (unsigned __int64)Object | 1;
LABEL_4:
    if( v15 >= 0 )
      v15 = CmOpenKey(KeyHandle, v8, ObjectAttributes, v6, (_CM_TRANS_PTR)v14, v18, (INT64)Object, (INT64)v20);
  }
  if( v14 )
    CmpTransDereferenceTransaction(v14);
  ExReleaseRundownProtection((PEX_RUNDOWN_REF)&CmpShutdownRundown);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  return v15;
}

Referenced by:

NtOpenKeyTransacted