Не доступность RPC из приложения, отлаживаемого с помощью wndbg api

Тема в разделе "WASM.WIN32", создана пользователем _nic, 17 мар 2012.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Вин 7,"отлаживаемое приложение" - блокнот.Если в этом блокноте вызвать диалог открытия/сохранения файла,то ловлю в RIP_INFO::dwType SLE_ERROR.А в DEBUG_EVENT::u.Exception.ExceptionRecord.ExceptionCode 0x6BA т.е. RPC_S_SERVER_UNAVAILABLE ,и в итоге после этого исключения все сваливаеться в ACCESS_VIOLATION.От чего так происходит?

    ЗЫ: в ворде даже ненадо никакой диалог вызывать, сразу же через 3-4 секунды вылазит экцепт с RPC_S_SERVER_UNAVAILABLE.В опере при открытии диалога сохранения вообще сразу ACCESS_VIOLATION, ничего не понимаю ((((((
     
  2. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    _nic
    Откройте в олли этот диалог и посмотрите.
     
  3. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    А что потом?Ну определил я что этот еррор возникает внутри GetOpenFileName,видимо фейлиться получение через ком интерфейс из эксплорера проводникового гуя,а почему хз :dntknw:(((( Интересно что эта ф-ция дает еррор при дебаге в ольке и моем коде,но в дебагере студии все гладко...
    Нет ни у кого идей от чего такие приколы возникают?Неужто в RPCRT4.dll какие то антиотладочные фичи зарыты?
     
  4. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    _nic
    Есть идея в кривости вашего кода. Что проблема потратить пол минуты времи и поюзать отладчик ?

    С такими желаниями товарищ вы далеко не уедите..
     
  5. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Вот код
    Код (Text):
    1. void PrintExpt(DWORD exCode)
    2. {
    3.     switch(exCode)
    4.     {
    5.     case EXCEPTION_ACCESS_VIOLATION:printf("EXCEPTION_ACCESS_VIOLATION");
    6.         break;
    7.     case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:printf("EXCEPTION_ARRAY_BOUNDS_EXCEEDED");
    8.         break;
    9.     case EXCEPTION_BREAKPOINT:printf("EXCEPTION_BREAKPOINT");
    10.         break;
    11.     case EXCEPTION_DATATYPE_MISALIGNMENT:printf("EXCEPTION_DATATYPE_MISALIGNMENT");
    12.         break;
    13.     case EXCEPTION_FLT_DENORMAL_OPERAND:printf("EXCEPTION_FLT_DENORMAL_OPERAND");
    14.         break;
    15.     case EXCEPTION_FLT_DIVIDE_BY_ZERO:printf("EXCEPTION_FLT_DIVIDE_BY_ZERO");
    16.         break;
    17.     case EXCEPTION_FLT_INEXACT_RESULT:printf("EXCEPTION_FLT_INEXACT_RESULT");
    18.         break;
    19.     case EXCEPTION_FLT_INVALID_OPERATION:printf("EXCEPTION_FLT_INVALID_OPERATION");
    20.         break;
    21.     case EXCEPTION_FLT_OVERFLOW:printf("EXCEPTION_FLT_OVERFLOW");
    22.         break;
    23.     case EXCEPTION_FLT_STACK_CHECK:printf("EXCEPTION_FLT_STACK_CHECK");
    24.         break;
    25.     case EXCEPTION_FLT_UNDERFLOW:printf("EXCEPTION_FLT_UNDERFLOW");
    26.         break;
    27.     case EXCEPTION_ILLEGAL_INSTRUCTION:printf("EXCEPTION_ILLEGAL_INSTRUCTION");
    28.         break;
    29.     case EXCEPTION_IN_PAGE_ERROR:printf("EXCEPTION_IN_PAGE_ERROR");
    30.         break;
    31.     case EXCEPTION_INT_DIVIDE_BY_ZERO:printf("EXCEPTION_INT_DIVIDE_BY_ZERO");
    32.         break;
    33.     case EXCEPTION_INT_OVERFLOW:printf("EXCEPTION_INT_OVERFLOW\n");
    34.         break;
    35.     case EXCEPTION_INVALID_DISPOSITION:printf("EXCEPTION_INVALID_DISPOSITION\n");
    36.         break;
    37.     case EXCEPTION_NONCONTINUABLE_EXCEPTION:printf("EXCEPTION_NONCONTINUABLE_EXCEPTION\n");
    38.         break;
    39.     case EXCEPTION_PRIV_INSTRUCTION:printf("EXCEPTION_PRIV_INSTRUCTION\n");
    40.         break;
    41.     case EXCEPTION_SINGLE_STEP:printf("EXCEPTION_SINGLE_STEP\n");
    42.         break;
    43.     case EXCEPTION_STACK_OVERFLOW:printf("EXCEPTION_STACK_OVERFLOW\n");
    44.         break;
    45.     }
    46.     printf(" Code: %X\n",exCode);
    47. }
    48. void WinApiErDescr(DWORD erc)
    49. {
    50.     wchar_t erbuf[1024];
    51.     FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,erc,0,erbuf,1024,0);
    52.     MessageBox(0,erbuf,L"",MB_ICONERROR);
    53. }
    54. int _tmain(int argc, _TCHAR* argv[])
    55. {
    56.     STARTUPINFO si;
    57.     PROCESS_INFORMATION pi;
    58.     ZeroMemory( &si, sizeof(si) );
    59.     si.cb = sizeof(si);
    60.     ZeroMemory( &pi, sizeof(pi) );
    61.     DEBUG_EVENT de;
    62.     CreateProcess(target,0,0,0,FALSE,NORMAL_PRIORITY_CLASS,0,0,&si,&pi);
    63.     printf("Started\n");
    64.     DebugActiveProcess(pi.dwProcessId);
    65.     int i=0;
    66.     while(i!=1)
    67.     {
    68.         ZeroMemory(&de,sizeof(DEBUG_EVENT));
    69.         WaitForDebugEvent(&de,INFINITE);
    70.         switch(de.dwDebugEventCode)
    71.         {
    72.         case EXIT_PROCESS_DEBUG_EVENT:
    73.             ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    74.             i=1;
    75.             printf("EXIT_PROCESS_DEBUG_EVENT\n");
    76.             break;
    77.         case EXCEPTION_DEBUG_EVENT:
    78.             printf("EXCEPTION_DEBUG_EVENT\n");
    79.             printf("Adr:%X\n",de.u.Exception.ExceptionRecord.ExceptionAddress);
    80.             PrintExpt(de.u.Exception.ExceptionRecord.ExceptionCode);
    81.             printf("RIP: %X\n",de.u.RipInfo.dwType);
    82.            
    83.             if(de.u.RipInfo.dwType!=0)
    84.             {
    85.                 WinApiErDescr(de.u.Exception.ExceptionRecord.ExceptionCode);
    86.                 //i=1;
    87.             }
    88.             getch();
    89.             ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    90.             break;
    91.         case CREATE_THREAD_DEBUG_EVENT:
    92.             ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    93.             printf("CREATE_THREAD_DEBUG_EVENT\n");
    94.             break;
    95.         case CREATE_PROCESS_DEBUG_EVENT:
    96.             printf("CREATE_PROCESS_DEBUG_EVENT\n");
    97.             printf("Base: %X\n",de.u.CreateProcessInfo.lpBaseOfImage);
    98.             ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    99.             break;
    100.         case EXIT_THREAD_DEBUG_EVENT:
    101.             ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    102.             printf("EXIT_THREAD_DEBUG_EVENT\n");
    103.             break;
    104.         case LOAD_DLL_DEBUG_EVENT:
    105.             ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    106.             printf("LOAD_DLL_DEBUG_EVENT\n");
    107.             break;
    108.         case UNLOAD_DLL_DEBUG_EVENT:
    109.             ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    110.             printf("UNLOAD_DLL_DEBUG_EVENT\n");
    111.             break;
    112.         case OUTPUT_DEBUG_STRING_EVENT:
    113.             ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    114.             printf("OUTPUT_DEBUG_STRING_EVENT\n");
    115.             break;
    116.         case RIP_EVENT:
    117.             ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
    118.             printf("RIP_EVENT\n");
    119.             break;
    120.         }
    121.     }
    122.     DebugActiveProcessStop(pi.dwProcessId);
    123.     printf("Finished\n");
    124.     getch();
    125.     return 0;
    126. }
    Идея потвердилась ,или опровергнута?
    Не совсем понятна фраза про отладчик...
    Вот кстати тестовое приложение которое в ольке падает так же как и блокнот,при открытии диалога на сохранение\открытие файла
    Код (Text):
    1. void OpenFileDialog(HWND hWnd)
    2. {
    3.     static OPENFILENAME ofn;
    4.     wchar_t szFileName[1024];
    5.     wchar_t szFilter[] = L"Исполняемые файлы\0*.exe\0\0";
    6.     wchar_t *fn=new wchar_t[1024*4];
    7.     szFileName[0] = szFileName[1] = 0;
    8.     ZeroMemory(&ofn,sizeof(OPENFILENAME));
    9.     ofn.lStructSize       = sizeof(OPENFILENAME);
    10.     ofn.hInstance        =(HINSTANCE)GetModuleHandle(NULL);
    11.     ofn.hwndOwner     = hWnd;        
    12.     ofn.lpstrFilter         = szFilter;
    13.     ofn.lpstrFile           = szFileName;    
    14.     ofn.nMaxFile          = sizeof(szFileName);
    15.     ofn.Flags               = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;
    16.     if (GetOpenFileName(&ofn))
    17.     {
    18.         MessageBoxA(0,"OK","",MB_OK);
    19.     }
    20.     else
    21.     {
    22.         MessageBoxA(0,"!","",MB_OK);
    23.     }
    24.  }
    25. int _tmain(int argc, _TCHAR* argv[])
    26. {
    27.     MessageBoxA(0,"!","",MB_OK);
    28.     OpenFileDialog(0);
    29.     return 0;
    30. }
    ЗЫ: кому не трудно,и у кого есть семерка,не могли б вы собрать его, и у себя в ольке проверить?
     
  6. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Никто не будет за вас это юзать. Всё что вам нужно знать было уже сказано. Оминь.