📄 diskmain.cpp
字号:
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;
}
if (m_Id.UltraDMASupport & (1 << 2))
{
dwCycleTime = UDMA_MODE2_CYCLE_TIME;
dwXferMode |= UDMA_MODE2;
dwBestXferMode = 2;
}
// Even the IDE device can support higher UDMA mode than 3,
// EP931x Rev E1 doesn't support UDMA4 or up.
// so set UDMA mode to 3.
//if (m_Id.UltraDMASupport & (1 << 3))
if (m_Id.UltraDMASupport & 0xf8 )
{
dwCycleTime = UDMA_MODE3_CYCLE_TIME;
dwXferMode |= UDMA_MODE3;
dwBestXferMode = 3;
}
/* if (m_Id.UltraDMASupport & (1 << 4))
{
dwCycleTime = UDMA_MODE4_CYCLE_TIME;
dwXferMode |= UDMA_MODE4;
dwBestXferMode = 4;
} */
}
if (m_Id.UltraDMAActive)
{
/* if (m_Id.UltraDMAActive & IDD_UDMA_MODE4_ACTIVE)
{
dwCurrentMode = UDMA_MODE4;
}
else if (m_Id.UltraDMAActive & IDD_UDMA_MODE3_ACTIVE)
*/
// Set UDMA mode up to 3.
if (m_Id.UltraDMAActive & 0xf8)
{
dwCurrentMode = UDMA_MODE3;
}
else if (m_Id.UltraDMAActive & IDD_UDMA_MODE2_ACTIVE)
{
dwCurrentMode = UDMA_MODE2;
}
else if (m_Id.UltraDMAActive & IDD_UDMA_MODE1_ACTIVE)
{
dwCurrentMode = UDMA_MODE1;
}
else if (m_Id.UltraDMAActive & IDD_UDMA_MODE0_ACTIVE)
{
dwCurrentMode = UDMA_MODE0;
}
}
}
//
// Doesn't really know the ultra dma cycle time
//
m_dwBestUDmaCycleTime = dwCycleTime;
m_dwBestUDmaMode = dwBestXferMode;
m_dwTransferModeSupported = dwXferMode;
m_dwTransferModeCurrent |= dwCurrentMode;
DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilities target %d transfer timing:\r\n"),m_dwDevice));
//* * * CAMSDB03/30/04 - Added a '0x' for mode display in all the DEBUGMSG's below.
DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilities PIO mode supported = 0x%04x and best cycle time = %5d ns\r\n"),
m_dwTransferModeSupported & PIO_SUPPORT,
m_dwBestPioCycleTime));
DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilities SWDMA mode supported = 0x%04x and best cycle time = %5d ns\r\n"),
m_dwTransferModeSupported & SWDMA_SUPPORT,
m_dwBestSwDmaCycleTime));
DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilities MWDMA mode supported = 0x%04x and best cycle time = %5d ns\r\n"),
m_dwTransferModeSupported & MWDMA_SUPPORT,
m_dwBestSwDmaCycleTime));
DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilities UDMA mode supported = 0x%04x and best cycle time = %5d ns\r\n"),
m_dwTransferModeSupported & UDMA_SUPPORT,
m_dwBestUDmaCycleTime));
//* * * CAMSDB03/30/04 - Uncommented the line below (START)
DEBUGMSG( ZONE_INIT, (TEXT("ATAPI:AnalyzeDeviceCapabilities Current mode bitmap = %04x\r\n"),
m_dwTransferModeCurrent));
//* * * CAMSDB03/30/04 - Uncommented the line below (END)
}
} // AnalyzeDeviceCapabilities
// Validate the buffer pointer.
BOOL CDisk::ValidateSg(PSG_REQ pSgReq ,DWORD InBufLen)
{
if (PSLGetCallerTrust()!= OEM_CERTIFY_TRUST) {
if (pSgReq && InBufLen >= (sizeof(SG_REQ) + sizeof(SG_BUF) * (pSgReq->sr_num_sg - 1))) {
DWORD dwIndex;
for (dwIndex=0; dwIndex < pSgReq -> sr_num_sg; dwIndex++) {
pSgReq->sr_sglist[dwIndex].sb_buf =
(PUCHAR)MapCallerPtr((LPVOID)pSgReq->sr_sglist[dwIndex].sb_buf,pSgReq->sr_sglist[dwIndex].sb_len);
}
}
else // Parameter Wrong.
return FALSE;
}
return TRUE;
}
BOOL CDisk::ValidateSg(PCDROM_READ pCdrom ,DWORD InBufLen)
{
if (PSLGetCallerTrust()!= OEM_CERTIFY_TRUST) {
if (pCdrom && InBufLen >= (sizeof(CDROM_READ) + sizeof(SGX_BUF) * (pCdrom->sgcount - 1))) {
DWORD dwIndex;
for (dwIndex=0; dwIndex < pCdrom-> sgcount; dwIndex++) {
pCdrom->sglist[dwIndex].sb_buf =
(PUCHAR)MapCallerPtr((LPVOID)pCdrom->sglist[dwIndex].sb_buf,pCdrom->sglist[dwIndex].sb_len);
}
}
else // Parameter Wrong.
return FALSE;
}
return TRUE;
}
/*------------------------------------------------------------------------------------------*/
BOOL CDisk::PerformIoctl(PIOREQ pIOReq)
{
DWORD dwError = ERROR_SUCCESS;
DEBUGMSG( ZONE_IOCTL, (TEXT("ATAPI:PerformIoctl: %x DeviceId: %x \r\n"),pIOReq->dwCode, m_dwDeviceId));
//* * * CAMSDB040204 - Added this for testing. (START)
//DEBUGMSG(1, (TEXT("ATAPI:PerformIoctl: %x DeviceId: %x \r\n"),pIOReq->dwCode, m_dwDeviceId));
//* * * CAMSDB040204 - Added this for testing. (END)
if (m_dwDeviceFlags & DFLAGS_DEVICE_PWRDN)
{
SetLastError(ERROR_DEVICE_NOT_AVAILABLE);
return FALSE;
}
if (pIOReq->pBytesReturned)
*(pIOReq->pBytesReturned)=0;
TakeCS();
__try {
switch( pIOReq->dwCode) {
case IOCTL_DISK_GETINFO:
case DISK_IOCTL_GETINFO:
if (IsCDRomDevice())
{
dwError = ERROR_BAD_COMMAND;
}
else
{
dwError = GetDiskInfo(pIOReq);
}
break;
case IOCTL_DISK_DEVICE_INFO:
dwError = GetDeviceInfo(pIOReq);
break;
case DISK_IOCTL_GETNAME :
case IOCTL_DISK_GETNAME :
dwError=GetDiskName(pIOReq);
break;
case DISK_IOCTL_SETINFO :
case IOCTL_DISK_SETINFO :
dwError = SetDiskInfo(pIOReq);
break;
case DISK_IOCTL_READ :
case IOCTL_DISK_READ :
if (!ValidateSg((PSG_REQ)pIOReq->pInBuf,pIOReq->dwInBufSize))
{
dwError=ERROR_INVALID_PARAMETER;
}
else if (IsReadDMASupported())
{
dwError = ReadWriteDiskDMA(pIOReq, TRUE);
}
else
{
dwError = ReadWriteDisk(pIOReq, TRUE);
}
break;
case DISK_IOCTL_WRITE:
case IOCTL_DISK_WRITE:
if (!ValidateSg((PSG_REQ)pIOReq->pInBuf,pIOReq->dwInBufSize))
{
dwError=ERROR_INVALID_PARAMETER;
}
else if (IsWriteDMASupported())
{
dwError = ReadWriteDiskDMA(pIOReq, FALSE);
}
else
{
dwError = ReadWriteDisk(pIOReq, FALSE);
}
break;
case IOCTL_DISK_GET_STORAGEID: // this is a new op, so use new codes //
dwError = GetStorageId(pIOReq);
break;
case DISK_IOCTL_FORMAT_MEDIA:
case IOCTL_DISK_FORMAT_MEDIA:
dwError = ERROR_SUCCESS;
break;;
///////////////////// ATAPI /////////////////////////////////////
case IOCTL_CDROM_READ_SG:
case IOCTL_CDROM_TEST_UNIT_READY:
case IOCTL_CDROM_DISC_INFO:
case IOCTL_CDROM_EJECT_MEDIA:
case IOCTL_CDROM_LOAD_MEDIA:
///////////////////// DVD ///////////////////////////////////////
case IOCTL_DVD_START_SESSION:
case IOCTL_DVD_READ_KEY:
case IOCTL_DVD_END_SESSION:
case IOCTL_DVD_SEND_KEY:
case IOCTL_DVD_GET_REGION:
///////////////////// CDAUDIO ///////////////////////////////////
case IOCTL_CDROM_READ_TOC:
case IOCTL_CDROM_GET_CONTROL:
case IOCTL_CDROM_PLAY_AUDIO_MSF:
case IOCTL_CDROM_SEEK_AUDIO_MSF:
case IOCTL_CDROM_STOP_AUDIO:
case IOCTL_CDROM_PAUSE_AUDIO:
case IOCTL_CDROM_RESUME_AUDIO:
case IOCTL_CDROM_GET_VOLUME:
case IOCTL_CDROM_SET_VOLUME:
case IOCTL_CDROM_READ_Q_CHANNEL:
case IOCTL_CDROM_GET_LAST_SESSION:
case IOCTL_CDROM_RAW_READ:
case IOCTL_CDROM_DISK_TYPE:
case IOCTL_CDROM_SCAN_AUDIO:
case IOCTL_CDROM_ISSUE_INQUIRY:
if (IsAtapiDevice())
dwError = AtapiIoctl(pIOReq);
else
dwError = ERROR_INVALID_OPERATION;
break;
case IOCTL_DISK_USER_GET_DRIVE_STATS:
if( (pIOReq->pInBuf == NULL) && (pIOReq->dwInBufSize == 0) &&
(pIOReq->pOutBuf) && (pIOReq->dwOutBufSize == sizeof(UserDriveStatistics)))
{
dwError = GetUserDriveStatistics((UserDriveStatistics *)pIOReq->pOutBuf);
*(pIOReq->pBytesReturned) = sizeof(UserDriveStatistics);
}
break;
case IOCTL_DISK_USER_GET_DRIVE_IDENTIFY:
if( (pIOReq->pInBuf == NULL) && (pIOReq->dwInBufSize == 0) &&
(pIOReq->pOutBuf) && (pIOReq->dwOutBufSize == sizeof(IDENTIFY_DATA)))
{
dwError = GetDriveIdentifyData((IDENTIFY_DATA *)pIOReq->pOutBuf);
*(pIOReq->pBytesReturned) = sizeof(IDENTIFY_DATA);
}
break;
case IOCTL_DISK_USER_SET_TRANSFER_MODE:
if( (pIOReq->pInBuf) && (pIOReq->dwInBufSize == sizeof(UserUdmaSettings)) &&
(pIOReq->pOutBuf == NULL) && (pIOReq->dwOutBufSize == 0) )
{
UserUdmaSettings *pSettings = (UserUdmaSettings *)pIOReq->pInBuf;
dwError = ForceTransferMode(pSettings->fUDMAEnable, pSettings->ulBestUDmaModeReg);
}
break;
default:
dwError = ERROR_NOT_SUPPORTED;
break;
}
} __except(EXCEPTION_EXECUTE_HANDLER) {
dwError = ERROR_GEN_FAILURE;
}
ReleaseCS();
if (dwError != ERROR_SUCCESS)
SetLastError( dwError);
return ERROR_SUCCESS == dwError;
}
/*------------------------------------------------------------------------------------------*/
BOOL CDisk::PostInit(PPOST_INIT_BUF pPostInitBuf)
{
DWORD dwError=ERROR_SUCCESS;
DEBUGMSG( ZONEID_INIT, (TEXT("ATAPI: PostInit ( Device :0x%x) \r\n"),m_dwDeviceId));
m_hDevice = pPostInitBuf->p_hDevice;
return dwError == ERROR_SUCCESS;
}
/*------------------------------------------------------------------------------------------*/
DWORD CDisk::GetDiskInfo(PIOREQ pIOReq)
{
DWORD dwError = ERROR_SUCCESS;
DISK_INFO *pInfo = NULL;
// The Call can come in three flavors (BC). Just inbuf is specified, outbuf is specified or both. If both then outbuf is used
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -