Написал примитивнейший драйвер. В нем есть глобальная переменная (базовый адрес пр-ва портов железки, но это не важно). В пользовательском приложении меняю значение этой переменной через вызов 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 все нормально, никаких ругательсв. В чем может быть дело? Извините, в области кодинга др-ов я ещё новичек, сам едва ли разбирусь... Может кто подскажет. Заранее спасибо!
Попробую подробнее. В пользовательском приложении инициализирую 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'ом (стеком?..) в ПОЛЬЗОВАТЕЛЬСКОМ приложении... Читается она нормально и меняется тоже (проверял), но если МЕНЯЕМ ее значение - такой глюк с входным буффером...
Скорее всего проблема выравнивания. У тебя переменная USHORT - 2 байта. Попробуй сделать её ULONG, хотя вообще-то компилер должен соображать что к чему.
Поскольку явление наблюдается исключительнов DEBUG сборке, возможно, дело в каком-то из ключей /Gs /Ge /GZ
Спасибо за ответы! Four-F особое спасибо за статьи - Великая вещь! Глюк с драйвером связан никак не был. Проблема была в пользовательском приложении: неправильно (в смысле типа) читал тот самый Base_Address_Var... А слона то я и не заметил....