Здравствуйте. Я новичек в программировании, поэтому пожалуйста не будьте ко мне очень строги. У меня есть один исходничек, но при его компиляции ml выдает ошибку: vmm.inc(312) : error A2008: syntax error : & MacroLoop(16): iteration 1: Macro Called From MakeCodeSeg(41): Macro Called From vmm.inc(312): Include File vmm.inc(312) : fatal error A1008: unmatched macro nesting MacroLoop(21): iteration 1: Macro Called From MakeCodeSeg(41): Macro Called From vmm.inc(312): Include File Пожалуйста подскажите в чем может быть причина.
Ошибка происходит в файле vmm.inc в 312 строке, что ещё надо то?! Видно что там макрос, значит ошибка в макросе или в том, что ему передаётся.
Llirik ошибок еще больше стало Давай исходник(и). Я пробовал на тривиальном Код (Text): .386 include vmm.inc end
Llirik не помогло. Не правда. Раньше компиляция _останавливалась_ на vmm.inc, а теперь пришла пора работать над содержимым твоего NTKERN.ASM. ошибок еще больше стало. Подключай mtrr.inc, vkd.inc, shell.inc, vpowerd.inc, vwin32.inc, vtd.inc, ifsmgr.inc, configmg.inc и т.д. до тех пор, пока не перестанет ругаться " NTKERN.ASM(...) : error A2006: undefined symbol : ??_vxdid ". Смотришь на строчку, в которой ошибка, ищешь в каком inc'е соответствующее имя и подключаешь его. + sourcer кое-где обрезал имена (или использовал похожие, наверное, у него свои inc'и), пример обрезания - строка 4884 написано _VPOWERD_W32_Set_System_Power, а должно быть _VPOWERD_W32_Set_System_Power_State, строка 24209 написано _VWIN32_SetWin32EventBoostPrio, а должно _VWIN32_SetWin32EventBoostPriority и т.д., пример похожести - строка 32772 написано _CONFIGMG_Set_Device_Dvr_PvtDW, а должно быть _CONFIGMG_Set_Device_Driver_Private_DWord и т.д. + sourcer знает не все call'ы, обрати внимание на строки содержащие "?? undocumented sub-function", надо разбираться что это такое. + разберись с arpl'ями (строка 538 и т.п.) там явно данные. ps ты же не думал, что сразу после работы sourcer'а можно компилировать
Я исправил имена всех функций и вот дошел до строки 8795 и никак не могу понять что за функция. пожалуйста помогите с ней разобраться. Функция _MPLeaveSingleProcessor
Llirik дошел до строки 8795 Номер строки из оригинального/приаттаченного файла или после "исправил имена всех функций"? _MPLeaveSingleProcessor Откуда такое имя?
Мне бы тоже это знать)) В листинге Sourcer`а оно есть, да и IDA его выдает. Вот листинг Sourcer`а и подправленный asm, правда ошибок в нем еще много
Llirik листинге Sourcer`а оно есть Ни в прикрепленных тобой архивах, ни в оригинальном ntkern.vxd v4.10.2222 я не вижу _MPLeaveSingleProcessor. Вернемся к строке 8795. Я не готов сказать, что там такое, для компилятора достаточно сделать так Код (Text): sub_93 proc near push ebp mov ebp,esp push ecx db 0CDh, 20h ;; VMMcall dd 000101BDh ;; dw 01bdH ; Win-VMM function mov dword ptr [ebp-4],eax mov eax,dword ptr [ebp-4] leave ; Procedure exit retn sub_93 endp Что делать с error A2107: cannot have implicit? Если надо быстро, т.е, чтобы компилятор не ругался, то сделай один сегмент, закомментировав Код (Text): ... seg_a segment para public use32 assume cs:seg_a , ds:seg_a ... ;;seg_a ends ... ;;seg_b segment para public use32 ;; assume cs:seg_b , ds:seg_a ... ;;seg_b ends . . ;; итак далее по seg_i включительно . ;;seg_j segment para public use32 ;; assume cs:seg_j , ds:seg_a ... seg_a ends;;seg_j ends Когда объединишь сегменты, ошибок, на которые ругается компилятор, останется очень мало. Среди них будет упоминание MTRRSetPhysicalCacheTypeRange (чуть ниже sub_352) вызов этой функции (через макрос VxDcall) должен иметь вид Код (Text): VxDcall MTRRSetPhysicalCacheTypeRange <p1, p2, p3, p4> где p# - параметры, которые макрос поместит в стек. В коде они уже помещены в стек (похоже, что код написан на Си) Код (Text): ... sub_352:: push dword ptr [esp+0Ch] push dword ptr [esp+0Ch] push dword ptr 0 push dword ptr [esp+10h] ... т.е. придется либо переписать эту часть кода использования макроса, либо заменить макрос на Код (Text): ... sub_352:: push dword ptr [esp+0Ch] push dword ptr [esp+0Ch] push dword ptr 0 push dword ptr [esp+10h] ;; VxDcall MTRRSetPhysicalCacheTypeRange ; MTRR fn=4A0001h db 0CDh, 20h dd 004A0001h retn 0Ch ...
И наверно последний вопрос. Что делать с jnz short loc_1756 на строке 25856, ведь в asm`е вообще нет такой метки?
Llirik Что делать с jnz short loc_1756 Я уже писал в #10 "разберись с arpl'ями (строка 538 и т.п.) там явно данные". В этом случае то же самое. Еще про данные Код (Text): ... loc_4:: add byte ptr [esi+0],ch ... после компиляции будет db 00h, 0Eh, а должно быть (см. ntkern2.rar.nkkern.lst) Код (Text): ... 00B53 loc_4:: 00B53 00 6E 00 add byte ptr [esi+0],ch ...
q_q извини, конечно, за мою тупость) но я пытался заменить данными jnz short loc_1756 еще до твоего совета, но вместо этой ошибки появляется куча новых)
Llirik я пытался заменить данными Как? Для компилятора достаточно Код (Text): ... db 75h, 74h ;; jnz short loc_1756 ... т.е. смотришь в ntkern2.rar.nkkern.lst и вставляешь байты. Если хочешь правильно, то в этом месте часть строки Код (Text): ... db 'ideo tim' ;; imul esp,dword ptr [ebp+6Fh],6D697420h db 'eo' ;; outs dx,dword ptr gs:[esi] db 'ut' ;; jnz short loc_1756 db ': ' ;; cmp ah,[eax] ... hint правильность строк можно сверять с оригинальным ntkern.vxd.
q_q Так я изначально и делал) просто после этого появляются ошибки типа error A2075: jump destination too far, например 3758