• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Помогите найти ошибку

  • Автор темы dimbasis
  • Дата начала
Статус
Закрыто для дальнейших ответов.
D

dimbasis

Уважаемые коллеги,

У меня есть необходимость найти адрес LPT порта.

Я написал такую функцию и поместил ее в DLL.

//===========================================
// LPTPort.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h";


BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID )
{
return 1;
}


int FindLPT( int iPortNum)
{

long *lplwAddr; // указатель на адрес области в которой находится адрес порта
long lwAddr; // адрес порта


if (iPortNum == 1)
{
lplwAddr= (long *)0x00000408;
}
else if (iPortNum == 2)
{
lplwAddr=( long *)0x0000040A;
}
else if (iPortNum == 3)
{
lplwAddr=( long *)0x0000040C;
}
else if (iPortNum == 4)
{
lplwAddr=( long *)0x0000040E;
}
else
{ return (0);}


lwAddr = *lplwAddr; // !!!!!!!!! при отладке на этой строке ошибка Access Violation
return (lwAddr);
}
//================================

DLL строится нормально, а если смотреть в отладчике, то указатели не показывают на адреса портов
и в строке lwAddr = *lplwAddr; - run time ошибка "Access Violation".

Помогите пожалуйста, что я сделал не так?

Заранее спасибо, Дмитрий.
 
V

vladimir_p_b

Всё не так.

В строке

lplwAddr= (long *)0x00000408;

переменной lplwAddr вы присваиваете некоторое числовое значение, указывая компилятору, что это числовое значение есть указатель на переменную типа long.
Это корректно и допустимо.

В строке

lwAddr = *lplwAddr; // !!!!!!!!! при отладке на этой строке ошибка Access Violation

вы пытаетесь переменной lwAddr присвоить значение, содержащееся в области памяти по адресу, на который указывает значение переменной lplwAddr.
Но это - область памяти системы, она недоступна для прикладных программ, что и вызывает ошибку Access Violation - нарушение доступа.
 
D

dimbasis

А как же быть, если мне все-таки нужен доступ (чтение) к памяти по адресам 0x00000408 ... и т. д. ?
BIOS помещает в эту область адреса LPT портов.
Неужели нельзя получть доступ?
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
давайте зайдем с другой стороны. зачем вам адрес LPT порта?
 
D

dimbasis

Более подробно. К LPT порту подключено устройство (что-то типа исполнительного механизма). Мне нужно определить, к какому LPT порту подключено устроойство и после этого читать биты ACK, BUSY, SEL, ERROR и послать данные на INIT, на STROBE и на D0-D7.
Мне известно, что когда BIOS назначает адреса LPT портов, он сохраняет базовые адреса этих портов по таким адресам:

0000:0408 для LPT1
0000:040A для LPT2
0000:040C для LPT3
0000:040E для LPT4

Действительно, адреса, например, LPT1 обычно 378h - 37Fh, но это не ввсегда так.
Для правильного определения адреса LPT1 нужно посмотреть в 0000:0408.

Отсюда и вовопрос. Как правильно прочитать данные по вышеуказанным адресам и
как послать и прочитать данные?

Заранее благодарен.
С уважением, Дмитрий.
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
Мне известно, что когда BIOS назначает адреса LPT портов, он сохраняет базовые адреса этих портов по таким адресам:
если не секрет, откуда знаете?
просто приложение в 3 кольце защиты(обычные приложения) работают в так называемом адресном пространстве, которое отображается на физическую память. прочитать данные напрямую из физической памяти нельзя (оно конечно можно..., но сейчас не об этом). Хотя если вы пишете под дос... тогда другое дело=)

Но в целом получить доступ к портам можно использую Win Api
 
D

dimbasis

Откуда знаю? Это известно всем, кто писал под ДОС, Win 3X и 9X. Сейчас, конечно, все не так, а с тех пор именно этим не занимался. Вот, нужно разобраться...
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!