示例#1
0
CNdasLogicalDevice* 
CNdasLogicalDeviceManager::Register(CNdasUnitDevice& unitDevice)
{
	ximeta::CAutoLock autolock(this);

	CONST NDAS_LOGICALDEVICE_GROUP& ldGroup = unitDevice.GetLDGroup();
	DWORD ldSequence = unitDevice.GetLDSequence();

	CNdasLogicalDevice* pLogDevice = NULL;
	LDGroupMap::iterator itr = m_LDGroupMap.find(ldGroup);

	if (itr == m_LDGroupMap.end()) {
		//
		// New Logical Device Instance
		//
		NDAS_LOGICALDEVICE_ID id = cpAllocateID();
		if (0 == id) {
			// SLOT FULL
			::SetLastError(NDASHLPSVC_ERROR_LOGICALDEVICE_SLOT_FULL);
			return NULL;
		}

		pLogDevice = new CNdasLogicalDevice(id, ldGroup);
		if (NULL == pLogDevice) {
			::SetLastError(ERROR_OUTOFMEMORY);
			return NULL;
		}
		BOOL fSuccess = pLogDevice->Initialize();
		if (!fSuccess) {
			delete pLogDevice;
			return NULL;
		}
		pLogDevice->AddRef();
		m_LDGroupMap.insert(LDGroupMap::value_type(ldGroup, pLogDevice));
		m_LDIDMap.insert(LDIDMap::value_type(id, pLogDevice));

		CNdasDevice* pDevice = unitDevice.GetParentDevice();
		if (pDevice->IsAutoRegistered()) {
			pLogDevice->SetMountOnReady(pDevice->GetGrantedAccess());
			// auto registered devices always ignore RiskyMountFlag
			pLogDevice->SetRiskyMountFlag(FALSE);
		}

	} else {
		pLogDevice = itr->second;
	}

	BOOL fSuccess = pLogDevice->AddUnitDevice(unitDevice);
	_ASSERTE(fSuccess);
	if (!fSuccess) {
		return NULL;
	}

	pLogDevice->AddRef();
	return pLogDevice;
}
示例#2
0
// not used at this time (reserved for the future use)
void 
CNdasDeviceRegistrar::pDeleteAutoRegistered(
	const DeviceSlotMap::value_type& entry)
{
	DWORD dwSlotNo = entry.first;
	CNdasDevice* pDevice = entry.second;
	if (pDevice->IsAutoRegistered())
	{
		TCHAR szContainer[30];
		HRESULT hr = ::StringCchPrintf(
			szContainer, 
			30, 
			_T("Devices\\%04d"), 
			dwSlotNo);
		_ASSERT(SUCCEEDED(hr));

		BOOL fSuccess = _NdasSystemCfg.DeleteContainer(szContainer, TRUE);

	}
}