Пример #1
0
void CService::ServiceMain(DWORD argc, LPTSTR *argv)
{
    BOOL res;

    if (!m_StatusHandle) {
        terminate(GetLastError());
        return;
    }

    res = SendStatusToSCM(SERVICE_START_PENDING, NO_ERROR, 0 , 1, 5000);
    if (!res) {
        terminate(GetLastError());
        return;
    }

    m_pDev = new CDevice();
    if (!m_pDev || !m_pDev->Init(this) || !m_pDev->Start()) {
        terminate(GetLastError());
        return;
    }

    m_hDevNotify = RegisterDeviceInterfaceNotification();
    if (m_hDevNotify == NULL) {
        terminate(GetLastError());
        return;
    }

    m_evTerminate = CreateEvent(NULL, TRUE, FALSE, NULL);
    if (!m_evTerminate) {
        terminate(GetLastError());
        return;
    }

    res = InitService();
    if (!res) {
        terminate(GetLastError());
        return;
    }

    res = SendStatusToSCM(SERVICE_RUNNING, NO_ERROR, 0 , 0, 0);
    if (!res) {
        terminate(GetLastError());
        return;
    }

    WaitForSingleObject(m_evTerminate, INFINITE);
    terminate(0);
}
Пример #2
0
bool
CNdasServiceDeviceEventHandler::
Initialize(HANDLE hRecipient, DWORD dwReceptionFlag)
{
	m_hRecipient = hRecipient;
	m_dwReceptionFlags = dwReceptionFlag;
	//
	// Caution!
	//
	// DEVICE_NOFITY_WINDOW_HANDLE is 0x000, hence
	// XTLASSERT(DEVICE_NOFITY_WINDOW_HANDLE & m_dwReceptionFlags)
	// will always fail.
	//
	XTLASSERT(
		((DEVICE_NOTIFY_SERVICE_HANDLE & m_dwReceptionFlags) == DEVICE_NOTIFY_SERVICE_HANDLE) ||
		((DEVICE_NOTIFY_WINDOW_HANDLE & m_dwReceptionFlags) == DEVICE_NOTIFY_WINDOW_HANDLE));

	//
	// Do not initialize twice if successful.
	//
	XTLASSERT(!m_bInitialized);

	pEnumerateNdasStoragePorts();

	//
	// register Storage Port, Volume and Disk device notification
	//

	m_hStoragePortNotify = RegisterDeviceInterfaceNotification(&GUID_DEVINTERFACE_STORAGEPORT);
	if (m_hStoragePortNotify.IsInvalid()) 
	{
		XTLTRACE2(NDASSVC_PNP, TRACE_LEVEL_ERROR, 
			"Registering Storage Port Device Notification failed, error=0x%X\n", GetLastError());
	}

	m_hVolumeNotify = RegisterDeviceInterfaceNotification(&GUID_DEVINTERFACE_VOLUME);
	if (m_hVolumeNotify.IsInvalid()) 
	{
		XTLTRACE2(NDASSVC_PNP, TRACE_LEVEL_ERROR, 
			"Registering Volume Device Notification failed, error=0x%X\n", GetLastError());
	}

	m_hDiskNotify = RegisterDeviceInterfaceNotification(&GUID_DEVINTERFACE_DISK);

	if (m_hDiskNotify.IsInvalid()) 
	{
		XTLTRACE2(NDASSVC_PNP, TRACE_LEVEL_ERROR, 
			"Registering Disk Device Notification failed, error=0x%X\n", GetLastError());
	}

	m_hCdRomClassNotify = RegisterDeviceInterfaceNotification(&GUID_DEVINTERFACE_CDROM);

	if (m_hCdRomClassNotify.IsInvalid()) 
	{
		XTLTRACE2(NDASSVC_PNP, TRACE_LEVEL_ERROR, 
			"Registering CDROM Device Notification failed, error=0x%X\n", GetLastError());
	}

	XTLTRACE2(NDASSVC_PNP, TRACE_LEVEL_INFORMATION, "Storage Port Notify Handle: %p\n", m_hStoragePortNotify);
	XTLTRACE2(NDASSVC_PNP, TRACE_LEVEL_INFORMATION, "Volume Notify Handle      : %p\n", m_hVolumeNotify);
	XTLTRACE2(NDASSVC_PNP, TRACE_LEVEL_INFORMATION, "Disk Device Notify Handle : %p\n", m_hDiskNotify);
	XTLTRACE2(NDASSVC_PNP, TRACE_LEVEL_INFORMATION, "CDROM Device Notify Handle : %p\n", m_hCdRomClassNotify);

	//
	// nothing more for Windows XP or later
	//

	//
	// If NoLfs is set and if the OS is Windows 2000, 
	// load ROFilter service
	//
	if (!(IsWindows2000() && m_bNoLfs)) 
	{
		m_bInitialized = TRUE;
		return TRUE;
	}

	XTLASSERT(m_hROFilter.IsInvalid());

	//
	// Even if the rofilter is not loaded
	// initialization returns TRUE
	// However, m_hROFilter has INVALID_HANDLE_VALUE
	//

	m_bInitialized = TRUE;

	SERVICE_STATUS serviceStatus;
	BOOL fSuccess = NdasRoFilterQueryServiceStatus(&serviceStatus);
	if (!fSuccess) 
	{
		XTLTRACE2(NDASSVC_PNP, TRACE_LEVEL_ERROR, 
			"NdasRoFilterQueryServiceStatus failed, error=0x%X\n", GetLastError());
		return TRUE;
	}

	if (SERVICE_RUNNING != serviceStatus.dwCurrentState) 
	{
		fSuccess = NdasRoFilterStartService();
		if (!fSuccess) 
		{
			XTLTRACE2(NDASSVC_PNP, TRACE_LEVEL_ERROR, 
				"NdasRoFilterStartService failed, error=0x%X\n", GetLastError());
			return TRUE;
		}
	}

	HANDLE hROFilter = NdasRoFilterOpenDevice();
	if (INVALID_HANDLE_VALUE == hROFilter) 
	{
		XTLTRACE2(NDASSVC_PNP, TRACE_LEVEL_ERROR, 
			"NdasRoFilterCreate failed, error=0x%X\n", GetLastError());
		return TRUE;
	}

	m_hROFilter = hROFilter;

	return TRUE;
}
Пример #3
0
bool
CNdasServiceDeviceEventHandler::Initialize(
	HANDLE hRecipient, DWORD dwReceptionFlag)
{
	HRESULT hr;

	m_hRecipient = hRecipient;
	m_dwReceptionFlags = dwReceptionFlag;

	//
	// Caution!
	//
	// DEVICE_NOFITY_WINDOW_HANDLE is 0x000, hence
	// XTLASSERT(DEVICE_NOFITY_WINDOW_HANDLE & m_dwReceptionFlags)
	// will always fail.
	//
	XTLASSERT(
		((DEVICE_NOTIFY_SERVICE_HANDLE & m_dwReceptionFlags) == DEVICE_NOTIFY_SERVICE_HANDLE) ||
		((DEVICE_NOTIFY_WINDOW_HANDLE & m_dwReceptionFlags) == DEVICE_NOTIFY_WINDOW_HANDLE));

	//
	// Do not initialize twice if successful.
	//
	XTLASSERT(!m_bInitialized);

	//
	// Register interested device interfaces
	//

	RegisterDeviceInterfaceNotification(
		&GUID_DEVINTERFACE_STORAGEPORT, "StoragePort");

	RegisterDeviceInterfaceNotification(
		&GUID_DEVINTERFACE_VOLUME, "Volume");

	for (DWORD i = 0; i < RTL_NUMBER_OF(LogicalUnitInterfaceGuids); ++i)
	{
		RegisterDeviceInterfaceNotification(
			LogicalUnitInterfaceGuids[i].Guid,
			LogicalUnitInterfaceGuids[i].TypeName);
	}
	
	//
	// Register all existing logical units
	//

	hr = pRegisterNdasScsiPorts();

	hr = pRegisterLogicalUnits();

	//
	// nothing more for Windows XP or later
	//

	//
	// If NoLfs is set and if the OS is Windows 2000, 
	// load ROFilter service
	//
	if (!(IsWindows2000() && m_bNoLfs)) 
	{
		m_bInitialized = TRUE;
		return TRUE;
	}

	XTLASSERT(m_hROFilter.IsInvalid());

	//
	// Even if the rofilter is not loaded
	// initialization returns TRUE
	// However, m_hROFilter has INVALID_HANDLE_VALUE
	//

	m_bInitialized = TRUE;

	SERVICE_STATUS serviceStatus;
	BOOL fSuccess = NdasRoFilterQueryServiceStatus(&serviceStatus);
	if (!fSuccess) 
	{
		XTLTRACE2(NDASSVC_PNP, TRACE_LEVEL_ERROR, 
			"NdasRoFilterQueryServiceStatus failed, error=0x%X\n", GetLastError());
		return TRUE;
	}

	if (SERVICE_RUNNING != serviceStatus.dwCurrentState) 
	{
		fSuccess = NdasRoFilterStartService();
		if (!fSuccess) 
		{
			XTLTRACE2(NDASSVC_PNP, TRACE_LEVEL_ERROR, 
				"NdasRoFilterStartService failed, error=0x%X\n", GetLastError());
			return TRUE;
		}
	}

	HANDLE hROFilter = NdasRoFilterOpenDevice();
	if (INVALID_HANDLE_VALUE == hROFilter) 
	{
		XTLTRACE2(NDASSVC_PNP, TRACE_LEVEL_ERROR, 
			"NdasRoFilterCreate failed, error=0x%X\n", GetLastError());
		return TRUE;
	}

	m_hROFilter = hROFilter;

	return TRUE;
}