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; }
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; }
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); }
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; }
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; }
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()); }
void CNdasDiskUnit::FinalRelease() { XTLTRACE2(NDASSVC_NDASUNITDEVICE, TRACE_LEVEL_INFORMATION, "NdasDiskUnit=%p, %s\n", this, CNdasUnitDeviceId(m_unitDeviceId).ToStringA()); }