Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Чтение памяти под ХР/2k  (Прочитано 7918 раз)
0 Пользователей и 1 Гость смотрят эту тему.
newmen
Интересующийся

ru
Offline Offline

« : 28-12-2004 11:42 » 

Помогите, пожалуйста..
мне необходимо считать базовые адреса com-портов. Нашел такую ф-ю. Скомпиленная на ПАСКАЛЕ она работает. Но в ДЕЛФЯХ таковой нет.

Function GetBaseAdr(PortIndex : Byte) : Word;
Var LowAdr : Word;
Begin
 LowAdr := (PortIndex-1)*2;
 GetBaseAdr:= MemW[$0040:LowAdr];
End;

Есть ли в делфи какой-нибудь аналог  MemW[$0040:LowAdr]?


 Помогите пожалуйста..  Вот такой я вот
Записан
Alf
Гость
« Ответ #1 : 28-12-2004 21:43 » 

Прочитать любую ячейку оперативной памяти - не проблема. Если даже нет такой функции, легко добиться этого эффекта посредством работы с указателем.

Вот только проку от этого будет немного, потому как указанный фрагмент предназначен для работы с таблицами BIOS в среде MS DOS. Программа, написанная на Delphi и выполняемая в среде Windows, по этим адресам ничего интересного не найдет. Если действительно зачем-то понадобилось получить базовые адреса COM-портов, лучше сделать это системными средствами, например, взять из реестра.
Записан
newmen
Интересующийся

ru
Offline Offline

« Ответ #2 : 29-12-2004 04:43 » 

Ага, то есть пройдет енто только в консольном приложении!?
а для винды эти ячейки известны?  Дело в том, что мне нужны не просто базовые адреса, но еще и все 8 регистров, чтоб управлять устройством, уж в винде-то никто не отменял прямого обращения к портам?

(мне бы проще было асмом напрямую работать с этим портом, потому что время немного - уже курсовик сдавать надо будет скоро) :oops:
Записан
newmen
Интересующийся

ru
Offline Offline

« Ответ #3 : 29-12-2004 05:23 » 

т.е.  где они хранятся в реестре, если не секрет?
Записан
Alf
Гость
« Ответ #4 : 29-12-2004 07:54 » 

Ага, то есть пройдет енто только в консольном приложении!?
Не просто в консольном приложении, а только в консольном приложении, работающем в реальном режиме (эмуляция 8086). Фактически - приложении MS DOS. Для Windows тоже вполне можно написать консольное приложение, которое при этом будет полноценной программой Win32.
Цитата
а для винды эти ячейки известны?
Нет. Более того, в среде MS Windows каждое 32-разрядное приложение запускается в собственном виртуальном адресном пространстве, изолированном от остальных (можно системными средствами создавать общие области памяти для разных процессов, но это вопрос достаточно тонкий). Поэтому ячейка с неким виртуальным адресом X для каждой программы отображается на разные физические адреса памяти, и каждая программа видит свой собственный вариант. Поэтому манипулировать физическими адресами обычно лишено смысла.
Цитата
Дело в том, что мне нужны не просто базовые адреса, но еще и все 8 регистров, чтоб управлять устройством, уж в винде-то никто не отменял прямого обращения к портам?
Мне жаль разочаровывать, однако - увы, отменили. Невозможно создать устойчиво работающую систему, в которой любой процесс может писать в любые регистры что заблагорассудится. На Гейтса постоянно катят бочку по поводу глючности его продукта (на мой взгляд, порой несколько проблема преувеличена), однако если бы он разрешил доступ к регистрам, тут бы мы и узнали кузькину мать. А уж как вирусописатели были бы благодарны за такой подарок...
Цитата
(мне бы проще было асмом напрямую работать с этим портом, потому что время немного - уже курсовик сдавать надо будет скоро) :oops:
Вот эта простота IMHO весьма преувеличена... Доводилось мне как-то писать программу для обмена данными по нескольким портам параллельно для MS DOS. Скажем так, заработала отнюдь не с первого включения, было в чем покопаться.

Кстати, а в чем необходимость этой затеи? Я бы еще понял, если бы это делалось на "голом" железе, для какого-нибудь контроллера на чипе с несколькими килобайтами памяти. Но когда используется более-менее полноценная операционная система, оснащенная драйверами для работы со всеми устройствами, зачем отодвигать их в сторону и грубо лезть на регистры, если есть уже все готовое?
Записан
Alf
Гость
« Ответ #5 : 29-12-2004 08:09 » 

т.е. где они хранятся в реестре, если не секрет?
На своей машине я нашел их в HKEY_LOCAL_MASHINE\HARDWARE\DESCRIPTION\System\MultifunctionAdapter\6\SerialController, соответственно в подразделах 0 и 1 там хранится информация о портах COM1 и COM2.

В ключе ConfigurationData типа REG_FULL_RESOURCE_DESCRIPTOR хранится полное описание порта.
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #6 : 29-12-2004 22:40 » 

а зачем эти адреса? открой нужный сом-порт через hCom := OpenFile (..); и работай с полученным дескриптором, как с обычным файлом. это будет работать даже в НТ. в любом случае писать напрямую в порт в НТ-шке практически невозможно.
Записан

newmen
Интересующийся

ru
Offline Offline

« Ответ #7 : 30-12-2004 07:05 » 

Alf, x77
Ох.., я не знаю на счет драйверов, у меня свое устройство (грубо говоря - ЦАП/АЦП) и назначение линий (rts,dtr,cts,dsr) нестандартное. А в виндовых ф-ях я пока ламерюга полный))
Ребята, спасибо огромное, попробую на праздниках проработать ваши рекомендации)) С Наступающим!!
Записан
Alf
Гость
« Ответ #8 : 30-12-2004 07:32 » 

newmen, спасибо, и тебя тоже.

Если тебе нужно просто передавать/принимать байты через порт, достаточно воспользоваться рекомендациями x77. Если же устройство использует дополнительные сигналы (CTS/RTS И т.п.), придется немного повозиться. Но опять же лазить самому по регистрам - не дело.

Вот здесь: https://club.shelek.ru/viewart.php?id=208 находится статья Алексей1153, в которой он описал свой подход к управлению COM-портом через WinAPI. Другой возможный вариант - использовать управляющий элемент ActiveX MSComm, в нем также есть все необходимое. ВЫбирай на свое усмотрение, оба варианта работают (хотя мне ближе второй, все-таки объект как-то симпатичнее пакета процедур).
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines