Указатель на область памяти

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Aleksej
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 191
Зарегистрирован: 03.06.2003 (Вт) 9:58

Указатель на область памяти

Сообщение Aleksej » 06.09.2004 (Пн) 10:54

Как получить указатель на область памяти, заданную ее физическим адресом и размером? Заранее спасибо.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.09.2004 (Пн) 12:59

Сорри, но зачем тебе?

Имхо если ты программируешь на столь низком уровне, что тебе это нужно, то ты уже должен это уметь. Если не умеешь - скорее всего, тебе это не нужно.
Изображение

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 06.09.2004 (Пн) 13:13

заданную ее физическим адресом


Ну собственно указатель это и есть адрес. Или ты что то другое подразумеваешь под словом "указатель"? Может ты хочешь получить значение по указанному адресу? Для этого есть CopyMemory или GetMem.

Aleksej
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 191
Зарегистрирован: 03.06.2003 (Вт) 9:58

Сообщение Aleksej » 06.09.2004 (Пн) 13:44

Имхо если ты программируешь на столь низком уровне, что тебе это нужно, то ты уже должен это уметь.

Ты прав. Просто может существовал другой способ, но раз других нет придётся написать на С++.
Для этого есть CopyMemory или GetMem.

GetMem - работает только в Win 9x, да и CopyMemory не подходит.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.09.2004 (Пн) 13:46

В другой процесс, что ль, ходишь? readprocessmemory попробуй тогда.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 06.09.2004 (Пн) 13:51

>GetMem - работает только в Win 9x, да и CopyMemory не подходит
Ты хоть исходник GetMem смотрел? Что там может не работать? Там от силы 5 инструкций.
Тебе CopyMemory может и не подходит, а ему вполне может сгодится.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.09.2004 (Пн) 13:54

Aleksej писал(а):
Имхо если ты программируешь на столь низком уровне, что тебе это нужно, то ты уже должен это уметь.

Ты прав. Просто может существовал другой способ, но раз других нет придётся написать на С++.

Да не секретничай ты, расскажи в чём проблема! Поможем как сможем :-)
Изображение

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 06.09.2004 (Пн) 14:05

Если не трудно, покажи в каком именно месте не работает

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

Aleksej
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 191
Зарегистрирован: 03.06.2003 (Вт) 9:58

Сообщение Aleksej » 06.09.2004 (Пн) 15:24

Есть такая штука SMBIOS со всякой инфой о Биосе, находится по адресу с F000:0000 по F000:FFFF. Содержит всю инфу о Биосе. Её конечно можно получить через WMI, но не всю температуру, частоту вращения кулера и напряжение в системе (Voltage Probe) через WMI не получишь. Вот и раделась идея выдрать это из SMBios'a.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.09.2004 (Пн) 15:44

Ну, начнём с того, что сегментов в Win32 нет вообще. Плоский адрес этой структуры у тебя есть?
Изображение

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 06.09.2004 (Пн) 15:50

Наверное без драйвера не обойтись, ИМХО

Aleksej
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 191
Зарегистрирован: 03.06.2003 (Вт) 9:58

Сообщение Aleksej » 06.09.2004 (Пн) 16:34

Ну, начнём с того, что сегментов в Win32 нет вообще.

Сегментов нету правильно, поэтому и надо получить линейный адрес из сегмент:смещение. Но на VB это не подсилу, придётся писать на С++.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.09.2004 (Пн) 16:57

Aleksej писал(а):
Ну, начнём с того, что сегментов в Win32 нет вообще.

Сегментов нету правильно, поэтому и надо получить линейный адрес из сегмент:смещение. Но на VB это не подсилу, придётся писать на С++.

А как ты собираешься это делать на C?
VB под силу почти всё. Ты ведь не драйвер собрался писать, так?
Изображение

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 06.09.2004 (Пн) 18:26

Не думаю что для подсчёта линейного адреса нужен Си. По моему это можно сделать так: Сегмент * Длина Сегмента + Смещение.

Каждый процесс работает в своём адресном пространстве. Правда что у процесса по нулевым адресам я не знаю. Но readprocessmemory тебе врядли тут поможет.

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 06.09.2004 (Пн) 18:41

Кстати у меня когда то был пример чтения из BIOS'а для VB6. Но видать затерялся. Полазь по известным сайтам. Я где то там брал.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.09.2004 (Пн) 19:13

BP писал(а):Не думаю что для подсчёта линейного адреса нужен Си. По моему это можно сделать так: Сегмент * Длина Сегмента + Смещение.

Что за бред, о каких вообще сегментах в плоской модели памяти идёт речь?
Не говоря уже о том, что в ДОС-е линейный адрес считается не так.
Мне кажется, у человека есть какой-то древний код, который он хочет перенести на Win32 посредством переписывания на Си. Что ж, флаг в руки :-)
Если серьёзно, Aleksej, ты уверен, что под Win32 вообще возможно прочитать содержимое адреса F000:0000? Уверяю тебя, это от языка не зависит.
Изображение

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Сообщение Юстас » 06.09.2004 (Пн) 20:02

Aleksej, адрес F000:0000 подразумевается 0f0000000h? Я правильно понял?

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 06.09.2004 (Пн) 20:52

Что за бред, о каких вообще сегментах в плоской модели памяти идёт речь?

Ну что заладил как сорока. Все уже поняли что ты знаешь это слово. Плоская - это такая модель, в которой базы всех регистров установлены в ноль, а лимиты — в 4 Гб. Хотя при чём тут я собственно? Тебе не с кем поговорить о плоской модели памяти?

Не говоря уже о том, что в ДОС-е линейный адрес считается не так.

Скорее всего ты прав. А как считается адрес?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.09.2004 (Пн) 22:11

