Выделение памяти типо FAR

Тема в разделе "WASM.WIN32", создана пользователем zzzyab, 25 май 2005.

  1. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Чегото я не нашел справочнике API как это сделать. Даже если такого API нет, я всеравно хочу так.

    Т.е. память должна быть FAR (cегмент:адрес) и еще начинаться с определенного адресса.
     
  2. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    VirtualAlloc(Ex) ???





    это под виндовс, апи функцией?
     
  3. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    VirtualAlloc вроде не выдает FAR. А мне нужно именно FAR и для WIN32
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    zzzyab

    Для каких целей под win32 необходим адрес в виде seg:offs?
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Для DDE? GlobalAlloc для этого можно юзать, хоть там уже нет никакого FAR, ибо в Win32 все указатели 32-битные.
     
  6. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    В проге WIN32 хоть cs<>ds,es - одно и тоже и там помимо самой проги еще и длл и всякая всячина, и в адреса занятые этим всем записать что-то свое нельзя. А я хочу чтоб у меня реально сs<>ds или еs типо как в DOS прогах. Теоритически это можно. Короче мне нужна справка как опсистема выделяет память программам.
     
  7. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    zzzyab

    Короче мне нужна справка как опсистема выделяет память программам.

    Не хочешь говорить зачем. Тогда читай Jeffrey Richter. Programming Applications for Microsoft (R) Windows. 4-th ed. Часть III. Управление памятью.
     
  8. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Если важно, я хочу сделать типо отладчик для Win32, уже сделал дизасемблер и PE формат, остались ресурсы и эта фигня с помощью которой я хочу вычислять EA т.е. я хочу чтобы адрес памяти куда я буду загружать исследуемый модуль равнялся его базовому.



    Jeffrey Richter. Programming Applications for Microsoft....

    В гуглях к сожалению такой книжки не нашел.
     
  9. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    zzzyab

    гугли по richter4.zip
     
  10. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Теоретически, такое, вероятно можно сдалать. Добавить свои записи в GDT. Перехватить KiSystemService, KiSystemCallExit, ... Пропатчить IDT. Будет ли это работать на практике - ? =) Основная проблема - все виртуальные адреса заняты, с каталогом страниц что-то химичить придётся.
     
  11. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Получаеться что нужно:

    1. найти свободный участок рeальной памяти

    2. найти свободный селектор

    3. забить его под найденую память в GDT



    я в эти дебри еще не заходил, например к GDT я могу получить доступ через SGDT, а дальше я чайник.
     
  12. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Код (Text):
    1.  
    2.  push 10000h
    3.  call kernel32_ord1
    4.  


    это типо VMM_get_version

    В еax должна вроде быть версия а получается -1. Пожалуйста подскажите как мне вызвать сервисы VMM из WIN32, я уже узнал как через DOS или WIN16, но мне эта идея не нравиться.
     
  13. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    zzzyab


    Код (Text):
    1. call_ring0  macro   par1
    2.         mov edx, offset par1
    3.         db  0FFh,1Dh
    4.         dd  offset callgate32
    5.         endm
    6.  
    7.  
    8. call_ring0_edx  macro   par1
    9.         db  0FFh,1Dh
    10.         dd  offset callgate32
    11.         endm
    12.  
    13.  
    14.  
    15. ;----------------------------------------------------------
    16. ; w9x Ring0  subroutines
    17. ;----------------------------------------------------------
    18. .data
    19. ;-----------------------------------------------------------------
    20. offs1       dw  ?
    21.         dw  28h
    22.         dw  1110110000000000b ;Present, DPL=3, WC=0
    23. offs2       dw  ?
    24. ;-----------------------------------------------------------------
    25. callgate32  dd  0, 0
    26.  
    27. .code
    28.  
    29.  
    30.  
    31. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    32.         mov edx, offset callgate_proc
    33.         call    CreateCallG32
    34.  
    35.  
    36.         ...
    37.         call_ring0 r0_malloc_9x
    38.         ...
    39.  
    40.  
    41. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    42.  
    43.  
    44. r0_malloc_9x:   push    PAGECONTIG+PAGEFIXED+PAGEUSEALIGN+PAGEZEROINIT
    45.         push    offset buf_ptr_phys
    46.         push    100000h
    47.         push    0   ; no restrictions
    48.         push    0   ; align = 4K
    49.         push    0
    50.         push    PG_SYS
    51.         push    256 ; in pages !
    52.         VMMCall _PageAllocate
    53.         add esp, 8*4
    54.         mov [buf_ptr_lin], eax
    55.         ret
    56.  
    57.  
    58.  
    59.  
    60.  
    61. CreateCallG32:  push    eax eax
    62.         sgdt    fword ptr [esp]
    63.         mov edi, dword ptr [esp+2]
    64.         movzx   eax, word ptr [esp]
    65.         and al, 0F8h
    66.         sub eax, 10h
    67.         mov [callgate32+4], eax
    68.         add edi, eax
    69.         pop eax eax
    70.         mov [offs1], dx
    71.         shr edx, 16
    72.         mov [offs2], dx
    73.         mov esi, offset offs1
    74.         movsd
    75.         movsd
    76.         ret
    77.  
    78.  
    79. callgate_proc:  cli
    80.         call    edx
    81.         sti
    82.         retf
    83.  
    84.  
    85. Get_VxDCall:    push    offset kernel32dll
    86.         call    LoadLibraryA
    87.         mov ecx, [eax+3Ch]
    88.         mov edx, [ecx+eax+78h]
    89.         add edx, eax
    90.         mov edx, [edx+1Ch]  ; AddressOfFunctions RVA
    91.         add edx, eax
    92.         mov edi, [edx]
    93.         add eax, edi    ; edi = VxDCall linaddr
    94.         mov [VxDCall_addr], eax
    95.         ret
    [​IMG] 1874678427__VMM.RAR
     
  14. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    спасибо, это мне поможет.



    Пробовал вызывать VMM напрямую - вроде работает
    Код (Text):
    1.  
    2. .code
    3.     push    0
    4.     push    11000000b ;типа 32-x битный 4к сегмент
    5.     push    11110111b ;типа, data R/W, DPL 3, present
    6.     push    0
    7.     push    1000h
    8.     call    dword ptr [BuildDescriptorDWORDs]
    9.     add esp,20
    10.  
    11.     push    0
    12.     push    eax
    13.     push    edx
    14.     call    dword ptr [AllocateGDTSelector]
    15.     add esp,12
    16.     mov esi,eax
    17.  
    18.    
    19.     push    0
    20.     push    esi
    21.     call    dword ptr [FreeGDTSelector]
    22.     add esp,8
    23.     ret
    24.  
    25. .data
    26. BuildDescriptorDWORDs   dd  0c0009360h
    27. AllocateGDTSelector dd  0c0008e70h
    28. FreeGDTSelector     dd  0c0008fbeh
    29.  




    Достаточно ли этого для выделения FAR памяти ?

    теоритически мне должно выделиться 4к FAR памяти, но

    ecли в то что выдает AllocateGDTSelector попрбовать что то считать или записать програма вылетает с ошибкой.



    Тоже самое я пробовал и с AllocateLDTSelector - не работает тоже
     
  15. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Узнал что адрес в программе и адрес типа linear не одно и тоже - короче я совсем попутался, пожалуйста разъясните терминологию на русском:

    1) linear page number;

    2) ring-0 linear address;

    3) если есть ring-0, то что такое не-ring-0 linear address;

    4) cоотв. не-linear page number.



    Что за тип адресов в WIN32 проге ?

    Как linear и обычный адрес в проге пересекаються ?
     
  16. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    После медитации над linear address пришло дзенское просветление:
    Код (Text):
    1.  
    2.     push    PAGE_READWRITE
    3.     push    MEM_COMMIT
    4.     push    4096
    5.     push    0
    6.     call    VirtualAlloc
    7.     test    eax,eax
    8.     jz  err_
    9.     mov edi,eax
    10.  
    11.    
    12.     call    dword ptr [GetCurVMHandle]
    13.  
    14.  
    15.     push    0
    16.     push    01000000b
    17.     push    11110111b
    18.     push    0fffffh
    19.     push    edi
    20.     call    dword ptr [BuildDescriptorDWORDs]
    21.     add esp,20
    22.  
    23.     push    0
    24.     push    1
    25.     push    eax
    26.     push    edx
    27.     push    ebx
    28.     call    dword ptr [AllocateLDTSelector]
    29.     add esp,20
    30.  
    31.     mov esi,eax
    32.     mov ds,ax  
    33.  
    34. ;основной код проги
    35.  
    36.     mov ax,es
    37.     mov ds,ax
    38.    
    39.     push    0
    40.     push    esi
    41.     push    ebx
    42.     call    dword ptr [FreeLDTSelector]
    43.     add esp,12
    44.  
    45.  
    46.  
    47.        
    48.     push    MEM_RELEASE
    49.     push    0
    50.     push    edi
    51.     call    VirtualFree
    52.    
    53. err_:
    54.     ret
    55.  
    56.  
    57. .data
    58. GetCurVMHandle      dd  0c0002295h
    59. BuildDescriptorDWORDs   dd  0c0009360h
    60. AllocateLDTSelector dd  0c000903ah
    61. FreeLDTSelector     dd  0c0009319h
    62.  






    Но в коде _BC_ я не разобрался, есть еще варианты нормального вызова VMM ?
     
  17. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    А чем тебе макрос VMMCall не нравится ?
     
  18. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Код (Text):
    1.  
    2.  
    3. r0_malloc_9x:
    4.  
    5. push PAGECONTIG+PAGEFIXED+PAGEUSEALIGN+PAGEZEROINIT
    6.  
    7. push offset buf_ptr_phys
    8.  
    9. push 100000h
    10.  
    11. push 0; no restrictions
    12.  
    13. push 0; align = 4K
    14.  
    15. push 0
    16.  
    17. push PG_SYS
    18.  
    19. push 256; in pages !
    20.  
    21. VMM Call_PageAllocate
    22.  
    23. add esp, 8*4
    24.  
    25. mov[buf_ptr_lin], eax
    26.  
    27. ret
    28.  
    29. [code]
    30.  
    31.  
    32.  
    33. Виполнение этого через твой колгейт почемуто вещает систему. мне нужно без сd20,т.е. параметры в програме а  колгейтом только сам вызов vxd.
     
  19. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759




    Там нет пробела.
    Код (Text):
    1. VMMCall    _PageAllocate




    Не нравится Int20h/VMMCall, тогда вызывай VMM_GetDDBList каким угодно способом и вручную ищи сервис в таблице.