BUG?: Протекторам не нравится мой сервис
От: DDwag  
Дата: 17.02.05 03:16
Оценка:
Дано: WinXP_sp2 + мой сервис (раз в десять секунд проверяет загружен ли определенный процесс myapp.exe, и если не загружен запускает его) + туча программ защищенных starforce, asprotect, armadillo и прочей подобной херней). Общее количество запущенных видимых процессов не превышает 20 + невидимых в taskmgr 3( наверно, трояны ). Все программы не защищенные протекторами запускаются и работают нормально. Даже если отъедают от проца приличное количество квантов.
Защищённые программы глючат при работе и периодически вылетают, даже если мой сервис не запускает myapp.exe
Тестировалось на 20 компах, с разными приложениями в течении 2 часов кучей народа.

Подозрение: Может глючат протекторы при разглядывании их пользуя OpenProccess + GetModuleBaseName?

ВОПРОС: Как узнать запущен ли процесс с определённым именем, но чтобы не требовалось использовать OpenProccess и GetModuleBaseName? Или возможно не там копаю?


Куски сырцов:
Установка сервиса:

...
schService = CreateService( schSCManager, TEXT(SZSERVICENAME), TEXT(SZSERVICEDISPLAYNAME), SERVICE_ALL_ACCESS, 
                            SERVICE_INTERACTIVE_PROCESS | SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, 
                            szPath, NULL, NULL, TEXT(SZDEPENDENCIES), NULL, NULL);
...



Главный цикл процесса:

...
   while(TRUE) {
    AutoRun();        
    if (!WaitForSingleObject(hStopEvent, 10000)) break;
   }
...



Функция проверки активности интересующего приложения:

void AutoRun( ){
    DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i,j;
    wchar_t  szProcessName[MAX_PATH] = L"unknown";
    HANDLE hProcess;

    EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded );
    cProcesses = cbNeeded / sizeof(DWORD);
    for ( i = 0; i < cProcesses; i++ )     {
        hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |  PROCESS_VM_READ, FALSE, aProcesses[i] );
        if (NULL != hProcess ){
            HMODULE hMod;
            DWORD cbNeeded;

            if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) ){
                GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName) );
                j = StrCmpW(szProcessName, L"myapp.exe");
                if (j==0){
                    CloseHandle( hProcess );
                    return;
                }
            }
        }
        CloseHandle(hProcess);
    }
    WinExec("c:\\windows\\myapp.exe", SW_SHOW);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.