Отследить завершение потока

Тема в разделе "WASM.WIN32", создана пользователем Clerk, 28 ноя 2008.

  1. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flasher
    Нельзя это делоть, можно только суспендить, иначе инхронизация может быть нарушена.
    KeSqueer
    Отправь мне на мэйл, я с форума аттачи не могу скачивать.
     
  2. Osen

    Osen Рие

    Публикаций:
    0
    Регистрация:
    5 апр 2008
    Сообщения:
    283
    Адрес:
    Париж
    Clerk
    1) У всех потоков в процессе переписываем in-thread-seh-обработчик. Для этого делаем инжект (GetThreadContext/SetThreadContext). В инжекте делаем MOV FS:[0], <адрес_структуры_EXCEPTION_REGISTRATION> и переход на старый EIP. Значение <адрес_структуры_EXCEPTION_REGISTRATION> у всех потоков будет разное и обязательно должно находится внутри стека потока, тут надо будет найти дно стека из _NT_TIB.StackBase и записать туда EXCEPTION_REGISTRATION специфичную для этого потока. EXCEPTION_REGISTRATION будет указывать на наш псевдо-глобальный обработчик. Также как-то сохраняем старый обработчик до перезаписи.

    2) Ставим TF

    3) Псевдо-глобальный обработчик будет обрабатывать TF (проверка на PUSH ESP(-1)) и после передавать управление на реальный обработчик.
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Osen
    При чём тут контекст не понятно.. Я уже скозал(пост #16), что ядро процесс прибьёт, как в кернелмоде отследить я знаю, с этим проблем нет.
     
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Clerk
    в форумском мыле нельзя файл прикрепить, поэтому исходник прилагается, или e-mail в личку нужен
    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3. #include <tchar.h>
    4.  
    5. TCHAR szSubKey[] = _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug");
    6.  
    7. void Error(TCHAR *szFuncName, DWORD dwErr)
    8. {
    9.     _tprintf(_T("Function %s failed. Error code: 0x%08lx\n"), szFuncName, dwErr);
    10. }
    11.  
    12. BOOL SetModuleAsDebugger(void)
    13. {
    14.     TCHAR szModuleFileName[0x200] = {0};
    15.     TCHAR szKeyValue[0x200] = {0};
    16.     HKEY hKey;
    17.     LSTATUS status;
    18.  
    19.     status = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
    20.         szSubKey, 0, KEY_SET_VALUE, &hKey);
    21.     if (status != ERROR_SUCCESS)
    22.     {
    23.         Error(_T("RegOpenKeyEx()"), status);
    24.         return FALSE;
    25.     }
    26.  
    27.     GetModuleFileName(NULL,
    28.         szModuleFileName,
    29.         sizeof(szModuleFileName)/sizeof(szModuleFileName[0])-1);
    30.     _stprintf_s(szKeyValue, sizeof(szKeyValue)/sizeof(szKeyValue[0]), _T("%s -p %%ld -e %%ld"), szModuleFileName);
    31.  
    32.     status = RegSetValueEx(hKey, _T("Debugger"), 0, REG_SZ,
    33.         (LPBYTE)szKeyValue, (lstrlen(szKeyValue)+1)*sizeof(szKeyValue[0]));
    34.     if (status != ERROR_SUCCESS)
    35.     {
    36.         Error(_T("RegSetValueEx()"), status);
    37.         return FALSE;
    38.     }
    39.  
    40.     status = RegSetValueEx(hKey, _T("Auto"), 0, REG_SZ,
    41.         (LPBYTE)"1", 2*sizeof(TCHAR));
    42.     if (status != ERROR_SUCCESS)
    43.         Error(_T("RegSetValueEx()"), status);
    44.  
    45.     status = RegCloseKey(hKey);
    46.     if (status != ERROR_SUCCESS)
    47.         Error(_T("RegCloseKey()"), status);
    48.  
    49.     return TRUE;
    50. }
    51.  
    52. int _tmain(int argc, _TCHAR* argv[])
    53. {
    54.  
    55.     if (argc > 1)
    56.     {
    57.         TCHAR buf[0x200] = {0};
    58.         int i;
    59.  
    60.         _tprintf(_T("Debugger \"%s\" called with following arguments:\n"), argv[0]);
    61.         for (i = 1; i < argc; ++i)
    62.         {
    63.             _tcscat_s(buf, sizeof(buf)/sizeof(buf[0]), argv[i]);
    64.             _tcscat_s(buf, sizeof(buf)/sizeof(buf[0]), _T(" "));
    65.         }
    66.         _tprintf(buf);
    67.         getc(stdin);
    68.         return 0;
    69.     }
    70.     else
    71.     {
    72.         if (SetModuleAsDebugger())
    73.         {
    74.             __asm   xor esp, esp;
    75.             __asm   dec esp;
    76.             __asm   push esp;
    77.         }
    78.         else
    79.         {
    80.             _tprintf(_T("Can't set module as a debugger.\n"));
    81.             getc(stdin);
    82.             return 1;
    83.         }
    84.     }
    85.     return 0;
    86. }
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    KeSqueer
    Да ладно, параметры в реестре я никогда писать не буду, для подключения отладчика достаточно сервисов.
    Всем спасибо, тема закрыта.
     
  6. Osen

    Osen Рие

    Публикаций:
    0
    Регистрация:
    5 апр 2008
    Сообщения:
    283
    Адрес:
    Париж
    Clerk
    Я предлагаю не доводить до этого исключения, а трейсить, в обработчике трейсера проверять на PUSH ESP (-1).