IopSymlinkPropagateToExtensionIfNeeded

NTSTATUS __stdcall IopSymlinkPropagateToExtensionIfNeeded(
        _FILE_OBJECT *FileObject,
        _ECP_LIST *EcpList,
        _UNICODE_STRING *CompleteName){
  _RELATIVE_SYMLINK_INFO *v5; 
  _FILE_OBJECT *RelatedFileObject; 
  int v7; 
  WCHAR **FileObjectExtension; 
  _FSRTL_ALLOCATE_ECP_FLAGS v10; 
  WCHAR **v11; 
  unsigned int v12; 
  NTSTATUS v13; 
  PVOID EcpContext; 

  EcpContext = 0i64;
  v5 = 0i64;
  if( EcpList )
  {
    IopSymlinkRemoveECP(EcpList, (_RELATIVE_SYMLINK_INFO **)&EcpContext);
    v5 = (_RELATIVE_SYMLINK_INFO *)EcpContext;
    if( EcpContext )
    {
      if( (*((_BYTE *)EcpContext + 2) & 1) != 0 )
        goto LABEL_13;
LABEL_4:
      v7 = 0;
      goto LABEL_5;
    }
  }
  RelatedFileObject = FileObject->RelatedFileObject;
  if( !RelatedFileObject )
    goto LABEL_4;
  FileObjectExtension = (WCHAR **)IopGetFileObjectExtension(RelatedFileObject, FoExtTypeSymlink, 0i64);
  v11 = FileObjectExtension;
  if( !FileObjectExtension )
    goto LABEL_4;
  v12 = *((unsigned __int16 *)FileObjectExtension + 8) + CompleteName->Length + 2;
  if( v12 >= 0xFFFF )
  {
    v7 = -1073741562;
    goto LABEL_5;
  }
  v13 = FsRtlAllocateExtraCreateParameterFromLookasideList(
          (_LPCGUID)&IopSymlinkECPGuid,
          (unsigned __int16)v12 + 32,
          v10,
          (PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK)IopSymlinkCleanupECP,
          (char *)&WheapErrorSourceTable + 2856,
          &EcpContext);
  v5 = (_RELATIVE_SYMLINK_INFO *)EcpContext;
  v7 = v13;
  if( v13 < 0 )
    goto LABEL_5;
  IopSymlinkInitializeSymlinkInfo(
    (_RELATIVE_SYMLINK_INFO *)EcpContext,
    v12 + 32,
    CompleteName->Buffer,
    CompleteName->Length,
    0,
    v11[3],
    *((_WORD *)v11 + 8),
    *((_WORD *)v11 + 2),
    *((_WORD *)v11 + 1),
    0i64);
  v5->ExposedNamespaceLength = *(_WORD *)v11 + v5->OpenedName.Length - *((_WORD *)v11 + 8);
LABEL_13:
  v7 = IopSymlinkSetFoExtension(FileObject, v5);
  if( v7 >= 0 )
  {
    IopSymlinkFreeRelatedMountPointChain(v5);
    return v7;
  }
LABEL_5:
  if( v5 )
  {
    IopSymlinkFreeRelatedMountPointChain(v5);
    FsRtlFreeExtraCreateParameter(v5);
  }
  return v7;
}

Referenced by:

IopParseDevice