Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
		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;
			}
		}