IopSymlinkAllocateAndAddECP

INT64 __fastcall IopSymlinkAllocateAndAddECP(IRP *Irp, VOID **EcpContext, UINT16 a3){
  int v4; 
  char v6; 
  NTSTATUS ParameterFromLookasideList; 
  PECP_LIST v8; 
  PECP_LIST EcpList; 
  *EcpContext = 0i64;
  EcpList = 0i64;
  v4 = a3;
  v6 = 0;
  IoGetIrpExtraCreateParameter(Irp, &EcpList);
  ParameterFromLookasideList = FsRtlAllocateExtraCreateParameterFromLookasideList(
                                 &IopSymlinkECPGuid,
                                 v4 + 32,
                                 0,
                                 (PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK)IopSymlinkCleanupECP,
                                 IopSymlinkInfoLookasideList,
                                 EcpContext);
  if( ParameterFromLookasideList >= 0 )
  {
    v8 = EcpList;
    if( EcpList )
      goto LABEL_5;
    ParameterFromLookasideList = FsRtlAllocateExtraCreateParameterList(0i64, &EcpList);
    if( ParameterFromLookasideList >= 0 )
    {
      v8 = EcpList;
      IoSetIrpExtraCreateParameter(Irp, EcpList);
      v6 = 1;
LABEL_5:
      ParameterFromLookasideList = FsRtlInsertExtraCreateParameter(v8, *EcpContext);
      if( ParameterFromLookasideList >= 0 )
        return(unsigned int)ParameterFromLookasideList;
      goto LABEL_8;
    }
  }
  v8 = EcpList;
LABEL_8:
  if( *EcpContext )
  {
    *((_QWORD *)*EcpContext + 1) = 0i64;
    FsRtlFreeExtraCreateParameter(*EcpContext);
    *EcpContext = 0i64;
  }
  if( v6 )
  {
    FsRtlFreeExtraCreateParameterList(v8);
    IoClearIrpExtraCreateParameter(Irp);
  }
  return(unsigned int)ParameterFromLookasideList;
}

Referenced by:

IopGraftName
IopSymlinkCreateECP
IopSymlinkUpdateECP