Дано: 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);
}