![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 29.12.2012
Сообщений: 21
|
![]()
Добрый день!
Есть подписанный ЭЦП драйвер WinIo 3.0 для доступа к портам и мапинга физической памяти для 32/64-разрадяных Windows. Драйвер с открытым исходным кодом и является весьма популярным. На Delphi 7 я воспроизвёл код установки драйвера в системе и обращение к нему через DeviceIoControl. Драйвер успешно зарегистрировался в Service Control Manager, запустился через StartService, успешно возвратил хэндл через CreateFile и даже смог считать и писать порты ввода-вывода, как под Windows 11 x64, так и Windows 7 32-bit. Однако если попытаться замапить память через MapPhysToLin, то драйвер возвращает совсем не то, что нужно. Код мапинга очень простой и ошибки здесь нет: Код:
Код:
Есть подозрение, что в С++ своя особенная упаковка структуры TtagPhysStruct: Код:
Последний раз редактировалось Комиссар Катани; 27.08.2023 в 12:27. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,821
|
![]() |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 29.12.2012
Сообщений: 21
|
![]() |
![]() |
![]() |
![]() |
#4 |
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,926
|
![]() |
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 29.12.2012
Сообщений: 21
|
![]()
В общем, друзья, сегодня установил Delphi 11.3 Community Edition, заменил тип Int64 переменных структуры TtagPhysStruct на DWORD64, как в сишном исходнике, и скомпилировал:
Код:
|
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,821
|
![]()
Покажите как вызываете
|
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 29.12.2012
Сообщений: 21
|
![]()
Вызываю просто:
Код:
Код:
Скорее всего, что я не совсем точно перевёл код функции с С++ на Паскаль. Вот, что она собой представляет в библиотеке WinIo32.dll: Код:
Последний раз редактировалось Комиссар Катани; 28.08.2023 в 18:20. Причина: Добавлен сишный код функции MapPhysToLin |
![]() |
![]() |
![]() |
#8 |
Пользователь
Регистрация: 29.12.2012
Сообщений: 21
|
![]()
Друзья, установил я ApiMonitor и отследил, как заполняется буфер PhysStruct типа TtagPhysStruct драйвером при обращении к нему через DeviceIoControl. Результат прилагается.
В первом случае, как видно на скрине, прога напрямую вызывает функцию MapPhysToLin, отправляя через DeviceIoControl соответствующий IOCTL код драйверу. Драйвер заполняет буфер PhysStruct и передаёт его программе обратно. Во втором случае вызов функции MapPhysToLin происходит из библиотеки WinIo32.dll. Как видно, заполненный буфер PhysStruct не сильно отличается от первого случая. В обоих случаях перед вызовом DeviceIoControl в буфер записываются dwPhysMemSizeInBytes = 4 и pvPhysAddress = $C0000. Тогда вопрос, как тогда MapPhysToLin из WinIo32.dll возвращает корректное значение $E975AA55, если на скрине видно, что pvPhysMemLin = $012F0000? |
![]() |
![]() |
![]() |
#9 |
Форумчанин
Регистрация: 07.11.2011
Сообщений: 178
|
![]() |
![]() |
![]() |
![]() |
#10 | |
Просветитель
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,844
|
![]() Цитата:
Код:
|
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Обращение по индексу(свойство чтения и записи) | plktre | Помощь студентам | 0 | 22.02.2020 20:25 |
Попытка чтения или записи в защищенную память. | zzz6 | Общие вопросы C/C++ | 2 | 23.03.2012 20:26 |
Как открыть для чтения и записи файл без расширения | DeDoK | Общие вопросы Delphi | 4 | 11.11.2009 22:41 |
С++. Кеширование чтения\записи файла | Vinny | Помощь студентам | 1 | 03.06.2009 00:43 |
Защита HDD от чтения/записи при любых условиях. | Air | Свободное общение | 43 | 17.05.2009 18:33 |