|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
27.08.2023, 12:24 | #1 |
Пользователь
Регистрация: 29.12.2012
Сообщений: 21
|
WinIO для чтения/записи портов I/O и физпамяти
Добрый день!
Есть подписанный ЭЦП драйвер 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. |
27.08.2023, 12:39 | #2 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,760
|
|
27.08.2023, 12:52 | #3 |
Пользователь
Регистрация: 29.12.2012
Сообщений: 21
|
|
28.08.2023, 01:37 | #4 |
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,894
|
|
28.08.2023, 13:51 | #5 |
Пользователь
Регистрация: 29.12.2012
Сообщений: 21
|
В общем, друзья, сегодня установил Delphi 11.3 Community Edition, заменил тип Int64 переменных структуры TtagPhysStruct на DWORD64, как в сишном исходнике, и скомпилировал:
Код:
|
28.08.2023, 14:00 | #6 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,760
|
Покажите как вызываете
|
28.08.2023, 15:15 | #7 |
Пользователь
Регистрация: 29.12.2012
Сообщений: 21
|
Вызываю просто:
Код:
Код:
Скорее всего, что я не совсем точно перевёл код функции с С++ на Паскаль. Вот, что она собой представляет в библиотеке WinIo32.dll: Код:
Последний раз редактировалось Комиссар Катани; 28.08.2023 в 18:20. Причина: Добавлен сишный код функции MapPhysToLin |
29.08.2023, 10:07 | #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? |
29.08.2023, 13:31 | #9 |
Форумчанин
Регистрация: 07.11.2011
Сообщений: 164
|
|
29.08.2023, 14:13 | #10 | |
Просветитель
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,834
|
Цитата:
Код:
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Обращение по индексу(свойство чтения и записи) | 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 |