Занести в массив все ID потоков, конкретно указанного процесса

Тема в разделе "WASM.WIN32", создана пользователем EvilsInterrupt, 24 авг 2006.

  1. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Написал, код:
    Код (Text):
    1.     hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);
    2.     if(hProcSnap != INVALID_HANDLE_VALUE) {
    3.         tentry.dwSize = sizeof(THREADENTRY32);
    4.         if(Thread32First(hProcSnap,&tentry)) {
    5.             CountThreads++;
    6.             for(; Thread32Next(hProcSnap,&tentry); CountThreads++);
    7.         }//Thread32First
    8.         pSysInfo = new SYSTEMINFO[CountThreads];
    9.         if(Thread32First(hProcSnap,&tentry)) {
    10.             pSysInfo[0].ThreadID = tentry.th32ThreadID;
    11.             pSysInfo[0].ProcID = tentry.th32OwnerProcessID;
    12.             for(int i =1; i < CountThreads; i++) {
    13.                 Thread32Next(hProcSnap,&tentry);
    14.                 pSysInfo[i].ThreadID = tentry.th32ThreadID;
    15.                 pSysInfo[i].ProcID = tentry.th32OwnerProcessID;
    16.             }//for
    17.         }//Thread32First
    18.         CloseHandle(hProcSnap);
    19.     }//hProcSnapshot
    20.     for(int i = 0; i < CountThreads; i++) {
    21.         cout << "ProcID # " << pSysInfo[i].ProcID << "#\t";
    22.         cout << "ThreadID # " << pSysInfo[i].ThreadID << endl;
    23.     }
    Но код, перечисляет ВСЕ потоки которые есть в системе, а мне нужно толко один, указанный мною!

    Причем бональным if(GetCurrentProcessId == pSysInfo.ProcID) решать не охота!

    Вопрос:
    Есть способ лучше?
     
  2. Troller

    Troller New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2006
    Сообщения:
    6
    Единственный способ в WinNT перечислить все процессы и потоки в системе - NtQuerySystemInformation. Так что используй ее. А как в остальных виндоузах не знаю.
     
  3. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    Похоже нет. Вот цитата из MSDN:
    (описание флага TH32CS_SNAPTHREAD)
     
  4. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    лучше не так
    Код (Text):
    1. if(GetCurrentProcessId == pSysInfo[i].ProcID)
    а так
    Код (Text):
    1. MyPid = GetCurrentProcessId();... if (MyPid == pSysInfo[i].ProcID)
    это более эффективно
     
  5. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Код (Text):
    1. RESULT  GetArrayThreadID(PMYTHREADINFO tinfo,DWORD ProcID) {
    2.     HANDLE              hProcSnap;
    3.     THREADENTRY32   tentry = {0};
    4.     int                     CountThreads = 0;
    5.     RESULT              ValRet = SUCCESS;
    6.  
    7.     try {
    8.         hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);
    9.         if(hProcSnap != INVALID_HANDLE_VALUE) {
    10.             tentry.dwSize = sizeof(THREADENTRY32);
    11.             if(Thread32First(hProcSnap,&tentry)) {
    12.                 if(tentry.th32OwnerProcessID == ProcID) CountThreads++;
    13.                 for(; Thread32Next(hProcSnap,&tentry); )
    14.                     if(tentry.th32OwnerProcessID == ProcID) CountThreads++;
    15.             }//Thread32First
    16.             else { ValRet = FAIL; }
    17.             tinfo->CountThreads = CountThreads;
    18.             tinfo->ThreadID = new DWORD[CountThreads];
    19.             ZeroMemory(tinfo->ThreadID,CountThreads*4);
    20.             if(Thread32First(hProcSnap,&tentry)) {
    21.                 if(tentry.th32OwnerProcessID == ProcID)
    22.                                                 tinfo->ThreadID[0] = tentry.th32ThreadID;
    23.                 for(int i=0;Thread32Next(hProcSnap,&tentry);i++) {
    24.                     if(tentry.th32OwnerProcessID == ProcID)
    25.                         tinfo->ThreadID[i] = tentry.th32ThreadID;
    26.                 }//for
    27.             }//Thread32First
    28.             else { ValRet = FAIL; }
    29.             CloseHandle(hProcSnap);
    30.             if(!CountThreads) tinfo->CountThreads = 0xFFFFFFFF;
    31.         }//hProcSnapshot
    32.         else { ValRet = FAIL; }
    33.     }// try
    34.     catch(...) { ValRet = FAIL; }
    35.     return ValRet;
    36. }
    Начал отлаживать...
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    EvilsInterrupt
    Начал отлаживать...
    После повторного Thread32First присваиваешь в _нулевой_ элемент tinfo->ThreadID, а затем цикл с Thread32Next начинается с индекса _ноль_ и индекс этот увеличивается независимо от того принадлежит ли очередной поток нужному процессу или нет.

    + imho вместо CountThreads*4 надо писать CountThreads*sizeof(DWORD).

    ps ты про конструкцию do { ... } while слышал?
     
  7. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Страшно ее не люблю :) Есть причины, хотя эта конструкция очень удобна.
    Я вот думаю, то что я выше применяю и это:
    http://www.codeproject.com/system/ntenumthreads.asp?print=true
    что будет лучше?

    Просто у меня Семантик Авер, на одну прогу выводящая листинг процессов, потоков и т.д. жалуется, а вот на Ms-Remовскую тулзу по убийству скрытых нет!
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Ну и зря. На асме ты некоторые инструкции процессора тоже не любишь?
     
  9. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    IceStudent
    А че ассемблер можно разве не любить? ;) У меня не получается :dntknw:
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    EvilsInterrupt
    Это я к тому, что нужно использовать все возможности технологии/языка, а не сидеть в уголке с десятком избранных конструкций.
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    EvilsInterrupt
    что будет лучше?
    Что значить _лучше_?
    Статья по ссылке применима для Win NT 4 где не было ToolHelp32 library. Если тебе нужна совместимость придется использовать оба варианта.