IopSymlinkAllocateAndAddECP

NTSTATUS __stdcall IopSymlinkAllocateAndAddECP(PIRP Irp, _RELATIVE_SYMLINK_INFO **SymlinkInfo, UINT16 AllocationSize){
  int v4; 
  char v6; 
  int ParameterFromLookasideList; 
  _ECP_LIST *v8; 
  _ECP_LIST *v9; 
  PECP_LIST EcpList; 

  *SymlinkInfo = 0i64;
  EcpList = 0i64;
  v4 = AllocationSize;
  v6 = 0;
  IoGetIrpExtraCreateParameter(Irp, &EcpList);
  ParameterFromLookasideList = FsRtlAllocateExtraCreateParameterFromLookasideList(
                                 (_LPCGUID)&IopSymlinkECPGuid,
                                 v4 + 32,
                                 0,
                                 (PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK)IopSymlinkCleanupECP,
                                 (char *)&WheapErrorSourceTable + 2856,
                                 (PVOID *)SymlinkInfo);
  if( ParameterFromLookasideList >= 0 )
  {
    v8 = EcpList;
    if( EcpList )
      goto LABEL_5;
    ParameterFromLookasideList = FsRtlAllocateExtraCreateParameterList(0i64, &EcpList);
    if( ParameterFromLookasideList >= 0 )
    {
      v8 = EcpList;
      IoSetIrpExtraCreateParameter(Irp, (_IRP *)EcpList, v9);
      v6 = 1;
LABEL_5:
      ParameterFromLookasideList = FsRtlInsertExtraCreateParameter(v8, *SymlinkInfo);
      if( ParameterFromLookasideList >= 0 )
        return ParameterFromLookasideList;
      goto LABEL_8;
    }
  }
  v8 = EcpList;
LABEL_8:
  if( *SymlinkInfo )
  {
    (*SymlinkInfo)->InteriorMountPoint = 0i64;
    FsRtlFreeExtraCreateParameter(*SymlinkInfo);
    *SymlinkInfo = 0i64;
  }
  if( v6 )
  {
    FsRtlFreeExtraCreateParameterList(v8);
    IoClearIrpExtraCreateParameter((INT64)Irp);
  }
  return ParameterFromLookasideList;
}

Referenced by:

IopGraftName
IopSymlinkCreateECP
IopSymlinkUpdateECP