<< Back Home UK uk   Donate Donate

Universal ATA driver for Windows NT3.51/NT4/2000/XP/2003/Vista/7/ReactOS
With PATA/SATA/AHCI support

Updated 2019.04.03


To get previous stable version - v 0.46d8 click here
Current version - v 0.47a


Who and why need this driver ? Let me tell you: it worth installing UniATA if vendor of your new motherboard do not want to supply you with drivers for your old OS. Or vice versa, you have old motherboard and want to install new Windows with it. Of course, it is possible to use standard (generic) drivers those most probably supports this hardware. But what about performance ? You will have PIO mode with 0.5 - 3 Mb/sec transfer rate. UniATA shall use DMA or UltraDMA and have up to 10 times better performance. There is still one common problem with modern hard driver of more than 128 Gb capacity (also known as LBA-48 or BigLba). Old OSes do not support such drives at all, new ones require latest Service Packs. UniATA has built-in support for large drives. And at last - upgrade or downgrade of the motherboard. If you simply connect your harddisk to different motherboard, the driver of the previous one shall not recognize new IDE controller. And the system shall not boot. You will have to connect everything back, change IDE drivers to generic ones, reboot and reconnect hardware again, then change drivers to new ones. You cannot even think about walking with bootable harddrive to some other computers. Or resign yourself to have 0.5 - 3 Mb/sec transfer rate. Since UniATA supports numerous IDE controllers and in addition is capable of driving all standard (onboard primary/secondary) controllers, this problem also appears to be solved. Also, UniATA works with new SATA and AHCI controllers Below you can find more detailed and more technical feature list.


  • DMA/UDMA support (up to ATA-133) on known and generic DMA on unknown controllers
  • LBA48 (large drives above 128Gb) support
  • large drives above 2Tb support (SCSI READ16, WRITE16)
  • SerialATA support (SATA, SATA-2, SATA-3)
  • AHCI rev. 0.95 - 1.30 support
  • NT3.51 (i386+ CPU), NT4, 2000, XP, 2003, 2005, Vista, 7, ReactOS (x86/i386)
  • SMP/HT support
  • support of contiguous set of modes UDMA0-UDMA6 (ATA-16/25/33/44/66/100/133)
  • Support of numerous IDE controllers and generic ATA/ATAPI
  • no reinstall required when migrating to different IDE controller or motherboard.
  • internal command queueing and optimized execution order of read/write requests
  • user-mode device management utility atactl.exe. You can change data transfer mode (PIO/DMA/UDMA) on the fly.
  • tuning Read/Write cache, transfer modes and many other things via Registry settings
  • list of bad/unreliable blocks, to prevent driver from treating HDD but return error immediately (Nikolai Vorontsov).
  • NEW SCT Command Transport support (used by smartmontools)
  • Hot swap for IDE devices under OSes prior w2k (Mike)


  • Human-friendly setup tool
  • RAID support (mirror, stripping, mirror+stripping)
  • correct PNP (WDM) implementation for w2k and higher
  • 64-bit Windows support
  • SATA-splitters support
  • Win 9x/ME support (now we have separate build with some limitation, thanks to Xeno)
  • work with BIOS INT13 (Alexei Chipovalov)
  • emulation of MODE SENSE/MODE SELECT SCSI commands on IDE devices (HDD) for managing caching, standby mode, etc. (under development)
  • old MFM HDD support (KtP)


