NtOpenKeyTransactedEx

NTSTATUS __stdcall NtOpenKeyTransactedEx(
        VOID **KeyHandle,
        UINT64 DesiredAccess,
        _OBJECT_ATTRIBUTES *ObjectAttributes,
        UINT64 OpenOptions,
        VOID *TransactionHandle){
  _ETHREAD *CurrentThread; 
  int v6; 
  int v8; 
  UINT8 v10; 
  _ETHREAD *v11; 
  INT8 PreviousMode; 
  NTSTATUS v13; 
  __int64 v14; 
  NTSTATUS v15; 
  NTSTATUS v16; 
  PVOID Object; 
  PVOID v19; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v6 = OpenOptions;
  v8 = DesiredAccess;
  --CurrentThread->Tcb.KernelApcDisable;
  v10 = ExAcquireRundownProtection((_EX_RUNDOWN_REF *)&CmpDummyThreadEvent + 132);
  v11 = (_ETHREAD *)KeGetCurrentThread();
  if( !v10 )
  {
    KeLeaveCriticalRegionThread(&v11->Tcb);
    return -1073741431;
  }
  PreviousMode = v11->Tcb.PreviousMode;
  Object = 0i64;
  v13 = ObReferenceObjectByHandle(TransactionHandle, 4ui64, *(&CmpDummyThreadEvent + 6), PreviousMode, &Object, 0i64);
  v14 = (__int64)Object;
  v15 = v13;
  if( v13 == -1073741788 )
  {
    v19 = 0i64;
    v16 = ObReferenceObjectByHandle(
            TransactionHandle,
            4ui64,
            (_OBJECT_TYPE *)TmTransactionObjectType,
            KeGetCurrentThread()->PreviousMode,
            &v19,
            0i64);
    v14 = (__int64)v19;
    v15 = v16;
    goto LABEL_4;
  }
  if( v13 >= 0 )
  {
    v14 = (unsigned __int64)Object | 1;
LABEL_4:
    if( v15 >= 0 )
      v15 = CmOpenKey(KeyHandle, v8, ObjectAttributes, v6, v14);
  }
  if( v14 )
    CmpTransDereferenceTransaction(v14);
  ExReleaseRundownProtection((_EX_RUNDOWN_REF *)&CmpDummyThreadEvent + 132);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  return v15;
}

Referenced by:

NtOpenKeyTransacted