Здравствуйте, господа. DDK; линкую драйвер, ругается странными для меня словами: fogd.obj() : error LNK2019: unresolved external symbol __chkstk referenced in function HookNtOP@16. Никакого вызова __chkstk там нет, не говоря о том что я такую функцию вообще нигде не нашел. В чем может быть проблема? Зачем его туда компилер вставляет? Код (Text): _HookNtOP@16 proc near ; DATA XREF: DriverEntry(x,x)+62o .text:00000023 .text:00000023 var_23F4 = dword ptr -23F4h .text:00000023 var_4 = dword ptr -4 .text:00000023 arg_0 = dword ptr 8 .text:00000023 arg_4 = dword ptr 0Ch .text:00000023 arg_8 = dword ptr 10h .text:00000023 arg_C = dword ptr 14h .text:00000023 .text:00000023 push ebp .text:00000024 mov ebp, esp .text:00000026 mov eax, 23F4h .text:0000002B call __chkstk ....................................................................
эта функция в 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 } }
Ну вообще действительно не помешает использовать кучу/пул (в зависимости от окружения, в котором будет выполняться пул)...
chkstk также иногда почему-то вставляется в функции, в которых используются локальные объекты с переопределённым деструктором. Причём иногда вставляется, а иногда нет.
Хм. Нетуть. Ладно, черт с ним. Как избавиться от этой назойливой надписи? dr.c(110) : error C4047: '>' : 'ULONG' differs in levels of indirection from 'ULONG *' 110: if ((ULONG)ClientId > MmUserProbeAddress) return STATUS_INVALID_PARAMETER; В смысле как отключить эти глупые варны в для build?
Vilco В VC есть в asm, obj и lib. В DDK только в lib. Искать проще всего полнотекстовым поиском по файлам, а если очень хочется, то можно выдрать obj отдельно с помощью dumpbin, например. По теме: сабж есть в 64битных ntoskrnl.lib, в 32битных есть в CRT и некоторых других либах. Ничего не глупые. В х64 MmUserProbeAddress объявлена как ULONG_PTR, а ты приводишь ClientId к ULONG. Приводи к ULONG_PTR, а лучше покажи, какой у ClientId тип. Т.к. приведения типов лучше вообще избегать.
^_^ Пробовал, просто, видимо, не совсем получилось. Какой-то глобальный затуп после 4 пар математики..
в ДДК чекстек обьявлена в ntdll.lib Код (Text): выглядит в нтдлл.длл вот так : .text:7C901A09 public _chkstk .text:7C901A09 _chkstk proc near .text:7C901A09 .text:7C901A09 arg_0 = dword ptr 4 .text:7C901A09 .text:7C901A09 cmp eax, 1000h ; _alloca_probe .text:7C901A0E jnb short loc_7C901A1E .text:7C901A10 neg eax .text:7C901A12 add eax, esp .text:7C901A14 add eax, 4 .text:7C901A17 test [eax], eax .text:7C901A19 xchg eax, esp .text:7C901A1A mov eax, [eax] .text:7C901A1C push eax .text:7C901A1D retn .text:7C901A1E ; --------------------------------------------------------------------------- .text:7C901A1E .text:7C901A1E loc_7C901A1E: ; CODE XREF: _chkstk+5j .text:7C901A1E push ecx .text:7C901A1F lea ecx, [esp+4+arg_0] .text:7C901A23 .text:7C901A23 loc_7C901A23: ; CODE XREF: _chkstk+2Cj .text:7C901A23 sub ecx, 1000h .text:7C901A29 sub eax, 1000h .text:7C901A2E test [ecx], eax .text:7C901A30 cmp eax, 1000h .text:7C901A35 jnb short loc_7C901A23 .text:7C901A37 sub ecx, eax .text:7C901A39 mov eax, esp .text:7C901A3B test [ecx], eax .text:7C901A3D mov esp, ecx .text:7C901A3F mov ecx, [eax] .text:7C901A41 mov eax, [eax+4] .text:7C901A44 push eax .text:7C901A45 retn .text:7C901A45 _chkstk endp ; sp = -8 так что можно либо перетащить, либо прилинковать ее : TARGETLIBS= ntoskrnl.lib \ ntdll.lib пронал.. нтдлл юзермод.. портируй тогда