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

Тема в разделе "MS Visual C++", создана пользователем dimbasis, 10 мар 2009.

Статус темы:
Закрыта.
  1. dimbasis

    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".

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

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

    vladimir_p_b Гость

    Всё не так.

    В строке

    lplwAddr= (long *)0x00000408;

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

    В строке

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

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

    dimbasis Гость

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

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    давайте зайдем с другой стороны. зачем вам адрес LPT порта?
     
  5. dimbasis

    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.

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

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

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    если не секрет, откуда знаете?
    просто приложение в 3 кольце защиты(обычные приложения) работают в так называемом адресном пространстве, которое отображается на физическую память. прочитать данные напрямую из физической памяти нельзя (оно конечно можно..., но сейчас не об этом). Хотя если вы пишете под дос... тогда другое дело=)

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

    dimbasis Гость

    Откуда знаю? Это известно всем, кто писал под ДОС, Win 3X и 9X. Сейчас, конечно, все не так, а с тех пор именно этим не занимался. Вот, нужно разобраться...
     
Загрузка...
Похожие Темы - Помогите найти ошибку
  1. OlgaZag
    Ответов:
    1
    Просмотров:
    1.291
  2. OlgaZag
    Ответов:
    0
    Просмотров:
    523
  3. Google313
    Ответов:
    0
    Просмотров:
    999
  4. Marikd
    Ответов:
    2
    Просмотров:
    1.209
  5. ruivit
    Ответов:
    2
    Просмотров:
    1.329
Статус темы:
Закрыта.

Поделиться этой страницей