IopRetrieveTransactionParameters

NTSTATUS __stdcall IopRetrieveTransactionParameters(
        _DEVICE_OBJECT *DeviceObject,
        _OPEN_PACKET *Op,
        UINT64 DesiredAccess,
        _FILE_OBJECT *FileObject){
  int v5; 
  NTSTATUS result; 
  int v9; 
  _ETHREAD *CurrentThread; 
  _WORD *Teb; 
  _WORD *v12; 
  __int16 v13; 
  NTSTATUS v14; 
  _HANDLE Handle[2]; 
  PVOID Object; 
  VOID *TypeExt; 

  v5 = DesiredAccess;
  TypeExt = 0i64;
  *(_QWORD *)Handle = 0i64;
  v13 = 0;
  result = TmCurrentTransaction(Handle);
  v9 = result;
  v14 = result;
  if( result == -1073741637 )
  {
    v9 = 0;
    v14 = 0;
  }
  else if( result < 0 )
  {
    return result;
  }
  if( *(_QWORD *)Handle )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    if( (CurrentThread->Tcb._bf_0 & 0x400) != 0
      || CurrentThread->Tcb.ApcStateIndex == 1
      || (Teb = CurrentThread->Tcb.Teb) == 0i64 )
    {
      v9 = -1072103400;
    }
    else
    {
      v13 = Teb[372];
      v9 = v14;
    }
  }
  if( v9 < 0 || !*(_QWORD *)Handle )
    return v9;
  if( IopCheckStackForTransactionSupport(DeviceObject)
    || (Op->ShareAccess &= 1u, Op->Disposition == 1) && (v5 & 0xFEEDFF56) == 0
    || Op->QueryOnly )
  {
    Object = 0i64;
    if( ObReferenceObjectByHandle(
           *(VOID **)Handle,
           0x120037ui64,
           (_OBJECT_TYPE *)TmTransactionObjectType,
           1,
           &Object,
           0i64) < 0 )
      return -1072103400;
    IopGetSetSpecificExtension(FileObject, FoExtTypeTransactionParams, 0x10ui64, 1u, &TypeExt, 0i64);
    v9 = result;
    if( result >= 0 )
    {
      v12 = TypeExt;
      *(_WORD *)TypeExt = 16;
      v12[1] = v13;
      *((_QWORD *)v12 + 1) = Object;
      return result;
    }
    HalPutDmaAdapter((PADAPTER_OBJECT)Object);
    return v9;
  }
  return -1072103361;
}

Referenced by:

IopAllocRealFileObject
IopParseDevice