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

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

dimbasis

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

У меня есть необходимость найти адрес 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

#2
Всё не так.

В строке

lplwAddr= (long *)0x00000408;

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

В строке

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

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

dimbasis

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

Kmet

Java Team
25.05.2006
1 036
8
#4
давайте зайдем с другой стороны. зачем вам адрес LPT порта?
 
D

dimbasis

#5
Более подробно. К 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

Java Team
25.05.2006
1 036
8
#6
Мне известно, что когда BIOS назначает адреса LPT портов, он сохраняет базовые адреса этих портов по таким адресам:
если не секрет, откуда знаете?
просто приложение в 3 кольце защиты(обычные приложения) работают в так называемом адресном пространстве, которое отображается на физическую память. прочитать данные напрямую из физической памяти нельзя (оно конечно можно..., но сейчас не об этом). Хотя если вы пишете под дос... тогда другое дело=)

Но в целом получить доступ к портам можно использую Win Api
http://www.codeguru.com/forum/archive/inde...p/t-223914.html
 
D

dimbasis

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