BOOL COXIteratorService::StartIteration( DWORD dwServiceType /* = SERVICE_WIN32 | SERVICE_DRIVER */, DWORD dwServiceState /* = SERVICE_STATE_ALL */) { // we terminate a potential previous iteration End(); if (!PrepareSCManager(SC_MANAGER_ENUMERATE_SERVICE)) return FALSE; // get number of services first DWORD dwBytesNeeded, dwServicesReturned, dwResumeHandle = 0; BOOL bResult = ::EnumServicesStatus(c_hSCM, dwServiceType, dwServiceState, NULL, 0, &dwBytesNeeded, &dwServicesReturned, &dwResumeHandle); // no services if (bResult) return TRUE; // abnormal failures if (::GetLastError() != ERROR_MORE_DATA || dwBytesNeeded == 0) { SetLastError(FALSE); return FALSE; } // get services again LPENUM_SERVICE_STATUS pESSArray = (LPENUM_SERVICE_STATUS)malloc(dwBytesNeeded); if (pESSArray == NULL) AfxThrowMemoryException(); dwResumeHandle = 0; bResult = SetErrCode(::EnumServicesStatus(c_hSCM, dwServiceType, dwServiceState, pESSArray, dwBytesNeeded, &dwBytesNeeded, &dwServicesReturned, &dwResumeHandle)); if (bResult) { GetNamesFromESSArray(pESSArray, dwServicesReturned); m_sKeyName = m_SrvKeyNames[m_nPos = 0]; } free(pESSArray); return bResult; }
BOOL COXIteratorService::StartDependentIteration( DWORD dwServiceState /* = SERVICE_STATE_ALL */) { // we terminate a potential previous iteration CString sKeyName = GetKeyName(); End(); SetKeyName(sKeyName); if (!PrepareSCHandle(SERVICE_ENUMERATE_DEPENDENTS)) return FALSE; // get number of dependent services first DWORD dwBytesNeeded, dwServicesReturned; BOOL bResult = ::EnumDependentServices(m_hSC, dwServiceState, NULL, 0, &dwBytesNeeded, &dwServicesReturned); // no services if (bResult) return TRUE; // abnormal failures if (::GetLastError() != ERROR_MORE_DATA || dwBytesNeeded == 0) { SetLastError(FALSE); return FALSE; } // get services again LPENUM_SERVICE_STATUS pESSArray = (LPENUM_SERVICE_STATUS)malloc(dwBytesNeeded); if (pESSArray == NULL) AfxThrowMemoryException(); bResult = SetErrCode(::EnumDependentServices(m_hSC, dwServiceState, pESSArray, dwBytesNeeded, &dwBytesNeeded, &dwServicesReturned)); if (bResult) { GetNamesFromESSArray(pESSArray, dwServicesReturned); m_sKeyName = m_SrvKeyNames[m_nPos = 0]; } free(pESSArray); return bResult; }
ThreadImpl* ThreadImpl::CreateInstance(ThreadFonc threadEntry, VoidPtr threadParam) { Int32 errCode; pthread_t threadID; ThreadImpl* thread = new ThreadImpl(threadEntry, threadParam); errCode = pthread_create(&threadID, NULL, NativeThreadEntry, (void*)thread); if(!errCode) { thread->_threadID = threadID; return thread; } else { SetErrCode((UInt32)errCode); DeletePtr(thread); return NULL; } }