eMule v0.50a X Mod v1.6.1.2

eMule X Mod的开发维护者为中国程序员Dolphin。X Mod基于Xtreme Mod修改。制作的目标是为改善细节、提高用户体验。相对于Xtreme Mod的主要增强有:提高启动速度;共享文件控制;文件类型识别;下载历史的文字和类型过滤;更好的网页界面等。尤其值得一提的是eMule X Mod有32位普通版、32位SSE指令集编译版、64位版。X Mod使用集成了的DLP反吸血。

最新版本号均为1.6.1.2。此版的国家旗帜数据IP2Country 和 Ini 文件支持UTF-8,做了不少修改和bug修复。具体见下文的更新日志。

下载

以下版本中,SSE版本要在支持SSE指令集的CPU上才能使用,不过一般也都支持,推荐使用SSE版。所有可执行文件版本包均未加入ipfilter、server.met等组件,使用前必须手动下载组件并放入相应文件夹。你可以下载在我们的相关组件目录找寻并使用最新版的相关组件。

推荐可执行文件版本下载:

eMule 0.50a X Mod 1.6.1.2 x86 nosse(32位版可执行文件压缩包,No SSE)

eMule 0.50a X-Mod 1.6.1.2 x86(32位版可执行文件压缩包,SSE指令集编译)

eMule 0.50a X-Mod 1.6.1.2 x64(64位版可执行文件压缩包)

eMule0.50a-X-Mod1.6.1.2-sources.7z(源代码包)

相关链接

如果您的 X Mod 发生错误崩溃了,产生的dmp文件请发至email:emulexmod at 126.com,以帮助作者修正bug。
X Mod与Lite的主页
X Mod与Lite的sourceforge项目页
本博客上X Mod与Lite的目录介绍

更新日志

X-Mod 1.6.1.2:

0.50a X-Mod 1.6.1.2
—————-
修正:
修正超过4GB文件重复hash问题 (ahaha)
修正分配磁盘空间时UI失去响应并发生文件损坏的问题 (ahaha)
CPartFileConvert::run 初始化 sfmt

修改:
替换部分CFileFind为_taccess
队列线程支持删除任务避免导致潜在的崩溃
IP2Country 和 Ini 支持 UTF-8

