2009ǯ06��24��

Windows�ץ������ΰ۾ェλ��ȥ�åפ��륳����

¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÅÐÏ¿

�� �Ϥ����

����������Ǥ����������꤬����ޤ�����
��Windows ��Υץ������ A ���饽���������ɤΤʤ��ץ������ B ��ư����ɬ�פ����������ɡ��ץ������ B �ϤȤ��ɤ��۾ェλ������ä��ꤹ�롣�����Ѥ���������뤳�ȼ��Τ��ܤ�Ĥ֤�Ȥ��ơ��ץ������ B ���۾ェλ�������ˤϥץ������ A ¦�Ǥ������˥ϥ�ɥ뤷�������ɤ���ˡ�Ϥʤ���Τ���

�����ä˶�̣�򴶤����۾ェλ�򵯤���û���ץ��������äƥǥХå��ǥȥ졼�����ʤ���ҥ�Ȥ�õ���Ƥ�����ˤդȻפ��ޤ�����


���Υץ���������Ǽ¹Ԥ���ȡ��ץ��������ǽ�������ʤ��㳰�ϿޤΤ褦�ʷ��ǥ����ƥ�ˤ�äƽ�������ޤ������������ǥХå���ǥǥХå��ʥǥХå��оݡˤȤ��Ƽ¹Ԥ��Ƥ�����ϥǥХå����㳰��ȯ�����Τ������桼���������ޤ����Ĥޤꡢ�ǥХå������沼�ˤ���ޤ���

�Ȥ������Ȥϡ֥ǥХå��Ȥ���ư��륳���ɡפ��Ѱդ��ץ������ B ��ǥХå��Ȥ��ư����С�������ȯ������̤�������㳰����ª���뤳�Ȥ��Ǥ��뤫�⤷��ޤ��� ����ä����򤽤��ʤΤǻ�ˤ��������ץ�������񤤤Ƥߤ뤳�Ȥˤ��ޤ�����

�� �ɤ�������Τ��롩

��ꤿ���ץ������Υ��᡼���Ϥ���������ΤǤ���
  1. ���ꤵ�줿�ץ�������ҥץ������Ȥ��Ƽ¹Ԥ���
  2. �ҥץ��������̤�������㳰��ȯ�����������ν�λ�����ɤ��֤�
  3. �ҥץ�����������˽�λ�������ˤϤ��ν�λ�����ɤ��֤�
�Ĥޤ���Υ�åѥץ������Ǥ��͡�

�� �ɤ���äƺ�롩

�ǥХå���Ȥä����ȤΤʤ��ץ�����ޤϾ��ʤ��Ȼפ��ޤ������ǥХå����ä����ȤΤ���ץ�����ޤ�ޤ����ޤ�¿���Ϥʤ��Ǥ��礦��ɮ�Ԥˤ⤽�ηи��Ϥʤ����ʤ���������̤������פȤ������᡼��������ޤ�����äȤ⺣�����ɸ�ϥץ�������ǥХå����뤿��ΥǥХå����뤳�ȤǤϤʤ������ޤǤ�ǥХå��ε�ǽ�ΰ��������Ѥ��뤳�ȤǤ����餢�ޤ굤�ˤ����¸���ˡ��Ĵ�٤뤳�Ȥˤ��ޤ���

��˽񤤤��̤ꤳ�Υץ������ϻҥץ�������ư�����ΤǤ��� ���ϤȤ⤢�� CreateProcess API �������򤢤餿����ɤ�Ǥߤޤ���
MSDN �饤�֥�� - CreateProcess �ؿ�
6 ���ܤΥѥ�᡼���� dwCreationFlags �������˼��ε��Ҥ�����ޤ���
DEBUG_PROCESS
���Υե饰����ꤹ��ȡ��ƤӽФ�¦�ץ�������ǥХå��� �������ץ�������ǥХå��оݤȤ��ư����ޤ��������ƥ�ϡ��ǥХå��оݤ� �ץ��������ȯ�����뤹�٤ƤΥǥХå����٥�Ȥ�ƤӽФ�¦����åɤ����Τ��ޤ���
���줳�줳�졪�Ȥ��������ǡ��֥ǥХå����٥�ȡפȤ����������륭����ɤ�ФƤ��ޤ����� �����ˤϤ���ʾ�������ϸ�������ޤ��󡣡�DEBUG_PROCESS�פ�Ĵ�٤Ƥߤޤ���

