На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> NtQueryObject виснет намертво :-\ , и на казалось бы очередном хендле...
    Замыслил я значит написать небольшую прогу чтобы искала какой процесс открыл определенный файл. Ну как в Process Explorer или Handles например. Получил список открытых хендлов
    ExpandedWrap disabled
      NtQuerySystemInformation(SystemHandleInformation,...

    Ну а дальше мои пути с sysinternals разошлись :) Они там через дрова как то делали а я копировал хендлы чужих процессов в свой и затем получал их имя
    ExpandedWrap disabled
      hpr=OpenProcess(PROCESS_DUP_HANDLE,...
      DuplicateHandle(hpr,...
      NtQueryObject(htemp_handle, ObjectNameInformation,...

    Все шло хорошо пока я не трогал сервисы. Когда же я довавил своей проге SeDebugPrivilege вылез прикол - на очередном хендле процесса services.exe функция NtQueryObject крепко зависает, так что потом с прогой ниче не сделаешь, только комп ребутать.

    Очень хотелось бы узнать были ли у кого такие траблы и как решались?
      Там есть какие-то специальные именованные пайпы, так вот при попытке их имена прочитать поток блокируется - это общеизвестно. Общеизвестный метод - запускать это в отдельный поток и ждать пару секунд, потом поток килять
        Интересно!!! возможно это связано с RPC - известным больным местом виндов. Возможно, это такая попытка защиты?
          Врядли, это скорее баг :)
          Я так и не нашел способа его обойти, разве что использовать драйвер...
            Цитата
            HOMO_PROGRAMMATIS, 26.08.04, 11:27
            Там есть какие-то специальные именованные пайпы, так вот при попытке их имена прочитать поток блокируется - это общеизвестно. Общеизвестный метод - запускать это в отдельный поток и ждать пару секунд, потом поток килять

            Ну это классно что все уже общеизвестно и опробовано. Но и тут засада!
            Значит так. Создаем поток:
            ExpandedWrap disabled
              hmutex=CreateMutex(NULL, TRUE, "sfu_mutex0");
              hth=CreateThread(NULL, 0, ThreadProc,...

            Вот с таким кодом:
            ExpandedWrap disabled
              DWORD WINAPI ThreadProc(LPVOID lpParameter){
                  HANDLE hmutex=OpenMutex(SYNCHRONIZE, FALSE, "sfu_mutex0");
                  for(;;){
                      WaitForSingleObject(hmutex, INFINITE);
                      NtQueryObject(...
                      ReleaseMutex(hmutex);
                  }
                  return 0;
              }

            Ну и где то в коде основного потока:
            ExpandedWrap disabled
              ReleaseMutex(hmutex);
              if(WaitForSingleObject(hmutex, 1000)!=WAIT_OBJECT_0){
                  TerminateThread(hth, 1);
                  CloseHandle(hth);
                  if(WaitForSingleObject(hmutex, 1000)==WAIT_ABANDONED_0)
                      hth=CreateThread(NULL, 0, ThreadProc,...   // создаем новый
                  else
                      // report error
              }

            Что же получается? TerminateThread возвращает 1, то есть вроде бы все ок. Но на самом деле поток не завершается (ну и мьютекс ясно дело не теряется).
            Завершаем отладку и процесс остается висеть в памяти, с одним потоком (главный то завершается).
            Зато если в коде вспомогательного потока вместо вызова NtQueryObject поставить какой нить Sleep(100000), то все работает как часы.
            Так и в чем же дело???
              или бросить это неблагодарное дело и сделать через дрова?
                Так NtQueryObject() все и вешает, и ничто иное. Кстати, у меня тоже та же фигня получалась - неубиваемый поток... Я так и не понял что неправильно. У меня был чуть измененный сорс, так вот оригинал работал а мой нет...
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0320 ]   [ 16 queries used ]   [ Generated: 27.04.24, 22:04 GMT ]