1. Си / Говнокод #2502

    +136.7

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    BOOLEAN
    KiCheckForAtlThunk (
        IN PEXCEPTION_RECORD ExceptionRecord,
        IN PCONTEXT Context
        )
    
    /*++
    
    Routine Description:
    
        This routine will determine whether an access violation was raised due to
        an attempt to execute an ATL thunk in a no-execute, non-stack area.
    
        If so, the thunk will be emulated and execution resumed.
    
    Arguments:
    
        ExceptionRecord - Supplies a pointer to an exception record.
    
        Context - Supplies a pointer to a context frame.
    
    Return Value:
    
        TRUE - Context was updated to reflect the emulated ATL thunk, resume
               execution.
    
        FALSE - Not an ATL thunk, continue raising the exception.
    
    --*/
    
    //.........
    //KiDispatchException:
    //......
     switch (ExceptionRecord->ExceptionCode) {
            case STATUS_BREAKPOINT:
                ContextFrame.Eip--;
                break;
    
            case KI_EXCEPTION_ACCESS_VIOLATION:
                ExceptionRecord->ExceptionCode = STATUS_ACCESS_VIOLATION;
                if (PreviousMode == UserMode) {
                    if (KiCheckForAtlThunk(ExceptionRecord,&ContextFrame) != FALSE) {
                        goto Handled1;
                    }
    
    //................

    Объявление KiCheckForAtlThunk (втыкать в комменты и название =)) ) Для тех кто в танке: исходники Windows, оконные классы ATL выделяют тупо в хипе кусок-переходник, который заменяет HWND, идущий первым параметром в оконную процедуру, на естественный, объектно-ориентированный this. Так вот, если у нас установлено где-то в реестре юзать защиту от выполнения данных, то, естественно, в хипе хер чего выполнишь, и возникнет #GP, и тут-то нам и придет на помощь KiCheckForAtlThunk =) Короче, ИМХО, вносить изменения в ядро, для того, чтобы нормально работала криво написанная юзермодная библиотека -- та еще жесть =) Все кто минусует -- не шарят :P

    Запостил: ISith, 30 Января 2010

    Комментарии (3) RSS

    • Это Windows, детка.
      Ответить
      • Да, это Windows, а следовательно борьба за обратную совместимость!
        Есть другие идеи как это починить, без перекомпиляции существующих программ?
        Ответить
        • Да ладно, скоро весь виндоуз превратится в сплошные ифы, помните, кстати, кто-нибудь фишку в загрузчике с секциями aspack, starforce без erw аттрибута? =)) та же фигня идеологически, что и здесь, только там таки юзермод, а тут -- ядро. В висте майкрософт сделал целую кучу всего, что нахер убило обратную совместимость, а это говнище осталось. Да и ладно, когда писали атл сначала, никто не думал про запрет выполнения данных в хипе, но, бля, потом можно было пофиксить, нормально выделять чанк в памяти, куда можно писать и выполнять, да нужно было бы добавить специальную кучу для этих целей, т.к. менять защиту можно только целиком у страницы, но глядишь через 10 - 15 лет и не нужно было бы этого костыля в ядре(!). Так что архитектурное решение -- однозначно говнокод =)
          Ответить

    Добавить комментарий