MSDN �饤�֥�� - Process Creation Flags (Windows)
DEBUG_PROCESS��0x00000001
The calling thread starts and debugs the new process and all child processes created by the new process. It can receive all related debug events using the WaitForDebugEvent function.
�ǥХå����٥�ȤȤ�����Τ� WaitForDebugEvent �ؿ��Ǽ�����뤳�Ȥ��Ǥ���Ȥ������ȤǤ��͡�

MSDN �饤�֥�� - WaitForDebugEvent �ؿ�
�ǥХå���Υץ������ǥǥХå����٥�Ȥ�ȯ������Τ��Ե����ޤ���

BOOL WaitForDebugEvent(
  LPDEBUG_EVENT lpDebugEvent,
  DWORD dwMilliseconds
);

�ѥ�᡼��
lpDebugEvent
�Ե�����ǥХå����٥�Ȥξ������ä� ��¤�ΤؤΥݥ��󥿤���ꤷ�ޤ���
dwMilliseconds
�ǥХå����٥�Ȥ��Ե�������֤�ߥ���ñ�̤ǻ��ꤷ�ޤ���
DEBUG_EVENT ��¤�Τ�Ĵ�٤Ƥߤޤ���

MSDN �饤�֥�� - DEBUG_EVENT Structure (Windows)
typedef struct _DEBUG_EVENT {
  DWORD dwDebugEventCode;
  DWORD dwProcessId;
  DWORD dwThreadId;
  union {
    EXCEPTION_DEBUG_INFO Exception;
    CREATE_THREAD_DEBUG_INFO CreateThread;
    CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
    EXIT_THREAD_DEBUG_INFO ExitThread;
    EXIT_PROCESS_DEBUG_INFO ExitProcess;
    LOAD_DLL_DEBUG_INFO LoadDll;
    UNLOAD_DLL_DEBUG_INFO UnloadDll;
    OUTPUT_DEBUG_STRING_INFO DebugString;
    RIP_INFO RipInfo;
  } u;
}DEBUG_EVENT, *LPDEBUG_EVENT;


dwDebugEventCode
The code that identifies the type of debugging event. This member can be one of the following values.

  • CREATE_PROCESS_DEBUG_EVENT
  • CREATE_THREAD_DEBUG_EVENT
  • EXCEPTION_DEBUG_EVENT
    Reports an exception debugging event. The value of u.Exception specifies an EXCEPTION_DEBUG_INFO structure.
  • EXIT_PROCESS_DEBUG_EVENT
  • EXIT_THREAD_DEBUG_EVENT
  • LOAD_DLL_DEBUG_EVENT
  • OUTPUT_DEBUG_STRING_EVENT
  • RIP_EVENT
  • UNLOAD_DLL_DEBUG_EVENT

Remarks
If the WaitForDebugEvent function succeeds, it fills in the members of a DEBUG_EVENT structure.

�ݥ���Ȥϡ�WaitForDebugEvent �ؿ�����������Ȱ������Ϥ��줿 DEBUG_EVENT ��¤�Τγƥ��Ф����åȤ���뤳�ȡ��㳰��ȯ���������� dwDebugEventCode �� EXCEPTION_DEBUG_EVENT �� ���åȤ���뤳�ȡ�EXCEPTION_DEBUG_EVENT �λ��� u.Exception ���Ф� EXCEPTION_DEBUG_INFO ��¤�Τ򻲾Ȥ��衢�Ȥ������ȤΤ褦�Ǥ���

��������Τλ��Ȥߤ��狼��ޤ��������Ȥ���������Ĵ�٤ʤ��饳���ɤ�񤯤��Ȥˤ��ޤ���

�� ���������� (trapfault.c)

