📄 diskmain.cpp
字号:
m_dwDeviceFlags |=DFLAGS_DEVICE_CDROM;
}
DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:Identify Completed Stage 1 Status=%02X\r\n"),GetAltStatus()));
m_dwDeviceFlags |= DFLAGS_DEVICE_PRESENT;
m_dwDeviceFlags |= (IsAtapiDevice()) ? DFLAGS_ATAPI_DEVICE : 0;
m_dwDeviceFlags |= (IsRemoveableDevice()) ? DFLAGS_REMOVABLE_DRIVE : 0;
AnalyzeDeviceCapabilities();
SetBestTransferMode();
if (IsAtapiDevice())
{
// TODO:
// AtapiSetInfo();
} else {
//
// Set Multiple Mode if ATA Device
//
m_bSectorsPerBlock= 1;
}
m_fLBAMode = (m_Id.Capabilities & 0x0200) ? TRUE : FALSE;
// m_fLBAMode = TRUE;
DWORD dwCHS = 0;
if (AtaGetRegistryValue(m_hDevKey, REG_VALUE_CHS, &dwCHS) && (dwCHS == 1)) {
m_fLBAMode = FALSE;
}
// if (!(m_Id.GeneralConfiguration & 0x8000)) {
if (!IsAtapiDevice()) {
m_bReadCommand = ATA_CMD_READ ;
m_bWriteCommand = ATA_CMD_WRITE ;
if (m_Id.MaximumBlockTransfer != 0){
SelectDevice();
WriteSectorCount( (BYTE)m_Id.MaximumBlockTransfer) ;
WriteCommand(ATA_CMD_SET_MULTIPLE);
if (!WaitOnBusy(FALSE) && (GetAltStatus() & ATA_STATUS_READY)) {
m_bReadCommand = ATA_CMD_MULTIPLE_READ ;
m_bWriteCommand = ATA_CMD_MULTIPLE_WRITE ;
m_bSectorsPerBlock = m_Id.MaximumBlockTransfer;
}
}
DEBUGMSG( ZONE_INIT, (TEXT("ATAPI: Idenitfy - MultipleMode Set to= %ld Sectors\r\n"),m_Id.MaximumBlockTransfer));
}
m_DiskInfo.di_bytes_per_sect = BYTES_PER_SECTOR; // Start with 512, then go with SetInfo changes
if (m_Id.NumberOfCurrentCylinders) {
m_DiskInfo.di_cylinders = m_Id.NumberOfCylinders;
} else {
if (!AtaGetRegistryValue(m_hDevKey, TEXT("Cylinders"), &(m_DiskInfo.di_cylinders))) {
AtaGetRegistryValue(m_hDevKey, TEXT("Cyl"), &(m_DiskInfo.di_cylinders));
}
}
if (m_Id.NumberOfCurrentHeads) {
m_DiskInfo.di_heads = m_Id.NumberOfCurrentHeads;
} else {
AtaGetRegistryValue(m_hDevKey, TEXT("Heads"), &(m_DiskInfo.di_heads));
}
if (m_Id.CurrentSectorsPerTrack) {
m_DiskInfo.di_sectors = m_Id.CurrentSectorsPerTrack;
} else {
if (!AtaGetRegistryValue(m_hDevKey, TEXT("SectorsPerTrack"), &(m_DiskInfo.di_sectors))) {
AtaGetRegistryValue(m_hDevKey, TEXT("spt"), &(m_DiskInfo.di_sectors)); // Shortcut for dev
}
}
if (m_Id.TotalUserAddressableSectors) {
m_DiskInfo.di_total_sectors = m_Id.TotalUserAddressableSectors;
} else {
// m_DiskInfo.di_total_sectors= m_Id.NumberOfCylinders*m_Id.NumberOfCurrentHeads*m_Id.CurrentSectorsPerTrack;
m_DiskInfo.di_total_sectors= m_DiskInfo.di_cylinders*m_DiskInfo.di_heads*m_DiskInfo.di_sectors;
}
m_DiskInfo.di_flags = DISK_INFO_FLAG_MBR;
DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:Identify Completed Stage 2 Status=%02X\r\n"),GetAltStatus()));
return TRUE;
}
/*------------------------------------------------------------------------------------------*/
void CDisk::AnalyzeDeviceCapabilities ()
{
DWORD dwCycleTime;
DWORD dwXferMode;
DWORD dwBestXferMode;
DWORD dwCurrentMode;
BOOL fIoReadyEnabled;
//
// Figure out who can do DMA and who cannot
//
if (m_dwDeviceFlags & DFLAGS_DEVICE_PRESENT) {
//
// check LBA capabilities
//
//CLRMASK (m_dwDeviceFlags, DFLAGS_LBA);
dwXferMode = 0;
dwCycleTime = UNINITIALIZED_CYCLE_TIME;
dwBestXferMode = 0;
//
// check for IoReady Line
//
if (m_Id.Capabilities & IDENTIFY_CAPABILITIES_IOREADY_SUPPORTED) {
fIoReadyEnabled = TRUE;
} else {
fIoReadyEnabled = FALSE;
}
//
// Check for PIO mode
//
if ((m_Id.MinimumPIOxferTimeWOFlow & 0x00ff) == 2) {
dwCycleTime = PIO_MODE2_CYCLE_TIME;
dwXferMode |= PIO_MODE2 | PIO_MODE1 | PIO_MODE0;
dwBestXferMode = 2;
dwCurrentMode = PIO_MODE2;
} else if ((m_Id.MinimumPIOxferTimeWOFlow & 0x00ff) == 1) {
dwCycleTime = PIO_MODE1_CYCLE_TIME;
dwXferMode |= PIO_MODE1 | PIO_MODE0;
dwBestXferMode = 1;
dwCurrentMode = PIO_MODE1;
} else {
dwCycleTime = PIO_MODE0_CYCLE_TIME;
dwXferMode |= PIO_MODE0;
dwBestXferMode = 0;
dwCurrentMode = PIO_MODE0;
}
DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilities target %d IdentifyData PioCycleTimingMode (highest pio mode) = 0x%x\r\n"),
m_dwDevice,
m_Id.MinimumPIOxferTimeWOFlow));
if (m_Id.TranslationFieldsValid & (1 << 1)) {
if (fIoReadyEnabled) {
dwCycleTime = m_Id.MinimumPIOxferTimeIORDYFlow;
} else {
dwCycleTime = m_Id.MinimumPIOxferTimeWOFlow;
}
if (m_Id.AdvancedPIOxferreserved & (1 << 0)) {
dwXferMode |= PIO_MODE3;
dwBestXferMode = 3;
dwCurrentMode = PIO_MODE3;
}
if (m_Id.AdvancedPIOxferreserved & (1 << 1)) {
dwXferMode |= PIO_MODE4;
dwBestXferMode = 4;
dwCurrentMode = PIO_MODE4;
}
DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilities target %d IdentifyData AdvancedPIOModes = 0x%x\r\n"),
m_dwDevice,
m_Id.AdvancedPIOxferreserved));
}
ASSERT (dwCycleTime != UNINITIALIZED_CYCLE_TIME);
ASSERT (dwXferMode);
ASSERT (dwCurrentMode);
m_dwBestPioCycleTime = dwCycleTime;
m_dwBestPioMode = dwBestXferMode;
//
// figure out all the DMA transfer mode this device supports
//
dwCurrentMode = 0;
//
// check singleword DMA timing
//
dwCycleTime = UNINITIALIZED_CYCLE_TIME;
dwBestXferMode = UNINITIALIZED_TRANSFER_MODE;
if (m_Id.SingleDmaModesSupported) {
DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilitiestarget %d IdentifyData SingleDmaModesSupported = 0x%x\r\n"),
m_dwDevice,
m_Id.SingleDmaModesSupported));
DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilitiestarget %d IdentifyData SingleWordDMAActive = 0x%x\r\n"),
m_dwDevice,
m_Id.SingleDmaTransferActive));
if (m_Id.SingleDmaModesSupported & (1 << 0)) {
dwCycleTime = SWDMA_MODE0_CYCLE_TIME;
dwXferMode |= SWDMA_MODE0;
dwBestXferMode = 0;
}
if (m_Id.SingleDmaModesSupported & (1 << 1)) {
dwCycleTime = SWDMA_MODE1_CYCLE_TIME;
dwXferMode |= SWDMA_MODE1;
dwBestXferMode = 1;
}
if (m_Id.SingleDmaModesSupported & (1 << 2)) {
dwCycleTime = SWDMA_MODE2_CYCLE_TIME;
dwXferMode |= SWDMA_MODE2;
dwBestXferMode = 2;
}
if (m_Id.SingleDmaTransferActive) {
if (m_Id.SingleDmaTransferActive & IDD_SWDMA_MODE2_ACTIVE) {
dwCurrentMode = SWDMA_MODE2;
} else if (m_Id.SingleDmaTransferActive & IDD_SWDMA_MODE1_ACTIVE) {
dwCurrentMode = SWDMA_MODE1;
} else if (m_Id.SingleDmaTransferActive & IDD_SWDMA_MODE0_ACTIVE) {
dwCurrentMode = SWDMA_MODE0;
}
}
}
m_dwBestSwDmaCycleTime = dwCycleTime;
m_dwBestSwDmaMode = dwBestXferMode;
//
// check multiword DMA timing
//
dwCycleTime = UNINITIALIZED_CYCLE_TIME;
dwBestXferMode = UNINITIALIZED_TRANSFER_MODE;
if (m_Id.MultiDmaModesSupported) {
DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilitiestarget %d IdentifyData MultiWordDMASupport = 0x%x\r\n"),
m_dwDevice,
m_Id.MultiDmaModesSupported));
DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilitiestarget %d IdentifyData MultiWordDMAActive = 0x%x\r\n"),
m_dwDevice,
m_Id.SingleDmaTransferActive));
if (m_Id.MultiDmaModesSupported & (1 << 0)) {
dwCycleTime = MWDMA_MODE0_CYCLE_TIME;
dwXferMode |= MWDMA_MODE0;
dwBestXferMode = 0;
}
if (m_Id.MultiDmaModesSupported & (1 << 1)) {
dwCycleTime = MWDMA_MODE1_CYCLE_TIME;
dwXferMode |= MWDMA_MODE1;
dwBestXferMode = 1;
}
if (m_Id.MultiDmaModesSupported & (1 << 2)) {
dwCycleTime = MWDMA_MODE2_CYCLE_TIME;
dwXferMode |= MWDMA_MODE2;
dwBestXferMode = 2;
}
if (m_Id.MultiDmaTransferActive) {
if (m_Id.MultiDmaTransferActive & IDD_MWDMA_MODE2_ACTIVE) {
dwCurrentMode = MWDMA_MODE2;
} else if (m_Id.MultiDmaTransferActive & IDD_MWDMA_MODE1_ACTIVE) {
dwCurrentMode = MWDMA_MODE1;
} else if (m_Id.MultiDmaTransferActive & IDD_MWDMA_MODE0_ACTIVE) {
dwCurrentMode = MWDMA_MODE0;
}
}
}
if (m_Id.TranslationFieldsValid & (1 << 1)) {
DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilitiestarget %d IdentifyData word 64-70 are valid\r\n"), m_dwDevice));
if (m_Id.MinimumMultiwordDMATime &&
m_Id.ManuRecomendedDMATime) {
DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilitiestarget %d IdentifyData MinimumPIOxferTimeWOFlow = 0x%x\r\n"),
m_dwDevice,
m_Id.MinimumPIOxferTimeWOFlow));
DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilitiestarget %d IdentifyData ManuRecomendedDMATime = 0x%x\r\n"),
m_dwDevice,
m_Id.ManuRecomendedDMATime));
dwCycleTime = m_Id.MinimumPIOxferTimeIORDYFlow;
}
}
m_dwBestMwDmaCycleTime = dwCycleTime;
m_dwBestMwDmaMode = dwBestXferMode;
//
// figure out the ultra DMA timing the device supports
//
dwCycleTime = UNINITIALIZED_CYCLE_TIME;
dwBestXferMode = UNINITIALIZED_TRANSFER_MODE;
if (m_Id.TranslationFieldsValid & (1 << 2)) {
if (m_Id.UltraDMASupport) {
DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilitiestarget %d IdentifyData UltraDMASupport = 0x%x\r\n"),
m_dwDevice,
m_Id.UltraDMASupport));
DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilitiestarget %d IdentifyData UltraDMAActive = 0x%x\r\n"),
m_dwDevice,
m_Id.UltraDMAActive));
if (m_Id.UltraDMASupport & (1 << 0)) {
dwCycleTime = UDMA_MODE0_CYCLE_TIME;
dwXferMode |= UDMA_MODE0;
dwBestXferMode = 0;
}
if (m_Id.UltraDMASupport & (1 << 1)) {
dwCycleTime = UDMA_MODE1_CYCLE_TIME;
dwXferMode |= UDMA_MODE1;
dwBestXferMode = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -