Может ли кто нибудь поделится етим файлом? Пробовал тот, которий включён в kmdkit, но вижу следуюший еррор: error LNK2001: unresolved external symbol @RtlUlonglongByteSwap@4 Кстати lib файл использовал то, которий входит в ddk для windows xp, когда использовал lib для win2000, всё компилилось, но DbgPrint неработал.
С этой функцией (и, возможно, с двумя другими RtlXxxByteSwap) в DDK полная лажа. В хидерах (w2k-w2k3) она определена так: Код (Text): ULONGLONG FASTCALL RtlUlonglongByteSwap( IN ULONGLONG Source ); Дизасм ntdll из w2k дает такое: Код (Text): :77FBC187 @RtlUlonglongByteSwap@4 proc near :77FBC187 mov edx, eax :77FBC189 mov eax, ecx :77FBC18B bswap edx :77FBC18D bswap eax :77FBC18F retn :77FBC18F @RtlUlonglongByteSwap@4 endp Т.е. в соответствии с соглашением о передаче параметров, @RtlUlonglongByteSwap@4 - это fastcall, принимающая один (вместо полагающихся двух) даблворд. Если попытаться скомпилить драйвер использую DDK в w2k environment, то он, естественно, тоже не линкуется. error LNK2019: unresolved external symbol @RtlUlonglongByteSwap@8 Дизасм ntdll из xp дает такое: Код (Text): .text:77F82C38 RtlUlonglongByteSwap proc near :77F82C38 :77F82C38 arg_0 = dword ptr 4 :77F82C38 arg_4 = dword ptr 8 :77F82C38 :77F82C38 mov edx, [esp+arg_4] :77F82C3C mov eax, [esp+arg_0] :77F82C40 bswap edx :77F82C42 bswap eax :77F82C44 mov ecx, eax :77F82C46 mov eax, edx :77F82C48 mov edx, ecx :77F82C4A retn :77F82C4A RtlUlonglongByteSwap endp Т.е. в соответствии с соглашением о передаче параметров, RtlUlonglongByteSwap - это уже __cdecl - со стека берется два даблворда и стек чистит вызывающая функция. Но хр'шная либа имеет внутри @RtlUlonglongByteSwap@8, т.е. это fastcall, принимающая два даблворда Если попытаться скомпилить драйвер использую DDK в xp environment, то он линкуется, но RtlUlonglongByteSwap инлайнится. Вобщем вердикт простой: не используйте RtlUlonglongByteSwap вообще. Раз уж на асме пишется, то сразу юзайте bswap.
Нужно просто не испльзовать RtlUlonglongByteSwap в исходнике, а заменить её вызов на ручной обмен байтов. Если не будет вызова этой функции, компилятор не будет пихать её в obj, линкер её не увидит и не будет ругаться, как бы неправильно она ни была определена в inc.