Using $20080820; 10: Evolution
We've been using the following code as a fast ReadCooked and it works 99% of the time
BUT in a rare but repeatable set of conditions a complete system hang (Task Manager doesnot help) will occur
1) read is to an area outside a track (with a specific disk) the function returns false normally but 1 sector will return success 2) after that the next read to a track area will put the sector count into the buffer and then pad 1 sector with 0 (other data in buffer is uneffected) - this will happen with a cooked read as well 3) do a number of other additional reads successfully 4) Reread previously read sector (with cooked) will HARD crash a PC 5) Log finishes with DeviceIoControl() failed, status 121 ( 0x79 ) Semaphore timeout, re-executing the CDB, 1 vs. 5000
Linden
AnEXCEPTION := StarBurn_CdvdBurnerGrabber_ReadRaw( _CdvdBurnerGrabber, @ExceptionText, sizeof(ExceptionText), Status, @aCDB_FAILURE_INFORMATION, EXPECTED_LB_TYPE_ANY, _Block, _BlockCount, // 1 - 32 ERROR_FIELD_NO_ERROR, // No error data included FALSE, // No EDC/ECC data TRUE, // we need user data HEADER_CODE_NONE, // No headers FALSE, // No SYNC pattern SUBCHANNEL_NO, // No sub-channel _Buffer, // Pointer to data buffer to receive the payload _BufferLen );
called with
if abs( SlowCooked - LBA ) > 1000 then begin SlowCooked := -1000; //try again ttick := gettickcount; Result := TStarBurnRAWClasses.SB_CdvdBurnerGrabber_ReadCooked( CdvdBurnerGrabber, LBA, blocks, buf, blocks * FSectorSize, FALSE ); if gettickcount - ttick > 3000 * blocks then SlowCooked := LBA + blocks div 2; end; if not result then //need the exception for bad LBA processing Result := TStarBurnRAWClasses.SB_CdvdBurnerGrabber_ReadRaw( CdvdBurnerGrabber, LBA, blocks, buf, blocks * FSectorSize );
|