Вывод отладочных сообщений

Тема в разделе "LANGS.C", создана пользователем Marik, 29 июн 2010.

  1. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Добрый день!
    Подскажите кто какие функции использует для вывода отладочных сообщений.
    Важное условие без привязки к CRT(нужно чтобы работало на абсолютно чистой ОС) и чтобы нормально выводила переменные указанные в качестве аргументов.
    Т.е. по сути чем можно заменить _vsnprintf в примере ниже:

    static VOID TRACE(const char *szFormat,...)
    {
    char szBuff[1024];
    va_list arg;
    va_start(arg, szFormat);
    _vsnprintf(szBuff,sizeof(szBuff), szFormat, arg);
    va_end(arg);
    OutputDebugString(szBuff);
    }

    Спасибо
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    va_list, va_start и va_end определяется дефайнами... достаточно просто подключить хедер... _vsnprintf экспортируется из user32.dll (wvsprintfA), безопасность по длине буфера уже в CRT реализуется... OutputDebugString - экспортируется из kernel32.dll (OutputDebugStringA)...
     
  3. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    ещё вроде ntdll.dll экспортирует какие-то функции из этой тематики... посмотри таблицу экспорта...
     
  4. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    DbgPrintEx. Находится в ntdll.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    lhc645
    не эквивалентно OutputDebugStringA. Используются разные механизмы.
     
  6. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    Great

    Ну да, OutputDebugString сводится к RaiseException(DBG_PRINTEXCEPTION_C), а DbgPrintEx к int 2d. Собственно, всегда использую второе (xp-7) и проблем не было.
     
  7. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Rel
    Спасибо, нужна была именно функция типа wvsprintfA.
     
  8. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    Marik

    кстати в ntdll тоже есть функция _vsnprintf )
     
  9. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    И да. я торможу насчет Peb (. На самом деле int 2D/RaiseException в DbgPrintEx определяется значением KUSER_SHARED_DATA.KdDebuggerEnabled. Сейчас посмотрено. Удалите №8 что ли.

    UPD:
    Проверяются 2 флага. Если BeingDebugged, то сразу на raiseexception. Если же BeingDebugged = 0, то проверяется KUSER-SHARED_DATA.KdDebuggerEnabled. Если оно равно 3, то int 2d. Дизасм листинги нельзя смотреть бегло лол.
     
  10. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    ULONG (__cdecl *DbgPrint_)(LPCSTR, ...) = (ULONG (__cdecl*)(LPCSTR, ...))
    GetProcAddress(GetModuleHandleW(L"ntdll.dll"),"DbgPrint");
    int main()
    {
    DbgPrint_("fuck %s", "you");
    }
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Суровый код ппц:
    Этоже насколько тупым нужно быть чтоб такое вызывать. Накол.
    lhc645
    Разница то в режиме. Для пользовательского отладчика генерится сепшен посредством NtRaiseException, для ядерного посредством Int 0x2D.
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    karabas_barabas
    #pragma comment (lib, "ntdll.lib")

    extern "C" VOID _cdecl DbgPrint (PCH, ...);

    ...
    DbgPrint ("lala");
     
  13. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    ТС поставил конкретный вопрос - я ему дал корректный, работающий код... без лишних "вы*бонов",заморочек и т.д. GetProcAddress(GetModuleHandleW(L"ntdll.dll"),"DbgPrint") - выполняется только один раз при инициализации, а не каждый...дальше происходит обращение по указателю...
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Нуко нуко.. поиск не работает чтоле ?
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    а статический импорт больше не в моде=)
     
  16. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    Clerk

    understand.
    Кстати может быть кто-то подскажет почему значение 3?

    listing x64 w7

    Код (Text):
    1. .text:0000000078EED85D                 mov     rax, gs:30h
    2. .text:0000000078EED866                 mov     rdx, [rax+60h]
    3. .text:0000000078EED86A                 cmp     PEB.FastPebLock, 0
    4. .text:0000000078EED86F                 jz      int_2d_call
    5. .text:0000000078EED875                 mov     rax, gs:30h
    6. .text:0000000078EED87E                 mov     rdx, [rax+60h]
    7. .text:0000000078EED882                 cmp     PEB.BeingDebugged, 0
    8. .text:0000000078EED886                 jnz     short raise_expt
    9. .text:0000000078EED888                 mov     al, ds:7FFE02D4h ; KUSER_SHARED_DATA.KdDebuggerEnabled
    10. .text:0000000078EED88F                 and     al, 3
    11. .text:0000000078EED891                 cmp     al, 3
    12. .text:0000000078EED893                 jz      short int_2d_call
    13. .text:0000000078EED895
    14. .text:0000000078EED895 raise_expt:                             ; CODE XREF: vDbgPrintExWithPrefixInternal+535E6j
    15. .text:0000000078EED895                 mov     [rsp+338h+var_2E8], 40010006h
    Бегло были просмотрены сорцы w2k и из kdinit.c!KdInitSystem

    Код (Text):
    1. KdDebuggerEnabled = TRUE;
    2. SharedUserData->KdDebuggerEnabled = TRUE;
    Стало быть должно быть true/false. Почему тогда проверка на 3 в ntdll ?