NtCreateRegistryTransaction

NTSTATUS __stdcall NtCreateRegistryTransaction(
        VOID **TransactionHandle,
        UINT64 DesiredAccess,
        _OBJECT_ATTRIBUTES *ObjectAttributes,
        UINT64 CreateOptions){
  int v4; 
  unsigned int v6; 
  _ETHREAD *CurrentThread; 
  UINT64 v9; 
  UINT8 v10; 
  UINT64 v11; 
  char PreviousMode; 
  __int64 v13; 
  int inserted; 
  _QWORD *v15; 
  VOID *v17; 
  VOID *v18; 
  UINT64 ObjectBodySize; 
  PVOID *Handle; 
  UINT64 v21; 
  PVOID v22; 
  PVOID Object; 

  v4 = CreateOptions;
  v6 = DesiredAccess;
  Object = 0i64;
  v22 = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  v10 = ExAcquireRundownProtection((_EX_RUNDOWN_REF *)&CmpDummyThreadEvent + 132);
  if( !v10 )
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
  if( v10 )
  {
    if( v4 )
    {
      inserted = -1073741811;
    }
    else
    {
      PreviousMode = KeGetCurrentThread()->PreviousMode;
      if( PreviousMode == 1 )
      {
        v13 = 0x7FFFFFFF0000i64;
        if( (unsigned __int64)TransactionHandle < 0x7FFFFFFF0000i64 )
          v13 = (__int64)TransactionHandle;
        *(_QWORD *)v13 = 0i64;
      }
      else
      {
        *TransactionHandle = 0i64;
      }
      LODWORD(v21) = 0;
      LODWORD(Handle) = 0;
      LODWORD(ObjectBodySize) = 24;
      LOBYTE(v11) = PreviousMode;
      LOBYTE(v9) = PreviousMode;
      inserted = ObCreateObjectEx(
                   v9,
                   *(&CmpDummyThreadEvent + 6),
                   ObjectAttributes,
                   v11,
                   v17,
                   ObjectBodySize,
                   (UINT64)Handle,
                   v21,
                   &Object,
                   0i64);
      if( inserted >= 0 )
      {
        v15 = Object;
        *(_OWORD *)Object = 0i64;
        v15[2] = 0i64;
        v15[1] = 0i64;
        LODWORD(v18) = 0;
        inserted = ObInsertObjectEx(v15, 0i64, v6, 0i64, (UINT64)v18, 0i64, &v22);
        Object = 0i64;
        if( inserted >= 0 )
        {
          *TransactionHandle = v22;
          v22 = 0i64;
          inserted = 0;
        }
      }
    }
  }
  else
  {
    inserted = -1073741431;
  }
  if( v22 )
    NtClose((UINT64)v22);
  if( Object )
    HalPutDmaAdapter((PADAPTER_OBJECT)Object);
  if( v10 )
  {
    ExReleaseRundownProtection((_EX_RUNDOWN_REF *)&CmpDummyThreadEvent + 132);
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
  }
  return inserted;
}

Referenced by:

No references.