Sav 
 
 
		
		
		
			
			
			 
			
Posts: 2180 
	
		
	 | 
	
		
			
			 
			
				baratorch Wrote:а че такое $3, и зачем перед еах - % ? 
я какбэ и в msvs достаточно с асмом поработал и тут недавно masm32 и fasm скачал, попрактиковался. но процитированный код меня пугает. 
Это Dev c++ и at&t ассемблер. 
$3 - константа, % - потому что такой синтаксис, а самое кошмарное то, что в mov первый операнд записывается во второй, а не наоборот. Меня этот код тоже пугает, если честно.   
			 
			
			
			
				
(This post was last modified: 29.08.2011 10:05 by Sav.)
 
			 
		 |  
	 
 | 
	| 29.08.2011 10:00 | 
	
		
	 | 
	
		
		feanor 
 
 
		
		
		
			
			
			 
			
Posts: 624 
	
		
	 | 
	
		
			
			 
			
				Quote:    с помощью __asm _emit и макросов в ms vc++ можно же реализовать любую недоступную инструкцию 
проблема не в инструкциях, проблема в синтаксисе. АТ-шный отличается сильно.
 Quote:Меня этот код тоже пугает, если честно.  
дык.
 
Code: 
 int __attribute__((naked)) NewLuckCode() asm("new_luck"); 
 
asm 
( 
    ".intel_syntax noprefix\n" // use intel syntax 
 
    "new_luck:                              \n" 
        "xor eax, eax                       \n" 
        "mov ecx, edi                       \n" 
            "loop_1:                        \n" 
        "cmp dword ptr ds:[ecx], 0x2D       \n" 
        "je calc_bonuses_1                  \n" 
        "inc eax                            \n" 
        "add ecx, 0x8                       \n" 
        "cmp eax, 0x13                      \n" 
        "jl loop_1                          \n" 
        "mov ecx, dword ptr ds:[0x660b68]   \n" 
        "mov eax, dword ptr ds:[ecx+0x5D8]  \n" 
        "cmp eax, -1                        \n" 
        "je art_2                           \n" 
        "lea edx, [eax*2+eax]               \n" 
        "mov eax, dword ptr ds:[0x660B6C]   \n" 
        "mov ecx, dword ptr ds:[edx*8+eax]  \n" 
        "push ecx                           \n" 
        "mov ecx, esi                       \n" 
        "mov eax, 0x4d9460                  \n" 
        "call eax                           \n" 
        "test al, al                        \n" 
        "je art_2                           \n" 
            "calc_bonuses_1:                \n" 
        "inc dword ptr ss:[ebp+0x0C]        \n" 
 
            "art_2:                         \n" 
        "xor eax, eax                       \n" 
        "mov ecx, edi                       \n" 
            "loop_2:                        \n" 
        "cmp dword ptr ds:[ecx], 163        \n" 
        "je calc_bonuses_2                  \n" 
        "inc eax                            \n" 
        "add ecx, 0x8                       \n" 
        "cmp eax, 0x13                      \n" 
        "jl loop_2                          \n" 
        "mov ecx, dword ptr ds:[0x660b68]   \n" 
        "mov eax, dword ptr ds:[ecx+0x5D8]  \n" 
        "cmp eax, -1                        \n" 
        "je art_3                           \n" 
        "lea edx, [eax*2+eax]               \n" 
        "mov eax, dword ptr ds:[0x660B6C]   \n" 
        "mov ecx, dword ptr ds:[edx*8+eax]  \n" 
        "push ecx                           \n" 
        "mov ecx, esi                       \n" 
        "mov eax, 0x4d9460                  \n" 
        "call eax                           \n" 
        "test al, al                        \n" 
        "je art_3                           \n" 
            "calc_bonuses_2:                \n" 
        "add dword ptr ss:[ebp+0x0C],-2     \n" 
 
 
 
            "art_3:" 
            "ret_section:                   \n" 
        "mov eax, 0x4E3AC7                  \n" 
        "jmp eax                            \n" 
    ".att_syntax noprefix\n" // reset AT&T syntax or there will be errors 
);
  
			 
			
			
			
				
(This post was last modified: 29.08.2011 10:22 by feanor.)
 
			 
		 |  
	 
 | 
	| 29.08.2011 10:21 | 
	
		
	 | 
	
		
		Sav 
 
 
		
		
		
			
			
			 
			
