Межсегментные вызовы

Тема в разделе "WASM.WIN32", создана пользователем Llirik, 19 апр 2009.

  1. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Скажите пожалуйста, почему не компилируется это?

    .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................
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Llirik
    Использовав .model ты выбрал определенные имена для сегментов, а свой код поместил в свой сегмент.
    В зависимости от того, что ты задумал можно поступить так:
    1) не использовать .model;
    2) использовать предопределенные сегменты - .code etc.;
    3) поместить внутрь сегмента _PTEXT
    Код (Text):
    1. extern KeRevertToUserAffinityThread:PROC
    2. extern KesetSystemAffinityThread:PROC
    3. extern IoForwardlrpSynchronously:PROC
    разумеется эти подпрограммы в исполняемом модуле должны находиться в сегменте _PTEXT;
    4) изменить определение ссылок подпрограммы
    Код (Text):
    1. extern KeRevertToUserAffinityThread:far
    2. extern KesetSystemAffinityThread:far
    3. extern IoForwardlrpSynchronously:far
    5) изменить команду вызова
    Код (Text):
    1. call far KeRevertToUserAffinityThread
    2. ...
    3. call far KesetSystemAffinityThread
    4. ...
    5. call far IoForwardlrpSynchronously
     
  3. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    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 форматом( Может подскажите как мне быть?
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Llirik
    > линкер опять за своё
    Подправь имена на KeSetSystemAffinityThread и IoForwardIrpSynchronously.

    > начиная с версии 6.11c ml в этом месте выдает error
    Такой код собирается, только запускать не надо, ибо ntoskrnl.dll не существует (у меня точно нет).
    Код (Text):
    1. ;;
    2. ;; foo.asm
    3. ;;
    4. ;; Microsoft (R) Macro Assembler Version 6.15.8803
    5. ;; Microsoft (R) Incremental Linker Version 5.12.8078
    6. ;;
    7. ;; set ML=/nologo /Cp /W3 /WX
    8. ;; set LINK=/NOLOGO /OPT:REF
    9. ;;
    10. ;; ml.exe /c /coff foo.asm
    11. ;; link.exe /SUBSYSTEM:WINDOWS foo.obj
    12. ;;
    13.  
    14. .386p
    15. .model flat, stdcall
    16.  
    17. includelib ntoskrnl.lib
    18.  
    19. extern _imp__KeRevertToUserAffinityThread@0 : dword
    20. extern _imp__KeSetSystemAffinityThread@4 : dword
    21. extern _imp__IoForwardIrpSynchronously@8 : dword
    22.  
    23. _PTEXT  segment para PUBLIC 'PCODE' USE32
    24.   ASSUME cs:_PTEXT
    25.  
    26. KeRevertToUse   proc    near
    27.     call    _imp__KeRevertToUserAffinityThread@0
    28.     ret
    29. KeRevertToUse   endp
    30.  
    31. KesetSystemAf   proc    near
    32.     call    _imp__KeSetSystemAffinityThread@4
    33.     ret
    34. KesetSystemAf   endp
    35.  
    36. IoForwardllrp   proc    near
    37.     call    _imp__IoForwardIrpSynchronously@8
    38.     ret
    39. IoForwardllrp   endp
    40.  
    41. start:
    42.     ret
    43.  
    44. _PTEXT ends
    45.  
    46. end start
     
  5. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Так в том то и дело, я не могу использовать .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

    если надо, могу макросы расшифровать