Объясните вот это(IO_STACK_LOCATION)

Тема в разделе "WASM.WIN32", создана пользователем LuckyDevil, 8 июл 2005.

  1. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Всем доброго!

    Встретил такую запись:
    Код (Text):
    1.  
    2. RtlCopyMemory( nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine));
    3.  


    это кусок макроса, я не могу понять FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine), какой IRP именно принадлежит CompletionRoutine.

    Грубого говоря:

    RtlCopyMemory( nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION,nextIrpSp->CompletionRoutine или irpSp->CompletionRoutine));

    заранее, спасибо!
     
  2. TarasCo

    TarasCo New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    106
    //

    // Calculate the byte offset of a field in a structure of type type.

    //



    #define FIELD_OFFSET(type, field) ((LONG)(LONG_PTR)&(((type *)0)->field))



    т.е это макрос просто вычисляет смещение от начала структуры до указанного поля.

    Приведенный код копирует часть структуры IO_STACK_LOCATION до поля, задающего функцию завершения запроса. По сему Ваш вопрос не имеет ответа :)
     
  3. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    "Вспомните, что при передаче IRP нижестоящему драйверу, драйвер kbdclass скопировал свой блок стека в следующий, использую макрос IoCopyCurrentIrpStackLocationToNext. Однако этот макрос не копирует поля связанные с процедурой завершения. Если бы он этого не сделал, то указатель на нашу процедуру завершения (он находится в блоке стека драйвера kbdclass) попал бы в блок стека драйвера i8042prt, и наша процедура завершения была бы вызвана дважды. В стародавние времена, когда ещё не было макроса IoCopyCurrentIrpStackLocationToNext, программисты вручную копировали блоки стека, иногда забывая обнулить поля связанные с процедурой завершения, что приводило к трудно находимым багам."



    Остальное в статье: http://wasm.ru/article.php?article=drvw2k15





    Там также можно узнать, что IRP не принадлежит CompletionRoutine. Скорее наоборот, а ещё точнее в каждом IO_STACK_LOCATION может быть указатель на CompletionRoutine и эти процедуры принадлежат разным драйверам.
     
  4. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    TarasCo, спасибо. Это понятно что идет расчет длины копируемых данных, просто как то(лично для меня) не привычно, видить такие записи. В тоже время как выясняется IO_STACK_LOCATION, может иметь 2 различные по содержанию структуры, отсюда и такой сопсоб вычисления длины компируемых данных.

    Four-F, столько информации сразу, что в голове сплошная каша.

    Спасибо.
     
  5. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Тут у меня еще возник вопрос или точнее, я опять в замешательстве...

    Вот структура:
    Код (Text):
    1.  
    2. typedef struct _SPY_COMPLETION_CONTEXT_W2K {
    3.  
    4.     SPY_COMPLETION_CONTEXT;
    5.    
    6.     WORK_QUEUE_ITEM WorkItem;
    7.     PDEVICE_OBJECT DeviceObject;
    8.     PIRP Irp;
    9.     PDEVICE_OBJECT NewDeviceObject;
    10.  
    11. } SPY_COMPLETION_CONTEXT_W2K, *PSPY_COMPLETION_CONTEXT_W2K;
    12.  


    как понимать SPY_COMPLETION_CONTEXT;

    ?????

    пример взят из ddk\filespy
     
  6. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    вот еще:
    Код (Text):
    1.  
    2. #define IoMarkIrpPending( Irp ) ( \
    3.     IoGetCurrentIrpStackLocation( (Irp) )->Control |= SL_PENDING_RETURNED )


    Control, тут без хорошей помощи вовсе не обойтись.

    Four-F, на сколько я понял из твоих исходников
    Код (Text):
    1. это (Irp)->Control есть
    2. mov eax, (_IRP PTR [eax]).Tail.Overlay.CurrentStackLocation
    3. (IO_STACK_LOCATION PTR [eax]).Control
    4. или
    5. PIO_STACK_LOCATION((Irp)->Tail.Overlay.CurrentStackLocation)->control
    6.  


    верно?
     
  7. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ LuckyDevil</font><!--color--><font color="gray]: В тоже время как выясняется IO_STACK_LOCATION, может иметь 2 различные по содержанию структуры, отсюда и такой сопсоб вычисления длины компируемых данных. ]</font><!--color-->



    IO_STACK_LOCATION является объединением намного бОльшего чем 2 числа структур, а способ вычисления длины компируемых данных такой совсем не поэтому. Сколько бы членов в объединении IO_STACK_LOCATION.Parameters не было, его размер определяется членом имеющим максимальным размер и смещение поля CompletionRoutine будет фиксированным.





    <font color="gray][ LuckyDevil</font><!--color--><font color="gray]: как понимать SPY_COMPLETION_CONTEXT; ]</font><!--color-->



    Это вложенная структура. Просто у члена нет имени и можно обращаться к членам SPY_COMPLETION_CONTEXT напрямую.


    Код (Text):
    1. typedef struct _A {
    2.     DWORD dw;
    3. } A;
    4.  
    5. typedef struct _B {
    6.     A;
    7. } B;
    8.  
    9. A a;
    10. B b;
    11.  
    12. a.dw = 0;
    13. b.dw = 0;




    <font color="gray][ LuckyDevil</font><!--color--><font color="gray]: верно? ]</font><!--color-->



    Да.
     
  8. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Код (Text):
    1. Это вложенная структура. Просто у члена нет имени и можно обращаться к членам SPY_COMPLETION_CONTEXT напрямую.
    2.  


    Four-F, ну надо же какие чудеса ))), дял меня это новость, Си то я не так хорошо знаю, спасибо за информацию!!!!!



    а если я так напишу это будет тоже самое ?

    Four-F, Развивая эту тему:
    Код (Text):
    1.  
    2. typedef struct _SPY_COMPLETION_CONTEXT {
    3.  
    4.     PRECORD_LIST RecordList;
    5.  
    6. } SPY_COMPLETION_CONTEXT, *PSPY_COMPLETION_CONTEXT;
    7.  
    8. typedef struct _SPY_COMPLETION_CONTEXT_W2K {
    9.  
    10.     SPY_COMPLETION_CONTEXT AA;
    11.    
    12.     WORK_QUEUE_ITEM WorkItem;
    13.     PDEVICE_OBJECT DeviceObject;
    14.     PIRP Irp;
    15.     PDEVICE_OBJECT NewDeviceObject;
    16.  
    17. } SPY_COMPLETION_CONTEXT_W2K, *PSPY_COMPLETION_CONTEXT_W2K;
    18. ...
    19. PSPY_COMPLETION_CONTEXT_W2K BB;
    20.  
    21. ...
    22. BB->AA.RecordList
    23.  
     
  9. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237