Скажите пожалуйста, почему не компилируется это? .386p .model flat, stdcall includelib C:\masm32\lib\ntoskrnl.lib extern KeRevertToUserAffinityThread:PROC extern KesetSystemAffinityThread:PROC extern IoForwardlrpSynchronously:PROC _PTEXT segment para PUBLIC 'PCODE' USE32 ASSUME cs:_PTEXT KeRevertToUse proc near call KeRevertToUserAffinityThread ret KeRevertToUse endp KesetSystemAf proc near call KesetSystemAffinityThread ret KesetSystemAf endp IoForwardllrp proc near call IoForwardlrpSynchronously ret IoForwardllrp endp _PTEXT ends end ml выдает: error A2107: cannot have implicit far jump................
Llirik Использовав .model ты выбрал определенные имена для сегментов, а свой код поместил в свой сегмент. В зависимости от того, что ты задумал можно поступить так: 1) не использовать .model; 2) использовать предопределенные сегменты - .code etc.; 3) поместить внутрь сегмента _PTEXT Код (Text): extern KeRevertToUserAffinityThread:PROC extern KesetSystemAffinityThread:PROC extern IoForwardlrpSynchronously:PROC разумеется эти подпрограммы в исполняемом модуле должны находиться в сегменте _PTEXT; 4) изменить определение ссылок подпрограммы Код (Text): extern KeRevertToUserAffinityThread:far extern KesetSystemAffinityThread:far extern IoForwardlrpSynchronously:far 5) изменить команду вызова Код (Text): call far KeRevertToUserAffinityThread ... call far KesetSystemAffinityThread ... call far IoForwardlrpSynchronously
q_q Спасибо, помогло, но линкер опять за своё( Что бы я не делал, как не изменял свой код, он твердит: osxpkern.obj : error LNK2001: unresolved external symbol KeRevertToUserAffinityThread osxpkern.obj : error LNK2001: unresolved external symbol KesetSystemAffinityThread osxpkern.obj : error LNK2001: unresolved external symbol IoForwardlrpSynchronously Если, конечно, не использовать .model flat, то есть отказаться от сегментов, а сегменты мне в данном случае очень важны. Если же использовать call far ptr, то начиная с версии 6.11c ml в этом месте выдает error A2004: symbol type conflict а в более ранних версиях этот код компилируется, но там проблема с coff форматом( Может подскажите как мне быть?
Llirik > линкер опять за своё Подправь имена на KeSetSystemAffinityThread и IoForwardIrpSynchronously. > начиная с версии 6.11c ml в этом месте выдает error Такой код собирается, только запускать не надо, ибо ntoskrnl.dll не существует (у меня точно нет). Код (Text): ;; ;; foo.asm ;; ;; Microsoft (R) Macro Assembler Version 6.15.8803 ;; Microsoft (R) Incremental Linker Version 5.12.8078 ;; ;; set ML=/nologo /Cp /W3 /WX ;; set LINK=/NOLOGO /OPT:REF ;; ;; ml.exe /c /coff foo.asm ;; link.exe /SUBSYSTEM:WINDOWS foo.obj ;; .386p .model flat, stdcall includelib ntoskrnl.lib extern _imp__KeRevertToUserAffinityThread@0 : dword extern _imp__KeSetSystemAffinityThread@4 : dword extern _imp__IoForwardIrpSynchronously@8 : dword _PTEXT segment para PUBLIC 'PCODE' USE32 ASSUME cs:_PTEXT KeRevertToUse proc near call _imp__KeRevertToUserAffinityThread@0 ret KeRevertToUse endp KesetSystemAf proc near call _imp__KeSetSystemAffinityThread@4 ret KesetSystemAf endp IoForwardllrp proc near call _imp__IoForwardIrpSynchronously@8 ret IoForwardllrp endp start: ret _PTEXT ends end start
Так в том то и дело, я не могу использовать .model flat, stdcall потому, использую vmm.inc. Вот реальный код, который мне необходимо собрать: .386p includelib C:\masm32\lib\ntoskrnl.lib include C:\masm32\bin\win98\inc\win98\vmm.inc include C:\masm32\bin\win98\inc\win98\vxdldr.inc extrn KeNumberProcessors:BYTE extern _imp__KeRevertToUserAffinityThread@0 : dword extern _imp__KeSetSystemAffinityThread@4 : dword extern _imp__IoForwardIrpSynchronously@8 : dword DECLARE_VIRTUAL_DEVICE OSXPKERN,1,0, OSXPKERN_Control, 99h, NTKERN_INIT_ORDER Begin_control_dispatch OSXPKERN Control_Dispatch Sys_Critical_Init, AdExpTabl End_control_dispatch OSXPKERN VxD_PAGEABLE_DATA_SEG hexport dd 0 ntker db 'ntoskrnl.exe',0 offunk dd offset KeNumberProcessors dd offset KeRevertToUse dd offset KesetSystemAf dd offset IoForwardllrp aKeNumberPr db "KeNumberProcessorK" aKeRevertToUse db "KeRevertToUserAffinityThreaK" aKesetSystemAf db "KesetSystemAffinityThreaK" aIoForwardll db "IoForwardlrpSynchronouslK" oftabntkrnl dd offset aKeNumberPr dd offset aKeRevertToUse dd offset aKesetSystemAf dd offset aIoForwardll ordinal db 0,0,1,0,2,0,3,0 VxD_PAGEABLE_DATA_ENDS VxD_PAGEABLE_CODE_SEG BeginProc KeRevertToUse call _imp__KeRevertToUserAffinityThread@0 ret EndProc KeRevertToUse BeginProc KesetSystemAf call _imp__KeRevertToUserAffinityThread@0 ret EndProc KesetSystemAf BeginProc IoForwardllrp call _imp__KeRevertToUserAffinityThread@0 ret EndProc IoForwardllrp VxD_PAGEABLE_CODE_ENDS VxD_INIT_CODE_SEG BeginProc AdExpTabl push 0 push offset offunk push offset ordinal push offset oftabntkrnl push 1 push 4 push 4 push offset ntker push offset hexport VxDCall _PELDR_AddExportTable ret EndProc AdExpTabl VxD_INIT_CODE_ENDS end если надо, могу макросы расшифровать