ntdll.inc для WinXP

Тема в разделе "WASM.BEGINNERS", создана пользователем cembo, 19 ноя 2006.

  1. cembo

    cembo New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    17
    Может ли кто нибудь поделится етим файлом? Пробовал тот, которий включён в kmdkit, но вижу следуюший еррор:
    error LNK2001: unresolved external symbol @RtlUlonglongByteSwap@4

    Кстати lib файл использовал то, которий входит в ddk для windows xp, когда использовал lib для win2000, всё компилилось, но DbgPrint неработал.
     
  2. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    С этой функцией (и, возможно, с двумя другими RtlXxxByteSwap) в DDK полная лажа.

    В хидерах (w2k-w2k3) она определена так:
    Код (Text):
    1. ULONGLONG
    2. FASTCALL
    3. RtlUlonglongByteSwap(
    4.     IN ULONGLONG Source
    5.     );
    Дизасм ntdll из w2k дает такое:
    Код (Text):
    1. :77FBC187 @RtlUlonglongByteSwap@4 proc near
    2. :77FBC187                 mov     edx, eax
    3. :77FBC189                 mov     eax, ecx
    4. :77FBC18B                 bswap   edx
    5. :77FBC18D                 bswap   eax
    6. :77FBC18F                 retn
    7. :77FBC18F @RtlUlonglongByteSwap@4 endp
    Т.е. в соответствии с соглашением о передаче параметров, @RtlUlonglongByteSwap@4 - это fastcall, принимающая один (вместо полагающихся двух) даблворд. Если попытаться скомпилить драйвер использую DDK в w2k environment, то он, естественно, тоже не линкуется. error LNK2019: unresolved external symbol @RtlUlonglongByteSwap@8

    Дизасм ntdll из xp дает такое:
    Код (Text):
    1. .text:77F82C38 RtlUlonglongByteSwap proc near
    2. :77F82C38
    3. :77F82C38 arg_0           = dword ptr  4
    4. :77F82C38 arg_4           = dword ptr  8
    5. :77F82C38
    6. :77F82C38                 mov     edx, [esp+arg_4]
    7. :77F82C3C                 mov     eax, [esp+arg_0]
    8. :77F82C40                 bswap   edx
    9. :77F82C42                 bswap   eax
    10. :77F82C44                 mov     ecx, eax
    11. :77F82C46                 mov     eax, edx
    12. :77F82C48                 mov     edx, ecx
    13. :77F82C4A                 retn
    14. :77F82C4A RtlUlonglongByteSwap endp
    Т.е. в соответствии с соглашением о передаче параметров, RtlUlonglongByteSwap - это уже __cdecl - со стека берется два даблворда и стек чистит вызывающая функция. Но хр'шная либа имеет внутри @RtlUlonglongByteSwap@8, т.е. это fastcall, принимающая два даблворда :) Если попытаться скомпилить драйвер использую DDK в xp environment, то он линкуется, но RtlUlonglongByteSwap инлайнится.

    Вобщем вердикт простой: не используйте RtlUlonglongByteSwap вообще. Раз уж на асме пишется, то сразу юзайте bswap.
     
  3. cembo

    cembo New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    17
    ок, большое спасибо за ответ, очень познавательно, но как мне тогда скомпилить ntdll.inc под xp?
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    А зачем его компилить? Это подключаемый файл, компилят обычно *.asm.
     
  5. cembo

    cembo New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    17
    Спасибо за помощь, проблемы больше нет.
     
  6. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Нужно просто не испльзовать RtlUlonglongByteSwap в исходнике, а заменить её вызов на ручной обмен байтов. Если не будет вызова этой функции, компилятор не будет пихать её в obj, линкер её не увидит и не будет ругаться, как бы неправильно она ни была определена в inc.