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

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

ru
Offline Offline
Пол: Мужской
Кот рыжий


« : 24-05-2004 03:23 » 

Стоит Numega Driver Studio 3я и Visual C 2003 в WinXP С помощью визарда сгенерировал WDM драйвер для USB Никак не могу заставить работать interrupt transfer...
На Device Control посадил такой код:

      case TEST_IOCTL_XFER:
         {   
      // Build a transfer request
        t << "Begin Interrupt Transfer ";
      PURB pUrb = m_Endpoint83IN.BuildInterruptTransfer(
         I.IoctlBuffer(),
         I.IoctlOutputBufferSize()
         );
      t << "URB" << pUrb << EOL;
      t << "Buffer's address" << I.IoctlBuffer() << EOL;
      t << "Buffer's length" << I.IoctlOutputBufferSize() << EOL;
      if( NULL == pUrb )
      {
         status = STATUS_INSUFFICIENT_RESOURCES;
         break;
      }

   // We are about to submit a request to the USB driver, so
   // bump the outstanding request count. Note that the counter
   // is also by the base class to count requests coming into
   // our driver. We will decrement the count in the completion
   // routine. This enables us to handle removals cleanly.

      IncrementOutstandingRequestCount();

   // Pass the request down on the same IRP. This is the
   // asynchronous form -- note use of completion routine
   
      I.MarkPending();
      status = m_Endpoint83IN.SubmitUrb(
         I,
         pUrb,
         LinkTo(TransferComplete),    
         this
         );

      return STATUS_PENDING;
   }
      default:
         // Unrecognized IOCTL request
         status = STATUS_INVALID_PARAMETER;
         break;
   }

   // If the IRP's IOCTL handler deferred processing using some driver
   // specific scheme, the status variable is set to STATUS_PENDING.
   // In this case we simply return that status, and the IRP will be
   // completed later.  Otherwise, complete the IRP using the status
   // returned by the IOCTL handler.
   if (status == STATUS_PENDING)
   {
      return status;
   }
   else
   {
      return I.PnpComplete(this, status);
   }
}


На transfer complete у меня

NTSTATUS TestDevice::TransferComplete(
   KIrp I,
   _URB_BULK_OR_INTERRUPT_TRANSFER* pUrb
   )
{
   t << "IRP status on transfer complete:" << I.Status()<<EOL;
   if (I->PendingReturned)
      I.MarkPending();

   // Set number of bytes transferred from URB to IRP

   I.Information() = pUrb->TransferBufferLength;
   t << "Tranferred bytes:" << pUrb->TransferBufferLength<<EOL;
   DbgBreakPoint();
   // Release the URB

   delete pUrb;

   DecrementOutstandingRequestCount();

   return STATUS_SUCCESS;
}

В итоге получаю что считано байт 0, при попытке удалить URB получаю BAD_POOL_CALLER экран смерти
Помогите пожалуйста любой инфой Одному мне эту проблему не вытянуть бьюсь я над ней месяц уже... (
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #1 : 25-05-2004 02:08 » 

Please Help!
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines