Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: О DriverStudio 3.1 и драйвере-фильтре  (Прочитано 5330 раз)
0 Пользователей и 1 Гость смотрят эту тему.
cooler
Участник

ru
Offline Offline
Пол: Мужской

« : 14-09-2006 07:56 » 

Использую DriverStudio для написании
драйвера - фильтра. Он ничего не делает(пока) -
просто перехватывает IRP_MJ_READ и IRP_MJ_WRITE
от USB железяки.

Вот функция Read,которую сгенерировал DriverStudio :

NTSTATUS FilterDrvDevice::Read(KIrp I)
{   
int   dwTotalSize = I.ReadSize(CURRENT);

NTSTATUS status;

status=PassThrough(I, LinkTo(IrpCompletionRoutine), this);
PUCHAR pBuffer =(PUCHAR)I.BufferedReadDest();

return status;
}

Красным цветом - мои вставки.
При получении маленьких пакетом dwTotalSize <=512 байт
в pBuffer правильная информация.(я знаю какая должна быть).
При больших значениях ,например 3000 байт в pBuffer хлам!

Почему?



Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #1 : 19-09-2006 20:30 » 

Лучше обрати внимание на WDF - Windows Driver Framework, это обертка от Майкрософта. Что там накрутили в скончавшейся Драйвер студио никто уже разбираться не будет, копаться в трупе нехорошо Улыбаюсь .
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #2 : 19-09-2006 20:34 » 

Ладно пну трупик немного -

status=PassThrough(I, LinkTo(IrpCompletionRoutine), this);
PUCHAR pBuffer =(PUCHAR)I.BufferedReadDest();

по логике PassThrough посылает запрос на нижележащий драйвер а он сразу возвращает STATUS_PENDING и откладывает запрос( особенно актуально для больших буферов ), то есть следующая строка трогает буфер куда данные еще не записались. Проверяй данные в CompletionRoutine, то есть когда запрос завершится.

Простая проверка
status=PassThrough(I, LinkTo(IrpCompletionRoutine), this);
if( STATUS_PENDING == status ){
  ASSERT( !"Get a rubbish!" );
}
PUCHAR pBuffer =(PUCHAR)I.BufferedReadDest();
« Последнее редактирование: 19-09-2006 20:40 от SlavaI » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines