Взаимодествие с драйвером. Проблемы со стеком в user mode приложении. HELP!

Тема в разделе "WASM.WIN32", создана пользователем HALT, 6 май 2005.

  1. HALT

    HALT New Member

    Публикаций:
    0
    Регистрация:
    5 май 2005
    Сообщения:
    10
    Написал примитивнейший драйвер. В нем есть глобальная переменная (базовый адрес пр-ва портов железки, но это не важно). В пользовательском приложении меняю значение этой переменной через вызов DeviceIoControl, в др-ре соответственно обработывается через IOCTL (METHOD_BUFFERED).

    Проблема: после записи в переменную др-ра в пользовательском приложении рушится стек: "Run-Time Check Failure #2 - Stack around the variable 'Base_Address_Var' was corrupted" (т.е. Base_Address_Var - у меня буфер с адресом, который я передаю др-ру). Причем работает все нормально пока это мое приложение не завершает работу. При компиляции как Debug вылетает отладчик VC++ c сообщением^^ (Пардон за не Дзенский инструмент!) При Release все нормально, никаких ругательсв. В чем может быть дело? Извините, в области кодинга др-ов я ещё новичек, сам едва ли разбирусь... Может кто подскажет. Заранее спасибо!
     
  2. Saint German

    Saint German New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2003
    Сообщения:
    222
    Мало информации для помощи
     
  3. HALT

    HALT New Member

    Публикаций:
    0
    Регистрация:
    5 май 2005
    Сообщения:
    10
    Попробую подробнее. В пользовательском приложении инициализирую var, передаю его др-ру:

    DeviceIoControl(hHandle, IOCTL_SET_BASE_ADDRESS, &Base_Address_Var,sizeof(Base_Address_Var), NULL, 0,

    &RetVar,NULL)



    В др-ре:

    switch .......

    case IOCTL_SET_BASE_ADDRESS: // по запросу - изменить

    // значение системной переменной

    {

    ULONG InputBuffSize = IrpStack->Parameters.DeviceIoControl.InputBufferLength;

    if( InputBuffSize!=2) //входной буффер unsigned short

    {

    status=STATUS_INVALID_PARAMETER;

    break;

    }

    USHORT *InputBuff;

    InputBuff=(PUSHORT)Irp->AssociatedIrp.SystemBuffer;

    /*

    т.к. METHOD_BUFFERED

    */

    BaseAddress=*InputBuff; // BaseAddress - глоб. var в др-ре

    ProcessingBytes=2; // байт обработали

    break;

    }



    Сейчас для нагладности подправил, но не существенно.

    Повторюсь, при Release компиляции все ОК! Работает всё это вроде корректно, тестил. Но что за ругательство отладчика?

    Добавлено мной уже утом (что-то никто не отвечает):

    Правильно ли я модифицирую системную переменную? Почему происходит проблема с var'ом (стеком?..) в ПОЛЬЗОВАТЕЛЬСКОМ приложении... Читается она нормально и меняется тоже (проверял), но если МЕНЯЕМ ее значение - такой глюк с входным буффером...
     
  4. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Скорее всего проблема выравнивания. У тебя переменная USHORT - 2 байта. Попробуй сделать её ULONG, хотя вообще-то компилер должен соображать что к чему.
     
  5. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Поскольку явление наблюдается исключительнов DEBUG сборке, возможно, дело в каком-то из ключей /Gs /Ge /GZ
     
  6. HALT

    HALT New Member

    Публикаций:
    0
    Регистрация:
    5 май 2005
    Сообщения:
    10
    Спасибо за ответы! Four-F особое спасибо за статьи - Великая вещь! Глюк с драйвером связан никак не был. Проблема была в пользовательском приложении: неправильно (в смысле типа) читал тот самый Base_Address_Var... А слона то я и не заметил....