глубина стека для вин апи

Тема в разделе "WASM.WIN32", создана пользователем doctor_Ice, 21 янв 2006.

  1. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    задача такова нужно при вызове апи сохранить все регистры неизменными задача усложнена тем что в стеке мы уже имеем необходимые параметры для какой либо апи функции (неизвестной)



    я решил это так



    @API_STACK_SAFE_DEPTH = 4096



    ; regs save

    push eax



    mov eax, esp

    add eax, 200h

    and eax, -200h



    pop d_w_p [ss:eax-@API_STACK_SAFE_DEPTH] ; eax

    mov d_w_p [ss:eax-@API_STACK_SAFE_DEPTH-04h], ebx

    mov d_w_p [ss:eax-@API_STACK_SAFE_DEPTH-08h], ecx

    mov d_w_p [ss:eax-@API_STACK_SAFE_DEPTH-0ch], edx

    mov d_w_p [ss:eax-@API_STACK_SAFE_DEPTH-10h], ebp

    mov d_w_p [ss:eax-@API_STACK_SAFE_DEPTH-14h], edi

    mov d_w_p [ss:eax-@API_STACK_SAFE_DEPTH-18h], esi





    call API



    ; regs resore



    mov eax, esp

    add eax, 200h

    and eax, -200h



    mov ebx, d_w_p [ss:eax-@API_STACK_SAFE_DEPTH-04h]

    mov ecx, d_w_p [ss:eax-@API_STACK_SAFE_DEPTH-08h]

    mov edx, d_w_p [ss:eax-@API_STACK_SAFE_DEPTH-0ch]

    mov ebp, d_w_p [ss:eax-@API_STACK_SAFE_DEPTH-10h]

    mov edi, d_w_p [ss:eax-@API_STACK_SAFE_DEPTH-14h]

    mov esi, d_w_p [ss:eax-@API_STACK_SAFE_DEPTH-18h]

    mov eax, d_w_p [ss:eax-@API_STACK_SAFE_DEPTH]





    я таким образом повызывал всякие апи все вроде работает нормально но всетаки малость неуверенно себя чувствую... хотелось бы знать какова вероятность того что апи заюзает стек на 4к. Может майкрсофт указала минимальный безопасный размер стека для своих апи? кто что знает подскажите пожалуйста.
     
  2. netw0rm

    netw0rm New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2005
    Сообщения:
    78
    ebp, ebx, esi и edi сохраняют сами вин апи.

    А что тебе мешает использовать GlobalAlloc?
     
  3. krokus

    krokus New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2005
    Сообщения:
    11
    Адрес:
    Ukraine
    doctor_Ice



    не факт что 4К спасут, если АПИ с CallBack использование стека может быть любое.

    ИМХО оптимальный вариант создание своего стека или сдвинуть часть стека (например 1К) вверх, а в образовавшееся окно сохранить регистры, после вызова АПИ все вернуть как было(возможно надо будет ещё перестраивать цепочку SEH до и после).
     
  4. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    у Рихтера написано же как стек устроен
     
  5. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    мне вообщем нужен самый быстрай способ поэтому аалоки не катят. вот свой стек уже чтото... и так для каждого треда блин :dntknw: мона пихать реги в сторожевую страницу :) и при возникновении исключения переносить их в следующую... тока как это организовать я пока не знаю...

    можно еще с самого начала резервировать место на топе стека ))) вот это имхо лучший вариант будет...



    да по поводу ebp ebx esi edi их испльзует мой алгоритм до и после вызова апи.