50条评论隐藏

  1. #1 Solitudes
    2012年2月7日 周二 09:46 | 回复

    哇,更新了,赶紧试试 😀

  2. #2 BBA
    2012年2月7日 周二 10:07 | 回复

    感谢更新,一直用这个

  3. #3 Solitudes
    2012年2月7日 周二 10:11 | 回复

    32位 nosse版的主程序文件版本显示还是1.6.1.1,是文件搞错了还是版本号忘记修改了?
    32位的sse版版本号正常

  4. #4 con16
    2012年2月7日 周二 10:30 | 回复

    dlp現在也沒人在更新….

  5. #5 lioe
    2012年2月7日 周二 10:31 | 回复

    @Solitudes 作者搞错了吧

  6. #6 相忘于江湖
    2012年2月7日 周二 12:38 | 回复

    1.修复了1.6.1.1的假死问题。
    2.终于解决了一直以来超过4GB文件重复hash问题。^_^

  7. #7 相忘于江湖
    2012年2月7日 周二 19:54 | 回复

    发现一个大bug:统计数据每次启动都会被清零。
    1.6.1.2 64位版。

  8. #8 相忘于江湖
    2012年2月7日 周二 21:34 | 回复

    这个版本下载好像有问题,同一个用户我用1.6.0可以达到100kb的速度,但是用1.6.1.2连那个用户只能达到几kb的速度。(下载同一个文件,反复对比了1个多小时)

    先回滚到1.6.0.0版,等1.6.1.3出来再说。

  9. #9 Charles
    2012年2月8日 周三 02:11 | 回复

    @相忘于江湖 我的32位版的1.6.1.2也有这个BUG。

  10. #10 Solitudes
    2012年2月8日 周三 09:33 | 回复

    昨天用下来已经崩溃了2次了,后来一次是半夜崩溃的,算是白挂了一晚上 😥
    还是先用旧版吧

  11. #11 相忘于江湖
    2012年2月8日 周三 13:04 | 回复

    @Charles

    作者已经修复统计数据清零的问题,请重新下载。

  12. #12 相忘于江湖
    2012年2月8日 周三 13:05 | 回复

    @Solitudes

    崩溃的问题我也碰到了,作者据说修复了这个问题,请重新下载确认。

  13. #13 cc
    2012年2月9日 周四 11:16 | 回复

    这个版本的更新真是不容易等啊,赶紧下来试用

  14. #14 Solitudes
    2012年2月9日 周四 12:03 | 回复

    @相忘于江湖
    已经重新下载,目前没发现问题 😀

  15. #15 相忘于江湖
    2012年2月9日 周四 12:43 | 回复

    最新版,好像还有一个问题:有时候上传速度会突然降下来很多,过几十分钟后自行恢复。
    (网络环境电信2M adsl 一台电脑独享带宽,骡子上行速度限制设置为42kb/s,上传速度去除网络开销一般稳定在32kb/s左右,但是有时候会突然降低到只有12kb/s,过几十分钟后又恢复到正常速度。电信网络问题的可能性很小,因为以前用1.6.0版本从未出现过这种情况。)

  16. #16 相忘于江湖
    2012年2月9日 周四 16:44 | 回复

    发现问题原因了:是我的ISP在限制ed2k连接速度。因为GFW的原因现在必须禁用迷惑协议才能连上ed2k服务器,所以我这几天把协议禁用了,但是我的ISP对ed2k做了限速,导致上传速度不能达到全速。

    解决方案是:启动电骡连接服务器的时候先禁用迷惑协议,连上服务器后马上启用迷惑协议就不会被ISP限速了。

    PS:对GFW的封锁以及ISP的限速表示鄙视 😯

  17. #17 xbeam
    2012年2月10日 周五 20:11 | 回复

    刚下了v1.6.1.2发现开启NAFC后下载速度几乎为0, 32位SSE

  18. #18 gqpx
    2012年2月12日 周日 09:46 | 回复

    @相忘于江湖 迷惑协议只是用来防止被ISP限速的吗?这个协议有什么必要性?

  19. #19 犟骡子
    2012年2月12日 周日 10:11 | 回复

    @gqpx 保证你的通信无法被包括方校长在内的无耻之徒上下其手。当然光腚爱好者和私有软件上瘾者们可以无视这一点。

  20. #20 ahaha
    2012年2月13日 周一 19:25 | 回复

    关于分配磁盘空间时UI假死的处理,我那个”return”仅仅是当时随手改改的权宜之计。
    在队列里有多个文件同时需要分配时现在的处理依然会造成假死的,
    下面给出一个比较全面彻底的解决方案,顺便重写一个我自己用的写盘过程,
    代码比较简单粗暴,但是UI操作丝般柔滑, 😳 希望作者看了有所启发。 😆
    PartFile.cpp

    int CPartFile::FlushBuffer2(bool forcewait)
    {
    //if (m_FlushSetting)
    //{
    // if (forcewait)
    // {
    // m_FlushSetting->evTerminated.wait();
    // FlushDone();
    // }
    // else return 1;
    //}

    //Xman Flush Thread improvement
    bool forcedbecauseincreasing=false;
    //Xman end

    // SLUGFILLER: SafeHash
    if (forcewait) { // Last chance to grab any ICH results
    Poco::FastMutex::SingleLock sLock(ICH_mut, true); // ICH locks the file – otherwise it may be written to while being checked
    ParseICHResult(); // Check result from ICH
    }
    // SLUGFILLER: SafeHash

    try
    {
    bool bCheckDiskspace = thePrefs.IsCheckDiskspaceEnabled() && thePrefs.GetMinFreeDiskSpace() > 0;
    ULONGLONG uFreeDiskSpace = bCheckDiskspace ? CVolumeInfo::_GetFreeDiskSpace(GetTempPath()) : 0;

    // Check free diskspace for compressed/sparse files before possibly increasing the file size
    if (bCheckDiskspace && !IsNormalFile())
    {
    // Compressed/sparse files; regardless whether the file is increased in size,
    // check the amount of data which will be written
    // would need to use disk cluster sizes for more accuracy
    if (m_nTotalBufferData + thePrefs.GetMinFreeDiskSpace() >= uFreeDiskSpace)
    AfxThrowFileException(CFileException::diskFull, 0, m_hpartfile.GetFileName());
    }
    uint64 crrentEnd = m_BufferedData_list.GetTail()->end;
    if (m_hpartfile.GetLength() = uFreeDiskSpace)
    AfxThrowFileException(CFileException::diskFull, 0, m_hpartfile.GetFileName());
    }

    if (!IsNormalFile() || uIncrease<2097152)
    {
    //Xman Flush Thread improvement
    if(!forcewait) forcedbecauseincreasing=true;
    //Xman end
    forcewait=true; // alloc it at once
    } //Xman

    // Allocate filesize
    if (!forcewait)
    {
    m_AllocateThread = new AllocateSpaceThread(this, newsize);
    if(m_AllocateThread->start())
    {
    return -1;
    }
    else
    {
    m_AllocateThread = NULL;
    TRACE(_T(“Failed to create alloc thread! -> allocate blocking\n”));
    forcewait=true;
    }
    }
    if (forcewait)
    {
    bIncreasedFile = true;
    // If this is a NTFS compressed file and the current block is the 1st one to be written and there is not
    // enough free disk space to hold the entire *uncompressed* file, windows throws a ‘diskFull’!?
    if (IsNormalFile())
    m_hpartfile.SetLength(newsize); // allocate disk space (may throw ‘diskFull’)
    }
    }
    }
    catch (CFileException* error)
    {
    FlushBuffersExceptionHandler(error);
    }
    #ifndef _DEBUG
    catch(…)
    {
    FlushBuffersExceptionHandler();
    }
    #endif

    m_nNextFlushBufferTime = 0;// X: [GB] – [Global Buffer]
    size_t partCount = GetPartCount();
    bool *changedPart = new bool[partCount];
    // Remember which parts need to be checked at the end of the flush
    for (size_t partNumber = 0; partNumber 0)
    {
    PartFileBufferedData *item = m_BufferedData_list.RemoveHead();
    uint32 lenData = (uint32)(item->end – item->start + 1);

    // SLUGFILLER: SafeHash – could be more than one part
    for (uint_ptr curpart = (uint_ptr)(item->start/PARTSIZE); curpart end/PARTSIZE; curpart++)
    changedPart[curpart] = true;
    // SLUGFILLER: SafeHash

    m_hpartfile.Seek(item->start, CFile::begin);
    m_hpartfile.Write(item->data, lenData);

    // Decrease buffer size
    m_nTotalBufferData -= lenData;

    // Release memory used by this item
    delete [] item->data;
    delete item;
    }

    //Creating the Thread to flush to disk
    m_FlushSetting = new FlushDone_Struct;
    m_FlushSetting->bForceICH = false;
    m_FlushSetting->changedPart = changedPart;
    if (forcewait == false || forcedbecauseincreasing==true) //Xman Flush Thread improvement
    {
    CPartFileFlushThread *flushThread = new CPartFileFlushThread(this);
    // X: queued disc-access for read/flushing-threads
    theApp.AddNewDiscAccessThread(flushThread);
    return 2;
    }

    // Or flush normally
    try
    {
    m_hpartfile.Flush();
    }
    catch (CFileException* error)
    {
    FlushBuffersExceptionHandler(error);
    delete[] changedPart;
    delete m_FlushSetting;
    m_FlushSetting = NULL;
    return -2;
    }

    FlushDone();
    changedPart = NULL;
    return 0;
    }

    void CPartFile::AllocateSpaceThread::run()
    {
    DbgSetThreadName(“Partfile-Allocate Space”);
    theApp.QueueDebugLogLine(false,_T(“ALLOC:Start (%s) (%s)”),myfile->GetFileName(), CastItoXBytes(m_iAllocinfo, false, false) );

    auto iHi = (LONG)(m_iAllocinfo >> 32);
    DWORD dwPtrLow = SetFilePointer(myfile->m_hpartfile.m_hFile, (LONG)m_iAllocinfo – 1, &iHi, CFile::begin);
    if(dwPtrLow == INVALID_SET_FILE_POINTER)
    {
    theApp.downloadqueue->m_bAlloctThreadRunning = false;
    PostMessage(theApp.emuledlg->m_hWnd,TM_FILEALLOCEXC,(WPARAM)myfile,(LPARAM)GetLastError());
    }else
    {
    WriteFile(myfile->m_hpartfile.m_hFile, “A”, 1, &dwPtrLow, NULL);
    //SetEndOfFile(myfile->m_hpartfile.m_hFile);
    }

    theApp.downloadqueue->m_bAlloctThreadRunning = false;
    myfile->m_AllocateThread=NULL;
    }

    void CDownloadQueue::Process(){
    .

    if(TotalBuffer > thePrefs.m_uGlobalBufferSize && m_bAlloctThreadRunning == false)
    {
    const DWORD curTick = ::GetTickCount();
    POSITION pos = filelist.GetHeadPosition();
    while(pos)
    {
    CPartFile* cur_file = filelist.GetNext(pos);
    if(cur_file
    && cur_file->m_bPreviewing == false
    && cur_file->m_nNextFlushBufferTime == 0
    && cur_file->m_nTotalBufferData
    && cur_file->GetStatus() != PS_INSUFFICIENT
    && cur_file->GetStatus() != PS_ERROR)
    {
    cur_file->m_nNextFlushBufferTime = curTick;
    TotalBuffer -= cur_file->m_nTotalBufferData;
    if(cur_file->FlushBuffer2(false) == -1)
    {
    m_bAlloctThreadRunning = true;
    TotalBuffer += cur_file->m_nTotalBufferData;
    break;
    }
    TotalBuffer += cur_file->m_nTotalBufferData;
    }
    }
    }
    theApp.emuledlg->transferwnd->ShowBufferUsage(TotalBuffer);

    // [TPT] – Patch
    if (theApp.serverconnect->IsUDPSocketAvailable())
    {
    if ((!lastudpsearchtime) || (::GetTickCount() – lastudpsearchtime) > UDPSERVERREASKTIME)
    SendNextUDPPacket();
    }
    }
    //end – Maella -New bandwidth control-
    CheckDiskspaceTimed();
    }

    由于不再每15秒检测完成块,退出程序时主动做一下保存:

    void CemuleDlg::OnClose()
    {
    .

    theApp.m_app_state = APP_STATE_SHUTTINGDOWN;

    for (POSITION pos = theApp.downloadqueue->filelist.GetHeadPosition();pos != 0;) // X: [ISS] – [Improved Source Save]
    {
    CPartFile* file = theApp.downloadqueue->filelist.GetNext(pos);
    if(!file->IsStopped())
    {
    file->m_sourcesaver.SaveSources();
    file->FlushBuffer2(true);
    }
    }

    // X: queued disc-access for read/flushing-threads
    theApp.m_DiscAccessQueue.stop();

    .

    基本上就这样,声明/构造/析构之类酌情补上就行了。

  21. #21 ahaha
    2012年2月13日 周一 19:34 | 回复

    关于分配磁盘空间时UI假死的处理,我那个”return”仅仅是当时随手改改的权宜之计。
    在队列里有多个文件同时需要分配时现在的处理依然会造成假死的,
    下面给出一个比较全面彻底的解决方案,顺便重写一个我自己用的写盘过程,
    代码比较简单粗暴,但是UI操作丝般柔滑, 😳 希望作者看了有所启发。 😆

    int CPartFile::FlushBuffer2(bool forcewait)
    {
    //if (m_FlushSetting)
    //{
    // if (forcewait)
    // {
    // m_FlushSetting->evTerminated.wait();
    // FlushDone();
    // }
    // else return 1;
    //}

    //Xman Flush Thread improvement
    bool forcedbecauseincreasing=false;
    //Xman end

    // SLUGFILLER: SafeHash
    if (forcewait) { // Last chance to grab any ICH results
    Poco::FastMutex::SingleLock sLock(ICH_mut, true); // ICH locks the file – otherwise it may be written to while being checked
    ParseICHResult(); // Check result from ICH
    }
    // SLUGFILLER: SafeHash

    try
    {
    bool bCheckDiskspace = thePrefs.IsCheckDiskspaceEnabled() && thePrefs.GetMinFreeDiskSpace() > 0;
    ULONGLONG uFreeDiskSpace = bCheckDiskspace ? CVolumeInfo::_GetFreeDiskSpace(GetTempPath()) : 0;

    // Check free diskspace for compressed/sparse files before possibly increasing the file size
    if (bCheckDiskspace && !IsNormalFile())
    {
    // Compressed/sparse files; regardless whether the file is increased in size,
    // check the amount of data which will be written
    // would need to use disk cluster sizes for more accuracy
    if (m_nTotalBufferData + thePrefs.GetMinFreeDiskSpace() >= uFreeDiskSpace)
    AfxThrowFileException(CFileException::diskFull, 0, m_hpartfile.GetFileName());
    }
    uint64 crrentEnd = m_BufferedData_list.GetTail()->end;
    if (m_hpartfile.GetLength() = uFreeDiskSpace)
    AfxThrowFileException(CFileException::diskFull, 0, m_hpartfile.GetFileName());
    }

    if (!IsNormalFile() || uIncrease<2097152)
    {
    //Xman Flush Thread improvement
    if(!forcewait) forcedbecauseincreasing=true;
    //Xman end
    forcewait=true; // alloc it at once
    } //Xman

    // Allocate filesize
    if (!forcewait)
    {
    m_AllocateThread = new AllocateSpaceThread(this, newsize);
    if(m_AllocateThread->start())
    {
    return -1;
    }
    else
    {
    m_AllocateThread = NULL;
    TRACE(_T(“Failed to create alloc thread! -> allocate blocking\n”));
    forcewait=true;
    }
    }
    if (forcewait)
    {
    bIncreasedFile = true;
    // If this is a NTFS compressed file and the current block is the 1st one to be written and there is not
    // enough free disk space to hold the entire *uncompressed* file, windows throws a ‘diskFull’!?
    if (IsNormalFile())
    m_hpartfile.SetLength(newsize); // allocate disk space (may throw ‘diskFull’)
    }
    }
    }
    catch (CFileException* error)
    {
    FlushBuffersExceptionHandler(error);
    }
    #ifndef _DEBUG
    catch(…)
    {
    FlushBuffersExceptionHandler();
    }
    #endif

    m_nNextFlushBufferTime = 0;// X: [GB] – [Global Buffer]
    size_t partCount = GetPartCount();
    bool *changedPart = new bool[partCount];
    // Remember which parts need to be checked at the end of the flush
    for (size_t partNumber = 0; partNumber 0)
    {
    PartFileBufferedData *item = m_BufferedData_list.RemoveHead();
    uint32 lenData = (uint32)(item->end – item->start + 1);

    // SLUGFILLER: SafeHash – could be more than one part
    for (uint_ptr curpart = (uint_ptr)(item->start/PARTSIZE); curpart end/PARTSIZE; curpart++)
    changedPart[curpart] = true;
    // SLUGFILLER: SafeHash

    m_hpartfile.Seek(item->start, CFile::begin);
    m_hpartfile.Write(item->data, lenData);

    // Decrease buffer size
    m_nTotalBufferData -= lenData;

    // Release memory used by this item
    delete [] item->data;
    delete item;
    }

    //Creating the Thread to flush to disk
    m_FlushSetting = new FlushDone_Struct;
    m_FlushSetting->bForceICH = false;
    m_FlushSetting->changedPart = changedPart;
    if (forcewait == false || forcedbecauseincreasing==true) //Xman Flush Thread improvement
    {
    CPartFileFlushThread *flushThread = new CPartFileFlushThread(this);
    // X: queued disc-access for read/flushing-threads
    theApp.AddNewDiscAccessThread(flushThread);
    return 2;
    }

    // Or flush normally
    try
    {
    m_hpartfile.Flush();
    }
    catch (CFileException* error)
    {
    FlushBuffersExceptionHandler(error);
    delete[] changedPart;
    delete m_FlushSetting;
    m_FlushSetting = NULL;
    return -2;
    }

    FlushDone();
    changedPart = NULL;
    return 0;
    }

  22. #22 allix
    2012年2月14日 周二 16:17 | 回复

    这个mod不显示旗帜吗

  23. #23 ahaha
    2012年2月14日 周二 18:50 | 回复

    @allix
    检查config目录下countryflag32.dll文件

  24. #24 ahaha
    2012年2月14日 周二 18:59 | 回复

    关于分配磁盘空间时UI假死的处理,我那个”return”仅仅是当时随手改改的权宜之计。8O
    在队列里有多个文件同时需要分配时现在的处理依然会造成假死的。
    现在提供一个彻底解决的思路给作者。
    这里不让贴图,贴代码超出长度,传到115了。

    这个包里附带一个编译好的64位执行文件,是我自己在用的,
    包含所有更改,请有兴趣的网友也测试下

    X.rar

  25. #25 ahaha
    2012年2月14日 周二 19:16 | 回复

    忘了条:eMule完全可以自己清除“KAD通过防火墙”
    上传队列调度加一行代码:

    else if (sec==5) {
    sec=0;
    theApp.downloadqueue->ProcessQuickStart(); // NEO: QS – [QuickStart] UpdateMaxClientScore();
    if (thePrefs.IsSchedulerEnabled())
    theApp.scheduler->Check();
    if (Kademlia::CKademlia::IsFirewalled())
    Kademlia::CKademlia::RecheckFirewalled();

    }

  26. #26 Ejack
    2012年2月15日 周三 06:52 | 回复

    @ahaha
    ……你这样会把真LowID用户搞死的……死循环。

  27. #27 allix
    2012年2月15日 周三 09:58 | 回复

    X Mod 的反吸血应该安装在什么文件下,好像config下不起作用 。另外谁有风之痕的反吸血最新版本?

  28. #28 Solitudes
    2012年2月15日 周三 10:15 | 回复

    @allix
    X Mod 的反吸血放在程序的根目录下。
    风之痕的DLP+已经N年不更新了。

  29. #29 allix
    2012年2月15日 周三 10:40 | 回复

    @Solitudes 根目录上也放了,还是没有!

  30. #30 allix
    2012年2月15日 周三 11:01 | 回复

    @Solitudes
    @allix 现在好了 ,能用了,谢谢! 👿

  31. #31 allix
    2012年2月20日 周一 15:31 | 回复

    为什么我的版本号下了eMule v0.50a X Mod v1.6.1.2,显示还是eMule v0.50a X Mod v1.6.1.1.
    而且“不要上传给吸血客户端”不能勾选,是灰色的?

  32. #32 allix
    2012年2月20日 周一 15:36 | 回复

    [IMG]http://p.tzqq.org/dm-QXYD.jpg[/IMG]就是这个样子的!不知道大家是什么样子的?

  33. #33 allix
    2012年2月20日 周一 15:37 | 回复

    2 Logo

  34. #34 相忘于江湖
    2012年2月20日 周一 16:34 | 回复

    @allix
    版本号的问题:程序里面只显示3位数。要查看详细版本号的话,打开emule安装目录,右击eMulex64.exe文件查看属性就能看到完整的版本号了。

    “不要上传给吸血客户端”不能勾选的问题:如果你自行更新了DLP的话就不能启用。必须使用程序集成的DLP才能启用这个选项。(这个是为了防止加载某些不正规的DLP变成吸血骡)

  35. #35 allix
    2012年2月21日 周二 17:18 | 回复


    为什么我在家里的这两栏不见了

  36. #36 allix
    2012年2月21日 周二 17:21 | 回复


    为什么我在家里装上emule,反吸血日至这两栏怎么不见了?是不是哪里需要设置?

  37. #37 allix
    2012年2月21日 周二 17:22 | 回复
  38. #38 ddku
    2012年2月21日 周二 17:39 | 回复

    @allix 扩展设置,开启verbosehttps://www.emulefans.com/extended/

  39. 2012年2月22日 周三 08:54 | 回复

    现在用XPE 😀

  40. #40 fun
    2012年2月25日 周六 14:49 | 回复

    装上卸了重新用 xtreme 了。容易崩溃,服务器掉线后,所有服务器如果连不上,kad 为什么也会掉啊?
    发现导入文件块的功能也没有了,如果崩溃后损坏文件就比较麻烦,还是用稳定的吧。

  41. #41 xrdsht
    2012年3月11日 周日 21:39 | 回复

    以前用32位都有国旗,现在改用64位却不能加载国旗了,有人知道原因吗

  42. #42 yangworm
    2012年3月12日 周一 16:40 | 回复

    确实 我的也没有国旗啊,请高手指点啊

  43. #43 yangworm
    2012年3月13日 周二 09:28 | 回复

    64位的主程序文件版本显示还是1.6.1.1,而且无法加载国旗

  44. 2012年4月8日 周日 14:19 | 回复

    以前用过,发现上传优先级的设置是摆设
    现在这个版本解决这个问题没有?

  45. #45 jin
    2012年4月10日 周二 00:50 | 回复

    试用结果是在完成文件的时候死机……几个g的文件白下了

  46. #46 cc
    2012年4月18日 周三 23:06 | 回复

    这个mod挺小巧的

  47. #47 沙漠上的妖精
    2012年5月19日 周六 12:03 | 回复

    我在学校内网完全无法连接EDONKEYNO2,在家里ADSL一连就连上了T_T

  48. #48 沙漠上的妖精
    2012年5月19日 周六 12:27 | 回复

    我丢!解压运行下个XTREME而已,仲么将我个XMOD洗佐,顶你个肺啊!!!!!我D设置同埋积分文件啊啊啊啊啊你老味啊!!!!!!!!!!!
    佢老母啊!!!!!!!!!!!!!!!!

  49. #49 阿德
    2012年5月19日 周六 22:37 | 回复

    @沙漠上的妖精 应该不会丢失的,找到config目录就有救

  50. #50 netr66
    2012年7月7日 周六 14:54 | 回复

    今天刚试用X86版,发现一个小BUG,在搜索窗输入关键字按搜索后,在结果显示窗出现两排表头栏,有显示残留。

共2页12下一页

发表评论

您的Email将不会显示出来。头像请至Gravatar.com注册上传。*号标注项为必填。

*
*
*
标签用法
字数:0