�Ӻ��ʤ��餶�ä��ꥳ���ɤ�񤤤Ƥߤޤ�����
trapfault.exe �Ϥ���������ΤǤ���
���� 1���ҥץ�������̤�������㳰��ȯ�������ݤ˸ƤӸ����֤���λ������
���� 2���ҥץ������Ȥ��Ƶ�ư����¹ԥե�����̾ # �ե�͡���ǻ���
���� 3�����ҥץ������ε�ư�����Ϥ��ѥ�᡼�� # ��ά��

��λ�����ɡ��ҥץ����������ェλ����Ф��ν�λ�����ɤ��֤�
�۾ェλ������������ǻ��ꤵ�줿�����ɤ��֤�
#include <windows.h>
#include <stdio.h>

DWORD doit(int ac, char *av[])
{
  BOOL bSts;
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  DWORD dwExitCode;
  DEBUG_EVENT debug;
  DWORD dwContinueStatus;
  DWORD dwDebugEventCode, dwDebugEventCodePrev = 0;
  DWORD dwExceptionCode, dwExceptionCodePrev = 0;
  DWORD dwExceptionFlags, dwExceptionFlagsPrev = 0;
  ULONG_PTR dwExceptionInformation0, dwExceptionInformation0Prev = 0;
  ULONG_PTR dwExceptionInformation1, dwExceptionInformation1Prev = 0;
  char *pszExe = av[2];
  char szParam[1024] = "\0";

  if (ac > 3) { // �ҥץ��������Ϥ�����
    int i;
    for (i = 3; i < ac; i++) {
      strcat(szParam, " ");
      strcat(szParam, av[i]);
    }
  }
  memset(&pi, 0, sizeof(pi));  
  memset(&si, 0, sizeof(si));  
  si.cb = sizeof(si);

  // ���ꤵ�줿�ץ������Υץ�������ư
  bSts = CreateProcess(pszExe, szParam, NULL, NULL, FALSE,
      DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS |
      CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS,
      NULL, NULL, &si, &pi);

  if (!bSts) {
    // CreateProcess ����
  }

  // �ǥХå����٥�ȥ롼��
  while (WaitForDebugEvent(&debug, INFINITE)) {
    dwDebugEventCode = debug.dwDebugEventCode;
    dwContinueStatus = DBG_CONTINUE;

    // �㳰ȯ��
    if (dwDebugEventCode == EXCEPTION_DEBUG_EVENT) {
      dwExceptionCode =
        debug.u.Exception.ExceptionRecord.ExceptionCode;
      dwExceptionFlags =
        debug.u.Exception.ExceptionRecord.ExceptionFlags;
      dwExceptionInformation0 =
        debug.u.Exception.ExceptionRecord.ExceptionInformation[0];
      dwExceptionInformation1 =
        debug.u.Exception.ExceptionRecord.ExceptionInformation[1];

      // ���󥰥륹�ƥå��㳰, �֥졼���ݥ�����㳰��̵��
      if (dwExceptionCode != EXCEPTION_SINGLE_STEP &&
          dwExceptionCode != EXCEPTION_BREAKPOINT) {

        // ľ����Ʊ����㳰�ʤ�æ��
        if (dwDebugEventCodePrev == EXCEPTION_DEBUG_EVENT &&
          dwExceptionCodePrev == dwExceptionCode &&
          dwExceptionFlagsPrev == dwExceptionFlags &&
          dwExceptionInformation0Prev == dwExceptionInformation0 &&
          dwExceptionInformation1Prev == dwExceptionInformation1) {
          dwExitCode = (DWORD)atol(av[1]);
          break;
        }
        dwDebugEventCodePrev = EXCEPTION_DEBUG_EVENT;
        dwExceptionCodePrev = dwExceptionCode;
        dwExceptionFlagsPrev = dwExceptionFlags;
        dwExceptionInformation0Prev = dwExceptionInformation0;
        dwExceptionInformation1Prev = dwExceptionInformation1;
        // �ץ������¦���㳰�����ˤޤ����Ƥߤ�
        dwContinueStatus = DBG_EXCEPTION_NOT_HANDLED;
      }
    }
    // �ץ�������λ
    else if (dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT) {
      if (debug.dwProcessId == pi.dwProcessId) {
        // �ǥХå��ν�λ�����ɤ򥻥å�
        GetExitCodeProcess(pi.hProcess, &dwExitCode);
        break;
      }
    }
    // ���٥�ȥ롼�׷�³
    if (!ContinueDebugEvent(debug.dwProcessId,
                debug.dwThreadId, dwContinueStatus)) {
      break;
    }
  }
  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);

  return dwExitCode;
}

