Reseting your disks from PIO to DMA
October 26th, 2007
If you are having issues with your PC, noticeable by your Media player crapping out whenever your Hard Disk or CD/DVD is accessed or by your mouse sticking, check this piece of VBscript that resets your devices from PIO ( software ) mode to DMA ( hardware ). Sometimes windows will switch over to software mode without even telling you ( thats nice ) and this will detect and reset those settings.
For the original script check it out here
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | ' Visual Basic Script program to reset the DMA status of all ATA drives ' Copyright © 2006 Hans-Georg Michna ' Version 2007-04-04 ' Works in Windows XP, probably also in Windows 2000 and NT. ' Does no harm if Windows version is incompatible. If MsgBox("This program will now reset the DMA"_ & " status of all ATA drives with Windows drivers." _ & vbNewline & "Windows will redetect the status after "_ & "the next reboot, therefore this procedure" _ & vbNewline & "should be harmless.", _ vbOkCancel, "Program start message") _ = vbOk Then RegPath = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\"_ & "Control\Class\{4D36E96A-E325-11CE-BFC1-08002BE10318}\" ValueName1Master = "MasterIdDataChecksum" ValueName1Slave = "SlaveIdDataChecksum" ValueName2Master = "UserMasterDeviceTimingModeAllowed" ValueName2Slave = "UserSlaveDeviceTimingModeAllowed" ValueName3 = "ResetErrorCountersOnSuccess" MessageText = "The following ATA channels have been reset:" MessageTextLen0 = Len(MessageText) ConsecutiveMisses = 0 Set WshShell = WScript.CreateObject("WScript.Shell") For i = 0 to 999 RegSubPath = Right("000" & i, 4) & "\" ' Master Err.Clear On Error Resume Next WshShell.RegRead RegPath & RegSubPath & ValueName1Master errMaster = Err.Number On Error Goto 0 If errMaster = 0 Then On Error Resume Next WshShell.RegDelete RegPath & RegSubPath & ValueName1Master WshShell.RegDelete RegPath & RegSubPath & ValueName2Master On Error Goto 0 MessageText = MessageText & vbNewLine & "Master" End If ' Slave Err.Clear On Error Resume Next WshShell.RegRead RegPath & RegSubPath & ValueName1Slave errSlave = Err.Number On Error Goto 0 If errSlave = 0 Then On Error Resume Next WshShell.RegDelete RegPath & RegSubPath & ValueName1Slave WshShell.RegDelete RegPath & RegSubPath & ValueName2Slave On Error Goto 0 If errMaster = 0 Then MessageText = MessageText & " and " Else MessageText = MessageText & vbNewLine End If MessageText = MessageText & "Slave" End If If errMaster = 0 Or errSlave = 0 Then On Error Resume Next WshShell.RegWrite RegPath & RegSubPath & ValueName3, 1, "REG_DWORD" On Error Goto 0 ChannelName = "unnamed channel " & Left(RegSubPath, 4) On Error Resume Next ChannelName = WshShell.RegRead(RegPath & RegSubPath & "DriverDesc") On Error Goto 0 MessageText = MessageText & " of " & ChannelName & ";" ConsecutiveMisses = 0 Else ConsecutiveMisses = ConsecutiveMisses + 1 If ConsecutiveMisses >= 32 Then Exit For ' Don't search unnecessarily long. End If Next ' i If Len(MessageText) <= MessageTextLen0 Then MessageText = "No resettable ATA channels with "_ & "Windows drivers found. Nothing changed." Else MessageText = MessageText & vbNewline _ & "Please reboot now to reset and redetect the DMA status." End If MsgBox MessageText, vbOkOnly, "Program finished normally" End If ' MsgBox(...) = vbOk ' End of Visual Basic Script program |