Механизм получения данных от OutputDebugString

Тема в разделе "WASM.BEGINNERS", создана пользователем vino, 18 янв 2007.

  1. vino

    vino New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2007
    Сообщения:
    19
    Поясните, пожалуйста, как сделать.
    Никогда не сталкивался с необходимостью построить свой DebugViewer, а счас нужно устроить параллельное слежение за процессом с реакцией на выдаваемые им OutputDebugString.
     
  2. Hellspawn

    Hellspawn New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2006
    Сообщения:
    310
    Адрес:
    Москва
    запусти процесс под отладкой и обрабатывай событие OUTPUT_DEBUG_STRING_EVENT
     
  3. vino

    vino New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2007
    Сообщения:
    19
    А подробнее? как удаленно (на др.машине) запустить отладку, когда сам процесс уже запущен (мне обязательно нужен хэндл процесса и перезапустить его под отладкой)?
     
  4. vino

    vino New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2007
    Сообщения:
    19
    Если точнее, то нужно только подключиться к машине, на которой запущен некий сервис, и смотреть данные, отправляемые им через OutputDebugString.
     
  5. Hellspawn

    Hellspawn New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2006
    Сообщения:
    310
    Адрес:
    Москва
    хех, ну не обязательно перезапускать, можно приаттачиться =)
     
  6. green_newbie

    green_newbie New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2006
    Сообщения:
    51
    Чобы получать данные, отправленные через OutputDebugString/KdPrint нужно читать их из ммф, используя несколько обьектов синхронизации. Имена ммф и обьектов синхронизации можно посмотреть через ProcessExplorer в процессе DbgView.
    Примерная схема такая:
    OpenMMF
    WaitForEvent
    WaitForMutex
    GetDataformMMF
    ReleaseMutex
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    vino
    По реализации DbgView есть поиск по форуму. Конкретно по твоему вопросу - без сервиса на удалённой машине никак - будь-то твой или MDM/msvcmon.
     
  8. vino

    vino New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2007
    Сообщения:
    19
    А как же тогда работает c удаленными компами DbgView? Он же использует ядро Windowого дебагера.
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Так он MDM, вроде, и использует.
    А нет, он ставит свой сервис.
     
  10. vino

    vino New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2007
    Сообщения:
    19
    А каким образом ставится сервис на удаленную машину?
    Темен я - просветите, пжлста!
     
  11. vino

    vino New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2007
    Сообщения:
    19
    Думал я, что он регистрируется в виндовом ядре...
     
  12. vino

    vino New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2007
    Сообщения:
    19
    У меня локальная проблема - после DebugActiveProcess я не могу закрыть дебагер, оставив работающей прогу (мне так надо:)
    что-то типа "поматросил - бросил" :))
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Чёрт, да прочитай его справку :)
     
  14. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    vino
    To stop debugging the process, you must exit the process or call the DebugActiveProcessStop function. Exiting the debugger also exits the process unless you use the DebugSetProcessKillOnExit function.

    Начиная с Windows XP
     
  15. vino

    vino New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2007
    Сообщения:
    19
    То, что доктор прописАл :)
    И все-таки - нет ли менее "тяжелого" способа читать строки от OutputDebugString?
     
  16. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    кстати, как это делает DbgView?
     
  17. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    хех.. ну что можно сказать
    use поиск

    Код (Text):
    1. #include "stdafx.h"
    2. #include "1.h"
    3.  
    4. LPCTSTR lpDBWinMutexName= _T("DBWinMutex");
    5. LPCTSTR lpDBWinBufferReadyName= _T("DBWIN_BUFFER_READY");
    6. LPCTSTR lpDBWinDataReadyName= _T("DBWIN_DATA_READY");
    7. LPCTSTR lpDBWinBufferName= _T("DBWIN_BUFFER");
    8.  
    9. #define DBWIN_BUFFER_SIZE 0x1000
    10.  
    11. #pragma pack(push)
    12. #pragma pack(4)
    13. typedef struct __DBWIN_BUFFER
    14. {
    15.     DWORD dwProcessId;
    16.     char chData[DBWIN_BUFFER_SIZE-sizeof(DWORD)];
    17. } DBWIN_BUFFER, *LPDBWIN_BUFFER;
    18. #pragma pack(pop)
    19.  
    20. int main()
    21. {
    22.     HANDLE hDBWinMutex= NULL;
    23.     HANDLE hDBWinBufferReady= NULL;
    24.     HANDLE hDBWinDataReady= NULL;
    25.     HANDLE hDBWinBuffer= NULL;
    26.    
    27.     LPVOID lpMappingAddress;
    28.     DBWIN_BUFFER stDBWinBuffer;
    29.     DWORD dwWaitResult;
    30.  
    31.     SECURITY_DESCRIPTOR stSecurityDescriptor;
    32.     SECURITY_ATTRIBUTES stSecurityAttributes;
    33.     LPSECURITY_ATTRIBUTES lpSecurityAttributes;
    34.  
    35.     if(!InitializeSecurityDescriptor(&stSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION))
    36.     {
    37.         printf("%s: %08X\n", "Cannot initialize security dscriptor, error code", GetLastError());
    38.         return 0;
    39.     }
    40.  
    41.     if(!SetSecurityDescriptorDacl(&stSecurityDescriptor, TRUE, NULL, FALSE))
    42.     {
    43.         printf("%s: %08X\n", "Cannot set security dscriptor DACL, error code", GetLastError());
    44.         return 0;
    45.     }
    46.  
    47.     stSecurityAttributes.nLength= sizeof(stSecurityAttributes);
    48.     stSecurityAttributes.bInheritHandle= FALSE;
    49.     stSecurityAttributes.lpSecurityDescriptor= &stSecurityDescriptor;
    50.  
    51.     lpSecurityAttributes= &stSecurityAttributes;
    52.  
    53.     hDBWinMutex= CreateMutex(lpSecurityAttributes, FALSE, lpDBWinMutexName);
    54.     if(!hDBWinMutex)
    55.     {
    56.         printf("%s: %08X\n", "Cannot open mutex, error code", GetLastError());
    57.         return 0;
    58.     }
    59.  
    60.     hDBWinBufferReady= CreateEvent(lpSecurityAttributes, FALSE, FALSE, lpDBWinBufferReadyName);
    61.     if(!hDBWinBufferReady)
    62.     {
    63.         printf("%s: %08X\n", "Cannot open buffer ready event, error code", GetLastError());
    64.         return 0;
    65.     }
    66.  
    67.     hDBWinDataReady= CreateEvent(lpSecurityAttributes, FALSE, FALSE, lpDBWinDataReadyName);
    68.     if(!hDBWinDataReady)
    69.     {
    70.         printf("%s: %08X\n", "Cannot open data ready event, error code", GetLastError());
    71.         return 0;
    72.     }
    73.  
    74.     hDBWinBuffer= CreateFileMapping(INVALID_HANDLE_VALUE, lpSecurityAttributes, PAGE_READWRITE, 0, DBWIN_BUFFER_SIZE, lpDBWinBufferName);
    75.     if(!hDBWinBuffer)
    76.     {
    77.         printf("%s: %08X\n", "Cannot open shared memory section, error code", GetLastError());
    78.         return 0;
    79.     }
    80.  
    81.     lpMappingAddress= MapViewOfFile(hDBWinBuffer, FILE_MAP_READ, 0, 0, DBWIN_BUFFER_SIZE);
    82.     if(!lpMappingAddress)
    83.     {
    84.         printf("%s: %08X\n", "Cannot map shared section into memory, error code", GetLastError());
    85.         return 0;
    86.     }
    87.  
    88.     WaitForSingleObject(hDBWinMutex, 0);
    89.     SetEvent(hDBWinBufferReady);
    90.     for(;;)
    91.     {
    92.         dwWaitResult= WaitForSingleObject(hDBWinDataReady, INFINITE);
    93.         ResetEvent(hDBWinBufferReady);
    94.         if(dwWaitResult==WAIT_OBJECT_0)
    95.         {
    96.             CopyMemory(&stDBWinBuffer, lpMappingAddress, DBWIN_BUFFER_SIZE);
    97.         }
    98.         SetEvent(hDBWinBufferReady);
    99.         if(dwWaitResult==WAIT_OBJECT_0)
    100.         {
    101.             stDBWinBuffer.chData[sizeof(stDBWinBuffer.chData)-1]= '\0';
    102.             printf("%08X - %s\n", stDBWinBuffer.dwProcessId, stDBWinBuffer.chData);
    103.         }
    104.     }
    105.  
    106.     return 0;
    107. }
    насчет работоспособности под 9x не уверен

    и еще.. сложно сказать, какую функцию тут выполняет hDBWinMutex, но похоже, его лучше убрать
     
  18. vino

    vino New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2007
    Сообщения:
    19
    Спасиб!
     
  19. vino

    vino New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2007
    Сообщения:
    19
    А-а-а! 8-0
    В общем - непосредственно в системе используем алгоритм работы OutputDebugString!
    hDBWinMutex убирать нельзя, иначе функция OutputDebugString ничего не кладет в DBWIN_BUFFER.
     
  20. vino

    vino New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2007
    Сообщения:
    19
    Ок! Всем спасиб!
    Все есть на http://www.unixwiz.net/techtips/outputdebugstring.html