// // Constructor for a multiple member logical device // CNdasLogicalDevice::CNdasLogicalDevice( NDAS_LOGICALDEVICE_ID logDevId, CONST NDAS_LOGICALDEVICE_GROUP& ldGroup) : m_logicalDeviceId(logDevId), m_nUnitDeviceInstances(0), m_status(NDAS_LOGICALDEVICE_STATUS_NOT_INITIALIZED), m_lastError(NDAS_LOGICALDEVICE_ERROR_NONE), m_dwMountedDriveSet(0), m_MountedAccess(0), m_hAlarmEvent(NULL), m_hDisconnectedEvent(NULL), m_bReconnecting(FALSE), m_fDisconnected(FALSE), m_fMountOnReady(FALSE), m_fReducedMountOnReadyAccess(FALSE), m_mountOnReadyAccess(0), m_fRiskyMount(FALSE), m_dwMountTick(0), m_dwCurrentMRB(0), m_logicalDeviceGroup(ldGroup), m_NdasScsiLocation(0), m_fShutdown(FALSE), m_ulAdapterStatus(ADAPTERINFO_STATUS_INIT) { // // Clear out unit device instances // ::ZeroMemory( m_pUnitDevices, sizeof(CNdasUnitDevice*) * MAX_NDAS_LOGICALDEVICE_GROUP_MEMBER); // // Locate Registry Container based on its hash value // cpLocateRegContainer(); DBGPRT_TRACE(_FT("%s\n"), ToString()); }
CNdasUnitDiskDevice::CNdasUnitDiskDevice( CNdasDevice& parentDevice, DWORD dwUnitNo, NDAS_UNITDEVICE_DISK_TYPE diskType, CONST NDAS_UNITDEVICE_INFORMATION& unitDevInfo, CONST NDAS_LOGICALDEVICE_GROUP& ldGroup, DWORD ldSequence, ULONG ulUserBlocks, PVOID pAddTargetInfo, CONST NDAS_CONTENT_ENCRYPT& contentEncrypt, NDAS_DIB_V2* pDIBv2) : m_ulUserBlocks(ulUserBlocks), m_pAddTargetInfo(pAddTargetInfo), m_contentEncrypt(contentEncrypt), m_pDIBv2(pDIBv2), m_diskType(diskType), CNdasUnitDevice( parentDevice, dwUnitNo, NDAS_UNITDEVICE_TYPE_DISK, CreateNdasUnitDeviceSubType(diskType), unitDevInfo, ldGroup, ldSequence) { // // m_pDIBv2 and m_pAddTargetInfo will be deleted // by this class on destruction // _ASSERTE( (NDAS_CONTENT_ENCRYPT_METHOD_NONE == m_contentEncrypt.Method && m_contentEncrypt.KeyLength == 0) || (NDAS_CONTENT_ENCRYPT_METHOD_NONE != m_contentEncrypt.Method && m_contentEncrypt.KeyLength > 0)); DBGPRT_TRACE(_FT("ctor: %s\n"), ToString()); }
// // Destructor // CNdasUnitDevice::~CNdasUnitDevice() { DBGPRT_TRACE(_FT("dtor: %s\n"), ToString()); }
CNdasLogicalDeviceManager::~CNdasLogicalDeviceManager() { DBGPRT_TRACE(_FT("dtor\n")); }
CNdasLogicalDeviceManager::CNdasLogicalDeviceManager() : m_slotbitset(1) // first bit (slot 0) is always occupied and reserved. { DBGPRT_TRACE(_FT("ctor\n")); }
BOOL WINAPI NdasDmGetScsiPortNumberOfDisk( IN HANDLE hDisk, OUT LPDWORD lpdwScsiPortNumber) { _ASSERTE(!IsBadWritePtr(lpdwScsiPortNumber, sizeof(DWORD))); BOOL fSuccess(FALSE); DWORD cbReturned(0); // // Query Storage Property // STORAGE_PROPERTY_QUERY storPropQuery; STORAGE_ADAPTER_DESCRIPTOR storAdptDesc; DWORD cbStorPropQuery = sizeof(STORAGE_PROPERTY_QUERY); DWORD cbStorAdptDesc = sizeof(STORAGE_ADAPTER_DESCRIPTOR); DBGPRT_TRACE(_FT("DeviceIoControl(IOCTL_STORAGE_QUERY_PROPERTY)\n")); ::ZeroMemory(&storPropQuery, cbStorPropQuery); storPropQuery.PropertyId = StorageAdapterProperty; storPropQuery.QueryType = PropertyStandardQuery; fSuccess = ::DeviceIoControl( hDisk, IOCTL_STORAGE_QUERY_PROPERTY, &storPropQuery, cbStorPropQuery, &storAdptDesc, cbStorAdptDesc, &cbReturned, NULL); if (!fSuccess) { DBGPRT_ERR_EX(_FT("DeviceIoControl(IOCTL_STORAGE_QUERY_PROPERTY) failed: ")); return FALSE; } // // Ignore non-SCSI device // if (BusTypeScsi != storAdptDesc.BusType) { DBGPRT_INFO(_FT("Ignoring non-scsi bus\n")); ::SetLastError(NDASDM_ERROR_NON_SCSI_TYPE_DEVICE); return FALSE; } // // Query SCSI Address, given that the physical drive is a SCSI device // SCSI_ADDRESS scsiAddress; DWORD cbScsiAddress = sizeof(SCSI_ADDRESS); DBGPRT_TRACE(_FT("DeviceIoControl(IOCTL_SCSI_GET_ADDRESS)\n")); fSuccess = ::DeviceIoControl( hDisk, IOCTL_SCSI_GET_ADDRESS, NULL, 0, &scsiAddress, cbScsiAddress, &cbReturned, NULL); if (!fSuccess) { DBGPRT_ERR_EX(_FT("DeviceIoControl(IOCTL_SCSI_GET_ADDRESS) failed: ")); return FALSE; } DBGPRT_INFO(_FT("SCSIAddress: Len: %d, PortNumber: %d, PathId: %d, TargetId: %d, Lun: %d\n"), (DWORD) scsiAddress.Length, (DWORD) scsiAddress.PortNumber, (DWORD) scsiAddress.PathId, (DWORD) scsiAddress.TargetId, (DWORD) scsiAddress.Lun); // // Return the result // *lpdwScsiPortNumber = scsiAddress.PortNumber; return TRUE; }
BOOL WINAPI NdasDmGetDiskNumbersOfVolume( HANDLE hVolume, LPDWORD pDiskNumbers, DWORD dwDiskNumbers, LPDWORD lpdwDiskNumbersUsed) { BOOL fSuccess(FALSE); DWORD cbReturned(0); // // Prepare Volume Disk Extent Buffer // DWORD cbVolumeDiskExtents = sizeof(VOLUME_DISK_EXTENTS) + MAX_VOL_DISK_EXTS * sizeof(VOLUME_DISK_EXTENTS); PVOLUME_DISK_EXTENTS pVolumeDiskExtents = (PVOLUME_DISK_EXTENTS) ::HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cbVolumeDiskExtents); if (NULL == pVolumeDiskExtents) { DBGPRT_ERR_EX(_FT("Memory allication (%d bytes) failed: "), cbVolumeDiskExtents); return FALSE; } // // Get Volume Disk Extents // DBGPRT_TRACE(_FT("DeviceIoControl(IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS)\n")); fSuccess = ::DeviceIoControl( hVolume, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0, pVolumeDiskExtents, cbVolumeDiskExtents, &cbReturned, NULL); if (!fSuccess) { DBGPRT_ERR_EX(_FT("DeviceIoControl(IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS) failed: ")); ::HeapFree(::GetProcessHeap(), 0, pVolumeDiskExtents); return FALSE; } // // usually it returns one disk device // *lpdwDiskNumbersUsed = 0; for (DWORD i = 0; i < pVolumeDiskExtents->NumberOfDiskExtents; ++i) { DBGPRT_INFO(_FT("Extents[%d]:: Disk Number: %d, Starting Offset: %d, Extent Length: %d.\n"), i, pVolumeDiskExtents->Extents[i].DiskNumber, pVolumeDiskExtents->Extents[i].StartingOffset, pVolumeDiskExtents->Extents[i].ExtentLength); if (i < dwDiskNumbers) { pDiskNumbers[i] = pVolumeDiskExtents->Extents[i].DiskNumber; ++(*lpdwDiskNumbersUsed); } } ::HeapFree(::GetProcessHeap(), 0, pVolumeDiskExtents); return TRUE; }