Beispiel #1
0
void
CNdasServiceStringConfig::Set(
	NDASSVC_CONFIG_STRING_TYPE Type, 
	LPCTSTR Value)
{
	SIZE_T i = (SIZE_T) Type;
	XTLASSERT(i < DEF_SIZE);
	if (i >= DEF_SIZE) return;

	WriteLock();

	LPCTSTR RegValueName = NSCONFIG_STRING_DEF[i].RegValueName;
	BOOL fSuccess = _NdasSystemCfg.SetValueEx(
		SubContainer,
		RegValueName, 
		Value);
	XTLASSERT(fSuccess);

	HRESULT hr = ::StringCchCopyN(
		m_data[i], MAX_STRING_VALUE_LEN, 
		Value, MAX_STRING_VALUE_LEN);
	if (!m_cached[i])
	{
		m_cached[i] = true;
	}

	WriteUnlock();

	return;
}
Beispiel #2
0
BOOL
CNdasUnitDevice::GetHostUsageCount(
	LPDWORD lpnROHosts, 
	LPDWORD lpnRWHosts, 
	BOOL fUpdate)
{
	InstanceAutoLock autolock(this);

	XTLASSERT(!IsBadWritePtr(lpnROHosts, sizeof(DWORD)));
	XTLASSERT(!IsBadWritePtr(lpnRWHosts, sizeof(DWORD)));

	CNdasDevicePtr pParentDevice(m_pParentDevice);

	if (fUpdate) 
	{
		BOOL fSuccess = pParentDevice->UpdateStats();
		if (!fSuccess) 
		{
			XTLTRACE2(NDASSVC_NDASUNITDEVICE, TRACE_LEVEL_ERROR,
				"Update device status failed, error=0x%X\n", GetLastError());
			return FALSE;
		}
	}

	const NDAS_DEVICE_STAT& dstat = pParentDevice->GetStats();
	*lpnROHosts = dstat.UnitDevices[m_unitDeviceId.UnitNo].ROHostCount;
	*lpnRWHosts = dstat.UnitDevices[m_unitDeviceId.UnitNo].RWHostCount;

	XTLTRACE2(NDASSVC_NDASUNITDEVICE, TRACE_LEVEL_INFORMATION,
		"Host Usage Count: RO=%d, RW=%d.\n", 
		*lpnROHosts, *lpnRWHosts);

	return TRUE;
}
Beispiel #3
0
void
CNdasServiceBoolConfig::Set(
	NDASSVC_CONFIG_BOOL_TYPE Type, 
	BOOL Value)
{
	SIZE_T i = (SIZE_T) Type;
	XTLASSERT(i < DEF_SIZE);
	if (i >= DEF_SIZE) return;

	WriteLock();

	LPCTSTR RegValueName = NSCONFIG_BOOL_DEF[i].RegValueName;
	BOOL fSuccess = _NdasSystemCfg.SetValueEx(
		SubContainer, 
		RegValueName, 
		Value);
	XTLASSERT(fSuccess);

	m_data[i] = Value;
	if (!m_cached[i])
	{
		m_cached[i] = true;
	}

	WriteUnlock();

	return;
}
STDMETHODIMP
CNdasLogicalUnitManager::UnregisterNdasLocation(
	NDAS_LOCATION location,
	INdasLogicalUnit* pNdasLogicalUnit)
{
	CAutoLock autolock(this);

	XTLTRACE2(NDASSVC_NDASLOGDEVMANAGER, TRACE_LEVEL_INFORMATION, 
		"Unregistering NdasLocation, slot=%d\n",
		location);

	LocationMap::iterator itr = m_NdasLocationMap.find(location);
	XTLASSERT(m_NdasLocationMap.end() != itr);
	if (m_NdasLocationMap.end() == itr)
	{
		XTLTRACE2(NDASSVC_NDASLOGDEVMANAGER, TRACE_LEVEL_ERROR, 
			"NdasLocation not registered, slot=%d", 
			location);
		return E_FAIL;
	}

	XTLASSERT(itr->second == pNdasLogicalUnit);

	m_NdasLocationMap.erase(itr);

	return S_OK;
}
Beispiel #5
0
BOOL GetLocalLpxAddressList(
	IN SOCKET s,
	IN DWORD cbBuffer,
	OUT LPSOCKET_ADDRESS_LIST lpBuffer,
	OUT LPDWORD pcbBytesReturned)
{
	XTLASSERT(INVALID_SOCKET != s);
	XTLASSERT(!IsBadWritePtr(lpBuffer, cbBuffer));

	INT iError = WSAIoctl(
		s,
		SIO_ADDRESS_LIST_QUERY,
		NULL, 
		0,
		lpBuffer,
		cbBuffer,
		pcbBytesReturned,
		NULL,
		NULL);

	if (iError != 0) {
		XTLTRACE2(NDASSVC_LPXCOMM, TRACE_LEVEL_ERROR,
			"SIO_ADDRESS_LIST_QUERY failed, error=0x%X\n", GetLastError());
		return FALSE;
	}

	return TRUE;
}
DWORD 
CNdasAutoRegister::ThreadStart(HANDLE hStopEvent)
{
	CCoInitialize coinit(COINIT_MULTITHREADED);

	XTLASSERT(!m_hSemQueue.IsInvalid() && "Don't forget to call initialize().");

	// Queue Semaphore, Terminating Thread, Pipe Instances(MAX...)
	HANDLE hWaitHandles[2] = { hStopEvent, m_hSemQueue };

	CNdasDeviceHeartbeatListener& listener = pGetNdasDeviceHeartbeatListener();

	COMVERIFY(listener.Advise(this));

	do 
	{
		DWORD waitResult = ::WaitForMultipleObjects(
			RTL_NUMBER_OF(hWaitHandles), 
			hWaitHandles, 
			FALSE, INFINITE);

		if (WAIT_OBJECT_0 == waitResult) 
		{
			break;
		} 
		else if (WAIT_OBJECT_0 + 1 == waitResult) 
		{
			while (TRUE) 
			{
				m_queueLock.LockInstance();
				if (m_queue.empty()) 
				{
					m_queueLock.UnlockInstance();
					break;
				}
				QUEUE_ENTRY entry = m_queue.front();
				m_queue.pop();
				m_queueLock.UnlockInstance();
				(VOID) ProcessRegister(entry.deviceID, entry.access);
			}
		} 
		else 
		{
			XTLASSERT(FALSE);
			// ERROR
		}

	} while (TRUE);

	COMVERIFY(listener.Unadvise(this));

	return 0;
}
Beispiel #7
0
DWORD
CNdasIXBcast::ThreadStart(HANDLE hStopEvent)
{
	if (0 == m_NDFSVersion.wMajor && 0 == m_NDFSVersion.wMinor)
	{
		return 1;
	}

	HANDLE waitHandles[] = { 
		hStopEvent, 
		m_sockAddrChangeNotifier.GetChangeEvent()};
	const DWORD nWaitHandles = RTL_NUMBER_OF(waitHandles);

	// CTask::Initialized called?
	XTLASSERT(NULL != waitHandles[0]);
	// m_sockAddrChangeNotifier is initialized?
	XTLASSERT(NULL != waitHandles[1]);

	//
	// Initial bind
	//
	ResetBind(hStopEvent);

	//
	// initial LPX socket address list is attained
	//
	DWORD dwTimeout = 1000; // broadcast interval
	while (TRUE) 
	{
		DWORD waitResult = ::WaitForMultipleObjects(
			nWaitHandles, waitHandles, FALSE, dwTimeout);

		if (WAIT_OBJECT_0 == waitResult) 
		{
			return 0;
		}
		else if (WAIT_OBJECT_0 + 1 == waitResult) 
		{
			// reset bind
			ResetBind(hStopEvent);
		}
		else if (WAIT_TIMEOUT == waitResult) 
		{
			BroadcastStatus();
		}
		else 
		{
			XTLTRACE2(NDASSVC_IX, TRACE_LEVEL_ERROR,
				"WaitForMultipleObject failed, waitResult=%d.\n", waitResult);
			XTLASSERT(FALSE);
		}
	}
}
Beispiel #8
0
static 
VOID
pGetOSVersion(LPDWORD lpdwMajorVersion, LPDWORD lpdwMinorVersion)
{
	XTLASSERT(!IsBadWritePtr(lpdwMajorVersion, sizeof(DWORD)));
	XTLASSERT(!IsBadWritePtr(lpdwMinorVersion, sizeof(DWORD)));

	OSVERSIONINFOEX osvi;
	::ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
	BOOL fSuccess = ::GetVersionEx((OSVERSIONINFO*) &osvi);
	_ASSERT(fSuccess);
	*lpdwMajorVersion = osvi.dwMajorVersion;
	*lpdwMinorVersion = osvi.dwMinorVersion;
}
Beispiel #9
0
BOOL 
CNdasDeviceComm::GetUnitDeviceInformation(PNDAS_UNITDEVICE_HARDWARE_INFO pUnitDevInfo)
{
	XTLASSERT(NULL != m_hNdas && "CNdasDeviceComm is not connected");
	XTLASSERT(pUnitDevInfo != NULL);

	BOOL fSuccess = NdasCommGetUnitDeviceHardwareInfo(m_hNdas, pUnitDevInfo);
	if (!fSuccess)
	{
		DBGPRT_ERR_EX(_FT("NdasCommGetUnitDeviceInfo failed: "));
		return FALSE;
	}

	return TRUE;
}
Beispiel #10
0
DWORD 
CNdasNullUnitDevice::
GetLDSequence() const 
{ 
	XTLASSERT(FALSE);
	return 0;
}
Beispiel #11
0
NDASVOL_LINKAGE
HRESULT
NDASVOL_CALL
NdasIsNdasPathA(
	IN LPCSTR FilePath)
{
	if (IsBadStringPtrA(FilePath, UINT_PTR(-1)))
	{
		XTLTRACE2(NdasVolTrace, TRACE_LEVEL_ERROR,
			"Invalid path, path=%hs\n", FilePath); 
		return E_INVALIDARG;
	}

	XTLTRACE2(NdasVolTrace, 4, "NdasIsNdasPathA(%hs)\n", FilePath);

	int nChars = MultiByteToWideChar(CP_ACP, 0, FilePath, -1, NULL, 0);
	++nChars; // additional terminating NULL char
	XTL::AutoProcessHeapPtr<WCHAR> wszFilePath = reinterpret_cast<LPWSTR>(
		::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, nChars * sizeof(WCHAR)));
	if (wszFilePath.IsInvalid())
	{
		return E_OUTOFMEMORY;
	}

	nChars = MultiByteToWideChar(CP_ACP, 0, FilePath, -1, wszFilePath, nChars);

	XTLASSERT(nChars > 0);

	return NdasIsNdasPathW(wszFilePath);
}
Beispiel #12
0
BOOL
CNdasUnitDeviceCreator::IsConsistentDIB(
    CONST NDAS_DIB_V2* pDIBv2)
{
    XTLASSERT(!IsBadReadPtr(pDIBv2, sizeof(NDAS_DIB_V2)));

    BOOL bConsistent = FALSE;
    const NDAS_DEVICE_ID& deviceID = m_pDevice->GetDeviceId();
    const DWORD unitNo = m_dwUnitNo;

    for (DWORD i = 0; i < pDIBv2->nDiskCount + pDIBv2->nSpareCount  && i < NDAS_MAX_UNITS_IN_V2; ++i)
    {
        C_ASSERT(
            sizeof(deviceID.Node) ==
            sizeof(pDIBv2->UnitDisks[i].MACAddr));

        if (0 == memcmp(
                    deviceID.Node,
                    pDIBv2->UnitDisks[i].MACAddr,
                    sizeof(deviceID.Node)) &&
                unitNo == pDIBv2->UnitDisks[i].UnitNumber)
        {
            bConsistent = TRUE;
        }
    }
    return bConsistent;
}
Beispiel #13
0
DWORD 
CNdasCommandServer::CommandProcessStart(HANDLE hStopEvent)
{
	// 'Param' should be a copy of the 'Param' supplied by the caller
	// If the initiating thread has been abandoned already, Param will
	// be invalidated if it is an automatic object.

	// increment the work item count or 
	// check if stop event is signaled already
	HANDLE waitHandles[] = {hStopEvent, m_hProcSemaphore};
	const DWORD nWaitHandles = RTL_NUMBER_OF(waitHandles);

	DWORD waitResult = ::WaitForMultipleObjects(nWaitHandles, waitHandles, FALSE, INFINITE);
	if (WAIT_OBJECT_0 == waitResult)
	{
		return 0xFFFFFFFF; // stopped without actually starting a work
	}
	else if (WAIT_OBJECT_0 + 1 == waitResult)
	{
		// incremented work item count
		// execute the actual work item
		DWORD ret = ServiceCommand(hStopEvent);
		// decrement the work item count
		XTLVERIFY( ::ReleaseSemaphore(m_hProcSemaphore, 1, NULL) );
		return ret;
	}
	else
	{
		XTLASSERT(FALSE);
		return 0x0000FFFF;
	}
}
Beispiel #14
0
const NDAS_LOGICALDEVICE_GROUP& 
CNdasNullUnitDevice::
GetLDGroup() const
{
	XTLASSERT(FALSE);
	return NDAS_LOGICALDEVICE_GROUP_NONE;
}
Beispiel #15
0
ACCESS_MASK 
CNdasNullUnitDevice::
GetAllowingAccess()
{
	XTLASSERT(FALSE && "Null unit device do not have this property");
	return 0;
}
Beispiel #16
0
LPCGUID
pGetNdasHostGuid()
{
	static LPGUID pHostGuid = NULL;
	static GUID hostGuid;

	if (NULL != pHostGuid) 
	{
		return pHostGuid;
	}

	BOOL fSuccess = _NdasSystemCfg.GetValueEx(
		_T("Host"),
		_T("HostID"),
		&hostGuid,
		sizeof(GUID));

	if (!fSuccess) {
		HRESULT hr = ::CoCreateGuid(&hostGuid);
		XTLASSERT(SUCCEEDED(hr));

		fSuccess = _NdasSystemCfg.SetValueEx(
			_T("Host"),
			_T("HostID"),
			REG_BINARY,
			&hostGuid,
			sizeof(GUID));

	}

	pHostGuid = &hostGuid;
	return pHostGuid;
}
Beispiel #17
0
void
CNdasServiceDeviceEventHandler::
OnDeviceArrival(
	PDEV_BROADCAST_HDR pdbhdr)
{
	XTLASSERT(m_bInitialized);
	XTLTRACE2(NDASSVC_PNP, TRACE_LEVEL_INFORMATION, 
		"OnDeviceArrival: Type %x\n", pdbhdr->dbch_devicetype);

	if (DBT_DEVTYP_DEVICEINTERFACE == pdbhdr->dbch_devicetype) 
	{
		PDEV_BROADCAST_DEVICEINTERFACE pdbcc =
			reinterpret_cast<PDEV_BROADCAST_DEVICEINTERFACE>(pdbhdr);
		
		if (::IsEqualGUID(GUID_DEVINTERFACE_STORAGEPORT, pdbcc->dbcc_classguid))
		{
			OnStoragePortDeviceInterfaceArrival(pdbcc);
		}
		else if (::IsEqualGUID(GUID_DEVINTERFACE_VOLUME, pdbcc->dbcc_classguid))
		{
			OnVolumeDeviceInterfaceArrival(pdbcc);
		}
		else if (::IsEqualGUID(GUID_DEVINTERFACE_DISK, pdbcc->dbcc_classguid))
		{
			OnDiskDeviceInterfaceArrival(pdbcc);
		}
		else if (::IsEqualGUID(GUID_DEVINTERFACE_CDROM, pdbcc->dbcc_classguid))
		{
			OnCdRomDeviceInterfaceArrival(pdbcc);
		}
	}
}
Beispiel #18
0
DWORD
pReadMaxRequestBlockLimitConfig(DWORD hardwareVersion)
{
	const LPCTSTR MAX_REQUEST_BLOCK_LIMIT_KEY = _T("MaxRequestBlockLimit");
	const DWORD MAX_REQUEST_BLOCK_LIMIT_DEFAULT = 128;
	BOOL fSuccess;
	DWORD dwMaxRequestBlockLimit;
	TCHAR szMaxRequestBlockLimitKey[64];
	HRESULT hr = ::StringCchPrintf(
		szMaxRequestBlockLimitKey, 
		RTL_NUMBER_OF(szMaxRequestBlockLimitKey),
		_T("%s.%d"),
		MAX_REQUEST_BLOCK_LIMIT_KEY,
		hardwareVersion);
	XTLASSERT(SUCCEEDED(hr));

	fSuccess = _NdasSystemCfg.GetValueEx(
		_T("ndassvc"),
		szMaxRequestBlockLimitKey,
		&dwMaxRequestBlockLimit);
	if (!fSuccess || 0 == dwMaxRequestBlockLimit)
	{
		// MaxRequestBlockLimit.{Version} is not specified
		// Locate MaxRequestBlockLimit
		fSuccess = _NdasSystemCfg.GetValueEx(
			_T("ndassvc"),
			MAX_REQUEST_BLOCK_LIMIT_KEY,
			&dwMaxRequestBlockLimit);
		if (!fSuccess || 0 == dwMaxRequestBlockLimit)
		{
			dwMaxRequestBlockLimit = MAX_REQUEST_BLOCK_LIMIT_DEFAULT;
		}
	}
	return dwMaxRequestBlockLimit;
}
Beispiel #19
0
UINT64 
CNdasNullUnitDevice::
GetPhysicalBlockCount()
{
	XTLASSERT(FALSE && "Null unit device do not have this property");
	return 0;
}
Beispiel #20
0
STDMETHODIMP
CNdasUnitImpl::get_HardwareInfo(__out PNDAS_UNITDEVICE_HARDWARE_INFO HardwareInfo)
{
	XTLASSERT(!IsBadWritePtr(HardwareInfo, sizeof(NDAS_UNITDEVICE_HARDWARE_INFO)));
	CAutoInstanceLock autolock(this);
	CopyMemory(HardwareInfo, &m_udinfo, sizeof(NDAS_UNITDEVICE_HARDWARE_INFO));
	return S_OK;
}
Beispiel #21
0
CNdasDeviceComm::~CNdasDeviceComm()
{
	if (m_hNdas)
	{
		BOOL fSuccess = Disconnect();
		XTLASSERT(fSuccess && "Disconnect should succeed");
	}
}
HRESULT
CNdasDeviceComm::GetNdasUnitInfo(PNDAS_UNITDEVICE_HARDWARE_INFO pUnitDevInfo)
{
	XTLASSERT(NULL != m_hNdas && "CNdasDeviceComm is not connected");
	XTLASSERT(pUnitDevInfo != NULL);

	BOOL success = NdasCommGetUnitDeviceHardwareInfo(m_hNdas, pUnitDevInfo);
	if (!success)
	{
		HRESULT hr = HRESULT_FROM_WIN32(GetLastError());
		XTLTRACE2(NDASSVC_NDASCOMM, TRACE_LEVEL_ERROR,
			"NdasCommGetUnitDeviceHardwareInfo failed, hr=0x%X\n", hr);
		return hr;
	}

	return S_OK;
}
Beispiel #23
0
void
CNdasServiceDeviceEventHandler::
OnDeviceRemoveComplete(
	PDEV_BROADCAST_HDR pdbhdr)
{
	XTLASSERT(m_bInitialized);
	XTLTRACE2(NDASSVC_PNP, TRACE_LEVEL_INFORMATION, 
		"OnDeviceRemoveComplete: Type %x\n", pdbhdr->dbch_devicetype);

	//
	// RemoveComplete events are reported to 
	// both Device Interface and Device Handle
	//
	// We prefer to handling them in Device Handle
	//

	if (DBT_DEVTYP_DEVICEINTERFACE == pdbhdr->dbch_devicetype) 
	{
		PDEV_BROADCAST_DEVICEINTERFACE pdbcc =
			reinterpret_cast<PDEV_BROADCAST_DEVICEINTERFACE>(pdbhdr);

		XTLTRACE2(NDASSVC_PNP, TRACE_LEVEL_INFORMATION, 
			"OnDeviceRemoveComplete : Interface %ls\n", 
			ximeta::CGuid(&pdbcc->dbcc_classguid).ToString());

		if (::IsEqualGUID(GUID_DEVINTERFACE_STORAGEPORT, pdbcc->dbcc_classguid))
		{
			OnStoragePortDeviceInterfaceRemoveComplete(pdbcc);
		}
		else if (::IsEqualGUID(GUID_DEVINTERFACE_VOLUME, pdbcc->dbcc_classguid))
		{
			OnVolumeDeviceInterfaceRemoveComplete(pdbcc);
		}
		else if (::IsEqualGUID(GUID_DEVINTERFACE_DISK, pdbcc->dbcc_classguid))
		{
			OnDiskDeviceInterfaceRemoveComplete(pdbcc);
		}
		else if (::IsEqualGUID(GUID_DEVINTERFACE_CDROM, pdbcc->dbcc_classguid))
		{
			OnCdRomDeviceInterfaceRemoveComplete(pdbcc);
		}
	} 
	else if (DBT_DEVTYP_HANDLE == pdbhdr->dbch_devicetype) 
	{

		PDEV_BROADCAST_HANDLE pdbch =
			reinterpret_cast<PDEV_BROADCAST_HANDLE>(pdbhdr);

		XTLTRACE2(NDASSVC_PNP, TRACE_LEVEL_INFORMATION, 
			"OnDeviceRemoveComplete: Handle %p, Notify Handle %p\n",
			pdbch->dbch_handle, pdbch->dbch_hdevnotify);

		OnDeviceHandleRemoveComplete(pdbch);
	}

	// TODO: Set Logical Device Status (LDS_UNMOUNTED)
}
Beispiel #24
0
CNdasService* 
CNdasService::CreateInstance()
{
	WSADATA wsaData;
	XTLVERIFY(SOCKET_ERROR != WSAStartup(MAKEWORD(2,2),&wsaData) );
	XTLASSERT(NULL == CNdasService::instance);
	CNdasService::instance = new CNdasService();
	return CNdasService::instance;
}
Beispiel #25
0
void 
CNdasUnitDevice::GetHardwareInfo(PNDAS_UNITDEVICE_HARDWARE_INFO pudinfo)
{
	XTLASSERT(!IsBadWritePtr(pudinfo, sizeof(NDAS_UNITDEVICE_HARDWARE_INFO)));
	{
		InstanceAutoLock autolock(this);
		::CopyMemory(pudinfo, &m_udinfo, sizeof(NDAS_UNITDEVICE_HARDWARE_INFO));
	}
}
Beispiel #26
0
STDMETHODIMP
CNdasUnitImpl::GetHostUsageCount (
	LPDWORD lpnROHosts, 
	LPDWORD lpnRWHosts, 
	BOOL	fUpdate
	)
{
	XTLASSERT(!IsBadWritePtr(lpnROHosts, sizeof(DWORD)));
	XTLASSERT(!IsBadWritePtr(lpnRWHosts, sizeof(DWORD)));

	CComPtr<INdasDevice> pNdasDevice = m_pParentNdasDevice;

	if (fUpdate) {

		HRESULT hr = pNdasDevice->UpdateStats();
		
		if (FAILED(hr)) {

			XTLTRACE2(NDASSVC_NDASUNITDEVICE, TRACE_LEVEL_ERROR,
				"Update device status failed, hr=0x%X\n", hr);
			
			return hr;
		}
	}

	NDAS_DEVICE_STAT dstat;

	HRESULT hr = pNdasDevice->get_DeviceStat(&dstat);

	if (FAILED(hr)) {

		return hr;
	}

	*lpnROHosts = dstat.UnitDevices[m_unitDeviceId.UnitNo].RoHostCount;
	*lpnRWHosts = dstat.UnitDevices[m_unitDeviceId.UnitNo].RwHostCount;

	NdasUiDbgCall( 2, "Host Usage Count: RO=%d, RW=%d.\n", *lpnROHosts, *lpnRWHosts );

	ATLASSERT( *lpnRWHosts != NDAS_HOST_COUNT_UNKNOWN );
	ATLASSERT( *lpnRWHosts != NDAS_HOST_COUNT_UNKNOWN );

	return S_OK;
}
Beispiel #27
0
BOOL
CNdasDeviceComm::ReadDiskBlock(PBYTE pBlockBuffer, INT64 i64DiskBlock, INT32 i32BlockSize)
{
	XTLASSERT(NULL != m_hNdas && "CNdasDeviceComm is not connected");
	XTLASSERT(pBlockBuffer != NULL);
	XTLASSERT(i32BlockSize >= 1 && i32BlockSize <= 128);
	XTLASSERT(!::IsBadWritePtr(pBlockBuffer, i32BlockSize * 512));

	BOOL fSuccess = NdasCommBlockDeviceRead(
		m_hNdas, i64DiskBlock, i32BlockSize, pBlockBuffer);

	if (!fSuccess)
	{
		DBGPRT_ERR_EX(_FT("NdasCommBlockDeviceRead failed: "));
		return FALSE;
	}

	return TRUE;
}
Beispiel #28
0
CNdasHostInfoCache*
pGetNdasHostInfoCache()
{
	static CNdasHostInfoCache* phi = NULL;
	if (NULL != phi) {
		return phi;
	}
	phi = new CNdasHostInfoCache();
	XTLASSERT(NULL != phi);
	return phi;
}
Beispiel #29
0
BOOL
CNdasDeviceComm::GetDiskInfoBlock(PNDAS_DIB pDiskInfoBlock)
{
	XTLASSERT(NULL != m_hNdas && "CNdasDeviceComm is not connected");
	XTLASSERT(pDiskInfoBlock != NULL && "INVALID PARAMETER");

	//
	// Read Last Sector for NDAS_UNITDISK_INFORMATION_BLOCK
	//
	BOOL fSuccess = NdasCommBlockDeviceRead(
		m_hNdas, -1, 1, 
		reinterpret_cast<LPBYTE>(pDiskInfoBlock));

	if (!fSuccess)
	{
		DBGPRT_ERR_EX(_FT("NdasCommBlockDeviceRead failed: "));
		return FALSE;
	}

	return TRUE;
}
void
CNdasEventMonitor::OnLogicalDeviceAlarmedByPnP(
	__in INdasLogicalUnit* pNdasLogicalUnit, 
	__in ULONG NewAdapterStatus)
{
	NDAS_LOCATION ndasLocation;
	COMVERIFY(pNdasLogicalUnit->get_Id(&ndasLocation));

	XTLTRACE2(NDASSVC_EVENTMON, TRACE_LEVEL_INFORMATION,
		"Alarm Event, ndasLocation=%08X, logicalUnit=%p\n", 
		ndasLocation, pNdasLogicalUnit);

	if (0 == ndasLocation) 
	{
		XTLTRACE2(NDASSVC_EVENTMON, TRACE_LEVEL_ERROR,
			"Invalid SCSI Location\n");
		XTLASSERT(FALSE);
		return;
	}

	XTLTRACE2(NDASSVC_EVENTMON, TRACE_LEVEL_INFORMATION,
		"Logical device alarmed by PnP, ndasLocation=%08X, adapterStatus=%08X.\n", 
		ndasLocation, NewAdapterStatus);

	// Determine whether an alarm will be issued.
	// Only viable alarm will be published
	ULONG currentAdapterStatus;
	COMVERIFY(pNdasLogicalUnit->get_AdapterStatus(&currentAdapterStatus));

	if (pIsViableAlarmStatus(currentAdapterStatus, NewAdapterStatus))
	{
		CNdasEventPublisher& epub = pGetNdasEventPublisher();

		if (ADAPTERINFO_ISSTATUS(NewAdapterStatus, NDASSCSI_ADAPTER_STATUS_STOPPED) &&
			ADAPTERINFO_ISSTATUSFLAG(NewAdapterStatus, NDAS_DEVICE_ALARM_STATUSFLAG_ABNORMAL_TERMINAT))
		{
			//
			// Notify abnormal removal of the LU device.
			//
			OnLogicalDeviceDisconnected(pNdasLogicalUnit);
		}
		else
		{
			NDAS_LOGICALDEVICE_ID logicalUnitId;
			COMVERIFY(pNdasLogicalUnit->get_Id(&logicalUnitId));
			(void) epub.LogicalDeviceAlarmed(
				logicalUnitId, 
				pGetSignificantAlarm(currentAdapterStatus, NewAdapterStatus));
		}
	}

	COMVERIFY(pNdasLogicalUnit->put_AdapterStatus(NewAdapterStatus));
}