Quote:TEventParams = ARRAY[0..63]
Я смотрел в исходниках Эры, там только 16.
GhostManSD Wrote:Как быть, если мне нужно поместить значение в X1 в одном хуке, а считывать - с другого?
Лучше завести отдельную переменную: мало ли как может использоваться SN:X между хуками (даже если не используется - ради совместимости с потенциальными другими модами).
Quote:Я смотрел в исходниках Эры, там только 16.
Извиняюсь, скопировал с черновика 2.0.
Берс, не о том речь, хотя это тоже пригодится.
Code:
PROCEDURE Data1_TownEnter; ASSEMBLER; {$FRAME-}
ASM
// Restore default code
LEA EAX, [ECX+EDX-$9B]
MOV ECX, [$6AAAB8]
CMP ECX, EAX
// Push all registers
PUSHAD
// Save to data (в ECX у нас уже хранится нужное число)
MOV EAX, [EventParams]
MOV [EAX], ECX
// Restore all registers
POPAD
// Return
PUSH $5D46D6
END; // .PROCEDURE Data1_TownEnter
PROCEDURE HOOK_TownEnter; ASSEMBLER; {$FRAME-}
ASM
// Restore default code
PUSH EBP
MOV EBP, ESP
PUSH -1
// Push all registers
PUSHAD
// Move X1 to ERM
Как заставить это добро показываться в ERM?
!!SN:X?v1;
!!IF:M^%V1^;
Выдается всякая хрень. 40, 13, 38, 0 - варианты хрени. :-)
// Call function
PUSH 90001
MOV EAX, $74CE30
CALL EAX
ADD ESP, 4
// Restore all registers
POPAD
// Return
PUSH $5C6C75
END; // .PROCEDURE HOOK_TownEnter
Sav, попробую сейчас.
Прописываем переменную после следующего кода:
Code:
VAR
EventParams: PEventParams;
...так:
...и передаем в нее значение в
хуке 1 вот так:
Code:
MOV ECX, [какая-либо нужная фигня]
MOV [Data1], ECX
...и затем перемещаем ее в X1 в
хуке 2 так:
Code:
MOV ECX, [Data1]
MOV EAX, [EventParams]
MOV [EAX], ECX
Верно?
(04.02.2011 15:29)MOP Wrote: [ -> ]3. >=293512Ch (21AE12C + 787000). Основная динамическая память.
еще раз. Все секции - статические.
Подскажите, пожалуйста, где ошибка (в X1 не появляются нужные параметры)...
//////////////////////////////////////////////////
// 90001: TownEnter
// X1 - town number
// X2 - town type
//////////////////////////////////////////////////
PROCEDURE HookData1_TownEnter; ASSEMBLER; {$FRAME-}
ASM
// Restore default code
MOV ECX, DWORD PTR SS:[EBP-$1C]
MOV DWORD PTR DS:[$6AAAB8], EAX
MOVSX EAX, BYTE PTR DS:[EAX+ECX+$40]
// Push all registers
PUSHAD
// MOVE
MOV [Data1_TownEnter], EAX
// Restore all registers
POPAD
// Return
PUSH $5D46E9
END;
PROCEDURE HookTrigger_TownEnter; ASSEMBLER; {$FRAME-}
ASM
// Restore default code
PUSH EBP
MOV EBP, ESP
PUSH -1
PUSH EBP
MOV EBP, ESP
PUSH -1
// Push all registers
PUSHAD
// Move Data1 to X1
MOV EAX, [EventParams]
MOV ECX, [Data1_TownEnter]
MOV [EAX], ECX
// Call ERM function
PUSH 90001
MOV EAX, $74CE30
CALL EAX
ADD ESP, 4
// Restore all registers
POPAD
// Return
PUSH $5C6C75
END; // .PROCEDURE HookTrigger_TownEnter
Когда ты используешь переменную, не надо ставить квадратные скобки:
mov var, eax
mov ecx, var
квадратные скобки играют роль только для регистров.
Не выходит, хоть убей. Все время по запросу !!SN:X?v1 выдается 139. Хук стоит на $5C6C70.
PROCEDURE HookTrigger_TownEnter; ASSEMBLER; {$FRAME-}
ASM
// Restore default code
PUSH EBP
MOV EBP, ESP
PUSH -1
// Push all registers
PUSHAD
// Move Data1 to X1
MOV ECX, DWORD PTR [$6AAAB8]
MOV EAX, DWORD PTR [EventParams]
MOV DWORD PTR [EAX], ECX
// Call ERM function
PUSH 90001
MOV EAX, $74CE30
CALL EAX
ADD ESP, 4
// Restore all registers
POPAD
// Return
PUSH $5C6C75
END; // .PROCEDURE HookTrigger_TownEnter
Спасибо большое, проблему решил самостоятельно, что радует еще больше.

Хорошо. Я уже как раз разобрался с остальными делами и собирался проверить dll в отладчике. А что было не так?
Все это, конечно, здорово. Но указатель порой находится далеко от места, на которое срабатывает хард брейкпойнт. Допустим, я никак не могу найти адрес типа текущего города, хотя знаю, что в момент срабатывания бряка по адресу $741B7C тип города заносится в ECX. Можно ли мне быстро найти место, где значение заносится в ECX? Я листал долго, но ничего в духе MOV ECX, [Адрес] не обнаружил. Нашел MOV ECX, [EBP-8], но где ставится EBP, найти не могу. Quod autem facere, то бишь, делать-то что?