Чегото я не нашел справочнике API как это сделать. Даже если такого API нет, я всеравно хочу так. Т.е. память должна быть FAR (cегмент:адрес) и еще начинаться с определенного адресса.
Для DDE? GlobalAlloc для этого можно юзать, хоть там уже нет никакого FAR, ибо в Win32 все указатели 32-битные.
В проге WIN32 хоть cs<>ds,es - одно и тоже и там помимо самой проги еще и длл и всякая всячина, и в адреса занятые этим всем записать что-то свое нельзя. А я хочу чтоб у меня реально сs<>ds или еs типо как в DOS прогах. Теоритически это можно. Короче мне нужна справка как опсистема выделяет память программам.
zzzyab Короче мне нужна справка как опсистема выделяет память программам. Не хочешь говорить зачем. Тогда читай Jeffrey Richter. Programming Applications for Microsoft (R) Windows. 4-th ed. Часть III. Управление памятью.
Если важно, я хочу сделать типо отладчик для Win32, уже сделал дизасемблер и PE формат, остались ресурсы и эта фигня с помощью которой я хочу вычислять EA т.е. я хочу чтобы адрес памяти куда я буду загружать исследуемый модуль равнялся его базовому. Jeffrey Richter. Programming Applications for Microsoft.... В гуглях к сожалению такой книжки не нашел.
Теоретически, такое, вероятно можно сдалать. Добавить свои записи в GDT. Перехватить KiSystemService, KiSystemCallExit, ... Пропатчить IDT. Будет ли это работать на практике - ? =) Основная проблема - все виртуальные адреса заняты, с каталогом страниц что-то химичить придётся.
Получаеться что нужно: 1. найти свободный участок рeальной памяти 2. найти свободный селектор 3. забить его под найденую память в GDT я в эти дебри еще не заходил, например к GDT я могу получить доступ через SGDT, а дальше я чайник.
Код (Text): push 10000h call kernel32_ord1 это типо VMM_get_version В еax должна вроде быть версия а получается -1. Пожалуйста подскажите как мне вызвать сервисы VMM из WIN32, я уже узнал как через DOS или WIN16, но мне эта идея не нравиться.
zzzyab Код (Text): call_ring0 macro par1 mov edx, offset par1 db 0FFh,1Dh dd offset callgate32 endm call_ring0_edx macro par1 db 0FFh,1Dh dd offset callgate32 endm ;---------------------------------------------------------- ; w9x Ring0 subroutines ;---------------------------------------------------------- .data ;----------------------------------------------------------------- offs1 dw ? dw 28h dw 1110110000000000b ;Present, DPL=3, WC=0 offs2 dw ? ;----------------------------------------------------------------- callgate32 dd 0, 0 .code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! mov edx, offset callgate_proc call CreateCallG32 ... call_ring0 r0_malloc_9x ... !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! r0_malloc_9x: push PAGECONTIG+PAGEFIXED+PAGEUSEALIGN+PAGEZEROINIT push offset buf_ptr_phys push 100000h push 0 ; no restrictions push 0 ; align = 4K push 0 push PG_SYS push 256 ; in pages ! VMMCall _PageAllocate add esp, 8*4 mov [buf_ptr_lin], eax ret CreateCallG32: push eax eax sgdt fword ptr [esp] mov edi, dword ptr [esp+2] movzx eax, word ptr [esp] and al, 0F8h sub eax, 10h mov [callgate32+4], eax add edi, eax pop eax eax mov [offs1], dx shr edx, 16 mov [offs2], dx mov esi, offset offs1 movsd movsd ret callgate_proc: cli call edx sti retf Get_VxDCall: push offset kernel32dll call LoadLibraryA mov ecx, [eax+3Ch] mov edx, [ecx+eax+78h] add edx, eax mov edx, [edx+1Ch] ; AddressOfFunctions RVA add edx, eax mov edi, [edx] add eax, edi ; edi = VxDCall linaddr mov [VxDCall_addr], eax ret 1874678427__VMM.RAR
спасибо, это мне поможет. Пробовал вызывать VMM напрямую - вроде работает Код (Text): .code push 0 push 11000000b ;типа 32-x битный 4к сегмент push 11110111b ;типа, data R/W, DPL 3, present push 0 push 1000h call dword ptr [BuildDescriptorDWORDs] add esp,20 push 0 push eax push edx call dword ptr [AllocateGDTSelector] add esp,12 mov esi,eax push 0 push esi call dword ptr [FreeGDTSelector] add esp,8 ret .data BuildDescriptorDWORDs dd 0c0009360h AllocateGDTSelector dd 0c0008e70h FreeGDTSelector dd 0c0008fbeh Достаточно ли этого для выделения FAR памяти ? теоритически мне должно выделиться 4к FAR памяти, но ecли в то что выдает AllocateGDTSelector попрбовать что то считать или записать програма вылетает с ошибкой. Тоже самое я пробовал и с AllocateLDTSelector - не работает тоже
Узнал что адрес в программе и адрес типа linear не одно и тоже - короче я совсем попутался, пожалуйста разъясните терминологию на русском: 1) linear page number; 2) ring-0 linear address; 3) если есть ring-0, то что такое не-ring-0 linear address; 4) cоотв. не-linear page number. Что за тип адресов в WIN32 проге ? Как linear и обычный адрес в проге пересекаються ?
После медитации над linear address пришло дзенское просветление: Код (Text): push PAGE_READWRITE push MEM_COMMIT push 4096 push 0 call VirtualAlloc test eax,eax jz err_ mov edi,eax call dword ptr [GetCurVMHandle] push 0 push 01000000b push 11110111b push 0fffffh push edi call dword ptr [BuildDescriptorDWORDs] add esp,20 push 0 push 1 push eax push edx push ebx call dword ptr [AllocateLDTSelector] add esp,20 mov esi,eax mov ds,ax ;основной код проги mov ax,es mov ds,ax push 0 push esi push ebx call dword ptr [FreeLDTSelector] add esp,12 push MEM_RELEASE push 0 push edi call VirtualFree err_: ret .data GetCurVMHandle dd 0c0002295h BuildDescriptorDWORDs dd 0c0009360h AllocateLDTSelector dd 0c000903ah FreeLDTSelector dd 0c0009319h Но в коде _BC_ я не разобрался, есть еще варианты нормального вызова VMM ?
Код (Text): r0_malloc_9x: push PAGECONTIG+PAGEFIXED+PAGEUSEALIGN+PAGEZEROINIT push offset buf_ptr_phys push 100000h push 0; no restrictions push 0; align = 4K push 0 push PG_SYS push 256; in pages ! VMM Call_PageAllocate add esp, 8*4 mov[buf_ptr_lin], eax ret [code] Виполнение этого через твой колгейт почемуто вещает систему. мне нужно без сd20,т.е. параметры в програме а колгейтом только сам вызов vxd.
Там нет пробела. Код (Text): VMMCall _PageAllocate Не нравится Int20h/VMMCall, тогда вызывай VMM_GetDDBList каким угодно способом и вручную ищи сервис в таблице.