Нет. Он всегда со мной может поговорить о плоской модели памяти :roll:
Просто он прав, вот и выражает свою т.з., раз истина пока не установлена :)
И вообще, "можно ли прочитать" - есть функции isbadreadptr и isbadwriteptr.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 06.09.2004 (Пн) 22:55

Что то я не помню что-бы я заикнулся(посмел в твоём присутствии) об использовании сегментов в Windows. Хотя в принципе Виндовс можно было бы и на сегметной модели памяти организовать. Но раз уж она плоская, то никто о них и не говорит ничего. Меня такие беспочвенные обвинения не радуют. Начинают мерещится сговоры и.т.д. и т.п.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.09.2004 (Вт) 5:15

BP писал(а):Но раз уж она плоская, то никто о них и не говорит ничего.

А перед этим, ты писал(а):Не думаю что для подсчёта линейного адреса нужен Си. По моему это можно сделать так: Сегмент * Длина Сегмента + Смещение.
Изображение

Aleksej
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 191
Зарегистрирован: 03.06.2003 (Вт) 9:58

Сообщение Aleksej » 07.09.2004 (Вт) 8:40

Если серьёзно, 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
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 08.09.2004 (Ср) 2:55

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 писал(а):Не думаю что для подсчёта линейного адреса нужен Си. По моему это можно сделать так: Сегмент * Длина Сегмента + Смещение.

Что за бред, о каких вообще сегментах в плоской модели памяти идёт речь?


:) :) :) :) :) :) :) :)

Сегменты есть ВСЕГДА. Иначе не бывает. В "плоской модели" организации памяти ВСЕГДА существует, КАК МИНИМУМ ТРИ СЕГМЕНТА: сегмент данных, сегмент кода, сегмент стека...
На самом же деле, в "плоской модели" огранизации памяти в одной программе бывает более трёх сегментов. Другой вопрос, что АДРЕСНОЕ ПРОСТРАНСТВО плоское. То есть адресация внутри этого адресного пространства сквозная. Однако, друзья мои, и тут бывают различия. Как вы думаете, если адресовать относительно ds и fs регистров в "плоской модели" организации памяти получишь одинаковый результат? Ну-ну... попробуйте на досуге, видимо, сильно удивитесь...

P.S. Когда-то сегментация была связана с ограничениями адресных возможностей процессоров. Сегодня сегментация связана с уровнем организации прав доступа к различным сегментам адресного пространства программы.
С уважением, Approximator.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 08.09.2004 (Ср) 3:11

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


Ну, сказано же уже было: Read/WriteProcessMemory помогут полностью вылечить твою проблему.
С уважением, Approximator.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.09.2004 (Ср) 12:09

Approximator писал(а):
tyomitch писал(а):
BP писал(а):Не думаю что для подсчёта линейного адреса нужен Си. По моему это можно сделать так: Сегмент * Длина Сегмента + Смещение.

Что за бред, о каких вообще сегментах в плоской модели памяти идёт речь?


:) :) :) :) :) :) :) :)

Сегменты есть ВСЕГДА. Иначе не бывает. В "плоской модели" организации памяти ВСЕГДА существует, КАК МИНИМУМ ТРИ СЕГМЕНТА: сегмент данных, сегмент кода, сегмент стека...
На самом же деле, в "плоской модели" огранизации памяти в одной программе бывает более трёх сегментов. Другой вопрос, что АДРЕСНОЕ ПРОСТРАНСТВО плоское. То есть адресация внутри этого адресного пространства сквозная. Однако, друзья мои, и тут бывают различия. Как вы думаете, если адресовать относительно ds и fs регистров в "плоской модели" организации памяти получишь одинаковый результат? Ну-ну... попробуйте на досуге, видимо, сильно удивитесь...

P.S. Когда-то сегментация была связана с ограничениями адресных возможностей процессоров. Сегодня сегментация связана с уровнем организации прав доступа к различным сегментам адресного пространства программы.

Я знал, что кто-нибудь придерётся. Но думал, что BP, а не ты.
Есть два разных понятия - сегменты и сегментные регистры. Когда-то они были связаны, сейчас сегментов нет и поэтому связи между ними нет.
Я говорил именно про то, что запись F000:0000 не имеет смысла в Win32, потому что номер "сегмента" не задаёт место памяти, а задаёт как раз права. И следовательно, доступ по этому "адресу" не есть чтение данных БИОСа.

Approximator, про нервную систему червей я скорее всего знаю меньше тебя, но уж про систему адресации - достаточно. Не надо вести себя так некрасиво.
Изображение

Aleksej
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 191
Зарегистрирован: 03.06.2003 (Вт) 9:58

Сообщение Aleksej » 08.09.2004 (Ср) 12:23

Ну, сказано же уже было: Read/WriteProcessMemory помогут полностью вылечить твою проблему.

А какой процесс передавать в функцию?

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 08.09.2004 (Ср) 15:32

Approximator писал(а):Ну, сказано же уже было: Read/WriteProcessMemory помогут полностью вылечить твою проблему.



Одна маленькая ремарка
на NT* платформах WriteProcessMemory на VB6 практически не реализуем.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.09.2004 (Ср) 17:23

codemaster писал(а):
Approximator писал(а):Ну, сказано же уже было: Read/WriteProcessMemory помогут полностью вылечить твою проблему.



Одна маленькая ремарка
на NT* платформах WriteProcessMemory на VB6 практически не реализуем.
Почему это?
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 08.09.2004 (Ср) 17:38

Дык... Права доступа.
Даже под админом не все решаемо, что уж говорить о пользователе.
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.09.2004 (Ср) 18:15

Я язык-то здесь причём? Приложения на VB6 ограничены в правах? :-)
Дискриминация! :-)
Изображение

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 61

    TopList