ACCESS_MASK CNdasLogicalDevice::GetGrantedAccess() { ximeta::CAutoLock autolock(this); if (0 == GetUnitDeviceCount()) { return 0x00000000L; } ACCESS_MASK access(0xFFFFFFFFL); // // Any single missing entry will revoke all accesses // for (DWORD i = 0; i < GetUnitDeviceCount(); ++i) { CRefObjPtr<CNdasUnitDevice> pUnitDevice = GetUnitDevice(i); if (NULL == pUnitDevice.p) { return 0x00000000L; } access &= pUnitDevice->GetGrantedAccess(); } return access; }
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(NDASSVC_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(); // internal pointer reference m_LDGroupMap.insert(LDGroupMap::value_type(ldGroup, pLogDevice)); m_LDIDMap.insert(LDIDMap::value_type(id, pLogDevice)); CRefObjPtr<CNdasDevice> pDevice = unitDevice.GetParentDevice(); _ASSERTE(NULL != pDevice.p); 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; } if (NULL != pLogDevice) pLogDevice->AddRef(); // external pointer reference return pLogDevice; }