예제 #1
0
//
// 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());
}
예제 #2
0
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());
}
예제 #3
0
//
// Destructor
//
CNdasUnitDevice::~CNdasUnitDevice()
{
	DBGPRT_TRACE(_FT("dtor: %s\n"), ToString());
}
예제 #4
0
CNdasLogicalDeviceManager::~CNdasLogicalDeviceManager()
{
	DBGPRT_TRACE(_FT("dtor\n"));
}
예제 #5
0
CNdasLogicalDeviceManager::CNdasLogicalDeviceManager() :
	m_slotbitset(1) // first bit (slot 0) is always occupied and reserved.
{
	DBGPRT_TRACE(_FT("ctor\n"));
}
예제 #6
0
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;
}
예제 #7
0
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;
}