заданную ее физическим адресом
Имхо если ты программируешь на столь низком уровне, что тебе это нужно, то ты уже должен это уметь.
Для этого есть CopyMemory или GetMem.
Aleksej писал(а):Имхо если ты программируешь на столь низком уровне, что тебе это нужно, то ты уже должен это уметь.
Ты прав. Просто может существовал другой способ, но раз других нет придётся написать на С++.
Ну, начнём с того, что сегментов в Win32 нет вообще.
Aleksej писал(а):Ну, начнём с того, что сегментов в Win32 нет вообще.
Сегментов нету правильно, поэтому и надо получить линейный адрес из сегмент:смещение. Но на VB это не подсилу, придётся писать на С++.
BP писал(а):Не думаю что для подсчёта линейного адреса нужен Си. По моему это можно сделать так: Сегмент * Длина Сегмента + Смещение.
Что за бред, о каких вообще сегментах в плоской модели памяти идёт речь?
Не говоря уже о том, что в ДОС-е линейный адрес считается не так.
BP писал(а):Но раз уж она плоская, то никто о них и не говорит ничего.
А перед этим, ты писал(а):Не думаю что для подсчёта линейного адреса нужен Си. По моему это можно сделать так: Сегмент * Длина Сегмента + Смещение.
Если серьёзно, Aleksej, ты уверен, что под Win32 вообще возможно прочитать содержимое адреса F000:0000?
Private Function GetBIOSDate() As String
Dim p As Byte, MemAddr As Long, sBios As String
Dim i As Integer
MemAddr = &HF13E0
For i = 0 To 4
Call GetMem2(MemAddr + i, p)
sBios = sBios & Chr$(p)
Next i
GetBIOSDate = sBios
End Function
BP писал(а):Если не трудно, покажи в каком именно месте не работает
Exported fn(): GetMem1 - Ord:013Dh
:660F6EC6 8B442404 mov eax, dword ptr [esp+04]
:660F6ECA 8B4C2408 mov ecx, dword ptr [esp+08]
:660F6ECE 8A00 mov al, byte ptr [eax]
:660F6ED0 8801 mov byte ptr [ecx], al
:660F6ED2 33C0 xor eax, eax
:660F6ED4 C20800 ret 0008
tyomitch писал(а):BP писал(а):Не думаю что для подсчёта линейного адреса нужен Си. По моему это можно сделать так: Сегмент * Длина Сегмента + Смещение.
Что за бред, о каких вообще сегментах в плоской модели памяти идёт речь?
Aleksej писал(а):Если серьёзно, Aleksej, ты уверен, что под Win32 вообще возможно прочитать содержимое адреса F000:0000?
Конечно можно. Вот объяснения:
Я взял библиотеку MemoryAccess и передал туды адрес &HF13E0 (к примеру) и эта зараза вернула 3А8113E0 (к примеру значение постоянно изменяется при каждом вызове).
И если использовать этот адрес то всё что надо возвращается. И всё это упирается в вызов функции VMMCall_MapPhysToLinear. И вся проблема в том, что в Win 2000 и Win XP запрещено работать с некоторыми участками памяти на прямую. В Win 98 такой проблемы нет и поэтому этот код работает:
- Код: Выделить всё
Private Function GetBIOSDate() As String
Dim p As Byte, MemAddr As Long, sBios As String
Dim i As Integer
MemAddr = &HF13E0
For i = 0 To 4
Call GetMem2(MemAddr + i, p)
sBios = sBios & Chr$(p)
Next i
GetBIOSDate = sBios
End Function
Approximator писал(а):tyomitch писал(а):BP писал(а):Не думаю что для подсчёта линейного адреса нужен Си. По моему это можно сделать так: Сегмент * Длина Сегмента + Смещение.
Что за бред, о каких вообще сегментах в плоской модели памяти идёт речь?
Сегменты есть ВСЕГДА. Иначе не бывает. В "плоской модели" организации памяти ВСЕГДА существует, КАК МИНИМУМ ТРИ СЕГМЕНТА: сегмент данных, сегмент кода, сегмент стека...
На самом же деле, в "плоской модели" огранизации памяти в одной программе бывает более трёх сегментов. Другой вопрос, что АДРЕСНОЕ ПРОСТРАНСТВО плоское. То есть адресация внутри этого адресного пространства сквозная. Однако, друзья мои, и тут бывают различия. Как вы думаете, если адресовать относительно ds и fs регистров в "плоской модели" организации памяти получишь одинаковый результат? Ну-ну... попробуйте на досуге, видимо, сильно удивитесь...
P.S. Когда-то сегментация была связана с ограничениями адресных возможностей процессоров. Сегодня сегментация связана с уровнем организации прав доступа к различным сегментам адресного пространства программы.
Ну, сказано же уже было: Read/WriteProcessMemory помогут полностью вылечить твою проблему.
Approximator писал(а):Ну, сказано же уже было: Read/WriteProcessMemory помогут полностью вылечить твою проблему.
Почему это?codemaster писал(а):Approximator писал(а):Ну, сказано же уже было: Read/WriteProcessMemory помогут полностью вылечить твою проблему.
Одна маленькая ремарка
на NT* платформах WriteProcessMemory на VB6 практически не реализуем.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 50