EcoPatcher?

  • 基本的にeco_launch.exe(以下本家ランチャ)と同じ動作をするが
  • ECOプレイ中に行われる解凍作業を省くために、データを解凍しながらパッチを当てる事が出来
  • さらに本家ランチャのリソースファイル設定をより効率的に設定し高速化が図られている。
    • 現在本家ランチャーも最適化され、速度は同等になっていると思われる。

使い方

  • 基本的にランチャと使い方は同じ。

比較

  • 下記は古い公式ランチャの話。現在はより高速になっている。
    ある環境でVer108の状態からVer117まで当てたときの時間
                   かかった時間  CPU時間 機能
    高速ランチャ       85秒   50秒 パッチ
    公式ランチャ     254秒   22秒 パッチ+解凍
    再構築君ランチャ   300秒   48秒 パッチ+解凍

単純にかかった時間で見ても約3倍速
解凍にかかった時間を考慮すると4倍速以上

履歴

  • v0.26b
    • URL変更に対応
    • バグを修正
  • v0.26a
    • バグを修正
  • v0.26
    • ログインを自動化
  • v0.25
    • ディレクトリ構造を持ったパッチが当てられなかった問題を修正
  • v0.24
    • 新規ファイルを当てることが出来なかった不具合を修正
  • v0.23
    • 読み取り専用ファイルが上書きできない問題を修正
  • v0.22
    • 起動してると一定時間毎に更新チェック
  • v0.21
    • 起動時にウィンドウを中央に移動
  • v0.2
    • ちょこちょこ修正
  • v0.1
    • 公開

Unpack.DLLについて

Ecoの関数をコピーして少し手を加えてあります。
プログラムの著作権はGunghoにありますので、ECO関係以外で使わないようにお願いします。
ECO関係なら少しくらい見逃してくれるかなーって事で、再配布もokです。

公開関数

*関数  Unpack

書式 int Unpack(const char *src, int srcSize, char **dest, int *destSize, int dw);

引数1 圧縮されたデータのアドレス
引数2 圧縮されたデータのサイズ
引数3 解凍先のアドレス のポインタ
引数4 解凍後のサイズ のポインタ(ポインタ先の値が変更されるかは未確認)
引数5 とりあえず1固定
戻り値 成功なら1 失敗なら0

srcからsrcSize分の圧縮データを destへdestSize分だけ解凍する。
解凍後のサイズがdestSizeを超えた場合は たぶん失敗する。
解凍後のサイズ<destSizeの場合はok
  • ※以下はUnpack.dllのVer1.2より

    #ref(): File not found: "Unpack121.zip" at page "ランチャー/Patcher"

  • Source

    #ref(): File not found: "src121.zip" at page "ランチャー/Patcher"

*関数Pack

書式 int Pack(const char *src, int srcSize, char **dest, int *destSize, int dw, int dw2);

引数1 圧縮するデータのアドレス
引数2 圧縮するデータのサイズ
引数3 圧縮先のアドレスを収納するポインタ
引数4 圧縮後のサイズを収納するポインタ
引数5 とりあえず1固定(2なら一個とばしで圧縮する?)
引数6 とりあえず0固定
戻り値 成功なら1 失敗なら0

srcからsrcSize分のデータを確保した領域(サイズはsrcSizeの二倍)へ圧縮し、
確保した領域のアドレスはdestへ、 圧縮データのサイズをdestSizeへ収納する。
※確保した領域はPackFreeを使って解放しなければならない。
*関数PackFree

書式 int PackFree(char **dest);

引数1 Packの引数3
戻り値 return HeapFree(GetProcessHeap(), 0, *dest);

Packで確保した領域はPackFreeを使って解放しなければならない。

使い方

//例えばanim.datのファイルリストを列挙してみる

#include <windows.h>
#include <stdio.h>

typedef int  (__stdcall *TUNPACK)  //戻り値 成功なら非0 失敗なら0
(
	const char *pSrc,         //圧縮されたデータのアドレス
	int         nSrcSize,     //圧縮されたデータのサイズ
	char **     pDest,        //解凍先のアドレスのポインタ
	int *       nDestSize,    //解凍後のサイズのポインタ
	int         n             //何これ? とりあえず1を渡す
);

typedef int  (__stdcall *TPACK)  //戻り値 成功なら非0 失敗なら0
(
	const char *pSrc,         //圧縮するデータのアドレス
	int         nSrcSize,     //圧縮するデータのサイズ
	char **     pDest,        //圧縮先のアドレスを収納するポインタ
	int *       nDestSize,    //圧縮後のサイズを収納するポインタ
	int         n,            //何これ? とりあえず1を渡す
	int         n2            //何これ? とりあえず0を渡す
);

typedef int  (__stdcall *TPACKFREE)
(
	char **     pDest
);

TUNPACK   Unpack   = NULL;
TPACK     Pack     = NULL;
TPACKFREE PackFree = NULL;

int LoadDLL(void) {

	HMODULE hUnackDll = LoadLibrary("Unpack.dll");
	if (hUnackDll) {
		Unpack  =   (TUNPACK)GetProcAddress(hUnackDll, "Unpack");
		Pack    =     (TPACK)GetProcAddress(hUnackDll, "Pack");
		PackFree= (TPACKFREE)GetProcAddress(hUnackDll, "PackFree");
	}
	
	if (hUnackDll && Unpack && Pack && PackFree)
		return 1;
	else
		return 0;
}

void main() {
	if (!LoadDLL())
		return;
	
	struct {
		int address;
		int packsize;
		int unpacksize;
	}stHed;
	
	int num = 0;//hedファイルの何個目を読むか。リストは0番目
	
	char *sHed = "./data/chara/anim.hed";
	char *sDat = "./data/chara/anim.dat";
	
	printf("%s\n", sDat);
	
	//.hed読み込み
	FILE *fpHed = fopen(sHed, "rb");
	fseek(fpHed, num * sizeof(stHed), SEEK_SET);
	fread(&stHed, sizeof(stHed), 1, fpHed);
	fclose(fpHed);
	
	BOOL bPacking = (stHed.packsize < 0);
	
	if (bPacking)
		stHed.packsize &= 0x7FFFFFFF;
	
	char *src  = (char *)malloc(stHed.packsize);
	char *dest = (char *)malloc(stHed.unpacksize);
	
	//.dat読み込み
	FILE *fpDat = fopen(sDat, "rb");
	fseek(fpDat, stHed.address, SEEK_SET);
	fread(src, stHed.packsize, 1, fpDat);
	fclose(fpDat);
	
	//解凍コピー
	if (bPacking)//圧縮チェック
		if (Unpack(src, stHed.packsize, &dest, &stHed.unpacksize, 1) != 0)
			;//success
		else
			;//error
	else if (stHed.packsize == stHed.unpacksize)
		memcpy(dest, src, stHed.packsize);
	else
		;//error
	
	free(src);
	
	//リスト表示
	int nList = *(int *)dest;
	char *p = &dest[4];
	for (int i = 0; i < nList; i++) {
		printf("%s\n", p);
		p += strlen(p) + 1;
	}
	
	free(dest);
}
//データを圧縮してみる。
int main() {
	LoadDLL();
	
	char str[] = "Uryyyyyyyyyyyyyyyyyyyyy";
	char *src = str;
	char *dest = NULL;
	
	int srcsize = strlen(str);
	int destsize = 0;
	
	printf("src  %02d:%s\n", srcsize, src);
	Pack(src, srcsize, &dest, &destsize, 1, 0);
	
	printf("dest %02d:", destsize);
	for (int i=0; i < destsize; i++) {
		printf("%02X ", (BYTE)dest[i]);
	}
	printf("\n");
	
	PackFree(dest);
	return 0;
}

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-07-14 (日) 04:24:02 (1680d)