예제 #1
0
HRESULT 
CNdasUnitImpl::ImplInitialize(
	__in INdasDevice* pNdasDevice, 
	__in DWORD UnitNo,
	__in NDAS_UNITDEVICE_TYPE Type,
	__in NDAS_UNITDEVICE_SUBTYPE SubType,
	__in const NDAS_UNITDEVICE_HARDWARE_INFO& HardwareInfo,
	__in const NDAS_LOGICALUNIT_DEFINITION& NdasLogicalUnitDefinition,
	__in DWORD LuSequence)
{
	m_pParentNdasDevice = pNdasDevice;
	m_unitDeviceId = pCreateUnitDeviceId(pNdasDevice,UnitNo);
	m_type = Type;
	m_subType = SubType;
	m_status = NDAS_UNITDEVICE_STATUS_NOT_MOUNTED;
	m_lastError = NDAS_UNITDEVICE_ERROR_NONE;
	m_udinfo = HardwareInfo;
	m_NdasLogicalUnitDefinition = NdasLogicalUnitDefinition;
	m_NdasLogicalUnitSequence = LuSequence;

	XTLTRACE2(NDASSVC_NDASUNITDEVICE, TRACE_LEVEL_INFORMATION,
		"NdasUnit=%p, %s\n", this, CNdasUnitDeviceId(m_unitDeviceId).ToStringA());

	DWORD slotNo;
	COMVERIFY(pNdasDevice->get_SlotNo(&slotNo));

	COMVERIFY( StringCchPrintf(
		m_szRegContainer,
		30,
		_T("Devices\\%04d\\%04d"),
		slotNo,
		m_unitDeviceId.UnitNo));

	return S_OK;
}
예제 #2
0
STDMETHODIMP 
CNdasDiskUnit::IsBitmapClean()
{
	CAutoInstanceLock autolock(this);

	CNdasDeviceComm devComm(m_pParentNdasDevice, m_unitDeviceId.UnitNo);

	HRESULT hr = devComm.Connect(FALSE);
	if (FAILED(hr)) 
	{
		return hr;
	}

	NDAS_UNITDEVICE_HARDWARE_INFO udinfo = {0};
	udinfo.Size = sizeof(NDAS_UNITDEVICE_HARDWARE_INFO);
	hr = devComm.GetNdasUnitInfo(&udinfo);
	if (FAILED(hr)) 
	{
		XTLTRACE2(NDASSVC_NDASUNITDEVICE, TRACE_LEVEL_ERROR,
			"GetUnitDeviceInformation of %s failed, error=0x%X\n", 
			CNdasUnitDeviceId(m_unitDeviceId).ToStringA(), hr);
		return hr;
	}

	BYTE BitmapData[128 * 512] = {0};

	// 1MB from NDAS_BLOCK_LOCATION_BITMAP
	for (INT i = 0; i < 16; i++)  
	{
		hr = devComm.ReadDiskBlock(
			BitmapData, 
			NDAS_BLOCK_LOCATION_BITMAP + (i * 128), 
			128);

		if (FAILED(hr)) 
		{
			return hr;
		}

		PULONG pBitmapData = (PULONG)BitmapData;
		for (INT j = 0; j < 128 * 512 / 4; ++j) 
		{
			if (*pBitmapData) 
			{
				return E_FAIL;
			}
			pBitmapData++;
		}
	}	

	return S_OK;
}
예제 #3
0
VOID 
CNdasLogicalDevice::SetStatus(NDAS_LOGICALDEVICE_STATUS newStatus)
{
	ximeta::CAutoLock autolock(this);

	//
	// Ignore duplicate status change
	//
	if (m_status == newStatus) {
		return;
	}

	NDAS_LOGICALDEVICE_STATUS oldStatus = m_status;

	BOOL fValid = pCheckStatusValidity(m_status, newStatus);
	_ASSERTE(fValid);

	m_status = newStatus;

	// Update Unit Device Status
	for (DWORD i = 0; i < GetUnitDeviceCount(); ++i) {

		CRefObjPtr<CNdasUnitDevice> pUnitDevice = GetUnitDevice(i);

		if (NULL == pUnitDevice.p) {
			DBGPRT_ERR(_FT("Unit Device %s is not found.\n"),
				CNdasUnitDeviceId(GetUnitDeviceID(i)).ToString());
			continue;
		}

		//
		// TODO: Create a status updater with observer
		//

		switch (m_status) {
		case NDAS_LOGICALDEVICE_STATUS_MOUNTED:
		case NDAS_LOGICALDEVICE_STATUS_MOUNT_PENDING:
		case NDAS_LOGICALDEVICE_STATUS_UNMOUNT_PENDING:
			pUnitDevice->SetStatus(NDAS_UNITDEVICE_STATUS_MOUNTED);
			break;
		default:
			// otherwise
			pUnitDevice->SetStatus(NDAS_UNITDEVICE_STATUS_NOT_MOUNTED);
		}

	}
	
	// publish a status change event
	(VOID) pGetNdasEventPublisher()->
		LogicalDeviceStatusChanged(m_logicalDeviceId, oldStatus, newStatus);

}
예제 #4
0
HRESULT 
CNdasDiskUnit::UnitInitialize(
	__in INdasDevice* pNdasDevice, 
	__in DWORD UnitNo, 
	__in NDAS_DISK_UNIT_TYPE DiskType, 
	__in const NDAS_UNITDEVICE_HARDWARE_INFO& HardwareInfo, 
	__in const NDAS_LOGICALUNIT_DEFINITION& NdasLogicalUnitDefinition,
	__in DWORD LuSequence,
	__in UINT64 UserBlocks,
	__in PVOID pRaidInfo,
	__in const NDAS_CONTENT_ENCRYPT& Encryption,
	__in NDAS_DIB_V2* pDIBv2,
	__in BLOCK_ACCESS_CONTROL_LIST *pBlockAcl)
{
	HRESULT hr = CNdasUnitImpl::ImplInitialize(
		pNdasDevice, UnitNo, NDAS_UNITDEVICE_TYPE_DISK, 
		CreateSubType(DiskType),
		HardwareInfo,
		NdasLogicalUnitDefinition,
		LuSequence);

	if (FAILED(hr))
	{
		ATLASSERT(FALSE);
		return hr;
	}

	ATLASSERT(NULL != pDIBv2);

	m_ulUserBlocks = UserBlocks;
	m_pNdasLogicalUnitRaidInfo.Attach(pRaidInfo);
	m_contentEncrypt = Encryption;
	m_pDIBv2.Attach(pDIBv2);
	m_pBACL.Attach(pBlockAcl);
	m_diskType = DiskType;

	//
	// m_pDIBv2 and m_pAddTargetInfo will be deleted 
	// by this class on destruction
	//
	XTLASSERT(
	(NDAS_CONTENT_ENCRYPT_METHOD_NONE == m_contentEncrypt.Method &&
	m_contentEncrypt.KeyLength == 0) ||
	(NDAS_CONTENT_ENCRYPT_METHOD_NONE != m_contentEncrypt.Method &&
	m_contentEncrypt.KeyLength > 0));

	XTLTRACE2(NDASSVC_NDASUNITDEVICE, TRACE_LEVEL_VERBOSE, 
		"%s\n", CNdasUnitDeviceId(m_unitDeviceId).ToStringA());

	return S_OK;
}
예제 #5
0
LPCTSTR 
CNdasLogicalDevice::ToString()
{
	ximeta::CAutoLock autolock(this);

	LPTSTR pszNext = m_szStringRep;
	size_t cchRemaining = MAX_STRING_REP;

	HRESULT hr = ::StringCchPrintfEx(
		pszNext, cchRemaining,
		&pszNext, &cchRemaining, STRSAFE_IGNORE_NULLS,
		TEXT("[%02X]: %s(%d) ["),
		m_logicalDeviceId,
		(NdasLogicalDeviceTypeString(GetType()) + 24), // remove prefix
		GetUnitDeviceCount());
	
	_ASSERTE(SUCCEEDED(hr) || STRSAFE_E_INSUFFICIENT_BUFFER == hr);

	if (STRSAFE_E_INSUFFICIENT_BUFFER == hr) 
	{
		return m_szStringRep;
	}

	for (DWORD i = 0; i < GetUnitDeviceCount(); ++i) 
	{
		hr = ::StringCchPrintfEx(
			pszNext, cchRemaining,
			&pszNext, &cchRemaining, STRSAFE_IGNORE_NULLS,
			TEXT("%s(%p) "),
			CNdasUnitDeviceId(GetUnitDeviceID(i)).ToString(),
			m_pUnitDevices[i]);

		_ASSERTE(SUCCEEDED(hr) || STRSAFE_E_INSUFFICIENT_BUFFER == hr);

		if (STRSAFE_E_INSUFFICIENT_BUFFER == hr) 
		{
			return m_szStringRep;
		}
	}

	hr = ::StringCchPrintfEx(
		pszNext, cchRemaining,
		&pszNext, &cchRemaining, STRSAFE_IGNORE_NULLS,
		TEXT("]"));
	
	_ASSERTE(SUCCEEDED(hr) || STRSAFE_E_INSUFFICIENT_BUFFER == hr);

	return m_szStringRep;
}
예제 #6
0
CNdasUnitDevice::CNdasUnitDevice(
	CNdasDevice& parentDevice, 
	DWORD dwUnitNo, 
	NDAS_UNITDEVICE_TYPE type,
	NDAS_UNITDEVICE_SUBTYPE subType,
	CONST NDAS_UNITDEVICE_INFORMATION& unitDeviceInfo,
	CONST NDAS_LOGICALDEVICE_GROUP& ldGroup,
	DWORD ldSequence) :
	m_unitDeviceId(pCreateUnitDeviceId(parentDevice,dwUnitNo)),
	m_pParentDevice(&parentDevice),
	m_type(type),
	m_subType(subType),
	m_status(NDAS_UNITDEVICE_STATUS_NOT_MOUNTED),
	m_lastError(NDAS_UNITDEVICE_ERROR_NONE),
	m_devInfo(unitDeviceInfo),
	m_ldGroup(ldGroup),
	m_ldSequence(ldSequence),
	m_pLogicalDevice(NULL),
	m_bSupposeFault(FALSE)
{
	::ZeroMemory(
		&m_PrimaryHostInfo, 
		sizeof(NDAS_UNITDEVICE_PRIMARY_HOST_INFO));

	HRESULT hr = ::StringCchPrintf(
		m_szRegContainer,
		30,
		_T("Devices\\%04d\\%04d"),
		m_pParentDevice->GetSlotNo(),
		m_unitDeviceId.UnitNo);

	_ASSERTE(SUCCEEDED(hr));

	hr = ::StringCchPrintf(
		m_szStrBuf, 
		CCH_STR_BUF,
		_T("%s"),
		CNdasUnitDeviceId(m_unitDeviceId).ToString());

	_ASSERTE(SUCCEEDED(hr));

	DBGPRT_TRACE(_FT("ctor: %s\n"), ToString());
}
예제 #7
0
void 
CNdasDiskUnit::FinalRelease()
{
	XTLTRACE2(NDASSVC_NDASUNITDEVICE, TRACE_LEVEL_INFORMATION,
		"NdasDiskUnit=%p, %s\n", this, CNdasUnitDeviceId(m_unitDeviceId).ToStringA());
}