Posts: 2180 
	
		
	 | 
	
		
			
			 
			
				Понятно, спасибо. 
 
А что означают __attribute__((naked)) и asm("new_luck") в объявлении функции?
			 
			
			
			
		 |  
	 
 | 
	| 29.08.2011 11:02 | 
	
		
	 | 
	
		
		baratorch 
 
 
		
		
		
			
			
			 
			
Posts: 197 
	
		
	 | 
	
		
			
			 
			
				__attribute__((naked)) это как в msvc++ __declspec(naked) ? 
- очевидно означает объявление "голой" функции, то есть скомпилированная она будет без всяких такм push ebp   mov ebp, esp ... вначале и ... retn в конце. 
 
я вот вижу не только асм кривой в гсс... зочем такое извращение как двойные скобки после __attribute__? 
 
кстати здесь на форуме отдельная тема по программированию есть, а то офф. пошел.. 
 
вопрос: без asm("new_luck") и  ...   "new_luck:  
голая функция работать не будет что ли?
			 
			
			
			
		 |  
	 
 | 
	| 29.08.2011 12:19 | 
	
		
	 | 
	
		
		baratorch 
 
 
		
		
		
			
			
			 
			
Posts: 197 
	
		
	 | 
	
		
			
			 
			
				вообще я бы заменил 
 
void SkipChecking() 
{    asm("mov $3, %eax");    asm("mov %eax, 0x67F554"); 
} 
 
на  
 
void SkipChecking() 
{    *(DWORD*)0x67F554 = 3; 
} 
 
а используя и HOOKTYPE_BRIDGE можно решить в плагине абсолютно любую задачу, не используя ассемблер вообще.
			 
			
			
			
		 |  
	 
 | 
	| 29.08.2011 13:34 | 
	
		
	 | 
	
		
		Sav 
 
 
		
		
		
			
			
			 
			
Posts: 2180 
	
		
	 | 
	
		
			
			 
			
				baratorch Wrote:вопрос: без asm("new_luck") и ... "new_luck:  
голая функция работать не будет что ли? 
У меня не заработало.
 baratorch Wrote:__attribute__((naked)) это как в msvc++ __declspec(naked) ? 
- очевидно означает объявление "голой" функции, то есть скомпилированная она будет без всяких такм push ebp mov ebp, esp ... вначале и ... retn в конце. 
У меня одинаково заработало и __attribute__((naked)), и __declspec(naked) (причём компилятор обычно выдавал warning`и, что nacked проигнорировано, но всё было нормально).
 baratorch Wrote:void SkipChecking() 
{      *(DWORD*)0x67F554 = 3; 
} 
Да, пожалуй, в данном случае лучше без ассемблера.
 Вот обновлённая (UPD: и ещё раз обновлённая) версия. Как оказалось, прошлая избавляла от необходимости существования только экзешника AB: lod`ы, snd и vid считались существующими и должны были быть открыты (иначе - ошибка). С snd и vid-файлами я разобрался (вместо ошибки просто пропускаю открытие), а с lod`ами всё сложнее. Но, с другой стороны, если подгружать только конкретные lod`ы (например с плагином lods через параметры), ошибки с lod`ами и не будет.
 
Кстати, если в исходнике HOOKTYPE_CALL заменить на HOOKTYPE_BRIDGE (только это одно изменение), работать это не будет. Bridge требует каких-то дополнительных специальных телодвижений?
			  
			
			
			
				
(This post was last modified: 30.08.2011 19:13 by Sav.)
 
			 
		 |  
	 
 | 
	| 29.08.2011 19:05 | 
	
		
	 | 
	
		
		Berserker 
 
 
		
		
		
			
			
 
 
			
 
 
			
Posts: 16788 
	
		
	 | 
	
		
			
			 
			
				Для моста нужно: 
Code: 
 __stdcall LONGBOOL Sav (PHookHandlerArgs Context) 
{ 
  // Поменяем регистры: 
  Context->EAX = 777; 
  // Адрес возврата тоже сменим 
  Context->RetAddr = 0; 
  // Ну и выполним затёртый код, 0 - не выполнять 
  return 1 
}
  
Я в своё время понял, что лучше пустые лоды для случайных карт держать. Например, убирал проверки, а в меню просмотра случайных карт (список) шли вылеты на некорректных датах. Даты и сейчас там какие-то абсолютно стрёмные, но в случае нормальных лодов вылетов нет.
			  
			
			
  
Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов 
Поддержать проект 
			
		 |  
	 
 | 
	| 29.08.2011 21:18 | 
	
		
	 | 
	
		
		Sav 
 
 
		
		
		
			
			
			 
			
Posts: 2180 
	
		
	 | 
	
		
			
			 
			
				Насчёт моста понятно, спасибо. 
Berserker Wrote:Я в своё время понял, что лучше пустые лоды для случайных карт держать. Например, убирал проверки, а в меню просмотра случайных карт (список) шли вылеты на некорректных датах. Даты и сейчас там какие-то абсолютно стрёмные, но в случае нормальных лодов вылетов нет. 
Создал несколько случайных карт, ни разу не было вылета в списке (AB-ские lod`ы убрал и в коде вообще не подгружал), хотя даты действительно стрёмные. Эти вылеты непостоянно случались?
			  
			
			
			
				
(This post was last modified: 30.08.2011 00:10 by Sav.)
 
			 
		 |  
	 
 | 
	| 30.08.2011 00:10 | 
	
		
	 | 
	
		
		Berserker 
 
 
		
		
		
			
			
 
 
			
 
 
			
Posts: 16788 
	
		
	 | 
	
		
 | 
	| 30.08.2011 00:17 | 
	
		
	 | 
	
		
		Sav 
 
 
		
		
		
			
			
			 
			
Posts: 2180 
	
		
	 | 
	
		
			
			 
			
				Последняя версия. 
Всё работает без всех файлов AB: экзешника, lod`ов, snd, vid без дополнительных плагинов. Вылетов в списке случайных карт не замечено.
 
От lod`ов избавился просто: убрал их номера из таблиц подгрузки для версии 3. Это чисто теоретически не очень хорошо в плане совместимости, но совместимо со всем, что существует сейчас на том направлении.    Только если у кого-то такая кривая версия, что в H3ab_bmp.lod или H3ab_spr.lod хранятся файлы, которые необходимо подгрузить, с плагином у них вообще ничего не заработает, даже при наличии этих lod`ов (ибо их подгрузка в нём срезана практически начисто).   
			 
			
			
			
				
(This post was last modified: 20.09.2011 23:35 by Sav.)
 
			 
		 |  
	 
 | 
	| 30.08.2011 19:25 | 
	
		
	 | 
	
		
		Berserker 
 
 
		
		
		
			
			
 
 
			
 
 
			
Posts: 16788 
	
		
	 | 
	
		
 | 
	| 30.08.2011 21:23 | 
	
		
	 | 
	
		
		Berserker 
 
 
		
		
		
			
			
 
 
			
 
 
			
Posts: 16788 
	
		
	 | 
	
		
 | 
	| 30.08.2011 21:33 | 
	
		
	 | 
	
		
		Sav 
 
 
		
		
		
			
			
			 
			
Posts: 2180 
	
		
	 | 
	
		
			
			 
			
				А lod`ы теперь подгружаются после OnAfterWoG что ли? 
Только сейчас обратил внимание, это вообще-то делает плагин lods (вернее ту его версию, которую я ещё не выкладывал   ) несовместимым с автоподгрузкой, но я могу это обойти (и, скорее всего, это обойдётся автоматически, т. к. я собираюсь переносить таблицы в dll и расширять их для vid`ов).
			  
			
			
			
				
(This post was last modified: 31.08.2011 22:01 by Sav.)
 
			 
		 |  
	 
 | 
	| 31.08.2011 21:56 | 
	
		
	 | 
	
		
		Sav 
 
 
		
		
		
			
			
			 
			
Posts: 2180 
	
		
	 | 
	
		
			
			 
			
				Глянул в исходники Эры, понял, что прав.
			 
			
			
			
				
(This post was last modified: 01.09.2011 21:04 by Sav.)
 
			 
		 |  
	 
 | 
	| 01.09.2011 21:04 | 
	
		
	 | 
	
		
		etoprostoya 
 
 
		
		
		
			
			
			 
			
Posts: 1809 
	
		
	 | 
	
		
			
			 
			
				В порядке изучения изученных внутренностей ВоГа сделал плагин, позволяющий загружать тексты из любых папок. Прописал путь к папке с текстом перевода игры в ини-файле и играй в переведённую игру, изменил расширение у плагина - играй с текстами, что в лодах или в Data. 
http://zalil.ru/31657771
			 
			
			
			
		 |  
	 
 | 
	| 06.09.2011 20:12 | 
	
		
	 |