int WINAPI WinMain(HINSTANCE p_hInstance, HINSTANCE p_hPreInst,
                   LPSTR p_pchCmdLine, int p_iCmdShow )
{
  char buf[16];
  int ret;
  if (__argc < 3 || GetFileAttributes(__argv[2]) == 0xFFFFFFFF) {
    MessageBox(NULL,
      "usage: trapfault <exitcode> <debugee> [<debugee parameter>]...",
      __argv[0], MB_OK);
    return 0;
  }
  ret = (int)doit(__argc, __argv);

  //sprintf(buf, "ret=%d\n", ret);
  //MessageBox(NULL, buf, __argv[0], MB_OK);

  return ret;
}
�ǥХå��Ȥ��Ƽ������ʤ�����񤷤����Ȥ�ҤȤޤ��������٤�û�������ɤǼ¸��Ǥ��ޤ����� �����ñ��ʤ�ΤǤ�������������ˡ�Ϥ����������ѤǤ������Ǥ���

�� �����������

�嵭�Υץ������μ¹Է����������������������ɤǤ��ޤ��ʥե꡼���եȡˡ��ܺ٤ϥ��������֤˴ޤޤ�� README �򻲾Ȥ��Ʋ�������

����trapfaultMbox 999 test1.exe�פμ¹Է��

����trapfaultMbox 999 test1.exe abc�פμ¹Է��

�� ���ͽ���

��API�dzؤ�WindowsŰ������
������BP�Ҵ����¼� ���� ��
��Windows�ץ�����ޤΤ���ΥǥХå��ƥ��˥å�Ű�����
������BP���եȥץ쥹����John Robbins ����˭�� �� ��
(tanabe)
klab_gijutsu2 at 10:59��Comments(2)��TrackBack(0)��win 

�ȥ�å��Хå�URL

���ε����ؤΥ�����

1. Posted by ��󥿥륵���С���Ӵ����ͤΥ���   2009ǯ11��11�� 12:45
�ɤ��⡢�Ϥ�ޤ��ơ�
�����Ǥ���
�����ɤޤ���ĺ���ޤ�����

�����������ɤΤʤ��ץ�������ư�����뤳�Ȥ���ǽ�ʤ�Ǥ�������
��������

�ǥХå��������Τϡ�
�ץ�����ޡ��ǤϾ��ʤ���Ǥ�����
����ٹ��ʤ�Ǥ��礦����
2. Posted by tanabe   2009ǯ11��11�� 16:27
�������󡢥����Ȥ򤢤꤬�Ȥ��������ޤ����⤷���ε��������Ƥ˴ؿ��򤪻����ʤ黲�ͽ��Ҥ���ɤ���뤳�Ȥ򤪤����ᤷ�ޤ���

���ε����˥����Ȥ���

̾��:
URL:
  ����òµ­²ï¿½: ɾ��: ��    ��
 
 
 
Blog�⸡��
�ǿ�����
Archives
���Υ֥����ˤĤ���
DSAS�Ȥϡ�KLab �����ۤ����Ѥ��Ƥ��륳��ƥ�ĥ����ӥ��Ѥ�Linux�١����Υ���ե�Ǥ�������5����Υǡ������󥿤ˤƹ��ۤ������Ѥ��Ƥ��ޤ������桹��DSAS����Ȥ��䤹�����������ˡ������Ƥ����ϤDZ��ѤǤ��뤳�Ȥ��ܻؤ��ơ��������ɤ˶Ф���Ǥ��ޤ���
���Υ֥����Ǥϡ������ DSAS �ǻȤäƤ��뵻�ѤξҲ�䡢�¸����Ƥߤ���̤���𡢥ȥ�֥�˴������ޤ줿���ηи��̤ʤɡ���������������������򿥤�ޤ��ƾҲ𤷤Ƥ��������Ȼפ��ޤ���
�ǿ�������
<%==comments[n].author%>
<% } %>