The idea of writing own universal ATA driver had appeared due to the following reasons :
  1. compatibility of DMA/UDMA mode (really, the driver supporting these modes) and varoius CD-R/RW recording software (see CD-R/RW & DMA drivers)
  2. absence of user-level IDE management tools: transfer mode management/monitoring (PIO, (U)DMA), getting detailed device information
  3. absence of simultaneous usage of devices operating in different transfer modes (PIO vs (U)DMA) with single IDE cable.
  4. a wish to implement command reordering to improve performance (I hope everybody knows why SCSI shows better results than IDE in multiprocess environment.
  5. an idea of organizing LBA-based sector cache, (of course, cache block would be at least 64k)
  6. neverending problems with decision what is better: to be able to boot OS on any motherboard or to use UDMA. Such questions come when we have to support many computers with different hardware, but identical set of software (NortonGhost's users know). Especially topical for w2k, where changing of IDE controller makes system unbootable. By the way, to solve this problem one significant improvment is planned. Read about it here.

There are some wishes from downloaders (not implemented yet):
  1. RAID support (mirror, stripping, mirror+stripping)
  2. NT3.51 support (already done)
  3. Hot swap for IDE devices under OSes prior w2k
  4. And many other things, read plans above.

After reading some specifications (for HDDs, ATAPI and ATA/IDE controllers) and looking through sources (from NT4 DDK and FreeBSD 4.3 - 4.5) the first working version - BusMaster_v8a_ok.rar/tgz (52.1 Kb/60.5 Kb) (v 0.8a). Note, that the last one is BusMaster_v46d8.rar/tgz (173 Kb/267.8 Kb) :) That version (v 0.8a) successfully detected all available controllers under NT4. The first controller list was:

  1. VIA 82C586 (ETEQ) on SOYO-5EHM
  2. VIA 8233 on Soltek-DRV4
  3. CMD 649 (an additional PCI controller)
And a little later:
  1. Intel ICH on ~10 different machines
  2. Intel ICH2 on Dual-Processor machine
  3. ServerWorks CSB5 on Dual-Processor machine
  4. AcerLabs Aladdin V (Rev 0xC4) on Notebook
  5. Intel PIIX3
  6. VIA 82C686
  7. nVidia nForce MCP51 (PATA and SATA)

By design the driver initializes any PCI device that reports itself as an IDE Controller and also the following well-known Mass-storage Controllers:

    good BusMasters:

    Intel PIIX / PIIX3 / PIIX4
    Intel ICH / ICH0 / ICH2
    AcerLabs Aladdin ATA / ATA33
    VIA ATAxxx
    SiS 5591 ATA33
    CMD 649 ATA100 checked
    CMD 648 / 646
    Cyrix 5530 ATA33
    AMD 756 ATA66
    ServerWorks ROSB4 ATA33
    Promise TX2 ATA33 / ATA66 / ATA100
    HighPoint ATAxxx

    Intel ICH3, PIIX4e
    nVIDIA nForce/nForce2
    AMD 768, 766, 756
    ServerWorks CSB5 ATA66/100
    Promise TX2 ATA133
    Promise Ultra/FastTrak 33/66/100
    Promise OEM ATA100 Acard ATPxxxx 33/66/100
    Cenatek Rocket Drive
    Intel ICH4 /ICH5, PIIX4e
    SiS Family

    Intel ICH6
    National Geode SC1100

    Intel ICH7, ICH8
    nVIDIA nForce3/nForce4

    buggy controllers:

    PC Technology RZ 1000
    PC Technology 37C922
    CMD 640

Check if the driver really supports all mentioned devices is rather difficult. But some compatibility matrices for some versions you can find here


Release Version 0.47b (rar/tgz) - 198 Kb/0 bytes.
and sources 0.47b (rar/tgz) - 375.4 Kb/0 bytes.
Debug Version 0.47b (rar/tgz) - 467.5 Kb/0 bytes.
  • Added handling of Exclude option for entire interfaces - PCIIDE, ISA, MCI


Release Version 0.47a (rar/tgz) - 197.8 Kb/0 bytes.
and sources 0.47a (rar/tgz) - 373.8 Kb/0 bytes.
Debug Version 0.47a (rar/tgz) - 467.4 Kb/0 bytes.
  • fixed external dependence from PciDump
  • fixed bug with crash on Intel AHCI chipsets.
  • fixed bug in conditions of interface-type specific registry settings under PATA, SATA and AHCI sub-keys of Parameters.


Release Version 0.47 (rar/tgz) - 197.8 Kb/355 Kb.
and sources 0.47 (rar/tgz) - 373.5 Kb/570.9 Kb.
Debug Version 0.47 (rar/tgz) - 468.9 Kb/819.6 Kb.
  • fix for .mak files under Wine build environment
  • merged AHCI upadtes from FreeBSD 12.
  • listed new AMD, Intel and Marvell AHCI chipsets. Also added support for ASMedia, ThunderX and Annapurna
  • added UNIATA_AHCI_ALT_SIG flag for AHCIs returning device signature in PSIG rather than FIS on soft reset.
  • fix fo frozen disk format. Added call to UniataExpectChannelInterrupt() in IdeVerify()
  • added UNIATA_RAID_CONTROLLER flag to RAID controllers. Note, by default UniATA doesn't attach to RAIDs since SkipRaids option is set to 1 by default
  • added interface-type specific registry settings under PATA, SATA and AHCI sub-keys of Parameters. (ROS-13988)


Release Version 0.46e8 (rar/tgz) - 173.5 Kb/268.1 Kb.
and sources 0.46e8 (rar/tgz) - 344 Kb/484.3 Kb.
Debug Version 0.46e8 (rar/tgz) - 432.2 Kb/713.8 Kb.
  • enabled Generic AHCI 3.1.0, 3.1.1 support for unlisted controllers. It works. Thanks to ReactOS team for testing.
  • merged 64-bit upadtes from ReactOS.
  • published internal history ot versions and experiments with comments - chglog.txt(ROS-13988)


Release Version 0.46e5 (rar/tgz) - 173.3 Kb/268 Kb.
and sources 0.46e5 (rar/tgz) - 342.7 Kb/481.7 Kb.
Debug Version 0.46e5 (rar/tgz) - 430.1 Kb/711.7 Kb.
  • fixed double memory allocation of intermediate buffer below 4Gb in AtapiDmaAllocate() in AHCI mode. Along with memory leak the 2nd attempt was performed on high IRQL and could cause system crash, thanks to Michael Arthur Long for testing. (ROS-13988)


Release Version 0.46e4 (rar/tgz) - 173.3 Kb/268 Kb.
and sources 0.46e4 (rar/tgz) - 342.6 Kb/481.8 Kb.
Debug Version 0.46e4 (rar/tgz) - 433.4 Kb/716.5 Kb.
  • fixed nVidia MCP61 S2 support, thanks to Samuel Serapion (ROS-11773)


Release Version 0.46e3 (rar/tgz) - 173.3 Kb/268 Kb.
and sources 0.46e3 (rar/tgz) - 342.7 Kb/481.7 Kb.
Debug Version 0.46e3 (rar/tgz) - 433.3 Kb/716.4 Kb.


Release Version 0.46e2 (rar/tgz) - 173.2 Kb/267.9 Kb.
and sources 0.46e2 (rar/tgz) - 342.4 Kb/481 Kb.
Debug Version 0.46e2 (rar/tgz) - 433.3 Kb/715.6 Kb.
  • fixed problem with crash on attempt to get physical address for valid memory with uninitialized page table (sometimes it happens), thanks to Thomas Faber and ReactOS team. (ROS-11894)


Release Version 0.46e1 (rar/tgz) - 173.2 Kb/267.9 Kb.
and sources 0.46e1 (rar/tgz) - 342.5 Kb/481.1 Kb.
Debug Version 0.46e1 (rar/tgz) - 433.4 Kb/718 Kb.
  • fixed problem with ATAPI detection in previous build, thanks to KtP, Roy Tam.


Release Version 0.46e (rar/tgz) - 173.3 Kb/267.9 Kb.
and sources 0.46e (rar/tgz) - 342.3 Kb/480.9 Kb.
Debug Version 0.46e (rar/tgz) - 433.4 Kb/718 Kb.
  • fixed problem with I82371FB support (ROS-11157) and buffer overflow in PIO Multiblock error handling (ROS-11296). Thanks to ReactOS team.


Release Version 0.46d8 (rar/tgz) - 173 Kb/267.8 Kb.
and sources 0.46d8 (rar/tgz) - 341.6 Kb/480.5 Kb.
Debug Version 0.46d8 (rar/tgz) - 433 Kb/717.9 Kb.
  • Fixed several problems with ISA-only systems. Thanks to KtP.
  • Identified source of system freeze on NT4 with SMP kernel. Freeze is caused by BIOS USB keyboard emulation. When i8042 driver attempts to initialize chip, system freezes. Legacy USB keyboar support/emulation must be disabled in BIOS. Probably, load of USB drivers prior to i8042 may help.


Release Version 0.46d7 (rar/tgz) - 172.9 Kb/267.7 Kb.
and sources 0.46d7 (rar/tgz) - 341.3 Kb/480 Kb.
Debug Version 0.46d7 (rar/tgz) - 433.2 Kb/718.7 Kb.
  • fixed problem with duplicated data structures and strings in compiled driver binary. Thanks to KtP and ReactOS team. Binary size is reduced even more.


Release Version 0.46d6 (rar/tgz) - 171.3 Kb/255.6 Kb.
and sources 0.46d6 (rar/tgz) - 338.7 Kb/467.1 Kb.
Debug Version 0.46d6 (rar/tgz) - 430.6 Kb/672.9 Kb.
  • fixed CD/DVD detection problem on some SATA. Thahks to Rayer for finding exact version where support was broken.
  • fixed problem CSB5 and old ISA with i486, thanks to KtP for testing
  • reduced binary size


Release Version 0.46 (rar/tgz) - 176.7 Kb/261.8 Kb.
and sources 0.46 (rar/tgz) - 333.4 Kb/460.9 Kb.
Debug Version 0.46 (rar/tgz) - 433.5 Kb/674.5 Kb.
  • fixes for VBox and QEmu HDD write and CD-ROM support
  • fixed problem with buffer overflow in ISA controllers when original request is splitted on LBA-capable device.
  • 32-bit I/O support for PIO mode
  • DMA support for Intel PIIX (8086:1230)
  • changed CD-Changers init behavior


Release Version 0.45j1 (rar/tgz) - 176.5 Kb/261.7 Kb.
and sources 0.45j1 (rar/tgz) - 331.4 Kb/458.8 Kb.
Debug Version 0.45j1 (rar/tgz) - 432.7 Kb/673.2 Kb.
  • fixes for VBox and QEmu support
  • fast missing device detection, especially on VMs
  • AHCI-capable controllers in compatible mode support
  • compiler-dependent structure alignment fixes (in source code)


Release Version 0.45h1 (rar/tgz) - 176.5 Kb/261.6 Kb.
and sources 0.45h1 (rar/tgz) - 328.6 Kb/455.3 Kb.
Debug Version 0.45h1 (rar/tgz) - 434.2 Kb/680.6 Kb.
Intermediate version. We try to fix strange problems with several ATAPI devices on some SATA/AHCI controllers. Also there are some common changes:
  • added Cyrix 5510/5520/5030/5035 support from Linux sources
  • optimized ATAPI init code: do not issue for the 2nd time, if SCSIOP_MECHANISM_STATUS cause bus reset.
  • added handling of ATAPI devices those doesn't correctly report ATAPI signature on bus (in WordCount registers).


Release Version 0.45e (rar/tgz) - 175.4 Kb/259.9 Kb.
and sources 0.45e (rar/tgz) - 325.3 Kb/450.5 Kb.
Debug Version 0.45e (rar/tgz) - 430.7 Kb/677.4 Kb.
  • Fixed bug in DMA timing for ICH4 chips. Due to wrong programming we got assymetric transfer r/w rate in UDMA 5 - 80/16 Mb/s
  • Added handling of Exclude option for separate channels for Compatible controllers and AHCI channels
  • Partially added handling of "Exclude" option for ATA/SATA controllers (affects only total number of channels according to resulting port bitmap).
  • Added PortMask option for AHCI channels and partially for SATA (like "Exclude"). This option can reduce available cannels.
  • Added NumberChannels option for SATA, this option can only reduce available cannels.


Release Version 0.45d (rar/tgz) - 175.1 Kb/259.3 Kb.
and sources 0.45d (rar/tgz) - 324.6 Kb/450 Kb.
Debug Version 0.45d (rar/tgz) - 430.2 Kb/675.9 Kb.
added Force80pin registry option.

Release Version 0.45c1 (rar/tgz) - 175 Kb/259.3 Kb.
and sources 0.45c1 (rar/tgz) - 324.6 Kb/449.9 Kb.
Debug Version 0.45c1 (rar/tgz) - 429.6 Kb/675.3 Kb.
  • some fixes in AHCI support - freeze on controllers without legacy interrupt management registers.
  • fixed PATA/SATA/AHCI detection code for newer Intel

    Release Version 0.45a7 (rar/tgz) - 174.9 Kb/259.2 Kb.
    and sources 0.45a7 (rar/tgz) - 323.7 Kb/449 Kb.
    Debug Version 0.45a7 (rar/tgz) - 429 Kb/673.7 Kb.
  • AHCI support is enabled in INFs by default
  • added DevIDs for
    • newer ATI IPX700/800 (default them to SATA (non-AHCI) mode)
    • nVidia AHCI controllers, default them to SATA (non-AHCI) mode
    • VIA AHCI
    • new Promise chips
    • Hudson-2
    • SIS 630S, 962, 963, 1182 and 1182,
    • more PATA Marvell chips
  • added (experimental) PATA/SATA and AHCI detection code for newer ATI
  • removed duplicates and wrong values from device list
  • unified OS-specific INFs
  • fixed DevID for RZ 100x
  • added handler for uninitialized BAR4 for all SATA chips
  • improved AHCI error handler. Do not retry after interface errors
  • ATAPI commands READ_CD and READ_CD_MFS are marked as DMA-capable. Managed by registry option AtapiDmaRawRead.
  • Added workaround for "Marvell 9123" detection of AHCI channels. Chip reports 8 while it actually has 4.

    Release Version 0.44e (rar/tgz) - 169.6 Kb/247.9 Kb.
    and sources 0.44e (rar/tgz) - 316.9 Kb/437.3 Kb.
    Debug Version 0.44e (rar/tgz) - 421.3 Kb/660.2 Kb.
  • Cosmetic changes in code
  • Added experimental BIOS handoff (BOH) support for AHCI controllers.

    Release Version 0.44d (rar/tgz) - 169.6 Kb/247.7 Kb.
    and sources 0.44d (rar/tgz) - 316.6 Kb/437 Kb.
    Debug Version 0.44d (rar/tgz) - 420.7 Kb/658.5 Kb.
  • Fixed bug with fall to PIO on SIS 961.
  • Fixed bug never-completed PIO transfers on IDE devices, those generate intermediate interrupts during transfer and then report transfer completed status. Problem was caused by not adjusted internel byte counter in this branch of code.

    Release Version 0.44c3 (rar/tgz) - 169.8 Kb/247.9 Kb.
    and sources 0.44c3 (rar/tgz) - 316.4 Kb/436.6 Kb.
    Debug Version 0.44c3 (rar/tgz) - 420.8 Kb/658.4 Kb.
  • Fixed issue with too long delay after reset on some ATAPI devices. Problem appeared on devices those rapidly raise and clear BUSY.

    Release Version 0.44c1 (rar/tgz) - 169.7 Kb/248 Kb.
    and sources 0.44c1 (rar/tgz) - 316.2 Kb/436.4 Kb.
    Debug Version 0.44c1 (rar/tgz) - 420.7 Kb/658.5 Kb.
  • fixed handling of immediate error reporting on some ATAPI devices. Several devices sets ERR imediately after receiving packet with wrong parameters. We should not start DMA in such case, since it will cause timeout condition with further device reset. On the other hand, some other devices do not clear ERR immediately after successfull packet reception. Thus, if one operation failed, we cannot be sure, if the next is OK. Now driver issues SENSE_INFO if error condition is detected immediately after packet reception. This request always succeeds and clears error flag. After that it is safe to send next comand.

  • Release Version 0.44b4 (rar/tgz) - 169.6 Kb/247.9 Kb.
    and sources 0.44b4 (rar/tgz) - 315.6 Kb/436 Kb.
    Debug Version 0.44b4 (rar/tgz) - 420.5 Kb/658.2 Kb.
  • fixed LogToDisplay (by KtP)
  • Fixed support for Intel ICH7 with specific registers access and layout in SATA mode.
  • Fixed support for Intel ICH7 with specific registers access and layout in SATA mode.
  • Implemented more safe algorithm for PCI Command registers access, previous method may cause interrupt storm on some Intel controllers.
  • Fixed bug with not cleared interrupt status on chip init. Also, caused interrupt storm on some Intel controllers.
  • Fixed compatibility issue with SATA ATAPI those cannot handle service comamnds (other thar READ/WRITE) in DMA mode.

    Release Version 0.43f5 (rar/tgz) - 169.3 Kb/247.6 Kb.
    and sources 0.43f5 (rar/tgz) - 314.6 Kb/434.5 Kb.
    Debug Version 0.43f5 (rar/tgz) - 419.9 Kb/657.1 Kb.
  • Added code for reporting usage of PCI slot for Legacy controllers. This prevents conflicts with other Legacy IDE drivers. Previous versions claimed only ISA part of controllers, so other drivers could be loaded and breake normal operation. Tested under NT4 and Win 2003
  • Fixed uata_comm.inf for UniATA virtual communication port. Now driver is detected and installed automatically.

    Release Version 0.43e2 (rar/tgz) - 168.7 Kb/247 Kb.
    and sources 0.43e2 (rar/tgz) - 313.4 Kb/434.9 Kb.
    Debug Version 0.43e2 (rar/tgz) - 420 Kb/657.3 Kb.
  • Fixed .INF-file for XP and higher OSes (I checked under 2003). The problem appeared because %12% no longer points to drivers directory. Now %10%\System32\drivers is used.
  • Added uata_comm.inf for UniATA virtual communication port.
  • Fixed AHCI support bug in atactl.exe.

    Release Version 0.43d2 (rar/tgz) - 168.2 Kb/246.3 Kb.
    and sources 0.43d2 (rar/tgz) - 311.9 Kb/432.7 Kb.
    Debug Version 0.43d2 (rar/tgz) - 418.7 Kb/655.7 Kb.
  • Added AHCI enable code for chipsets, those have GHC_AE disabled by default
  • added MSI reset workaround code.
  • MaxTransferMode is now checked against channel-specific value instead of controller-specific one
  • Merged latest code updates from ReactOS and FreeBSD
  • Implemented experimental SCSIOP_START_STOP_UNIT Immediate, StartStop flag and PowerCondition handling. ATA IDLE, SLEEP (power down) and STANDBY (stop spindel) commands are used. Device is returned from Sleep state via HardReset.
  • Fixed PATA 40/80-pin cable detect for VIA and Intel controllers and for devices those do not report valid HwRes. Previous versions may incorrectly limit transfer rate to UDMA2.
  • Fixed, unified and updated with latest features SMART, SCT and ATA PASSTHROUH support code. Now smartmontools works with UniATA.
  • added AdvancedPowerMode and AcousticMgmt registry options. Minimum power consumption without standby is used by default.

    Release Version 0.43a1 (rar/tgz) - 166 Kb/243.3 Kb.
    and sources 0.43a1 (rar/tgz) - 305.1 Kb/424.6 Kb.
    Debug Version 0.43a1 (rar/tgz) - 412.6 Kb/647.7 Kb.
  • Finally fixed and unified behavior of SRB_STATUS_DATA_OVERRUN in all ISR branches.
  • Fixed bug with BUSY wait after ATAPI Soft Reset. Some hardware asserts BUSY with significant delay after RESET command.
  • Added buffer size check to all UniATA IOCTLs.
  • Fixed several bugs with 80-pin PATA cable detect.
  • Fixed transfer rate reporting in atactl, separated bus (channel) transfer rate and device transfer mode (PIO/DMA)
  • fixed bug with Physical/Logical channel numbering for Legacy controllers in AtapiChipInit()

    Release Version 0.42h2 (rar/tgz) - 165.5 Kb/242.8 Kb.
    and sources 0.42h2 (rar/tgz) - 302.8 Kb/421 Kb.
    Debug Version 0.42h2 (rar/tgz) - 409 Kb/643.1 Kb.
  • Fixed bug with incorrect behavior of SRB_STATUS_DATA_OVERRUN in AHCI ATAPI. This bug made disks unreadable for MS Windows systems (READ TOC reported unexpected status SUCCESS). ReactOS appeared to be tolerant to this bug.

    Release Version 0.42h (rar/tgz) - 165.5 Kb/242.9 Kb.
    and sources 0.42h (rar/tgz) - 302.6 Kb/420.5 Kb.
    Debug Version 0.42h (rar/tgz) - 408.9 Kb/643.4 Kb.
  • This is first successfull AHCI ATAPI version.
  • SATA and AHCI ATAPI devices are not switched to PIO-mode for 'technical' commands (neither READ nor WRITE).
  • Added support for READ16/WRITE16/VERIFY16/READ_CAPACITY16 SCSI command emulation. It extends addressable space to 64bits and gives possibility to supports HDDs above 2Tb, they use more than 32bits for LBA. Note, upper storage drivers should also support this feature.
  • I've found UniATA-related discuss on :)

    Release Version 0.42e2 (rar/tgz) - 164.8 Kb/242.3 Kb.
    and sources 0.42e2 (rar/tgz) - 292.2 Kb/389.6 Kb.
    Debug Version 0.42e2 (rar/tgz) - 406 Kb/637.9 Kb.
  • continue work on AHCI ATAPI. Now it doesn't crash or hang, but do not work yet.
  • 7AHCI code is beautified a little. Fixed several logical bug.
  • fixed bug with LBA28 addressing in AHCI code. Disk larger than 32Gb and less than 128Gb may be addressed incorrectly.
  • fixed and improved device ready wait code in ISR.
  • fixed bug with incorrect UDMA setup on Intel PATA. Previously imported code from new FreeBSD is rolled back. New code caused transfer rate degrade from 18Mb/s to 3Mb/s.
  • fixed bug ISA init without (or with wrong) DMA registers.
  • fixed bug with not claimed 2nd IO range on ISA.
  • fixed CHS disk size output in atactl.exe
  • added chglog.txt to sources with list of changes in each version (including intermediate). Thanks to KtP for testing.

    Release Version 0.42 (rar/tgz) - 125.2 Kb/201.9 Kb.
    and sources 0.42 (rar/tgz) - 287.9 Kb/407.4 Kb.
    Debug Version 0.42 (rar/tgz) - 348.5 Kb/586.9 Kb.
  • AHCI Support is available! thanks to KtP for testing.
  • optimized DMA engine
  • optimized interrupt checks
  • fixed bug in interrupt enable routine (it didn't clear previuos interrupt status)
  • fixed bug in interrupt service: in rather spacial case we didn't make complemantary enable interrupt.
  • added automatic wait timing tuning for old machines and virtual machines
  • now ISR uses BaseStatus instead of AltStatus to avoid interrupts during wait cycle.
  • fixed bug in atactl to driver communication on SATA c ontrollers.
  • fixed bug with missed cleiming of the 2nd IO range on ISA controllers
  • fixed several bugs with handling channels with the only 1 possible device attached.

    Release Version 0.41b5 (rar/tgz) - 160.6 Kb/260.5 Kb.
    and sources 0.41b5 (rar/tgz) - 281.9 Kb/399.4 Kb.
    Debug Version 0.41b5 (rar/tgz) - 426.6 Kb/714.6 Kb.
  • Commited changes from BugZilla ReactOS.

    Release Version 0.41b4 (rar/tgz) - 160.6 Kb/260.5 Kb.
    and sources 0.41b4 (rar/tgz) - 282 Kb/399.6 Kb.
    Debug Version 0.41b4 (rar/tgz) - 426.8 Kb/714.6 Kb.
  • This is intermediate version. Fixed bugs with access beyond allocated memory during ISA card init. This also bug affects systems where Primary or Secondary IDE channel(s) could not be initialized with DMA/BusMaster support. Thanks to Caemyr for bug report an testing.
  • Added new Intel chips Patsburg and Panther Point.
  • Fixed idedma.mak and updated file list pkg_files.src.

  • Also published update to v0.40 branch with bugfixes (merged from v0.41b4).
    Release Version 0.40b3 (rar/tgz) - 120.4 Kb/197.1 Kb.
    and sources 0.40b3 (rar/tgz) - 271.8 Kb/386.1 Kb.
    Debug Version 0.40b3 (rar/tgz) - 325.6 Kb/562 Kb.

    Release Version 0.40b2 (rar/tgz) - 157 Kb/255.2 Kb.
    and sources 0.40b2 (rar/tgz) - 270 Kb/383.1 Kb.
    Debug Version 0.40b2 (rar/tgz) - 411.3 Kb/701.9 Kb.
  • Many Intel chips have interesting method for accessing SATA registers. There was a bug in this code and distinguising between SATA/PATA modes. This bug may slow down system, especially dealing to ATAPI.
  • I've found a strange 128Gb problem with new Hitachi 1Tb HDD. When I access blocks near 127Gb limit (starting from LBA 0xfffff80) in old addressing mode (LBA28) and attempt to read/write more than one sector at once, HDD reports error. I've decreased LBA28-addressable range.
    Release Version 0.40b1 (rar/tgz) - 157.1 Kb/255.3 Kb.
    and sources 0.40b1 (rar/tgz) - 269.7 Kb/382.8 Kb.
    Debug Version 0.40b1 (rar/tgz) - 410.9 Kb/701.9 Kb.
  • I've look through several bug-reports in BugZilla ReactOS and made some fixes
  • Fixed bug with UDMA2 support on Intel ICH1/2/3/4/5 chips.
  • Made some experimental changes in automatic slow-down algorithm. This code is rather old, but was not tested properly.
  • Implemented VM detect code based on PCI bus scan. Now VirtualBox, VMWare, QEmu are detected. See also VirtualMachineType registry option for manual VM type setting.
  • I've tested HDD hot-plug/unplug under NT4. It works.
    1. dismount all partitions
    2. run atactl -h to hide disk and disconnect datacable. You have 20 seconds.
    3. reset controller with atactl -r
    4. run Disk Administrator again
    Connecting back - in reverse order:
    1. connect datacable.
    2. reset device with atactl -r
    3. run Disk Administrator
    4. mount partitions

    Release Version 0.40b (rar/tgz) - 156.8 Kb/255.1 Kb.
    and sources 0.40b (rar/tgz) - 269.1 Kb/382.1 Kb.
    Debug Version 0.40b (rar/tgz) - 410.4 Kb/701.8 Kb.
  • I've made an attempt to sync code with ReactOS, Revision 50985
  • Fixed bug with unnecessary call to AtapiEnableInterrupts() inside AtapiSendCommand() when DRQ is never asserted. This fix is related to ReactOS branch only. This bug definitly cause system freeze if device doesn't respond. Since I've seen VERIFY VOLUME request and request cancelation in logs, I think, the problem was caused by this part of code.
    I've added registry option AtapiSendDisableIntr to manage ATAPI comand sending behavior. AFAIU, under VirtualBox it is unnecessary to disable interrupts around sending ATAPI commands.
  • Implemented registry options for BUSY and DRQ timing adjustments.
  • Added VirtualBox tuning option - VirtualBox value in registry. Sets timings and ATAPI (CD/DVD) related options to the most compatible values.
  • I've declared ULONGIO_PTR type for 32-bit pointers to I/O ports instead of ULONG_PTR. For ReactOS ULONGIO_PTR is transformed to ULONG_PTR, for NT DDK - to ULONG. This is build compatibility issue, otherwise I cannot build driver. This is because ULONG_PTR is not defined on old versions of DDK.
  • Added explicit calling convention NTAPI to definitions of functions.
  • Imported changes, related to types PCCH, SCHAR, PCWSTR.
  • Imported changes from CheckDevice(). Really, I've lost Hard Reset part of code.
  • Documented all Registry settings
    Release Version 0.41b3 (rar/tgz) - 159.8 Kb/258.7 Kb.
    and sources 0.41b3 (rar/tgz) - 279.1 Kb/394.9 Kb.
    Debug Version 0.41b3 (rar/tgz) - 425.2 Kb/712.2 Kb.
  • This is intermediate version. AHCI is not ready yet, since PIO in AHCI is quite different from PIO in SATA/IDE modes. It is very similar to DMA :) So, I have to write corresponding part of code.
    Release Version 0.40a5 (rar/tgz) - 156.5 Kb/254.8 Kb.
    and sources 0.40a5 (rar/tgz) - 268.3 Kb/381.3 Kb.
    Debug Version 0.40a5 (rar/tgz) - 409.1 Kb/701.3 Kb.
  • Fixed bug with BSOD on newer SATA/AHCI Intel chips.
  • Added support for different number of devices on different channls.
  • Updated AHCI support code (not ready yet)
    Release Version 0.40a1 (rar/tgz) - 156 Kb/254.3 Kb.
    and sources 0.40a1 (rar/tgz) - 267.4 Kb/380.1 Kb.
    Debug Version 0.40a1 (rar/tgz) - 406.5 Kb/699.3 Kb.
  • Added support for new SATA/PATA controllers ITE, Intel, VIA.
  • Fixed bug with BSOD on unknown VIA chips.
  • Fixed some bugs in VIA SATA code. Thanks to RoyTam for testing and capturing logs.

    Release Version 0.39j (rar/tgz) - 150.5 Kb/240 Kb.
    and sources 0.39j (rar/tgz) - 261.2 Kb/364.8 Kb.
    Debug Version 0.39j (rar/tgz) - 402.8 Kb/686.5 Kb.
  • Added support for several new SATA/PATA controllers, e.g. Marvell, AMD, ATI, nVidia, VIA.
  • Fixed bug with BSOD on any SATA controller.
  • Fixed some bugs in VIA SATA code.
  • Continued AHCI support development :)
  • Fixed compatibility issue with DDK 2003

    Release Version 0.39g (rar/tgz) - 150.2 Kb/249.4 Kb.
    and sources 0.39g (rar/tgz) - 259.9 Kb/372.5 Kb.
    Debug Version 0.39g (rar/tgz) - 398.4 Kb/692.6 Kb.
    Fixed bug (hang) with HDDs larger than 128Gb.

    Release Version 0.39f (rar/tgz) - 150.1 Kb/249.4 Kb.
    and sources 0.39f (rar/tgz) - 259.4 Kb/372.2 Kb.
    Debug Version 0.39f (rar/tgz) - 397.5 Kb/693.7 Kb.
  • Rewritten code working with ports in PIO mode for better performance. Thanks to KtP.
  • Fixed several bugs in virtual communication device code. Driver emulates virtual device on each channel whech allows to communicate to didden/invisible for system ATA devices. This feature is added to workaround standard scsiport.sys, which doesn't allow access to devices, those it doesn't know about.
  • Fixed bug with not working transfer rate switching via atactl.exe.
  • Fixed bug with PIO support on Intel.
  • Fixed bug with support of "known" controllers, those have non-standard PCI Device Class ans SubClass.
  • Once again rewritten INF-files...
  • Fixed bug in help text of atactl.exe. There was c instead of a.
    Release Version 0.39d (rar/tgz) - 150.2 Kb/249.6 Kb.
    and sources 0.39d (rar/tgz) - 258.6 Kb/371.4 Kb.
    Debug Version 0.39d (rar/tgz) - 395 Kb/695.2 Kb.
  • Fixed bug in support of ATAPI devices, those generate interrupt when ready to accept command packet. Presence of such devices in system caused hangs or very slow operation when accessing such drives. Thanks to KtP for testing and capturing logs.
  • Changed directory structure of the distribution. Now there is separate folder for each OS. It amkes life easier. Also, there are some updates in INF fiels.
  • Added 'ReadOnly' option for ATA devices.
  • Fixed bugs with going to crash on attempts to access devices with invalid (too large) bus addresses.
  • Added experimental support for ISA-PNP and PCMCIA controllers.
    Release Version 0.39b1 (rar/tgz) - 111.3 Kb/148 Kb.
    and sources 0.39b1 (rar/tgz) - 254.7 Kb/329.6 Kb.
    Debug Version 0.39b1 (rar/tgz) - 357.7 Kb/588.1 Kb.
    Seems, I was away for about a half a year... But now I have a lot of news :)
  • Today UniATA was included in ReactOS. It is cool.
  • Implemented device "hiding". This means, that device becomes invisible in regular way, but we can access it via special interface. This would be useful for diagnostic and recovery tools. Also, hot plug/unplug can be implemented in such a way.
  • Implemented ReadOnly registry option for HDDs. You can use it to prevent writes on given HDD,
  • Fixed bug in ATI support. There was value assignment instead of comparison. As result was executed improper part of code... Thanks to ReactOS.
  • Some code beautification: '-1' are changed for human-friendly named constants :)
  • Started work on WDM (PnP) model support. This is required to let 2000 higher OSes go to hibernate and sleep.
  • Added support for ISA IDE controllers with non-standard I/O ranges and/or IRQs. For example - ESS-1868.
  • Changed 80/40-pin detection logic. Now by default we assume that known controllers can determine cable type. If it doesn't (and we know it) or it is unknown controller, this fact would be remembered. And if DMA transfer error occures, transfer rate is automatically decreased to UDMA-33. We cannot cable type info reported by HDD since many drives report prefered cable type instead of actually connected.
  • Removed code duplicates from controller and channels init.

    Release Version 0.38c2 (rar/tgz) - 103.6 Kb/137.1 Kb.
    and sources 0.38c2 (rar/tgz) - 242.1 Kb/310.6 Kb.
    Debug Version 0.38c2 (rar/tgz) - 293.9 Kb/483.6 Kb.
    Fixed still one bug in "is anobody home" code. It didn't work on some LBA48-capable HDDs (even smaller than 128Gb).

    Release Version 0.38c1 (rar/tgz) - 103.6 Kb/137.1 Kb.
    and sources 0.38c1 (rar/tgz) - 242.1 Kb/310.6 Kb.
    Debug Version 0.38c1 (rar/tgz) - 293.7 Kb/483.6 Kb.
    Fixed broken SATA support. Appeared, that fast device presence detection by write/read pattern to HDD register (is anobody home) doesn't work on nForce SATA.

    Release Version 0.38c (rar/tgz) - 103.6 Kb/137 Kb.
    and sources 0.38c (rar/tgz) - 242 Kb/310.5 Kb.
    Debug Version 0.38c (rar/tgz) - 293.6 Kb/483.3 Kb.
  • Fixed terrible bug. UniATA attempted to reprogramm all PCI devices, those report themself as Storage Controller class. Even if later UniATA decided that this device is not supported. As result such devices as Promise RAID, some card-readers, etc. failed to work. Windows Device Manager shown "Resource Conflict". Now it is fixed!
  • Implemented smart device presence check (without meanless waiting for definitly not present device). In vendor utilities this method is called is anybody home
    Thanks to Sergey Kazanskiy ( for valuable knowledge.
  • Removed search for Slave devices on SATA controllers. SATA bus works with single (Master) device only. Splitters are programmed in a different way and not supported yet.
  • Added extended ATA device information support to atactl.exe. Information is obtained from device passport via ATA_IDENTIFY command.
  • Implemented ATA bus rescan and device removal functionality. Works under all OSes including NT3.51 and NT4. Theoretically, this makes possible ATA device hot-swap.
  • Implemented list of bad/unreliable blocks, to prevent driver from treating HDD but return error immediately (by Nikolai Vorontsov).
  • Added support for relatively new requests (since Win 2000):
  • Fixed bug in very-very old PIO0 HDD support.
    Thanks to KtP for testing.
  • Fixed bug in PIO-xxx HDD support. Many of them supports only one PIO mode and cannot tune it. For example HDD may support PIO-2 only.
  • Added NT3.51 for i386 support.
    Thanks to KtP for testing.

    Release Version 0.37b (rar/tgz) - 91.5 Kb/112.6 Kb.
    and sources 0.37b (rar/tgz) - 217.5 Kb/270.5 Kb.
    Debug Version 0.37b (rar/tgz) - 267.5 Kb/424 Kb.
  • Thanks to moving to CrossNT.lib v0.2 now main branch of UniATA works under NT3.51 too.

    Release Version 0.37 (rar/tgz) - 90.5 Kb/111.6 Kb.
    and sources 0.37 (rar/tgz) - 209 Kb/259.7 Kb.
    Debug Version 0.37 (rar/tgz) - 263.3 Kb/418.7 Kb.
    NT3.51 Debug: UniATA v0.37 for NT 3.51
  • Fixed mega-bug with accessing memory-mapped data port. This bug affected ATI и SII SATA controllers. Mechine hanged when reading data block in PIO mode. This is required at least for determining device type and capabilitied.
  • Fixed several bugs those caused SATA controllers with non-generic registers layout to oparate in PIO mode only.
  • Changed init sequence. There was legacy code from ATAPI.SYS, where controller initialization was performed inside detection routine. This worked fine until I met controller, which produced interrupt after init command sequence. And this interrupt was not handled, because system didn't expect it.
  • I've beautified interrupt detection code, e.g. unexpected interrupt detection. This is rather important for SATA controllers, where interrupts can be generated not only on operation completion, but for notification about such events as device connect/disconnect.
  • Removed some unnecessary code fragments. Some other ones are now executed under proper conditions only. For example, in SATA mode some delayes, checks and init commands are unnecessary.

    Release Version 0.36a (rar/tgz) - 89.9 Kb/111.1 Kb.
    and sources 0.36a (rar/tgz) - 185.9 Kb/234.2 Kb.
    Debug Version 0.36a (rar/tgz) - 263.1 Kb/419.8 Kb.
  • Fixed bug with uninitialized addresses of SATA registers, All SATA controllers except NVIDIA were affected. As result, driver could not detect atteched devices and Windows could not find boot disk and crashed with INACCESSIBLE_BOOT_DEVICE error code.
  • Implemeted, but not tested yet, workaround for DMA support with 64-bit physical memory addresses (above 4Gb) with controllers those do not support large memory addresses. Driver allocates intermediate buffer in memory below 4Gb if necessary.

    Release Version 0.35c (rar/tgz) - 89.3 Kb/110.5 Kb.
    and sources 0.35c (rar/tgz) - 184.3 Kb/231.8 Kb.
    Debug Version 0.35c (rar/tgz) - 260.2 Kb/415.4 Kb.

    Present to New Year, under the Cristmass tree :)

  • Аdded SATA/SATA-2 support for VIA, SII, SIS, INTEL (except AHCI mode), ATI, NVIDIA, SERVERWORKS, ALI. This is significant change number 1.
  • Implemeted virtual addressing for controller registers. This makes easy to add support of controllers with non-standard layout of control registers. Note, that all SATA (except AHCI) are not standard. This is significant change number 0.
  • Now drivers uses special library from DbgDump, which makes it binary-compatible with all NT OSes.
  • Added support for more than 2 channels on single controller.
  • Added check of physical addresses for 4Gb limit. But there are few controllers, those support large addresses.

    Release Version 0.33h2 (rar/tgz) - 83.3 Kb/99.8 Kb.
    and sources 0.33h2 (rar/tgz) - 175.4 Kb/218.1 Kb.
    Debug Version 0.33h2 (rar/tgz) - 196.9 Kb/240.5 Kb.
    NT3.51 Debug

    Even a year have not over since last update :).

  • At last I've made representation on standard dual-channel IDE controller as 2 logical devices under Win 2000 and higher. In previous versions this controller was represented as single device with 2 interrupts. Sometimes it worked, sometimes not. This is significant change number 1.
  • I've understand SCSIPORT deferred procedure call API, which is used in interrupt service. Appeared, that it worth using timer only. Such calls as ScsiPortNotification(CallDisableInterrupts, ...) and ScsiPortNotification(CallEnableInterrupts, ...) are not usable. They can lower IRQL and let other interrupts to be serviced. But we cannot use timer together with them. So, we have no wierd magic in this area any more :) This is significant change number 2.
  • Found and fixed terrible bug in controller reset code. If reset is initiated when processing recursive device request, operation abort message is not sent to request originator. Such condition often appears during init of ATAPI devices.
  • Fixed PIO/DMA transfer mode reinit code. Appeared, that before sending some ATAPI commands we should switch device to PIO and then return it back.
  • In PIO/DMA transfer mode setup code removed check for IDE_STATUS_ERROR since it means that only previous operation have failed.
  • Fixed bug with uninitialized variable (interrupt vector) in old ISA IDE detect code. On some systems invalid value of this variable maked BSOD.
  • Removed connected devices search from controller detection code for performance reason. Anyway, device search is initiated by system when we inform OS about detected controller. This was legacy behavior from original ATAPI.SYS. It should not touch controller if there are no connected ATAPI devices found.

    Release Version 0.33d (rar/tgz) - 82.9 Kb/99.4 Kb.
    and sources 0.33d (rar/tgz) - 175 Kb/217.4 Kb.
    Debug Version 0.33d (rar/tgz) - 195.6 Kb/237.5 Kb.
  • Optimized functions of long waiting for device ready.
  • Added unconditional DMA DONE command sequence after controller reset. Otherwise in some cases we can experiance unexpected interrupt. Interesting, that devices report IDLE status, while DMA controller reports such unexpected INTR.
  • Significantly improved interrupt source detection. BM_STATUS_INTR bit in DMA status register is always checked regardless of operation type (DMA vs PIO). When BM_STATUS_INTR is set, the interrupt is definitly our regardless of BUSY bit in IDE status register. In previous varsions such condition was mistakenly treated as unexpected interrupt. Also removed requirement for cleared BM_STATUS_ACTIVE. This bit can be set along with BM_STATUS_INTR when device error occures.
  • Improved channel ready check order for multichannel controllers. Now channels those expect for interrupt are checked first.
  • Fixed bug with missmatched numbers of interrupt disable/enable calls when defered interrupt service is used (DPC, Timer DPC). Usually interrupt processing is defered whed we have to wait for device ready. In this case control is passed to thread with lower priority.
  • Implemented DMA support for non-READ/WRITE BLOCK ATAPI commands (READ/WRITE already use DMA for a long time).
  • Added check of IDE device status for 0xff value before sending command. Such value means that device have hanged or is not present.
  • Fixed several bugs with initial and on-fly DMA mode adjustment.
  • Added check for readiness of device to accept transfer mode adjustment request.
  • Added more informative error messages to atactl.exe.

    Release Version 0.32a2 (rar/tgz) - 81.9 Kb/98.5 Kb.
    and sources 0.32a2 (rar/tgz) - 172.3 Kb/214.7 Kb.
    Debug Version 0.32a2 (rar/tgz) - 192.2 Kb/234.5 Kb.
  • Fixed bug with nForce family. These controllers differs from VIA and AMDwith shifted control registers (16 bytes offset). During driver evolution I have removed NVIDIA flag from internal device list. I decided that it is unnecessary since we can check VensdorId instead. But in the place where controller is programmed old condition was left (bug...). As result when driver attempts to program secondary channel the controller hanged (we have written somewhere ;). Why primary channel worked I don't know. Its a kind of magic :)

    Release Version 0.32a (rar/tgz) - 81.8 Kb/98.4 Kb.
    and sources 0.32a (rar/tgz) - 172 Kb/214.3 Kb.
    Debug Version 0.32a (rar/tgz) - 191.5 Kb/234 Kb.
  • Now atactl.exe can determine transfer mode (PIO/DMA/UDMA) even if UniATA in not installed.
  • Porting to NT3.51 (thanks to KtP) and ReactOS (thanks to Root) has begun.
  • Added support for newest ICH6, ICH7 and VIA 6421.
  • Fixed bug with nForce и nForce2. These controllers mistakenly had AMDBUG flag in internal list if known devices.
  • Changed timings for HighPoint family.
  • Fixed bug with bogus geometry for large HDDs. There was 255 sectors and 63 heads. Must be 63 sectors and 255 heads.
  • Added SCSIOP_MEDIUM_REMOVAL support for non-ATAPI devices (translation from SCSI to ATA).
  • Fixed bug with old HDDs those do not release DRQ after finishing data transfer.
  • Fixed several bugs with inheritance of transfer rate limit in hierarchy of descriptors controller-channel-device.
  • Improved transfer mode (PIO/DMA) switching code.

    Release Version 0.31f (rar/tgz) - 80.4 Kb/96.4 Kb.
    and sources 0.31f (rar/tgz) - 166.9 Kb/207.4 Kb.
    Debug Version 0.31f (rar/tgz) - 190 Kb/232.3 Kb.
  • Fixed bug in .INF file for NT4. UniATA was installed as System Bus Extender, but disk.sys expected at least one SCSI miniport to be loaded. As result OS did not run disk.sys and could not find boot device. Thanks to Axxie.
  • Implemented more standard method of determining logical geometry of the drive. For better compatibility with previous versions the method is controlled by Registry settings. Read about GeomType for details.
  • Now Debug build comes with Debug Information in .PDB file. During Release build .PDB is also automatically generated.


    Release Version 0.31d (rar/tgz) - 80.1 Kb/96.1 Kb.
    and sources 0.31d (rar/tgz) - 166.2 Kb/206.7 Kb.
    Debug Version 0.31d (rar/tgz) - 111.8 Kb/131.6 Kb.
    Fixed several bugs in error recovery code for invalid address of the device on ATA bus.

    Debug Version 0.31c (rar/tgz) - 111.8 Kb/131.6 Kb.
    Release Version 0.31c (rar/tgz) - 80.1 Kb/96.1 Kb.
    and sources 0.31c (rar/tgz) - 166.3 Kb/206.6 Kb.
    Fixed bug in bus address validation code. I've written '>' instead of '>='. This lead to crash when someone send request to non-existent bus (e.g. N2, which comes after N0 and N1).

    Release Version 0.31b (rar/tgz) - 80.1 Kb/96.1 Kb.
    and sources 0.31b (rar/tgz) - 166.1 Kb/206.5 Kb.
    Debug Version 0.31b (rar/tgz) - 111.8 Kb/131.6 Kb.
  • Extension in Registry settings related to supported device classes. Now it is possible to enable/disable support of PCI, ISA, ISA/PCI Compat and MCA.
  • Also for Debug purposes added option for dumping Debug messages to blue screen.
  • HiNT VXPro II is added to the list of known devices. However, it doesn work yet :)
    Note: do not install Debug build under Win 2000 and higher until DbgPrint Dump is installed with
    DbgPrintLog.exe -full -T DTN -wd X:\dir_for_logs -drv 1 -svc A -drvopt DoNotPassMessagesDown 1
        -drvopt StopOnBufferOverflow 1 -drvopt BufferSize 16384 DbgDump.log

    Version 0.31a (rar/tgz) - 80 Kb/96 Kb.
    and sources 0.31a (rar/tgz) - 165.9 Kb/206.3 Kb.
  • Thanks to Axxie for discovering bug with uninitialized DEVICE_EXTENSION. This structure includes state variables of channels, connected devices and interrupt service routines. On most machines this memory block was allocated zero-filled. But on some ones it contained garbage.
  • I've also received interesting news from Mike. He have successfully run NT4+sp6a with UniATA installed on ICH4.

    Version 0.31 (rar/tgz) - 79.6 Kb/95.6 Kb.
    and sources 0.31 (rar/tgz) - 165.1 Kb/205.4 Kb.
  • Completely rewritten workaround for ATAPI devices those generate INTR without clearing BSY. Treate thanks to Root for testing.
  • Fixed bug in operation sequence for sending ATAPI command. At one place interrupt status was not cleared, and at another interrupts were enabled too early.
  • Added interrupt status clear code after controller reset.
  • Still some extensions in Registry settings.

    Debug Version 0.30i (rar/tgz) - 101.6 Kb/119.8 Kb.
    Version 0.30i (rar/tgz) - 79.2 Kb/95.2 Kb.
    and sources 0.30i (rar/tgz) - 164.2 Kb/204.5 Kb.
  • Fixed bug (too long delay) in HDD cache flushing code.
  • .INF is updated with till one patch by Root
  • Added experimantal workaround (from FreeBSD) for ATAPI devices those generate INTR without clearing BSY.
  • Added workaround for the following bug in SCSIPORT.SYS from NT4: If we attempt to initialize Compatible Mode IDE controller and SCSIPORT.SYS fails resource list check, it keeps AtDiskPrimaryAddressClaimed and/or AtDiskPrimaryAddressClaimed flag(s) set to TRUE. As result the second initialization attempt fails because UniATA driver decides that this controller is already clamed by some other driver. Thanks to Vitaliy Vorobyov aka (remove X) for bug report and fix.
  • I've extended and documented Registry settings.
  • Also published special debug build with logs enabled.

    Debug Version 0.30h (rar/tgz) - 99.9 Kb/118.2 Kb.
    Version 0.30h (rar/tgz) - 78.3 Kb/94.3 Kb.
    and sources 0.30h (rar/tgz) - 162.6 Kb/202.7 Kb.
  • Removed too long waiting for device readiness in error handler.
  • Implemented HDD cache flushing in response to system shutdown request.
  • .INF is updated with patch by Root. May be this will help .INFs working properly :)
  • Added device reset option -r to atactl.exe. It is useful when ATAPI device hangs.
  • Published special debug build with logs enabled.
    Note: do not install this build until DbgPrint Dump is installed with
    DbgPrintLog.exe -full -T DTN -wd X:\dir_for_logs -drv 1 -svc A -drvopt DoNotPassMessagesDown 1
        -drvopt StopOnBufferOverflow 1 DbgDump.log

    Version 0.30g (rar/tgz) - 78.2 Kb/93.8 Kb.
    and sources 0.30g (rar/tgz) - 161.5 Kb/201 Kb.
  • I've found and fixed rather specific bug: in some cases driver attempted to change transfer mode for some device on IDE bus while another device executed the command. In other cases similar situation appeared when new command came to the queue. The bug could be observed as complete system hang.
    On my configuration this situation could be reproduced in rather specific conditions. However, I have only 1 device on each IDE bus. My be such hang can happen on machines with 2 devices on single IDE bus much often, even during OS boot.
  • Seems, LBA48 already works fine now. And Intel ICH4 doesn't yet :(

    Version 0.30e (rar/tgz) - 78.1 Kb/93.8 Kb.
    and sources 0.30e (rar/tgz) - 160.9 Kb/200.4 Kb.
    Still some fixes with LBA48 support
  • I have forgotten to set IDE_USE_LBA flag when using LBA48 addressing
  • there were no support for LBA48 version of IDE_VERIFY command. This command is used for surface check.
  • in some cases READ NATIVE MAX LBA/SET MAX LBA were not handled properly
    and one useful addon:
  • implemented atactl.exe command line utility, which can enumerate IDE, SCSI and RAID controllers and display information about connected to them devices. If UniATA driver is installed, you can change data transfer mode (PIO/DMA/UDMA) for individual IDE/ATAPI devices with atactl.exe.
  • optimized controller-specific DMA tuning code. When removing code duplicates (see usage of AtaSetTransferMode()) I have found some misscorrespondance between ATA/ATAPI device transfer mode and controller transfer mode.

    Version 0.30c (rar/tgz) - 69.8 Kb/75.1 Kb.
    and sources 0.30c (rar/tgz) - 148.6 Kb/176.8 Kb.
  • Fixed LBA48 support bug. LBA48 is addressing mode used for large capacity drives - more than 128Gb. The problem was caused by code of determining real drive capacity. Some drives report their size as 32Gb (e.g. my Seagate Barracuda IV 40) or as 128Gb (I don't know real examples) for compatibility issues. There are special commands for retrieving real capacity and size limit removal. They are READ_NATIVE_LAST_LBA and SET_MAX_LBA. But I didn't know, about their 48-bit clones intended for drives larger than 128Gb. So, I programmed drives to limit their capacity to 128Gb wit hold commands :(
    Greate thanks to Alexander Spelicyn aka (remove X) for testing with 160Gb HDD on the old good i440BX.
  • Fixed bug with handling UNIATA_NO_DPC_ATAPI flag. This flag enables workaround for hangs with some new CD/DVD drives on CMD-649.

    Version 0.30a (rar/tgz) - 67.9 Kb/72.5 Kb.
    and sources 0.30a (rar/tgz) - 146.4 Kb/173.7 Kb.
  • Once again I have rewritten Intel ICH4 support code. Saying truth, I reverted it to very old state, when it seemed working. Let's wait for testing result.
  • Until we have no absolutely correct and 100%-reliable interaction with ScsiPort driver, I have introduced workaround. The main idea - I try to init main Onboar IDE controller using various tricks (I wrote about these tricks before). Experiments show that this workaround helps in many cases. Also, let's wait for results.

    Version 0.29j (rar/tgz) - 67.6 Kb/72 Kb.
    and sources 0.29j (rar/tgz) - 145.5 Kb/172.6 Kb.
  • Bug-fix in SiS controller detection code. It has very interesting algorithm. There is 1 PCI IDE Controller with instant DeviceId/VendorID. There are one or two specific Bridge Device(s). Their DeviceId/VendorId determine actual type of the IDE Controller. This behavior is similar to VIA. But some models need very specific check. We change 1 byte in PCI Config Space ot the IDE Controller and check if its DeviceId have changed (!). (Seems to me, this is not too good idea). The problem was because I have lost the line which reverts controller to initial state.
    Greate thanks to Mike for testing my buggy versions and supplying me with pretty bug-reports (181 Kb).
    So, lets try new version...

  • Still some fixes in Intel, Acer and some other controller support code. Silly bug. I put break in switch/case instead of return. As result after successfull UDMA initialization the default code was called and the device (not controller!) switched back to PIO-0.
  • Improved SiS controlelr support. Thanks to Ivano Guerra. Of course, this is beta-version and must be tested. Try Version 0.29i3 (rar/tgz) - 67.6 Kb/72 Kb.
    and sources 0.29i3 (rar/tgz) - 144.9 Kb/171.9 Kb.

    In same code for Intel ICHxxx IDE support found still one bug. Looks like that it is mine. The bug leads to data corruption. So, v29i is removed from the site.

    Version 0.29i (rar/tgz) - 144.4 Kb/171.2 Kb.
  • Found and fixed bug in Intel IDE support code. It was copied from FBSD 5.2.1 (and it is still there). Have compared the latest and some old versions and found, than 32-bit value (0x10000 << devno) is written to 16-bit register (PCI Config Space 0x54). Higher bits are truncated and lower bits are all 0. This turns the controller out from UDMA mode. But connected devices are already programmed to use UDMA. Thus we have transfer mode missmatch, and as result - hangs and crashes. I hope this fix will help.

    Version 0.29h (rar/tgz) - 66.9 Kb/71.4 Kb.
    and sources 0.29h (rar/tgz) - 143.6 Kb/170.3 Kb.
  • Rewritten Intel IDE controller support code. I hope this will only improve compatibility. Especially for ICH4, which didn't work with previous version.
  • Ported some new code from FBSD 5.2.1.
  • Fixed bug with include/exclude device list in Registry.
  • Implemented simplex-mode support. In this mode IDE channels do not operate simultaneously. For some controllers this mode is inevitable. Along with autodetect, you can turn the controller into simplex-mode using DWORD:ForceSimplex Registry value under HKLM\System\CurrentControlSet\Services\UniATA\Parameters Registry key or under its device-specific subkey.
  • Added support for IDE devices those report 0x40 (IDE_STATUS_DRDY) status in inactive state instead of usual 0x50 (IDE_STATUS_IDLE). Such behavior was oberved under latest VMWare release (4.5.1 build-7568). Thanks to Vitaliy for information and testing.
  • Rewritten load balancing code for separate IDE channels and devices connected to single channel.

    Version 0.29d (rar/tgz) - 62.4 Kb/66 Kb.
    and sources 0.29d (rar/tgz) - 135.9 Kb/160.1 Kb.
  • Fixed VIA 8235 and VIA 8233A init code. That was done because I have installed UniATA on one computer with VIA 8235. After that I observed a lot pretty bugs. System worked slowly and randomly crashes. It seemed like sometimes data is not correctly read from HDD. I looked into latest FBSD ata drivers and saw no changes for this controller. At the same time there are bug-reports in formus. I looked into Linux kernel and found that for VIA 8235 and VIA 8233A PCI register 0x4c is not programmed. I did the same. Unfortunately, I cannot check if it works on that machine.
  • During code review I found that I made a mistake when porting SiS support code from FBSD. The bug affected on secondary channel's UDMA mode register. Also fixed.

    Version 0.29c (rar/tgz) - 61.6 Kb/65.2 Kb.
    and sources 0.29c (rar/tgz) - 133.9 Kb/157.9 Kb.
  • Fixed VIA 8235 and VIA 8233A init code. That was done because I have installed UniATA on one computer with VIA 8235. After that I observed a lot pretty bugs. System worked slowly and randomly crashes. It seemed like sometimes data is not correctly read from HDD. I looked into latest FBSD ata drivers and saw no changes for this controller. At the same time there are bug-reports in formus. I looked into Linux kernel and found that for VIA 8235 and VIA 8233A PCI register 0x4c is not programmed. I did the same. Unfortunately, I cannot check if it works on that machine.
  • During code review I found that I made a mistake when porting SiS support code from FBSD. The bug affected on secondary channel's UDMA mode register. Also fixed.

    Version 0.29a (rar/tgz) - 61.1 Kb/64.7 Kb.
    and sources 0.29a (rar/tgz) - 133.5 Kb/157.5 Kb.
  • Added code for a lot of new controllers. Mostly for SiS and Promese.
  • Implemented device/vendor-specific Registry settings.
    You can create the following sub-keys with parameters under HKLM\System\CurrentControlSet\Services\UniATA.
    Paramaters - The most global settings.
    Paramaters\Ven_VVVV - where VVVV is Vendor ID (see. PCI Dump)
    Paramaters\Ven_VVVV\Dev_DDDD, where DDDD is Device Id. See the same place.
    Paramaters\Ven_VVVV\Dev_DDDD\Slot_XXXXXXXX, where XXXXXXXX is PCI address in 32-bit form (HEX).
    In general it would be pretty to create configuration utility...
  • Implemented Include/Exclude options. Now you can create Inlude or Exclude DWORD value under Registry key, described above to Enable/Disable UniATA support for specified controller.

    Version 0.29b (rar/tgz) - 61.5 Kb/65.1 Kb.
    and sources 0.29b (rar/tgz) - 133.8 Kb/157.8 Kb.
  • Fixed some issues in OEMSETUP.INF and TXTSETUP.OEM. After that UniATA was successfully added during text-mode w2k setup phase. Then w2k was installed on HDD connected to CMD649 IDE controlled. Note, w2k doesn't support it itself. So, I decided that these setup files are correct now. Enjoy.

    Version 0.28 (rar/tgz) - 58.3 Kb/61.8 Kb.
    and sources 0.28 (rar/tgz) - 127.2 Kb/149.1 Kb.
  • Fixed bug with interrupt enable/disable routines. They worked with Primary channel only.
  • At least we removed dependence on ScsiPort DMA support API. Now UniATA translates virtual addresses to physical itself. This give 2 advantages: 1) No hackar's init methods needed (ISA bridged controllers was initialized as PCI and this method worked not on all machines). 2) No more copying data between DMA buffer and user buffer.

    Version 0.27a (rar/tgz) - 58.2 Kb/61.9 Kb.
    and sources 0.27a (rar/tgz) - 124.7 Kb/147.6 Kb.
  • Fixed error handling code for ATAPI devices (CD-ROM/RW, etc.). On some devices we must wait for DRQ bit assertion if an error occured.

    Version 0.27 (rar/tgz) - 58.3 Kb/61.8 Kb.
    and sources 0.27 (rar/tgz) - 125.5 Kb/147.1 Kb.
  • Thanks to Vitaliy Vorobyov aka (remove X).
    Fixed initialization code for NT4+SP6a
  • Thanks to Vitaliy Vorobyov again, for rewriting installation INT. file for NT4
  • Interrupt service (ISR) code, that uses delays is moved to deparate thread (DPC).

    Version 0.26c (rar/tgz) - 55.8 Kb/59 Kb.
    and sources 0.26c (rar/tgz) - 120.7 Kb/141.4 Kb.
  • Fixed bug with DMA error handling. Previous versions deadly hanged the system if such error occured. The experiment shown, that after DMA CRC error we should wait for drive readiness before retry.
    Special thanks to Alex Y. Matiash for bug-report
  • Fixed interrupt handler for CMD 649 and CMD 648 controllers

    Version 0.26 (rar/tgz) - 55.7 Kb/59 Kb.
    and sources 0.26 (rar/tgz) - 119.3 Kb/140 Kb.
  • Promise and HighPoint RAID support is now disabled by default, because we don't support RAID-arrays yet.
    It is possible to enable support for these controllers in standard (non-RAID) dual-channel mode:
  • New utility for w2k .INF-file reconstruction is added to distribution. It scans PCI bus for compatible, but not listed IDE controllers. If such controllers are added, they are inserted into .INF-file.

    Version 0.26b (rar/tgz) - 55.8 Kb/59 Kb.
    and sources 0.26b (rar/tgz) - 120.6 Kb/141.2 Kb.
  • Fixed bug with DMA mode on some types of CD-ROMs

    Version 0.25f (rar/tgz) - 36.9 Kb/38.6 Kb.
    and sources 0.25f (rar/tgz) - 100.6 Kb/119.1 Kb.

    Version 0.25e (rar/tgz) - 164.3 Kb/200.1 Kb.
  • Fixed bug with invisibility of the 2nd IDE channel on onboard controller. The trouble was because NT4 allows initialization of 2 PCI devices with the same address on PCI bus, but with different system resource usage (I/O ranges and IRQ). W2k doesn't permit such tricks. Thus I use single device thet handles 2 IRQs under this OS.
  • AdapterControl fuctionality is added. It is used by OS to enable/disable controller interrupts under w2k and higher.
  • Tests show, that PnP functionality doesn't work yet under w2k. The main difficulty lays in the following: for PnP support we must create a list of all supported devices in Registry and installation .INF file. It is not compatible with the idea of universal driver. Probably the utilities for dynamic Registry and/or .INF file update will be created. Also probably 2 services using the same uniaata.sys would be created:
    - one of them will operate in PnP mode with fixed (from OS's point of view) set of known devices
    - onother will be started in Legacy mode to handle all other recognizable controllers

    Version 0.25a (rar/tgz) - 157.5 Kb/192.6 Kb.
  • I've found that problem with onboard controllers was caused by PciIde.sys, which handles such controllers. Thus a simple installation BAT-file was created. It simply copies UniATA.sys, creates neccessary Keys in Registry and disabled PciIde driver.
    Now it works under w2k !!!
  • Readme files are created for different platforms: w2k (readme_w2k.txt) and NT4 (readme_nt4.txt). Old version of NT4 readme is now called readme_nt4_old.txt. These files are moved to XXX_Dist directories.

    I've found, that even rahter old versions work under w2k. But with some restrictions: OS doesn't allow us to handle onboard (Compatible Mode) IDE, because in w2k IDE has its own miniport driver that differs from SCSI miniport. Now I'm thinking about the way of cheating the system to allow my driver representing Compatible Mode IDE controllers as SCSI devices.

    Version 0.25 (rar/tgz) - 155.2 Kb/187.5 Kb.
  • Acard and nForce2 IDE DMA controllers support is added.
  • Fixed bug with Promise IDE DMA support code.
  • DMA mode check is added before accessing controller registers
  • 2003.06.03

    Version 0.24 (rar/tgz) - 153.1 Kb/185.2 Kb.
  • Disabled DMA for ATAPI devices on ServerWorks controllers. It doesn't work :(
  • Fixed bug with very old HDDs those don't support SET_GEOMETRY feature.
  • Fixed bug with using DWordIO (32bit) on very old HDDs those report such capability, but can't operate in this mode
  • I tried to run this under w2k. It doesn't work.
  • 2003.02.15

    Version 0.23e (rar/tgz) - 152.8 Kb/184.9 Kb.
  • Code for handling some unusual devices (Yamaha-CRW2100) those like generating Unexpected Interrupt durring initialization process. (They do it a little later than I expected).

    Version 0.23d (rar/tgz) - 152.8 Kb/184.9 Kb.
  • Fixed bug in .INF file
  • .INF files together with uniata.sys are moved to Debug_Dist and Release_Dist directories
  • new target PKG with parameter VER is added to idedma.mak. For example, current version with Dist directories was build using the following command:
    nmake PKG VER="23d_ok"
  • new installation instruction can be found inside archive.

    Version 0.23c (rar/tgz) - 155.4 Kb/188.9 Kb.
  • I've fixed a very big and fat bug, that could bring the computer down when executing DSC-restrictive commands (Such as SEEK, PLAY_CD, immediate LOAD/UNLOAD, etc.). Is was found on attempt to play Audio-CD. This bug could also lead to non-oparated state of dual-channel controllers. (when both channels are visible via single PCI device).
  • .INF files are moved to Debug and Release directories for corresponding build installation.

    Version 0.23 (rar/tgz) - 147.3 Kb/176.6 Kb.
    But you should not use it. It is buggy ;). There is better one: 0.23b BusMaster_v23b_ok.rar/tgz (148.9 Kb/198.7 Kb) It is good enough, but I've not publish it yet....
    Already done!!! Here it is: BusMaster_v23b_ok.rar
  • Controllers initialization code is optimizad for minimal size.
  • I've created independent command queues for Master and Slave devices. Now command reordering is performed separately for each device, thus, it is more efficient. The queue to be serviced for the next time is chosen according to special algorithm. Currently it looks at queue size only, but I'm going to make something more clever in nearest future.
  • Installation .INF file is added (in Dist directory)
  • 2002.10.11(29)

    Version 0.22b (rar/tgz) - 146.1 Kb/173.5 Kb.
    It is a little less buggy
  • VIA-compatible chipset initialization code has been fixed. Now we handle the case of an unknown Revision Id properly.
  • Controller list initialization code has been fixed. There were a bug with NULL-pointers.
  • I've implement 'human-friendly' ;) algorithm of transfer rate slow-down when we have too high CRC Error-rate. Now driver don't switch device to PIO mode immediately. It probes slower modes until suitable one is found. The mode is assumed to be suitable if it shows much better results. If such mode can be found the device is switched to use this mode permanently. This technology solves problem with 40-cond. cables instead of 80-cond. one for UDMA66+ capable devices those don't set cable type bit properly in IDENTIFY_INFORMATION.
  • 2002.10.10

    Wow again! I've got new version BusMaster_v21d_ok.rar/tgz (87.8 Kb/108.2 Kb) (v 0.21d). I would be thankful to everyone who takes it for testing and tell me where it works and where it doesn't.
  • DMA/UDMA support for ATAPI devices is added.
  • The technology of working with controllers those have 2 channels available via single PCI device was dramatically changed. NT designers assumed that device can't interrupt until its previous interrupt is serviced. Thus, we can't programm one channel until transfer is completed on another channel. I've used a kind of workaround. (New DeviceObject connected to the same interrupt is created. It receives and queues interrupts from another channel).
  • IO request queue sorting by LBA is implemented. Huge directory tree scan works about 8% faster (6.00 min -> 5.30) even in multithread tests with different start directories. I've also tried transfer rates for simple copy, but the results were unstable. The experiments with sorting algorithm will go on.
  • 2002.09.16

    Wow! I've got working version BusMaster_v13b_ok.rar/tgz (97.4 Kb/112.6 Kb) (v 0.13b). that understand what is DMA.
  • DMA Engine is enabled and works now!!!
  • Some minor bugs in Primary/Secondary initialization on a single controller are fixed.
  • Generic DMA (Single Word DMA, mode 0) support is added for the case when other DMA modes can't be initialized (for ex. on unknown controller model). According to IDE BusMaster specification, the controller must automatically stitch to this mode after power on or reset.
  • Device response wait timeout was changed from 5 to 0.05 sec in interrupt handler. It is wrong - blocking interrupts / thread switching when device hangs. Especially because it is possible (and even recomended by Microsoft) to avoid such waits.
  • 2002.06.25

    Version 0.9 (rar/tgz) - 54.1 Kb/62.1 Kb.
  • New (I think, ideologically right) algorithm of device search and initialization is implemented.
  • Some bugs with initialization of MasterIde controller (this is one that is onboard and usually works via ISA-to-PCI bridge). I was surprised that we can't communicate with it via PCI bus. Though it is visible there, neither IRQ nor IO-range is allocated (I suspect it was done for some kind of compatibility) We should use the following standard (predefined) IRQ/IO-ranges instead:
      Primary channel - IRQ 14 / IO 0x1f0
      Secondary channel - IRQ 15 / IO 0x170
  • 2002.06.01

    I've found an interesting thing: some HDDs (in particular my Seagate Barracuda ATA 4) report their capacity as 32Gb by default. Thus, we should use special command to determine its right capacity (see ATA specifications, keyword="READ/SET NATIVE MAX LBA")


    Please, send your comments and propositions here: FB or mail (remove X)   Share
    << Back designed by Alter aka Alexander A. Telyatnikov powered by Apache+PHP under FBSD © 2002-2024