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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Завершения запроса к драйверу  (Прочитано 7861 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Sevenfly
Гость
« : 03-12-2006 21:26 » 

Есть такая проблема:

имеется устройство, которое периодическе что-то шлёт по USB. На Дельфи написана программа, в которой есть поток, считывающие данные:

while not Terminate do
begin
 If not ReadFile(hDevice, A, 32, ReadBytes, @ReadOL) then
 begin
  If GetLastError()= ERROR_IO_PENDING then
    begin
      WaitForSingleObject(ReadOl.hEvent,2000);
    end;
  end;
  CloseHandle(ReadOl.hEvent);
end;

и драйвер

NTSTATUS CandDV2Device::Read(KIrp I)
{
      DbgPrint("CandDV2Device::Read START");


   // Always ok to read 0 elements.
   if (I.ReadSize() == 0)
   {
      I.Information() = 0;
         DbgPrint("WARNING: I.Information() = 0");
         DbgPrint("ATDriverDevice::Read END");
      return I.PnpComplete(this, STATUS_SUCCESS);
   }
   NTSTATUS status      = STATUS_SUCCESS;

   PUCHAR   pBuffer      = (PUCHAR) I.BufferedReadDest();

   ULONG   dwTotalSize = I.ReadSize(CURRENT);   // Requested read size
   ULONG   dwBytesRead = 0;               // Count of bytes read


   ULONG dwMaxSize = m_Endpoint4IN.MaximumTransferSize();
   DbgPrint(" READ: Requested=%d MaxSize=%d", dwTotalSize, dwMaxSize);

    if (dwTotalSize > dwMaxSize)
    {
      dwTotalSize = dwMaxSize;
    }


   DbgPrint("Endpoint 4");
   

   PURB pUrb = m_Endpoint4IN.BuildInterruptTransfer(
                          pBuffer,        // Where is data coming from?
                        dwTotalSize,    // How much data to read?
                        TRUE            // Short OK
            );

   if (pUrb == NULL)
   {
      I.Information() = 0;
         DbgPrint("ERROR: BuildInterrupt");
      return I.PnpComplete(this, STATUS_INSUFFICIENT_RESOURCES);
   }

   // Submit the URB to our USB device, synchronously - say less is OK
   pUrb->UrbBulkOrInterruptTransfer.TransferFlags =
                (USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK);

   if (!m_Endpoint4IN.IsOpen())
   {
      I.Information() = 0;
         DbgPrint("ERROR: m_Endpoint4IN is not open!");
      return I.PnpComplete(this, STATUS_INSUFFICIENT_RESOURCES);
   }

   status = m_Endpoint4IN.SubmitUrb(pUrb);


   dwBytesRead = pUrb->UrbBulkOrInterruptTransfer.TransferBufferLength;

   if ( status == STATUS_SUCCESS) {
      DbgPrint("Read SUCCESS %d bytes", dwBytesRead);
   }
   else {
      DbgPrint("ERROR: SubmitUrb (%d) error code=%X", dwBytesRead, status);
   }

   for (int i=0; i<(int)dwBytesRead; i++)
      DbgPrint("  %d", ((PCHAR)(pBuffer)) );

   delete pUrb;

   I.Information() = dwBytesRead;
   

   DbgPrint("CandDV2Device::Read END");
   return I.PnpComplete(this, status);
}

В чем проблема: поток считывания из USB работает постоянно, т.е. запускается в начале программы, запускает чтение с USB и ждёт, пока устройство не запишет эти данные. Допустим необходимо закрыть программу. Можно жестко завершить нить, можно поставить WaitForMultipleObject и по нему выдти, не суть. Все равно запрос на считывание драйверу мы уже послали.

Допустим снова запускаем программу, снова запускается поток, который шлёт драйверу запрос на считывание. Когда от USB устройства придут данные, в результаты какого запроса драйвера они попадут? В запрос закрытой программы (и тем самым данные пропадут) или в результаты новой программы?


Заранее спасибо
Записан
Ochkarik
Модератор

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

« Ответ #1 : 04-12-2006 07:39 » 

кажись первое. ибо запрос URB поставится в очередь и останется в какой нить системной нити драйвера USB (PS драйвера шины)
PPS брррр.... щас... чет я в вашем коде запутался) минуту
« Последнее редактирование: 04-12-2006 07:46 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

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

« Ответ #2 : 04-12-2006 08:04 » 

ересь какая то))) запутался)))
вы посылаете запрос чтения. если он возвращается со со статусом pending вы ждете event 2 секунды...видимо потом данные куда то уходят... короче, запрос ваш выполнется в любом случае, так как вы в драйвере механизмов отмены запросов не предусмотрели. но если ваш девайс дольше двух секунд будет данные отдавать - они у вас пропадут. так как запрос то в силе, но результата уже никто не ждет. а результат еще и запишется хрен знает куда... IRP какого типа используется бефрезированный аль нет?

а вот драйвер.... хм.... не люблю я классы)
return I.PnpComplete(this, status); Не понялНе понял? это хто такое?)))
если IoCompleteRequest.... то... если.... короче нелюблю я классы) изврат)
и m_Endpoint4IN.SubmitUrb(pUrb).... - оно что делает?)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Greysfi
Гость
« Ответ #3 : 04-12-2006 11:16 » 

Вообще то есть такой вызов как IOCancel он должнен прекращать асинхронный запрос.
Записан
Ochkarik
Модератор

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

« Ответ #4 : 04-12-2006 13:14 » 

IoCancelIrp завершает IRP а не URB;)
а для завершения URB - всяческие  IOCTL_INTERNAL_USB_SUBMIT_URB скорее всего с URB_FUNCTION_RESET_PIPE
в любом случае с синхронизацией процессов заморачиваться...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Greysfi
Гость
« Ответ #5 : 04-12-2006 13:18 » 

Я говорю о том что приложение должно вызвать IoCancel, а как оно будет заимплеменчено на уровне драйвера это другой разговор Улыбаюсь.
Записан
Ochkarik
Модератор

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

« Ответ #6 : 04-12-2006 14:25 » 

угу... ток для данного случая IoCancel.... короче гемор один с ним будет) проще другими способами выкрутится...
PS а вообще пофиг... все равно ж гемор)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines