обнаружен глюк

Тема в разделе "WASM.WIN32", создана пользователем moderhi, 4 янв 2012.

  1. moderhi

    moderhi New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2011
    Сообщения:
    189
    обнаружен неизвесный глюк... короче смотрите сами)

    отпишитесь кто знает в чем причина, в компиляторе или в винде.

    этот глюк меня здорово помучал, я искал ошибку в большом коде....а она оказалась в секции данных
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    moderhi
    В руках. Буфер для чтения должен быть выравнен на размер сектора.
     
  3. moderhi

    moderhi New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2011
    Сообщения:
    189
    l_inc
    ровнее некуда
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    moderhi
    Речь о руках или о буфере? А то буфер-то в варианте "не работает" смещён на размеры первых двух переменных, соответственно не выравнен на границу размера сектора.
     
  5. moderhi

    moderhi New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2011
    Сообщения:
    189
    l_inc
    всё ровное) компилятор кривой!
     
  6. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    moderhi
    Код (Text):
    1. .data
    2. buf db 512 dup (0)
    Начало секции данных может быть не выравнено на размер сектора.
    Перед вызовом АПИ сделай вот это:
    Код (Text):
    1. mov eax, ADDR buf
    2. mov edx, 0
    3. mov ecx, 512
    4. div ecx
    После деления остановись в отладчике и посмотри на EDX.
    Если там ненулевое значение -- значит буфер не выравнен.

    Просто используй VirtualAlloc() для получения буфера -- там выравнено как надо.
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    AsmGuru62
    Без специальных извращений не может. Проблема в том, что в нерабочем варианте у ТС секция данных не начинается с buf.
     
  8. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    moderhi
    Вот так вроде работает
    Код (Text):
    1. .data
    2.  
    3. siz dd 0h
    4. physic db "\\.\PHYSICALDRIVE0",0
    5. align 4
    6. buf db 512 dup (0)
    7. hend dd 0h
     
  9. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Код (Text):
    1.             if (fileObject->Flags & FO_NO_INTERMEDIATE_BUFFERING) {
    2.  
    3.                 //
    4.                 // The file was opened without intermediate buffering enabled.
    5.                 // Check that the Buffer is properly aligned, and that the
    6.                 // length is an integral number of 512-byte blocks.
    7.                 //
    8.  
    9.                 if ((deviceObject->SectorSize &&
    10.                     (Length & (deviceObject->SectorSize - 1))) ||
    11.                     (ULONG_PTR) Buffer & deviceObject->AlignmentRequirement) {
    12.  
    13.                     //
    14.                     // Check for sector sizes that are not a power of two.
    15.                     //
    16.  
    17.                     if ((deviceObject->SectorSize &&
    18.                         Length % deviceObject->SectorSize) ||
    19.                         (ULONG_PTR) Buffer & deviceObject->AlignmentRequirement) {
    20.                         ObDereferenceObject( fileObject );
    21.                         return STATUS_INVALID_PARAMETER;
    22.                     }
    23.                 }
    Оминь.
     
  10. moderhi

    moderhi New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2011
    Сообщения:
    189
    всем спасибо!
    но в моем случае ничего не помогло ни VirtualAlloc ни align.
    у меня во всей секции данных несколько буферов по 512б .
    мож кто подскажет какойнибудь простой безотказный способ избегать такие глюки из секции данных?

    и всетаки компилятор в этом плане ипанутый на всю катушку....
     
  11. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    moderhi
    Ну код покажешь, может помогут.
    Может дело не совсем в компиляторе?
    ))
     
  12. moderhi

    moderhi New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2011
    Сообщения:
    189
    Код и так хотел выложить, но когда доведу до рабочего вида.
    Да по сути он уже и готов только непонятки с выравниванием остались .
     
  13. moderhi

    moderhi New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2011
    Сообщения:
    189
    Всё,справился. Данные местами по-переменял и всё получилось
     
  14. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Удивительное рядом)))
    А еще говорят Деда Мороза небывает
    ))
     
  15. moderhi

    moderhi New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2011
    Сообщения:
    189
    http://www.wasm.ru/forum/viewtopic.php?id=43576
    вот кстати код в котором возникал глюк. буферки перетосовал и глюка как небыло. спасибо деду морозу!)
     
  16. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    moderhi
    Спасибо за релиз.
    Очень интересно!, хотя и опасно
    )))
    PS. Если честно, то сам меняю местами эти буферы
    или проставляю "align" где это проходит нормально.
    Был бы благодарен если бы кто объяснил ))