Esempio n. 1
0
        public bool ReadSectors(out byte[] buffer, out AtaErrorRegistersLBA28 statusRegisters, byte count, uint lba, uint timeout, out double duration)
        {
            if (count == 0)
            {
                buffer = new byte[512 * 256];
            }
            else
            {
                buffer = new byte[512 * count];
            }
            AtaRegistersLBA28 registers = new AtaRegistersLBA28();
            bool sense;

            registers.command     = (byte)AtaCommands.ReadRetry;
            registers.sectorCount = count;
            registers.lbaHigh     = (byte)((lba & 0xFF0000) / 0x10000);
            registers.lbaMid      = (byte)((lba & 0xFF00) / 0x100);
            registers.lbaLow      = (byte)((lba & 0xFF) / 0x1);

            lastError = SendAtaCommand(registers, out statusRegisters, AtaProtocol.PioIn, AtaTransferRegister.SectorCount,
                                       ref buffer, timeout, true, out duration, out sense);
            error = lastError != 0;

            DicConsole.DebugWriteLine("ATA Device", "READ SECTORS took {0} ms.", duration);

            return(sense);
        }
Esempio n. 2
0
        public bool ReadBufferDma(out byte[] buffer, out AtaErrorRegistersLBA28 statusRegisters, uint timeout, out double duration)
        {
            buffer = new byte[512];
            AtaRegistersLBA28 registers = new AtaRegistersLBA28();
            bool sense;

            registers.command = (byte)AtaCommands.ReadBufferDma;

            lastError = SendAtaCommand(registers, out statusRegisters, AtaProtocol.Dma, AtaTransferRegister.NoTransfer,
                                       ref buffer, timeout, false, out duration, out sense);
            error = lastError != 0;

            DicConsole.DebugWriteLine("ATA Device", "READ BUFFER DMA took {0} ms.", duration);

            return(sense);
        }