Last active
December 28, 2022 22:23
-
-
Save guilt/84462c28d6e358efb865836f0bab2d9e to your computer and use it in GitHub Desktop.
Windows Script to reset DMA mode on Optical Drives
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
' Visual Basic Script program to reset the DMA status of all ATA drives | |
' Copyright © 2006 Hans-Georg Michna | |
' Version 2006-03-14 | |
' 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}\" | |
ValueName1 = "MasterIdDataChecksum" | |
ValueName2 = "SlaveIdDataChecksum" | |
ValueName3 = "ResetErrorCountersOnSuccess" | |
MessageText = "The following ATA channels have been reset:" | |
MessageTextLen0 = Len(MessageText) | |
SubsequentMisses = 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 & ValueName1 | |
e1 = Err.Number | |
Err.Clear | |
On Error Goto 0 | |
If e1 = 0 Then | |
On Error Resume Next | |
WshShell.RegDelete RegPath & RegSubPath & ValueName1 | |
On Error Goto 0 | |
MessageText = MessageText & vbNewLine & "Master" | |
End If | |
' Slave | |
Err.Clear | |
On Error Resume Next | |
WshShell.RegRead RegPath & RegSubPath & ValueName2 | |
e2 = Err.Number | |
On Error Goto 0 | |
If e2 = 0 Then | |
On Error Resume Next | |
WshShell.RegDelete RegPath & RegSubPath & ValueName2 | |
On Error Goto 0 | |
If e1 = 0 Then | |
MessageText = MessageText & " and " | |
Else | |
MessageText = MessageText & vbNewLine | |
End If | |
MessageText = MessageText & "Slave" | |
End If | |
If e1 = 0 Or e2 = 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 & ";" | |
SubsequentMisses = 0 | |
Else | |
SubsequentMisses = SubsequentMisses + 1 | |
If SubsequentMisses >= 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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment