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; }
// 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); } }