Сейчас на форуме: jinoweb (+5 невидимых)

 eXeL@B —› Программирование —› Заменить процедуру инициализации
Посл.ответ Сообщение

Ранг: 9.0 (гость), 1thx
Активность: 0.010
Статус: Участник

Создано: 01 мая 2016 19:48 · Поправил: Free-Man
· Личное сообщение · #1

Подскажите пожалуйста, ситуация следующая: Есть 2 PCI карты одна версия А другая версия B, есть 2 программы к этим картам, в обеих программах есть кусок кода:

proc near
push esi
mov esi, ecx
call card_B_initial

В этой процедуре происходит только jmp ds:card_B_initial (card_B_initial это импортированная процедура инициализации из соответствующей .dll'ки)

test eax, eax
mov [esi], eax
jle short loc_401557 (тут тупо pop esi)
mov esi, 1

Стоит задача заставить программу от карты B работать с картой А. Инструкции у обеих карт как мне известно одинаковые. Подскажите как это сделать? Заменить в секции импорта процедуру инициализации из dll от карты B на процедуру инициализации из dll от карты А верно? Или подменить в dll имя процедуры? И как это проделать технически подскажите (некоторый опыт имею надеюсь разберусь с вашей помощью).



Ранг: 6.7 (гость), 2thx
Активность: 0.01=0.01
Статус: Участник

Создано: 01 мая 2016 21:08
· Личное сообщение · #2

Обычно если карты отличаются версиями, это может отражаться в PCI регистрах device id/vendor id или subsystem id/subsystem vendor id. Если отличий нет, то нет механизма, который бы позволил найти отличия одной платы от другой. Разве что там есть eeprom или еще что, где это зашито. Это нужно выяснять. Что за платы-то? Если отличий нет ни на уровне команд, ни на уровне функционала, то и нет повода для беспокойства, все должно работать с вашей программой.

Кроме того, вы указываете, что код инициализации находится в dll. Но обычно в последнее время все содержится в драйверах, а dll оказывается wrapper-ом для обращения из пользовательского окружения. Поэтому мне кажется, что копать нужно в сторону драйвера. Есть, правда, старые варианты, которые использовали под windows 98, когда операции ввода-вывода засовывали в dll непосредственно. Сейчас это уже не используется.

Без программ и/или результатов их анализа пока разговор беспредметный.

| Сообщение посчитали полезным: Free-Man

Ранг: 9.0 (гость), 1thx
Активность: 0.010
Статус: Участник

Создано: 02 мая 2016 10:38 · Поправил: Free-Man
· Личное сообщение · #3

Adtech ADT-8940. Плата для управления станком, многоосевая.
Карта что версии B довольно старая, чип на ней 2006.
Карта B

Карта A

--> 2 dll для двух версий карт + 2 демонстрационные программы <--
--> Драйвер для карты версии B, так же в архиве исходник демонстрационной программы из ссылки ранее, на Visual C++ <--

KIS ругается на второй архив, но насколько я знаю это не вирус, по крайней мере так уверяли китайцы что этот драйвер писали ну и проблем при эксплуатации не было. Sentinel - программа для doongle (по ошибке оставил в архиве)



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 02 мая 2016 12:04 · Поправил: dosprog
· Личное сообщение · #4

А это ничего, что для карты А драйвера вроде как расчитаны на x64-систему, тогда как для карты B требуется x32 система? (Cудя по обеим DLL'ям - 8940A1.DLL и 8940B1.DLL) ..а впрочем..

Имена импортов в этих DLL'ях сильно различаются, значит тупо подменить одну другой не выйдет.
Да и драйверы эти DLL'и используют сильно разные.

Проблема в чём? - Предположу, что живьём имеется новая карта А, а весь софт с драйверами имеется только для старой карты В?

--Добавлено--

Скорей всего, это ни к чему не приведёт, но в DLL'ях есть такие фрагменты:
Code:
  1. Card A: .text:10007F63      cmp  eax, 89421022h    ;(Более новая)
  2. Card B: .text:100010CA      cmp  eax, 89411022h    ;(Более старая)


Пробуйте новый 8940B1.DLL (вместе с DEMO_B.EXE) запустить со своей картой "А".
1655_02.05.2016_EXELAB.rU.tgz - 8940B1.DLL

В аттаче запатченная DLL. Или можете запатчить это место самостоятельно:
Code:
  1. Minor fix
  2.  
  3. Differences between "8940b1_orig.dll" & "8940b1.dll"
  4. 8940b1.dll
  5. .100010CD: 41 42 ;000010CD:


Может, если у них есть совместимость снизу вверх, то что-то и получится. Но сомневаюсь.
И придётся ковырять драйвер (adtcard.sys). Имея на чём попробовать (собственно карту "А").


--Добавлено2--

Драйвер adtcard.sys это на самом деле giveio.sys..
Интересующий же - это 8940b1.sys



| Сообщение посчитали полезным: Free-Man

Ранг: 9.0 (гость), 1thx
Активность: 0.010
Статус: Участник

Создано: 02 мая 2016 14:42
· Личное сообщение · #5

dosprog пишет:
Предположу, что живьём имеется новая карта А, а весь софт с драйверами имеется только для старой карты В?


Да карту версии B (старую) уже не найти в продаже нигде.

dosprog пишет:И придётся ковырять драйвер (adtcard.sys). Имея на чём попробовать (собственно карту "А").

А поподробнее что в драйвере ковырять?



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 02 мая 2016 14:58 · Поправил: dosprog
· Личное сообщение · #6

Free-Man пишет:
А поподробнее что в драйвере ковырять?

Что показал запуск программы DEMO_B.EXE с подменной DLL - 8940B1.DLL ?

--Добавлено--

Снова предположу - вы имеете также и драйвера к новой карте "А", но они для Win х64.
Потому и возник вопрос с использованием старого софта?





Ранг: 9.0 (гость), 1thx
Активность: 0.010
Статус: Участник

Создано: 02 мая 2016 17:24
· Личное сообщение · #7

dosprog пишет:
Что показал запуск программы DEMO_B.EXE с подменной DLL - 8940B1.DLL ?


Запуск прошел! Сейчас тестирую все ли работает как надо, все ли доступно.

dosprog пишет:
Снова предположу - вы имеете также и драйвера к новой карте "А", но они для Win х64.
Потому и возник вопрос с использованием старого софта?


Да, драйвера есть. Софта под новую карту нету. Вот в архиве программа которая изначально работает с картой версии B, но эту карту приобрести сейчас нереально.
--> Link <--



Ранг: 6.7 (гость), 2thx
Активность: 0.01=0.01
Статус: Участник

Создано: 02 мая 2016 21:53
· Личное сообщение · #8

Видимо, различие в самом деле было в device id. Лечится подменой id.


 eXeL@B —› Программирование —› Заменить процедуру инициализации
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати