| 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: 16785
 
 | 
			| 
 
				Для моста нужно: 
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: 16785
 
 |  | 
	| 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: 16785
 
 |  | 
	| 30.08.2011 21:23 |  | 
	
		| Berserker   
   
   Posts: 16785
 
 |  | 
	| 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 |  |