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

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

Использует поля

  LIST_ENTRY IrpQueue;
  KSPIN_LOCK IrpQueueLock;
  BOOLEAN DeviceBusy;

Их нужно размещать в самом конце структуры DEVICE_EXTENSION? Меня одолевают смутные сомнения
Эта функция уже ориентирована на какие-то смещения этих полей в структуре DEVICE_EXTENSION же...где их размещать?
Записан
Ochkarik
Модератор

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

« Ответ #1 : 31-07-2006 06:51 » 

нипонял?Не понял? отколь такая? у меня так определена:
VOID
  IoStartNextPacket(
    IN PDEVICE_OBJECT  DeviceObject,
    IN BOOLEAN  Cancelable
    );
или ничего не понял...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
maaaaaad
Гость
« Ответ #2 : 31-07-2006 07:24 » 

Да, все верно, IoStarNextPacket такая, туда передается только указатель на DeviceObject из которого она получает указатель на DEVICE_EXTENSION. А из DEVICE_EXTENSION берет поля IrpQueue,IrpQueueLock, DeviceBusy.  Но откуда она знает об их смещение в DEVICE_EXTENSION???



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

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

« Ответ #3 : 31-07-2006 07:34 » 

опа... а где на это посмотреть можно? в каком *.h файле?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
maaaaaad
Гость
« Ответ #4 : 31-07-2006 07:38 » 

раздел Queuing I/O Requests из Олтера Оней,

приведен код "похожий" на оригинальный

VOID NaiveStartNextPacket(PDEVICE_EXTENSION pdx, PIRP Irp)
  {
  if (IsListEmpty(&pdx->IrpQueue))
    pdx->DeviceBusy = FALSE;
  else
    {
    PLIST_ENTRY foo = RemoveHeadList(&pdx->IrpQueue);
    PIRP Irp = CONTAINING_RECORD(foo, IRP,
      Tail.Overlay.ListEntry);
    StartIo(pdx->DeviceObject, Irp);
    }
  }



далее


typedef struct _DEVICE_EXTENSION {

  LIST_ENTRY IrpQueue;
  KSPIN_LOCK IrpQueueLock;
  BOOLEAN DeviceBusy;
  } DEVICE_EXTENSION, *PDEVICE_EXTENSION;

NTSTATUS AddDevice(...)
  {

  InitializeListHead(&pdx->IrpQueue);
  KeInitializeSpinLock(&pdx->IrpQueueLock);
 

  }


Здорово.....Как скомпиленный код IoStartNextPacket распознает поля IrpQueue и.т.п в моем DEVICE_EXTENSION не понятно.......Должно быть правило о размещении этих полей в моем DEVICE_EXTENSION... Здесь была моя ладья...

Записан
IRP
Постоялец

ua
Offline Offline

« Ответ #5 : 31-07-2006 07:41 » 

И где ты это нашел?
В коде ядра в помине нет обращений к этим полям. Если интересно посмотри в серцах.
Максимум к чему там идет обращение DeviceObject->DeviceQueue ну и DeviceObject->CurrentIrp...
Записан
maaaaaad
Гость
« Ответ #6 : 31-07-2006 07:43 » 

И вобще схема c StartIo для меня не совсем удобны т.к. у меня обработка будет вестить не целыми MDL (как предпологалось microsoft) а частью MDL - по 1 странице. Эк, мне чтобы соответствовать снандарту нужно заворачивать чтения-запись из UserMode если буфер > 4кб.
в общем старый код с синхронизацией Dispatch-DPC-Irq и очередью по приоритетам у меня есть но хотельсь то наконец заюзать этот стартио....
Записан
Ochkarik
Модератор

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

« Ответ #7 : 31-07-2006 07:45 » 

гы))) так это ж пользовательский код) вида тут не при чем)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
maaaaaad
Гость
« Ответ #8 : 31-07-2006 07:45 » 

А что это тогда за бред написан в книге? Эти все IrpQueue ... для отвода глаз скажи еще Улыбаюсь
Записан
IRP
Постоялец

ua
Offline Offline

« Ответ #9 : 31-07-2006 07:46 » 

Он просто приводит возможную реализацию и на примере показывает как это можно сделать.
В системе сделано по другому вот и все.
Записан
maaaaaad
Гость
« Ответ #10 : 31-07-2006 07:48 » 

Ты имеешь ввиду что под кодом
NTSTATUS AddDevice(...)
  {

  InitializeListHead(&pdx->IrpQueue);

  }

Они имели ввиду что это система делает....Но нет хрена лысого написано...
Queuing an IRP is conceptually very simple. You can provide a list anchor in your device extension, which >>>you<<< initialize in your AddDevice function:
Записан
maaaaaad
Гость
« Ответ #11 : 31-07-2006 07:49 » 

Ладно, короче я понял эта вся бойда не нужна в DEVICE_EXTENSION
Записан
IRP
Постоялец

ua
Offline Offline

« Ответ #12 : 31-07-2006 07:50 » 

Да нет, ты можешь сам организовать в своем коде очередь IRP и обрабатывать ее как вздумается. Что тебе Оней и показывает. Если хочешь пользоваться системным StartIo то тебе этого делать не нужно.
Записан
Ochkarik
Модератор

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

« Ответ #13 : 31-07-2006 07:54 » 

ээээ... подождите, винда имеет возможность использовать встроенный механизм очереди IRP построенный на StartIO. IoStartNextPacket - к нему и относится. сейчас не помню какие у него преимущества - помоему только то что заморочек меньше. но недостатки тоже какие то были... не помню где читал об этом.
Так же есть возможность строить свои очереди для IRP запросов. а Вльтер просто для удобства объяснения "как это работает" привел ну... модель встроенного кода)
если ты ъочешь использовать что то типа - смотри про использование StartIO.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
maaaaaad
Гость
« Ответ #14 : 31-07-2006 07:54 » 

Ну я так и делал раньше....А вот StartIo еще не пробовал.....Спасибо, а то я чето понять не мог, че это за херня написана...

Записан
maaaaaad
Гость
« Ответ #15 : 31-07-2006 07:55 » 

Незнаю, чето меня затерзали смутные сомнения....Делать с IoStartPacket или сделать опять свою очередь...
Записан
maaaaaad
Гость
« Ответ #16 : 31-07-2006 07:57 » 

Встроеный механизм это сильно сказано - 4 штук скрытых полей в DEVICE_EXTENSION и пара функций....
Записан
Ochkarik
Модератор

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

« Ответ #17 : 31-07-2006 08:05 » 

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

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

Да ниче так, гламурненько Улыбаюсь Вроде работает этот механизм Улыбаюсь Хоть экстеншн поменьше будет
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines