Тема: creaturecache.wdb
Показать сообщение отдельно
Старый 15.12.2013, 17:37   #17
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию

Скрипт для переименования Lua функций:
Завтра приду на работу проверю работоспособность.
Код:
typedef char* string;
#include <idc.idc>

static long getRegisterFunction()
{
	string str = "";
	auto dwAddress = 0; 
	
	dwAddress = FindBinary(dwAddress + 1, SEARCH_DOWN|SEARCH_NEXT, "\"Usage: SetCharCustomizeFrame\"");
	//Message("dwAddress %x\n", dwAddress);
	dwAddress = DfirstB(DfirstB(PrevFunction(DfirstB(dwAddress))))+0xE;
	str = GetOpnd (dwAddress,0);

	if(IsAddrStartOfFunction(LocByName(str)) == 0)
		return -1;

	RenameFunc(LocByName(str), "RegisterScriptFunction");
	return LocByName(str);
}

static long main()
{
    string prefix = "Script_";
	long dwAddress, nameptr, maxentries;
	long dwRegisterFunction; 
	string name,fname;
	long i;
	dwRegisterFunction = getRegisterFunction();
	//Message("dwRegisterFunction = %x\n", dwRegisterFunction);
	if(dwRegisterFunction == -1)
		return;
		
	dwAddress = 0;
	
	while (dwAddress != BADADDR)
	{
		dwAddress = RnextB (dwRegisterFunction, dwAddress); 
        //Message("dwAddress %x\n", dwAddress);		
		nameptr = GetNamesPtrFromAdr(dwAddress);
		//Message("nameptr %x\n", nameptr);
		maxentries = Dword(dwAddress + 0xD);
		for (i=0;i<maxentries/8;i++)
		{
			name = GetString(Dword(nameptr), -1, ASCSTR_C);
			//Message("name %s\n", name);
		
			if(strlen(name) < 4)
				break;
			if(IsAddrStartOfFunction(Dword(nameptr+4)) == 0)
				break;
			fname = prefix + name;
			Message("%x : %s%s\n", Dword(nameptr+4), prefix, name);
						
			if (RenameFunc(Dword(nameptr+4), fname) == 0)
				break;
			nameptr = nameptr + 8;
		}
	}
	Message("Done.\n");
}

static long GetNamesPtrFromAdr(long adr)
{
	long dwRet;
	dwRet = adr - 0x10 + 0x4;
	return (Dword(dwRet) - 4);
}

// 1 = Success, 0 = Failure
static long RenameFunc(long dwAddress, string sFunction)
{
	long dwRet;
	if(hasUserName(GetFlags(dwAddress)))
	{
		Message("%x already has custom name %s... skipping\n", dwAddress, Name(dwAddress));
		return 1;
	}
	
	dwRet = MakeNameEx(dwAddress, sFunction, SN_NOCHECK);

	if(dwRet == 0)
	{
		string sTemp;
		long i;
		for(i = 0; i < 32; i++)
		{
			sTemp = form("%s_%i", sFunction, i);

			if((dwRet = MakeNameEx(dwAddress, sTemp, SN_NOCHECK)) != 0)
			{
				Message("Info: Renamed to %s instead of %s\n", sTemp, sFunction);
				break;
			}
		}
	}
	return dwRet;	
}

static long IsAddrStartOfFunction(long addr)
{
	if(GetFunctionAttr(addr, FUNCATTR_START) == addr)
		return 1;
	return 0;
}
__________________
Konctantin вне форума   Ответить с цитированием