__chkstk

Тема в разделе "LANGS.C", создана пользователем Vilco, 25 сен 2007.

  1. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Здравствуйте, господа.
    DDK; линкую драйвер, ругается странными для меня словами:
    fogd.obj() : error LNK2019: unresolved external symbol __chkstk referenced in function HookNtOP@16.
    Никакого вызова __chkstk там нет, не говоря о том что я такую функцию вообще нигде не нашел. В чем может быть проблема? Зачем его туда компилер вставляет?
    Код (Text):
    1. _HookNtOP@16 proc near          ; DATA XREF: DriverEntry(x,x)+62o
    2. .text:00000023
    3. .text:00000023 var_23F4        = dword ptr -23F4h
    4. .text:00000023 var_4           = dword ptr -4
    5. .text:00000023 arg_0           = dword ptr  8
    6. .text:00000023 arg_4           = dword ptr  0Ch
    7. .text:00000023 arg_8           = dword ptr  10h
    8. .text:00000023 arg_C           = dword ptr  14h
    9. .text:00000023
    10. .text:00000023                 push    ebp
    11. .text:00000024                 mov     ebp, esp
    12. .text:00000026                 mov     eax, 23F4h
    13. .text:0000002B                 call    __chkstk
    14. ....................................................................
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    эта функция в VS >=7 выделяет место в стеке (фактически sub esp, X) + какието проверки, я не вникал.
    В опциях отключается, если не отключишь, тогда вот тебе простой стаб для нее:

    extern "C" __declspec(naked) void _chkstk()
    {
    __asm
    {
    // Enter: EAX = size
    xor edx, edx
    xchg [esp], edx ; save return address in edx
    add esp, 4 ; pop return address
    sub esp, eax ; reserve space
    push edx ; push return address
    retn ; return
    }
    }
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Либо не использовать массивы большого размера на стеке.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ну вообще действительно не помешает использовать кучу/пул (в зависимости от окружения, в котором будет выполняться пул)...
     
  5. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    chkstk также иногда почему-то вставляется в функции, в которых используются локальные объекты с переопределённым деструктором. Причём иногда вставляется, а иногда нет.
     
  6. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Спасибо, заглушечку вставлю пожалуй. Только возникает вопрос: почему нету её в стандартных либах?
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Vilco
    в CRT это есть..
     
  8. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Хм, может ddk неправильный, но не могу чёто найти=) как файл называется?
     
  9. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Vilco
    В MS VS 8 он называется 'chkstk.asm'. DDK под рукой нет.
     
  10. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Хм. Нетуть. Ладно, черт с ним. Как избавиться от этой назойливой надписи?
    dr.c(110) : error C4047: '>' : 'ULONG' differs in levels of indirection from 'ULONG *'
    110: if ((ULONG)ClientId > MmUserProbeAddress) return STATUS_INVALID_PARAMETER;
    В смысле как отключить эти глупые варны в для build?
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Vilco
    В VC есть в asm, obj и lib. В DDK только в lib. Искать проще всего полнотекстовым поиском по файлам, а если очень хочется, то можно выдрать obj отдельно с помощью dumpbin, например.

    По теме: сабж есть в 64битных ntoskrnl.lib, в 32битных есть в CRT и некоторых других либах.

    Ничего не глупые. В х64 MmUserProbeAddress объявлена как ULONG_PTR, а ты приводишь ClientId к ULONG. Приводи к ULONG_PTR, а лучше покажи, какой у ClientId тип. Т.к. приведения типов лучше вообще избегать.
     
  12. Myk

    Myk New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2004
    Сообщения:
    35
    Адрес:
    Ukraine
    там error, а не варнинг
     
  13. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Спасибо=)
    Пойду дальше писать. Просто копипаст из какой-то статьи...
     
  14. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Ппц..
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    жесть. чувак, Си выучить не пробовал?
     
  16. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    ^_^ Пробовал, просто, видимо, не совсем получилось. Какой-то глобальный затуп после 4 пар математики..
     
  17. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Хех. И реализован как retn.
     
  18. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Невероятно ценная=)
     
  19. UnW1n

    UnW1n New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2006
    Сообщения:
    13
    в ДДК чекстек обьявлена в ntdll.lib
    Код (Text):
    1. выглядит в нтдлл.длл вот так :
    2. .text:7C901A09                 public _chkstk
    3. .text:7C901A09 _chkstk         proc near      
    4. .text:7C901A09
    5. .text:7C901A09 arg_0           = dword ptr  4
    6. .text:7C901A09
    7. .text:7C901A09                 cmp     eax, 1000h      ; _alloca_probe
    8. .text:7C901A0E                 jnb     short loc_7C901A1E
    9. .text:7C901A10                 neg     eax
    10. .text:7C901A12                 add     eax, esp
    11. .text:7C901A14                 add     eax, 4
    12. .text:7C901A17                 test    [eax], eax
    13. .text:7C901A19                 xchg    eax, esp
    14. .text:7C901A1A                 mov     eax, [eax]
    15. .text:7C901A1C                 push    eax
    16. .text:7C901A1D                 retn
    17. .text:7C901A1E ; ---------------------------------------------------------------------------
    18. .text:7C901A1E
    19. .text:7C901A1E loc_7C901A1E:                           ; CODE XREF: _chkstk+5j
    20. .text:7C901A1E                 push    ecx
    21. .text:7C901A1F                 lea     ecx, [esp+4+arg_0]
    22. .text:7C901A23
    23. .text:7C901A23 loc_7C901A23:                           ; CODE XREF: _chkstk+2Cj
    24. .text:7C901A23                 sub     ecx, 1000h
    25. .text:7C901A29                 sub     eax, 1000h
    26. .text:7C901A2E                 test    [ecx], eax
    27. .text:7C901A30                 cmp     eax, 1000h
    28. .text:7C901A35                 jnb     short loc_7C901A23
    29. .text:7C901A37                 sub     ecx, eax
    30. .text:7C901A39                 mov     eax, esp
    31. .text:7C901A3B                 test    [ecx], eax
    32. .text:7C901A3D                 mov     esp, ecx
    33. .text:7C901A3F                 mov     ecx, [eax]
    34. .text:7C901A41                 mov     eax, [eax+4]
    35. .text:7C901A44                 push    eax
    36. .text:7C901A45                 retn
    37. .text:7C901A45 _chkstk         endp ; sp = -8
    так что можно либо перетащить, либо прилинковать ее :
    TARGETLIBS= ntoskrnl.lib \
    ntdll.lib


    пронал.. нтдлл юзермод.. портируй тогда
     
  20. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    type cast

    а при чем тут ддк и нтдлл? =))) дрова-то я пишу не линкуя с неЙ ) иначе жесть)