Ejemplo n.º 1
0
DWORD
CService::
ServiceCtrlHandlerEx(
	DWORD dwControl, 
	DWORD dwEventType, 
	LPVOID lpEventData)
{
	switch (dwControl) {
	// Standard Handlers
	case SERVICE_CONTROL_CONTINUE:
		return OnServiceResume();
	case SERVICE_CONTROL_INTERROGATE:
		return OnServiceInterrogate();
	case SERVICE_CONTROL_PARAMCHANGE:
		return OnServiceParamChange();
	case SERVICE_CONTROL_PAUSE:
		return OnServicePause();
	case SERVICE_CONTROL_SHUTDOWN:
		return OnServiceShutdown();
	case SERVICE_CONTROL_STOP:
		return OnServiceStop();

	// Extended Handlers
	case SERVICE_CONTROL_DEVICEEVENT:
		return OnServiceDeviceEvent(dwEventType, lpEventData);
	case SERVICE_CONTROL_HARDWAREPROFILECHANGE:
		return OnServiceHardwareProfileChange(dwEventType, lpEventData);
	case SERVICE_CONTROL_POWEREVENT:
		return OnServicePowerEvent(dwEventType, lpEventData);
#if (WINVER >= 0x510)
	case SERVICE_CONTROL_SESSIONCHANGE:
		return OnServiceSessionChange(dwEventType, lpEventData);
#endif

	// This control code has been deprecated. use PnP functionality instead
	case SERVICE_CONTROL_NETBINDADD:
	case SERVICE_CONTROL_NETBINDDISABLE:
	case SERVICE_CONTROL_NETBINDENABLE:
	case SERVICE_CONTROL_NETBINDREMOVE:
		return ERROR_CALL_NOT_IMPLEMENTED;

	default: // User-defined control code
		if (dwControl >= 128 && dwControl <= 255) {
			return OnServiceUserControl(dwControl, dwEventType, lpEventData);
		}
		else {
			return ERROR_CALL_NOT_IMPLEMENTED;
		}
	}
}
Ejemplo n.º 2
0
DWORD
CNdasService::Impl::ThreadStart(LPVOID)
{
	//
	//	Stop NdasBus auto-plugin feature to take over plugin facility.
	//

	BOOL fSuccess = LsBusCtlStartStopRegistrarEnum(FALSE, NULL);
	XTLASSERT(fSuccess);

	//////////////////////////////////////////////////////////////////////////
	// Get the initialized instance
	//////////////////////////////////////////////////////////////////////////

	if (!InitializeInstances())
	{
		OnServiceStop();
		return 1;
	}

	//////////////////////////////////////////////////////////////////////////
	// Bootstrap registrar from the registry
	//////////////////////////////////////////////////////////////////////////

	XTLVERIFY( m_cDeviceRegistrar.Bootstrap() );

	//////////////////////////////////////////////////////////////////////////
	// Start Queuing Work Items
	//////////////////////////////////////////////////////////////////////////

	m_nWorkItems = 0;
	if (!StartWorkItems(m_nWorkItems))
	{
		OnServiceStop();
		return 1;
	}

	// Release semaphore to start workers (semaphore increment)
	LONG prev;
	XTLVERIFY( ::ReleaseSemaphore(m_hWorkItemSemaphore, m_nWorkItems, &prev) );
	XTLASSERT( 0 == prev );

	//////////////////////////////////////////////////////////////////////////
	// Start Command Processor Thread
	//////////////////////////////////////////////////////////////////////////

	if (!m_wiCmdServer.CreateThreadEx(
			&m_cCmdServer, 
			&CNdasCommandServer::ThreadStart,
			LPVOID(m_hStopServiceEvent)))
	{
		OnServiceStop();
		return 1;
	}

	//////////////////////////////////////////////////////////////////////////
	// Initialization thread is done
	//////////////////////////////////////////////////////////////////////////

	return 0;
}