Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

3518 lines
214 KiB

'*********************************************************************************************
'* File: ADPlus.vbs
'* Version: 4.01
'* Date: 5/29/2001
'* Author: Robert Hensing, Solution Integration Engineering
'* Purpose: AutodumpPlus is used to automatically generate memory dumps or log files containing
'* scripted debug output usefull for troubleshooting N-tier WinDNA / .Net applications.
'* Since WinDNA / .Net applications often encompass multiple, interdependent
'* processes on one or more machines, when troubleshooting an application hang
'* or crash it is often necessary to 'look' at all of the processes at the same time.
'* AutodumpPlus allows you to profile an application that may be hanging by taking
'* 'snapshots' (memory dumps, or debug log files) of that application and all of
'* its processes, all at the same time. Multiple 'snapshots' can then be compared
'* or analyzed to build a history or profile of an application over time.
'*
'* In addition to taking 'snapshots' of hung/non-responsive WinDNA / .Net applications
'* AutodumpPlus can be used to troubleshoot applications that are crashing or throwing
'* unhandled exceptions which can lead to a crash.
'* Usage:
'* AutodumpPlus has 3 modes of operation: 'Hang', 'Quick' and 'Crash' mode.
'*
'* In 'Hang' mode, AutodumpPlus assumes that a process is hung and it will attach a
'* debugger to the process(s) specified on the command line with either the '-p'
'* or '-pn' or '-iis' switches. After the debugger is attached to the process(s)
'* AutodumpPlus will dump the memory of each process to a .dmp file for later analysis
'* with a debugger (such as WinDBG). In this mode, processes are paused briefly
'* while their memory is being dumped to a file and then resumed.
'*
'* In '-quick' mode AutodumpPlus assumes that a process is hung and it will attach a
'* debugger to the process(s) specified on the command line with either the '-p'
'* or '-pn' or '-iis' switches. After the debugger is attached to the process(s)
'* AutodumpPlus will create text files for each process, containing commonly requested
'* debug information, rather than dumping the entire memory for each process.
'* 'Quick' mode is generally faster than 'Hang' mode, but requires symbols to be
'* installed on the server where AutodumpPlus is running.
'*
'* In 'Crash' mode, AutodumpPlus assumes that a process will crash and it will attach
'* a debugger to the process(s) specified on the command line with either the '-p'
'* or '-pn' or '-iis' switches. After the debugger is attached to the process(s)
'* AutodumpPlus will configure the debugger to log 'first chance' access violations
'* (AV's) to a text file. When a 'second chance' access violation occurs, the
'* processes memory is dumped to a .dmp file for analysis with a debugger such as
'* WinDBG. In this mode, a debugger remains attached to the process(s) until the
'* process exits or the debugger is exited by pressing CTRL-C in the minimized
'* debugger window. When the process crashes, or CTRL-C is pressed, it will
'* need to be re-started.
'*
'* For more information on using AutodumpPlus, please refer to the following KB:
'* http://support.microsoft.com/support/kb/articles/q286/3/50.asp
'***********************************************************************************************
'*--------------------------------------------------------------------------
'*
'* Switches: '-hang', '-quick', '-crash', '-iis', '-p <PID>', '-pn <Process Name>
'* '-pageheap', '-quiet', '-o <output directory>, '-notify <target>
'*
'*
'* Required: ('-hang', or '-quick', or '-crash') AND ('-iis' or '-p' or '-pn')
'*
'* Optional: '-pageheap', '-quiet', '-o <outputdir>', '-notify <computer>'
'*
'* Examples: 'ADPlus -hang -iis', Produces memory dumps of IIS and all
'* MTS/COM+ packages currently running.
'*
'* 'ADPlus -crash -p 1896', Attaches the debugger to process with PID
'* 1896, and monitors it for 1st and 2nd
'* chance access violations (crashes).
'*
'* 'ADPlus -quick -pn mmc.exe', Attaches the debugger to all instances
'* of MMC.EXE and dumps debug information
'* about these processes to a text file.
'*
'* 'ADPlus -?' or 'ADPlus -help': Displays detailed help.
'*-------------------------------------------------------------------------------
'For more information on using AutodumpPlus, please refer to the following KB:
'http://support.microsoft.com/support/kb/articles/q286/3/50.asp
'****************************************************************************
Option Explicit
' These are AutodumpPlus's constants. By default, they should all be set to FALSE for performance reasons.
' These constants should only be set to TRUE for troubleshooting script problems or producing verbose debug
' information. Setting some of these constant to TRUE can have a performance impact on production servers.
' Set DEBUGGING = TRUE to turn on verbose debug output, usefull for troubleshooting ADPlus problems.
Const DEBUGGING = FALSE
' Set Full_Dump_on_CONTRL_C to TRUE if you wish to have ADPlus produce a full memory dump (as opposed to a
' mini-memory dump) whenever CTRL-C is pressed to stop debugging, when running in 'crash' mode.
' Note: Depending upon the number of processes being monitored, this could generate a signifigant amount
' of memory dumps.
Const Full_Dump_on_CONTRL_C = FALSE
' Set Create_Full_Dump_on_1st_Chance_Exception to TRUE if you wish to have ADPlus produce a full memory dump
' for the process each time a 1st chance exception is encountered. This is disabled by default for performance reasons.
' This is particulairly usefull if troubleshooting MTS or COM+ packages that get shut down after a 1st chance
' unhandled exception and do not reach a 2nd chance exception state before the process is shut down.
Const Create_Full_Dump_on_1st_Chance_Exception = FALSE
' Set No_Dump_on_1st_Chance_Exception to TRUE if you wish to have ADPlus not produce any memory dumps
' when 1st chance exceptions are encountered. You may wish to do this if a very high rate of 1st chance
' exceptions is encountered (i.e. hundreds per minute) and the debugger is spending too much time producing mini-memory dumps
' causing the process to appear hung.
' NOTE: This constant should NOT be set to TRUE if Create_Full_Dump_on_1st_Chance_Exception (above) is ALSO set to TRUE
' as this would produce mutually exclusive behavior.
Const No_Dump_on_1st_Chance_Exception = FALSE
' Set Dump_on_EH_Exceptions to TRUE if you wish to have ADPlus and produce a memory dump each time
' a C++ EH exception is encountered. This is disabled by default for performance reasons.
Const Dump_on_EH_Exceptions = FALSE
' Set Dump_on_Unknown_Exceptions = TRUE if you wish to have ADPlus produce a memory dump each time
' an unknown exception is encountered. This is disabled by default for performance reasons.
Const Dump_on_Unknown_Exceptions = FALSE
' Set Dump_Stack_on_DLL_Load = TRUE if you wish to have ADPlus dump the stack each time
' a DLL is loaded. This is disabled by default for performance reasons.
Const Dump_Stack_on_DLL_Load = FALSE
' Set Dump_Stack_on_DLL_Load_Unload = TRUE if you wish to have ADPlus dump the stack each time
' a DLL is unloaded. This is disabled by default for performance reasons.
Const Dump_Stack_on_DLL_UnLoad = FALSE
' Set No_CrashMode_Log = TRUE if you do NOT want ADPlus to create a log file in Crash Mode. If a process is generating
' a lot of exceptions, the debug log file created in crash mode could become quite large.
Const No_CrashMode_Log = FALSE
' Set No_Free_Space_Checking = TRUE if you do NOT want ADPlus to check for free space before running. Certain RAID drivers
' can cause problems for the free space checking routines and it may be necessary to set this to TRUE to allow ADPlus to run.
Const No_Free_Space_Checking = FALSE
' Set MAX_APPLICATIONS_TO_DEBUG to whatever upper limit you wish to impose on the -IIS switch.
' By default MAX_APPLICATIONS_TO_DEBUG defaults to 20 to limit the number of MTS or COM+ applications ADPlus will dump / monitor.
' NOTE: If there are 30 running MTS or COM+ applications and MAX_APPLICATIONS_TO_DEBUG is set to 20, ADPlus will display
' an error message indicating that there are too many applications running and it will quit.
Const MAX_APPLICATIONS_TO_DEBUG = 20
' AudotumpPlus version
Const VERSION = "4.01"
' The following constants are used by ADPlus for launching command shells and for the FileSystemObject.
' These constants should NOT be changed.
Const MINIMIZE_NOACTIVATE = 7
Const ACTIVATE_AND_DISPLAY = 1
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
' AutodumpPlus's global variables
Dim objArgs
Dim objShell
Dim objFileSystem
Dim objFolder
Dim HangMode
Dim IISMode
Dim QuickMode
Dim QuietMode
Dim CrashMode
Dim PageHeapMode
Dim OSwitchUsed
Dim OSVer
Dim OSBuildNumber
Dim ComputerName
Dim LogDir
Dim CDBScriptsDir
Dim CDBScriptName
Dim InstallDir
Dim ShortInstallDir
Dim OutPutDir
Dim OutPutDirShortPath
Dim PackageCount
Dim ErrorsDuringRuntime
Dim HangDir
Dim ShortHangDir
Dim CrashDir
Dim ShortCrashDir
Dim IISPid
Dim IISVer
Dim IISProcessCount
Dim GenericProcessPIDDictionary
Dim GenericProcessNameDictionary
Dim GenericModePID
Dim GenericModeProcessName
Dim DumpGenericProcess
Dim DateTimeStamp
Dim strPackageName
Dim NotifyAdmin
Dim NotifyTarget
Dim LocalUserName
Dim SymPathError
Dim WinDir
Dim EightDotThreePath
Dim EightDotThreeValue
' Initialize global variables to default values
Set GenericProcessPIDDictionary = CreateObject("Scripting.Dictionary")
Set GenericProcessNameDictionary = CreateObject("Scripting.Dictionary")
PackageCount = 0
IISProcessCount = 0
ErrorsDuringRuntime = false
HangMode = false
IISMode = false
QuickMode = false
QuietMode = false
CrashMode = false
GenericModePID = false
GenericModeProcessName = false
DumpGenericProcess = false
OSwitchUsed = false
NotifyAdmin = false
EightDotThreePath = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\NTFSDisable8Dot3NameCreation"
On Error Resume Next
' Get the installation directory name, used for verifying required files are present.
Set objShell = createobject("Wscript.shell")
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
'Check to see if NTFSDisable8Dot3NameCreation is set to 1
'If so then display an error and then exit to work around an issue with the Scripting.FileSystemObject's shortpath method.
EightDotThreeValue = objShell.RegRead(EightDotThreePath)
If DEBUGGING = TRUE Then
wscript.echo "-----------------------"
wscript.echo "In InitializeAutodump, checking the following registry key: " & EightDotThreePath
wscript.echo "Err.number after reading key: " & err.number
wscript.echo "Err.Description after reading key: " & err.description
wscript.echo "-----------------------"
err.clear
End If
If EightDotThreeValue = 1 Then 'Its TRUE, display an error and quit
If QuietMode = False Then
objShell.Popup "AutodumpPlus has detected that the following registry value " & EightDotThreePath & " is set to 1. AutodumpPlus will not work properly with 8.3 path's disabled. Please set this value to 0 and reboot the server before running AutodumpPlus again.",,"AutoDumpPlus", 0
Else
objShell.LogEvent 1, "AutodumpPlus has detected that the following registry value " & EightDotThreePath & " is set to 1. AutodumpPlus will not work properly with 8.3 path's disabled. Please set this value to 0 and reboot the server before running AutodumpPlus again."
wscript.echo "AutodumpPlus has detected that the following registry value " & EightDotThreePath & " is set to 1. AutodumpPlus will not work properly with 8.3 path's disabled. Please set this value to 0 and reboot the server before running AutodumpPlus again."
End If
wscript.quit 1
Else
End If
InstallDir = Left(wscript.scriptfullname,Len(wscript.scriptfullname)-Len(wscript.scriptname)-1)
If DEBUGGING = TRUE Then
wscript.echo "-----------------------------------------------------------"
wscript.echo "Initial info, prior to calling any functions . . ."
wscript.echo "The Wscript.scriptfullname is: " & Wscript.scriptfullname
wscript.echo "The Install Directory is: " & InstallDir
End If
Set objFolder = objFileSystem.GetFolder(InstallDir)
If DEBUGGING = TRUE Then
Wscript.echo ""
Wscript.echo "Trying to call objFileSystem.GetFolder on: " & InstallDir
Wscript.echo "Error number after calling objFileSystem.GetFolder = " & err.number
Wscript.echo "Error description: " & err.description
If InstallDir = "" Then
Wscript.quit 1
End If
End If
err.clear
ShortInstallDir = objFolder.ShortPath
If DEBUGGING = TRUE Then
Wscript.echo ""
Wscript.echo "Trying to get ShortInstallDir . . ."
Wscript.echo "Error number after calling objFolder.Shortpath = " & err.number
Wscript.echo "Error description: " & err.description
Wscript.echo "ShortInstallDir = " & ShortInstallDir
wscript.echo " ------------------------------------------------------------"
If ShortInstallDir = "" Then
Wscript.quit 1
End If
End If
If ShortInstallDir = "" Then
objShell.Popup "AutodumpPlus encountered an error trying to get the short path name for the following directory: " & InstallDir & ". AutodumpPlus can not continue.",,"AutodumpPlus",0
Wscript.quit 1
End If
err.clear
'---------------------------------------------------------------------------------------------
' Function: Main
' The following subroutines and functions provide the core functionality for
' AutodumpPlus. All core functionality should be encapsulated in these sub's or functions.
'---------------------------------------------------------------------------------------------
Call GetArguments(objArgs)
Call DetectOSVersion()
Call GetDateTimeStamp()
Call CheckFiles()
Call InitializeAutodump()
Call RunTlist()
If IISMode = True Then
If CrashMode = True Then
Call DumpIIS(CrashDir & "\Process_List.txt", OSVer)
Else
Call DumpIIS(HangDir & "\Process_List.txt", OSVer)
End If
End If
If DumpGenericProcess = True Then
Call DumpAnyProc()
End If
Call ShowStatus(OSVer)
' ------------------------------------------------------------------------------------------
'---------------------------------------------------------------------------------------------
' Function: GetArguments
' This function is responsible for getting the arguments the user passed in on the
' command line and storing them in an array.
'---------------------------------------------------------------------------------------------
Sub GetArguments(objArgs)
On Error Resume Next
If DEBUGGING = TRUE Then
Wscript.echo ""
Wscript.echo "-----------------------------------"
Wscript.echo "In the GetArguments() function . . ."
Wscript.echo "-----------------------------------"
Wscript.echo ""
End If
Dim IsValidArgument
Dim IsValidMode, IsValidAction
Dim CallPrintHelp
Dim x, y, z
Dim Arg
Dim EnvVar
Dim Args
Dim YesNo
Dim objShell
Dim SysEnv, UserEnv, VolatileEnv
Dim Sympath
Dim objFileSystem
Dim oFS2
Dim WShNetwork
Dim CallDetectIISFromPNSwitch
Set WShNetwork = CreateObject("Wscript.Network")
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Wscript.Shell")
IsValidArgument = False
IsValidMode = False
IsValidACtion = False
x = 0
y = 0
z = 0
OutPutDir = InstallDir
ComputerName = WshNetwork.ComputerName
Args = wscript.arguments.count
If Wscript.arguments.Count > 0 Then
Set objArgs = Wscript.Arguments
For x=0 to Args-1
If UCase(objArgs(x)) = "-QUIET" Then
QuietMode = True
IsValidArgument = True
ElseIf UCase(objArgs(x)) = "-HANG" Then
HangMode = True
IsValidArgument = True
IsValidMode = True
ElseIf UCase(objArgs(x)) = "-QUICK" Then
QuickMode = True
HangMode = True
IsValidArgument = True
IsValidMode = True
ElseIf UCase(objArgs(x)) = "-CRASH" Then
CrashMode = True
HangMode = False
IsValidArgument = True
IsValidMode = True
ElseIf UCase(objArgs(x)) = "-PAGEHEAP" Then
PageHeapMode = True
IsValidArgument = True
IsValidMode = True
ElseIf UCase(objArgs(x)) = "-NOTIFY" Then
If UCase(objArgs(x+1)) = "" or UCase(objArgs(x+1)) = " " or UCase(objArgs(x+1)) = "-PN" or UCase(objArgs(x+1)) = "-O" or UCase(objArgs(x+1)) = "-P" or UCase(objArgs(x+1)) = "-HANG" or UCase(objArgs(x+1)) = "-CRASH" or UCase(objArgs(x+1)) = "-QUICK" or UCase(objArgs(x+1)) = "-IIS" or UCase(objArgs(x+1)) = "-PAGEHEAP" or UCase(objArgs(x+1)) = "-QUIET" Then
If QuietMode = False Then
objShell.PopUp "No computer name or username was specified after the '-notify' switch on the command line. If the '-notify' switch is used, the next command line argument argument must specify a valid computer name or username for AutodumpPlus to send messages to (using the Messenger Service). It is recommended that you specify a computer name as it is generally more reliable than specifying a username.",,"AutodumpPlus",0
Else
Wscript.echo "No computer name or username was specified after the '-notify' switch on the command line. If the '-notify' switch is used, the next command line argument argument must specify a valid computer name or username for AutodumpPlus to send messages to (using the Messenger Service). It is recommended that you specify a computer name as it is generally more reliable than specifying a username."
objShell.LogEvent 1, "No computer name or username was specified after the '-notify' switch on the command line. If the '-notify' switch is used, the next command line argument argument must specify a valid computer name or username for AutodumpPlus to send messages to (using the Messenger Service). It is recommended that you specify a computer name as it is generally more reliable than specifying a username."
ErrorsDuringRuntime = True
End If
wscript.quit 1
End If
NotifyTarget = objArgs(x+1)
NotifyAdmin = True
IsValidArgument = True
ElseIf UCase(objArgs(x)) = "-?" Then
CallPrintHelp = True
IsValidArgument = True
ElseIf UCase(objArgs(x)) = "-HELP" Then
CallPrintHelp = True
IsValidArgument = True
ElseIf UCase(objArgs(x)) = "-IIS" Then
IISMode = True
IsValidArgument = True
IsValidAction = True
ElseIf UCase(objArgs(x)) = "-O" Then
If UCase(objArgs(x+1)) = "" or UCase(objArgs(x+1)) = " " or UCase(objArgs(x+1)) = "-PN" or UCase(objArgs(x+1)) = "-O" or UCase(objArgs(x+1)) = "-P" or UCase(objArgs(x+1)) = "-HANG" or UCase(objArgs(x+1)) = "-CRASH" or UCase(objArgs(x+1)) = "-QUICK" or UCase(objArgs(x+1)) = "-IIS" or UCase(objArgs(x+1)) = "-PAGEHEAP" or UCase(objArgs(x+1)) = "-QUIET" Then
If QuietMode = False Then
objShell.PopUp "No valid directory or UNC path was specified after the '-o' switch. If the '-o' switch is used, the next command line argument must specify a valid path for AutodumpPlus to output files to, i.e. '-o " & Chr(34) & "\\fileserver\share" & Chr(34) & "'",,"AutodumpPlus",0
Else
Wscript.echo "No valid directory or UNC path was specified after the '-o' switch. If the '-o' switch is used, the next command line argument must specify a valid path for AutodumpPlus to output files to, i.e. '-o " & Chr(34) & "\\fileserver\share" & Chr(34) & "'"
objShell.LogEvent 1, "No valid directory or UNC path was specified after the '-o' switch. If the '-o' switch is used, the next command line argument must specify a valid path for AutodumpPlus to output files to, i.e. '-o " & Chr(34) & "\\fileserver\share" & Chr(34) & "'"
ErrorsDuringRuntime = True
End If
wscript.quit 1
End If
OutPutDir = objArgs(x+1)
If DEBUGGING = TRUE Then
wscript.echo "In GetArguments, OutPutDir = " & OutPutDir
End If
If InStr(1,OutPutDir,"\\",1) Then
OutputDir = OutPutDir & "\" & WshNetwork.ComputerName
End If
If DEBUGGING = TRUE Then
wscript.echo "In GetArguments, OutPutDir with server name = " & OutPutDir
End If
CreateDirectory(OutPutDir)
Set oFS2 = objFileSystem.GetFolder(OutPutDir)
OutPutDirShortPath = oFS2.ShortPath
IsValidArgument = True
OSwitchUsed = True
ElseIf UCase(objArgs(x)) = "-P" Then
If UCase(objArgs(x+1)) = "" or UCase(objArgs(x+1)) = " " or UCase(objArgs(x+1)) = "-PN" or UCase(objArgs(x+1)) = "-O" or UCase(objArgs(x+1)) = "-P" Then
If QuietMode = False Then
objShell.PopUp "If the '-p' switch is used, you must specify the PID (Process ID) of a process to attach to, i.e. '-p 1896'",,"AutodumpPlus",0
Else
Wscript.echo "If the '-p' switch is used, you must specify the PID (Process ID) of a process to attach to, i.e. '-p 1896'"
objShell.LogEvent 1, "If the '-p' switch is used, you must specify the PID (Process ID) of a process to attach to, i.e. '-p 1896'"
ErrorsDuringRuntime = True
End If
wscript.quit 1
End If
GenericProcessPIDDictionary.add y, objArgs(x+1)
y = y+1
DumpGenericProcess = True
GenericModePID = True
IsValidArgument = True
IsValidAction = True
ElseIf UCase(objArgs(x)) = "-PN" Then
If UCase(objArgs(x+1)) = "" or UCase(objArgs(x+1)) = " " or UCase(objArgs(x+1)) = "-P" or UCase(objArgs(x+1)) = "-O" or UCase(objArgs(x+1)) = "-PN" Then
If QuietMode = False Then
objShell.PopUp "If the '-pn' switch is used, you must specify the name of a process to attach to, i.e. '-pn mmc.exe'",,"AutodumpPlus",0
Else
Wscript.echo "If the '-pn' switch is used, you must specify the name of a process to attach to, i.e. '-pn mmc.exe'"
objShell.LogEvent 1, "If the '-pn' switch is used, you must specify the name of a process to attach to, i.e. '-pn mmc.exe'"
ErrorsDuringRuntime = True
End If
wscript.quit 1
End If
GenericProcessNameDictionary.add z, objArgs(x+1)
z = z+1
DumpGenericProcess = True
GenericModeProcessName = True
IsValidArgument = True
IsValidAction = True
End If
Next
Else 'No arguments were typed, display the usage info . . .
'After getting the arguments, the first thing we need to do is determine the script engine that is running AutodumpPlus.
Call DetectScriptEngine()
Call PrintUsage()
End If
'Check to see if PageHeapMode is being used in Crash mode or hang mode. If used in hang mode, display an error and quit.
If PageHeapMode = True and CrashMode = False Then
If QuietMode = False Then
objShell.PopUp "AutodumpPlus must be running in crash mode ('-crash' switch) in order to use the '-pageheap' switch. Please re-run AutodumpPlus using the '-crash' switch if you are trying to use Pageheap to troubleshoot heap corruption.",,"AutodumpPlus",0
Else
Wscript.echo "AutodumpPlus must be running in crash mode ('-crash' switch) in order to use the '-pageheap' switch. Please re-run AutodumpPlus using the '-crash' switch if you are trying to use Pageheap to troubleshoot heap corruption."
objShell.LogEvent 1, "AutodumpPlus must be running in crash mode ('-crash' switch) in order to use the '-pageheap' switch. Please re-run AutodumpPlus using the '-crash' switch if you are trying to use Pageheap to troubleshoot heap corruption."
ErrorsDuringRuntime = True
End If
wscript.quit 1
End If
'Check to see if the -notify switch is being used in 'Hang' mode, if so display an error.
If NotifyAdmin = True and HangMode = True Then
If QuietMode = False Then
objShell.PopUp "The '-notify' switch is only valid when running in crash mode. Please try running AutodumpPlus again in 'crash' mode or without the '-notify' switch.",,"AutodumpPlus",0
ErrorsDuringRuntime = True
wscript.quit 1
Else
Wscript.echo "The '-notify' switch is only valid when running in crash mode. Please try running AutodumpPlus again in 'crash' mode or without the '-notify' switch."
objShell.LogEvent 1, "The '-notify' switch is only valid when running in crash mode. Please try running AutodumpPlus again in 'crash' mode or without the '-notify' switch."
ErrorsDuringRuntime = True
wscript.quit 1
End If
End If
'After getting the arguments, the first thing we need to do is determine the script engine that is running AutodumpPlus.
Call DetectScriptEngine()
'Check to see whether the '-iis' switch was used along with the '-pn' switch for any duplicate process dumping / monitoring
'objShell.Popup "Debug Break", 0
For Arg = 0 to objArgs.Count -1
If IISMode = True Then
DetectIISVersion()
End If
If IISMode = True and UCase(objArgs(Arg)) = "DLLHOST.EXE" Then
If HangMode = True or QuickMode = True Then
If QuietMode = False Then
objShell.Popup "You have specified the '-iis' switch on the command line in addition to '-pn dllhost.exe'. The '-iis' switch when used in 'hang' or 'quick' mode will automatically dump all running instances of dllhost.exe. Please run AutodumpPlus again without the '-pn' switch. If you are trying to dump the System package, please use the '-p' switch and specify the PID for the System package.",,"Autodump",0
Wscript.quit 1
Else
wscript.echo "You have specified the '-iis' switch on the command line in addition to '-pn dllhost.exe'. The '-iis' switch when used in 'hang' or 'quick' mode will automatically dump all running instances of dllhost.exe. Please run AutodumpPlus again without the '-pn' switch. If you are trying to dump the System package, please use the '-p' switch and specify the PID for the System package."
objShell.logevent 1, "You have specified the '-iis' switch on the command line in addition to '-pn dllhost.exe'. The '-iis' switch when used in 'hang' or 'quick' mode will automatically dump all running instances of dllhost.exe. Please run AutodumpPlus again without the '-pn' switch. If you are trying to dump the System package, please use the '-p' switch and specify the PID for the System package."
Wscript.quit 1
End If
Else
If QuietMode = False Then
objShell.Popup "You have specified the '-iis' switch on the command line in addition to '-pn dllhost.exe'. The '-iis' switch when used in 'crash' mode will automatically attach a debugger to all running instances of dllhost.exe. Please run AutodumpPlus again without the '-pn' switch. If you are trying to attach a debugger to the System package, please use the '-p' switch and specify the PID for the System package.",,"Autodump",0
Wscript.quit 1
Else
wscript.echo "You have specified the '-iis' switch on the command line in addition to '-pn dllhost.exe'. The '-iis' switch when used in 'crash' mode will automatically attach a debugger to all running instances of dllhost.exe. Please run AutodumpPlus again without the '-pn' switch. If you are trying to attach a debugger to the System package, please use the '-p' switch and specify the PID for the System package."
objShell.logevent 1, "You have specified the '-iis' switch on the command line in addition to '-pn dllhost.exe'. The '-iis' switch when used in 'crash' mode will automatically attach a debugger to all running instances of dllhost.exe. Please run AutodumpPlus again without the '-pn' switch. If you are trying to attach a debugger to the System package, please use the '-p' switch and specify the PID for the System package."
Wscript.quit 1
End If
End If
ElseIf IISMode = True and UCase(objArgs(Arg)) = "MTX.EXE" Then
If HangMode = True or QuickMode = True Then
If QuietMode = False Then
objShell.Popup "You have specified the '-iis' switch on the command line in addition to '-pn mtx.exe'. The '-iis' switch when used in 'hang' or 'quick' mode will automatically dump all running instances of mtx.exe. Please run AutodumpPlus again without the '-pn' switch. If you are trying to dump the System package, please use the '-p' switch and specify the PID for the System package.",,"Autodump",0
Wscript.quit 1
Else
wscript.echo "You have specified the '-iis' switch on the command line in addition to '-pn mtx.exe'. The '-iis' switch when used in 'hang' or 'quick' mode will automatically dump all running instances of mtx.exe. Please run AutodumpPlus again without the '-pn' switch. If you are trying to dump the System package, please use the '-p' switch and specify the PID for the System package."
objShell.logevent 1, "You have specified the '-iis' switch on the command line in addition to '-pn mtx.exe'. The '-iis' switch when used in 'hang' or 'quick' mode will automatically dump all running instances of mtx.exe. Please run AutodumpPlus again without the '-pn' switch. If you are trying to dump the System package, please use the '-p' switch and specify the PID for the System package."
Wscript.quit 1
End If
Else
If QuietMode = False Then
objShell.Popup "You have specified the '-iis' switch on the command line in addition to '-pn mtx.exe'. The '-iis' switch when used in 'crash' mode will automatically attach a debugger to all running instances of mtx.exe. Please run AutodumpPlus again without the '-pn' switch. If you are trying to attach a debugger to the System package, please use the '-p' switch and specify the PID for the System package.",,"Autodump",0
Wscript.quit 1
Else
wscript.echo "You have specified the '-iis' switch on the command line in addition to '-pn mtx.exe'. The '-iis' switch when used in 'crash' mode will automatically attach a debugger to all running instances of mtx.exe. Please run AutodumpPlus again without the '-pn' switch. If you are trying to attach a debugger to the System package, please use the '-p' switch and specify the PID for the System package."
objShell.logevent 1, "You have specified the '-iis' switch on the command line in addition to '-pn mtx.exe'. The '-iis' switch when used in 'crash' mode will automatically attach a debugger to all running instances of mtx.exe. Please run AutodumpPlus again without the '-pn' switch. If you are trying to attach a debugger to the System package, please use the '-p' switch and specify the PID for the System package."
Wscript.quit 1
End If
End If
ElseIf IISMode = True and UCase(objArgs(Arg)) = "INETINFO.EXE" Then
If HangMode = True or QuickMode = True Then
If QuietMode = False Then
objShell.Popup "You have specified the '-iis' switch on the command line in addition to '-pn inetinfo.exe'. The '-iis' switch when used in 'hang' or 'quick' mode will automatically dump all running instances of inetinfo.exe. Please run AutodumpPlus again without the '-pn' switch. If you are trying to dump the System package, please use the '-p' switch and specify the PID for the System package.",,"Autodump",0
Wscript.quit 1
Else
wscript.echo "You have specified the '-iis' switch on the command line in addition to '-pn inetinfo.exe'. The '-iis' switch when used in 'hang' or 'quick' mode will automatically dump all running instances of inetinfo.exe. Please run AutodumpPlus again without the '-pn' switch. If you are trying to dump the System package, please use the '-p' switch and specify the PID for the System package."
objShell.logevent 1, "You have specified the '-iis' switch on the command line in addition to '-pn inetinfo.exe'. The '-iis' switch when used in 'hang' or 'quick' mode will automatically dump all running instances of inetinfo.exe. Please run AutodumpPlus again without the '-pn' switch. If you are trying to dump the System package, please use the '-p' switch and specify the PID for the System package."
Wscript.quit 1
End If
Else
If QuietMode = False Then
objShell.Popup "You have specified the '-iis' switch on the command line in addition to '-pn inetinfo.exe'. The '-iis' switch when used in 'crash' mode will automatically attach a debugger to all running instances of inetinfo.exe. Please run AutodumpPlus again without the '-pn' switch. If you are trying to attach a debugger to the System package, please use the '-p' switch and specify the PID for the System package.",,"Autodump",0
Wscript.quit 1
Else
wscript.echo "You have specified the '-iis' switch on the command line in addition to '-pn inetinfo.exe'. The '-iis' switch when used in 'crash' mode will automatically attach a debugger to all running instances of inetinfo.exe. Please run AutodumpPlus again without the '-pn' switch. If you are trying to attach a debugger to the System package, please use the '-p' switch and specify the PID for the System package."
objShell.logevent 1, "You have specified the '-iis' switch on the command line in addition to '-pn inetinfo.exe'. The '-iis' switch when used in 'crash' mode will automatically attach a debugger to all running instances of inetinfo.exe. Please run AutodumpPlus again without the '-pn' switch. If you are trying to attach a debugger to the System package, please use the '-p' switch and specify the PID for the System package."
Wscript.quit 1
End If
End If
End If
Next
'Check to see if we need to print the help screen
If CallPrintHelp = True Then
PrintHelp()
End If
If IsValidArgument = False Then 'No valid arguments were passed in, display the usage info . . .
Call PrintUsage()
QuickMode = False
QuietMode = False
CrashMode = False
End If
If not (IsValidMode and IsValidAction) Then
PrintUsage()
End If
If HangMode = True AND CrashMode = True Then 'Can't run in both hang and crash mode at the same time
Call PrintUsage()
ElseIf CrashMode = True AND QuickMode = True Then 'Can't run in both crash and quick mode at the same time
Call PrintUsage()
ElseIf HangMode <> True and CrashMode <> True and QuickMode <> True Then 'You have to at least be running in hang, crash, or quick mode
Call PrintUsage()
End If
Set SysEnv = objShell.Environment("SYSTEM")
Set UserEnv = objShell.Environment("USER")
If QuickMode = True or CrashMode = True Then
If SysEnv("_NT_SYMBOL_PATH") <> "" Then
Sympath = SysEnv("_NT_SYMBOL_PATH")
ElseIf UserEnv("_NT_SYMBOL_PATH") <> "" Then
Sympath = UserEnv("_NT_SYMBOL_PATH")
Else
If QuietMode = False Then
objShell.Popup "WARNING! An '_NT_SYMBOL_PATH' environment variable is not set, as a result AutodumpPlus will be forced to use 'export' symbols (if present) to resolve function names in the stack trace information for each thread listed in the log file for the processes being debugged. To resolve this warning, please copy the appropriate symbols to a directory on the server and then create an environment variable with a name of '_NT_SYMBOL_PATH' and a value containing the path to the proper symbols (i.e. c:\winnt\symbols) before running AutodumpPlus in quick or crash modes again. NOTE: After creating the '_NT_SYMBOL_PATH' system environment variable you will need to close the current command shell and open a new one before running AutodumpPlus again.",,"AutodumpPlus",0
SymPathError = True
ErrorsDuringScriptRuntime = True
Else
Wscript.echo "WARNING! An '_NT_SYMBOL_PATH' environment variable is not set."
Wscript.echo "Please check the application event log or the AutodumpPlus-report.txt"
Wscript.echo "for more details."
Wscript.echo ""
objShell.LogEvent 1, "WARNING! An '_NT_SYMBOL_PATH' environment variable is not set, as a result AutodumpPlus will be forced to use 'export' symbols (if present) to resolve function names in the stack trace information for each thread listed in the log file for the processes being debugged. To resolve this warning, please copy the appropriate symbols to a directory on the server and then create an environment variable with a name of '_NT_SYMBOL_PATH' and a value containing the path to the proper symbols (i.e. c:\winnt\symbols) before running AutodumpPlus in quick or crash modes again. NOTE: After creating the '_NT_SYMBOL_PATH' system environment variable you will need to close the current command shell and open a new one before running AutodumpPlus again."
SymPathError = True
End If
'Wscript.Quit
End If
End If
'If not running on Windows XP, check to see if the user account is running inside of a terminal server session.
'If so, and the -crash switch is being used, display an error since 'crash' mode doesn't work inside of a terminal
'server session on NT 4.0 or Windows 2000.
'If the server doesn't have terminal services installed, we can assume they aren't running ADPlus in a TS session
'so check for that first.
'I have not tested this on NT 4.0 TSE so I'm not sure if this code will work properly on NT 4.0 TSE boxes.
Call DetectOSVersion
If CInt(OSBuildNumber) <= 2195 Then
Dim TermServDeviceDesc
Dim TermServKey
TermServKey = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\RDPDR\0000\DeviceDesc"
err.clear
TermServDeviceDesc = objShell.RegRead(TermServKey)
If err.number <> -2147024894 Then 'The TS RDPDR key was found, Terminal services is installed, check to make sure the user isn't in a TS session.
Set VolatileEnv = objShell.Environment("PROCESS")
If (UCase(VolatileEnv("SESSIONNAME")) <> "CONSOLE" and VolatileEnv("SESSIONNAME") <> "") and (CrashMode = True) Then
If QuietMode = False Then
objShell.Popup "AutodumpPlus has detected that you are attempting to run in 'Crash' mode, but this account is currently logged into terminal server session ID: " & UCase(VolatileEnv("SESSIONNAME")) & ". 'Crash' mode (invoked via the '-crash' switch) will not work inside a terminal server session. To run AutodumpPlus in 'Crash' mode, please log in locally at the console.",,"AutodumpPlus",0
Else
Wscript.echo "AutodumpPlus has detected that you are attempting to run in 'Crash' mode, but this account is currently logged into terminal server session ID: " & UCase(VolatileEnv("SESSIONNAME")) & ". 'Crash' mode (invoked via the '-crash' switch) will not work inside a terminal server session. To run AutodumpPlus in 'Crash' mode, please log in locally at the console."
objShell.LogEvent 1, "AutodumpPlus has detected that you are attempting to run in 'Crash' mode, but this account is currently logged into terminal server session ID: " & UCase(VolatileEnv("SESSIONNAME")) & ". 'Crash' mode (invoked via the '-crash' switch) will not work inside a terminal server session. To run AutodumpPlus in 'Crash' mode, please log in locally at the console."
ErrorsDuringRuntime = True
End If
Wscript.Quit
End If
End If
End If
'Get the locally logged on users name for use with the !Net_send command
LocalUserName = VolatileEnv("USERNAME")
If DEBUGGING = TRUE Then
wscript.echo "--------------------------------"
wscript.echo "In GetArguments(), QuickMode = " & QuickMode
wscript.echo "In GetArguments(), QuietMode = " & QuietMode
wscript.echo "In GetArguments(), CrashMode = " & CrashMode
wscript.echo "In GetArguments(), HangMode = " & HangMode
wscript.echo "In GetArguments(), LocaluserName = " & LocalUserName
wscript.echo "--------------------------------"
End If
End Sub
'---------------------------------------------------------------------------------------------
' Function: GetDateTimeStamp
' This function is responsible for getting the unique Date / Time stamp used for
' creating unique directory / file names.
' To Change the names of the output directories, edit them below.
'---------------------------------------------------------------------------------------------
Function GetDateTimeStamp()
On Error Resume Next
If DEBUGGING = TRUE Then
Wscript.echo ""
Wscript.echo "-----------------------------------"
Wscript.echo "In the GetDateTimeStamp() function . . ."
Wscript.echo "-----------------------------------"
Wscript.echo ""
End If
Dim AMorPM
Dim Seconds
Dim Minutes
Dim Hours
Dim theDay
Dim theMonth
Hours = Hour(Now)
Minutes = Minute(Now)
Seconds = Second(Now)
theDay = Day(Now)
theMonth = Month(Now)
AMorPM = Right(Now(),2)
If Len(Hours) = 1 Then Hours = "0" & Hours
If Len(Minutes) = 1 Then Minutes = "0" & Minutes
If Len(Seconds) = 1 Then Seconds = "0" & Seconds
If Len(theDay) = 1 Then theDay = "0" & theDay
If Len(theMonth) = 1 Then theMonth = "0" & theMonth
DateTimeStamp = "Date_" & theMonth & "-" & theDay & "-" & Year(Now) & "__Time_" & Hours & "-" & Minutes & "-" & Seconds & AMorPM
If DEBUGGING = TRUE Then
Wscript.echo ""
Wscript.echo "-----------------------------------"
Wscript.echo "In GetDateTimeStamp(), DateTimeStamp = " & DateTimeStamp
Wscript.echo "-----------------------------------"
Wscript.echo ""
End If
If QuickMode = True Then
HangDir = OutPutDir & "\Quick_Hang_Mode__" + DateTimeStamp
Else
HangDir = OutPutDir & "\Normal_Hang_Mode__" + DateTimeStamp
CrashDir = OutPutDir + "\Crash_Mode__" + DateTimeStamp
End If
End Function
'---------------------------------------------------------------------------------------------
' Function: CheckFiles
' This function is responsible for ensuring that all the required files are
' installed in the 'InstallDir'. If files are missing, display an error or
' log an error to the event log if running in quiet mode.
'---------------------------------------------------------------------------------------------
Sub CheckFiles()
On Error Resume Next
If DEBUGGING = TRUE Then
Wscript.echo ""
Wscript.echo "-----------------------------------"
Wscript.echo "In the CheckFiles() function . . ."
Wscript.echo "-----------------------------------"
Wscript.echo ""
End If
Dim objFS
Dim objShell
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Wscript.Shell")
'Make sure CDB.EXE & ADPlus.vbs are in the right place. If its not it could mean ADPlus.vbs isn't running from the debuggers directory.
If not FileExists(InstallDir & "\cdb.exe") Then
If QuietMode = False Then
objShell.popup "AutodumpPlus is not configured properly. Either the file CDB.EXE is missing from " & InstallDir & " or ADPlus.vbs is not running from the debuggers installation directory. Please place ADPlus.vbs in the debuggers installation directory or try re-installing the Debugging Tools for Windows.",,"AutodumpPlus",0
Else
objShell.LogEvent 1, "AutodumpPlus is not configured properly. Either the file CDB.EXE is missing from " & InstallDir & " or ADPlus.vbs is not running from the debuggers installation directory. Please place ADPlus.vbs in the debuggers installation directory or try re-installing the Debugging Tools for Windows."
wscript.echo "AutodumpPlus is not configured properly. Either the file CDB.EXE is missing from " & InstallDir & " or ADPlus.vbs is not running from the debuggers installation directory. Please place ADPlus.vbs in the debuggers installation directory or try re-installing the Debugging Tools for Windows."
End If
wscript.quit 1
End If
'Make sure the NT 4.0 debug extensions are installed
If OSVer = "4.0" Then
If not FileExists(InstallDir & "\nt4fre\userexts.dll") Then
If QuietMode = False Then
objShell.popup "AutodumpPlus is not configured properly. The file userexts.dll is missing from " & InstallDir & "\nt4fre" & ". Please re-install the Debugging Tools for Windows.",,"AutodumpPlus",0
Else
objShell.LogEvent 1, "AutodumpPlus is not configured properly. The file userexts.dll is missing from " & InstallDir & "\nt4fre" & ". Please re-install the Debugging Tools for Windows."
wscript.echo "AutodumpPlus is not configured properly. The file userexts.dll is missing from " & InstallDir & "\nt4fre" & ". Please re-install the Debugging Tools for Windows."
End If
wscript.quit 1
End If
End If
'Make sure the Windows 2000 debug extensions are installed
If CInt(OSBuildNumber) = 2195 Then
If not FileExists(InstallDir & "\w2kfre\userexts.dll") Then
If QuietMode = False Then
objShell.popup "AutodumpPlus is not configured properly. The file userexts.dll is missing from " & InstallDir & "\w2kfre" & ". Please re-install the Debugging Tools for Windows.",,"AutodumpPlus",0
Else
objShell.LogEvent 1, "AutodumpPlus is not configured properly. The file userexts.dll is missing from " & InstallDir & "\w2kfre" & ". Please re-install the Debugging Tools for Windows."
wscript.echo "AutodumpPlus is not configured properly. The file userexts.dll is missing from " & InstallDir & "\w2kfre" & ". Please re-install the Debugging Tools for Windows."
End If
wscript.quit 1
End If
End If
'Make sure the Windows XP debug extensions are installed
'If CInt(OSBuildNumber) > 2195 Then
' If not FileExists(InstallDir & "\w2001\userexts.dll") Then
' If QuietMode = False Then
' objShell.popup "AutodumpPlus is not configured properly. The file userexts.dll is missing from " & InstallDir & "\winxp" & ". Please re-install the Debugging Tools for Windows.",,"AutodumpPlus",0
' Else
' objShell.LogEvent 1, "AutodumpPlus is not configured properly. The file userexts.dll is missing from " & InstallDir & "\winxp" & ". Please re-install the Debugging Tools for Windows."
' wscript.echo "AutodumpPlus is not configured properly. The file userexts.dll is missing from " & InstallDir & "\winxp" & ". Please re-install the Debugging Tools for Windows."
' End If
' wscript.quit 1
' End If
'End If
If not FileExists(InstallDir & "\cdb.exe") then
If QuietMode = False Then
objShell.popup "AutodumpPlus is not configured properly. The file cdb.exe is missing from " & InstallDir & ". Please re-install the Debugging Tools for Windows.",,"AutodumpPlus",0
Else
objShell.LogEvent 1, "AutodumpPlus is not configured properly. The file cdb.exe is missing from " & InstallDir & ". Please re-install the Debugging Tools for Windows."
wscript.echo "AutodumpPlus is not configured properly. The file cdb.exe is missing from " & InstallDir & ". Please re-install the Debugging Tools for Windows."
End If
wscript.quit 1
end If
If not FileExists(InstallDir & "\dbgeng.dll") Then
If QuietMode = False Then
objShell.popup "AutodumpPlus is not configured properly. The file dbgeng.dll is missing from " & InstallDir & ". Please re-install the Debugging Tools for Windows.",,"AutodumpPlus",0
Else
objShell.LogEvent 1, "AutodumpPlus is not configured properly. The file dbgeng.dll is missing from " & InstallDir & ". Please re-install the Debugging Tools for Windows."
wscript.echo "AutodumpPlus is not configured properly. The file dbgeng.dll is missing from " & InstallDir & ". Please re-install the Debugging Tools for Windows."
End If
wscript.quit 1
end If
If not FileExists(InstallDir & "\dbghelp.dll") then
If QuietMode = False Then
objShell.popup "AutodumpPlus is not configured properly. The file dbghelp.dll is missing from " & InstallDir & ". Please re-install the Debugging Tools for Windows.",,"AutodumpPlus",0
Else
objShell.LogEvent 1, "AutodumpPlus is not configured properly. The file dbghelp.dll is missing from " & InstallDir & ". Please re-install the Debugging Tools for Windows."
wscript.echo "AutodumpPlus is not configured properly. The file dbghelp.dll is missing from " & InstallDir & ". Please re-install the Debugging Tools for Windows."
End If
wscript.quit 1
end If
If not FileExists(InstallDir & "\tlist.exe") then
If QuietMode = False Then
objShell.popup "AutodumpPlus is not configured properly. The file tlist.exe is missing from " & InstallDir & ". Please re-install the Debugging Tools for Windows.",,"AutodumpPlus",0
Else
objShell.LogEvent 1, "AutodumpPlus is not configured properly. The file tlist.exe is missing from " & InstallDir & ". Please re-install the Debugging Tools for Windows."
wscript.echo "AutodumpPlus is not configured properly. The file tlist.exe is missing from " & InstallDir & ". Please re-install the Debugging Tools for Windows."
End If
wscript.quit 1
end If
set objFS= nothing
set objShell = nothing
End Sub
'---------------------------------------------------------------------------------------------
' Function: InitializeAutodump
' This function is responsible for creating the crash or hang directories.
' The CreateDirectory function is called from this function and handles any
' permissions / directory creation problems by displaying an error or logging to
' the event log if running in quiet mode.
'---------------------------------------------------------------------------------------------
Sub InitializeAutodump()
On Error Resume Next
Dim versionFile
Dim objFileSystem
Dim oFSHang
Dim oFSCrash
On Error Resume Next
If DEBUGGING = TRUE Then
wscript.echo "-----------------------"
wscript.echo "In InitializeAutodump"
wscript.echo "-----------------------"
End If
set objFileSystem = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Wscript.Shell")
If CrashMode = true Then
If Create_Full_Dump_on_1st_Chance_Exception = TRUE and No_Dump_on_1st_Chance_Exception = TRUE Then
If QuietMode = False Then
objShell.popup "AutodumpPlus is not configured properly. The following constants: Create_Full_Dump_on_1st_Chance_Exception and No_Dump_on_1st_Chance_Exception are both set to TRUE and this is mutually exclusive behavior. Please set one or both of those constants to FALSE and try running AutodumpPlus again.",,"AutodumpPlus",0
Else
objShell.LogEvent 1, "AutodumpPlus is not configured properly. The following constants: Create_Full_Dump_on_1st_Chance_Exception and No_Dump_on_1st_Chance_Exception are both set to TRUE and this is mutually exclusive behavior. Please set one or both of those constants to FALSE and try running AutodumpPlus again."
wscript.echo "AutodumpPlus is not configured properly. The following constants: Create_Full_Dump_on_1st_Chance_Exception and No_Dump_on_1st_Chance_Exception are both set to TRUE and this is mutually exclusive behavior. Please set one or both of those constants to FALSE and try running AutodumpPlus again."
End If
wscript.quit 1
End If
Call CreateDirectory(CrashDir) ' Create the new crash mode folder.
Set oFSCrash = objFileSystem.GetFolder(CrashDir)
ShortCrashDir = oFSCrash.ShortPath 'Set the short file name.
If DEBUGGING = TRUE Then
wscript.echo "In InitializeAutodump(), CrashDir = " & CrashDir
wscript.echo "In InitializeAutodump(), ShortCrashDir = " & ShortCrashDir
Wscript.echo "Error number after calling oFSCrash.Shortpath = " & err.number
Wscript.echo "Error description: " & err.description
wscript.echo " ------------------------------------------------------------"
If ShortCrashDir = "" Then
Wscript.quit 1
End If
End If
If ShortCrashDir = "" Then
If QuietMode = False Then
objShell.Popup "AutodumpPlus encountered an error trying to get the short path name for the following directory: " & CrashDir & ". AutodumpPlus can not continue.",,"AutodumpPlus",0
Else
objShell.LogEvent 1, "AutodumpPlus encountered an error trying to get the short path name for the following directory: " & CrashDir & ". AutodumpPlus can not continue."
wscript.echo "AutodumpPlus encountered an error trying to get the short path name for the following directory: " & CrashDir & ". AutodumpPlus can not continue."
End If
DeleteDirectory(CrashDir)
Wscript.quit 1
End If
Else
Call CreateDirectory(HangDir) ' Create the new hang mode folder.
Set oFSHang = objFileSystem.GetFolder(HangDir)
ShortHangDir = oFSHang.ShortPath 'Set the short file name.
If DEBUGGING = TRUE Then
wscript.echo "In InitializeAutodump(), HangDir = " & HangDir
wscript.echo "In InitializeAutodump(), ShortHangDir = " & ShortHangDir
Wscript.echo "Error number after calling oFSHang.Shortpath = " & err.number
Wscript.echo "Error description: " & err.description
wscript.echo " ------------------------------------------------------------"
If ShortHangDir = "" Then
Wscript.quit 1
End If
End If
If ShortHangDir = "" Then
If QuietMode = False Then
objShell.Popup "AutodumpPlus encountered an error trying to get the short path name for the following directory: " & HangDir & ". AutodumpPlus can not continue.",,"AutodumpPlus",0
Else
objShell.LogEvent 1, "AutodumpPlus encountered an error trying to get the short path name for the following directory: " & HangDir & ". AutodumpPlus can not continue."
wscript.echo "AutodumpPlus encountered an error trying to get the short path name for the following directory: " & HangDir & ". AutodumpPlus can not continue."
End If
DeleteDirectory(HangDir)
Wscript.quit 1
End If
End If
End Sub
'---------------------------------------------------------------------------------------------
' Function: RunTlist
' This function is responsible for running tlist.exe -k to get a list of all
' running MTS or COM+ packages and piping it out to the appropriate text file.
' This function also runs EMCMD.EXE /T to get a list of all running processes.
'---------------------------------------------------------------------------------------------
Sub RunTlist()
On Error Resume Next
Dim objShell
Dim objFileSystem
Dim oFS2
Dim objTextFile
Dim strShell
Dim objShellErrorLevel
Dim DriveObject
Dim Path
Dim NewPath
Dim PathArray
Dim ServerName
Dim ShareName
Dim MinFreeSpace
Set objShell = CreateObject("Wscript.Shell")
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
MinFreeSpace = 10000000 '10Mb free space should be enough to at least produce the .txt files and the output logs.
If DEBUGGING = TRUE Then
wscript.echo "-----------------------"
wscript.echo "In RunTlist"
wscript.echo ""
End If
'Check the output directories drive to ensure there is enough free space for the files.
If CrashMode = true Then
If Left(ShortCrashDir,2) <> "\\" Then 'We are in crash mode but not logging to a UNC path.
Set DriveObject = objFileSystem.GetDrive(Left(ShortCrashDir,1))
If DEBUGGING = TRUE Then
Wscript.echo "In RunTlist(), Err number after calling objFileSystem.GetDrive: " & err.number & " Err Description: " & err.description
Wscript.echo "In RunTlist(), Free space = " & DriveObject.FreeSpace
Wscript.echo "In RunTlist(), MinFreeSpace = " & MinFreeSpace
Wscript.echo ""
End If
If No_Free_Space_Checking = False Then
If DriveObject.FreeSpace < MinFreeSpace Then
If DEBUGGING = TRUE Then
Wscript.echo "In RunEcmdm(), No_Free_Space_Checking = FALSE"
Wscript.echo "In RunTlist(), Err number after calling DriveObject.Freespace: " & err.number & " Err Description: " & err.description
Wscript.echo "In RunTlist(), Free space = " & DriveObject.FreeSpace
Wscript.echo "In RunTlist(), MinFreeSpace = " & MinFreeSpace
Wscript.echo ""
End If
If QuietMode = False Then
objShell.popup "AutodumpPlus has detected that there is not enough free space on the " & Left(ShortCrashDir,2) & " drive. AutodumpPlus requires at least 10Mb of free space. Please free up some space on that drive and try running AutodumpPlus again.",,"AutodumpPlus",0
Else
objShell.LogEvent 1, "AutodumpPlus has detected that there is not enough free space on the " & Left(ShortCrashDir,2) & " drive. AutodumpPlus requires at least 10Mb of free space. Please free up some space on that drive and try running AutodumpPlus again."
wscript.echo "AutodumpPlus has detected that there is not enough free space on the " & Left(ShortCrashDir,2) & " drive. AutodumpPlus requires at least 10Mb of free space. Please free up some space on that drive and try running AutodumpPlus again."
End If
DeleteDirectory(ShortCrashDir)
wscript.quit 1
End If
Else
If DEBUGGING = TRUE Then
Wscript.echo "In RunTlist(), No_Free_Space_Checking = TRUE"
Wscript.echo "In RunTlist(), Call to DriveObject.Freespace skipped!"
Wscript.echo "In RunTlist(), Err number after calling objFileSystem.GetDrive: " & err.number & " Err Description: " & err.description
Wscript.echo ""
End If
End If
Else 'We are in crash mode and logging to a UNC path
Path = ShortCrashDir
If DEBUGGING = TRUE Then
Wscript.echo "Path = " & Path
End If
NewPath = Right(Path, Len(Path) - 2)
If DEBUGGING = TRUE Then
Wscript.echo "NewPath = " & NewPath
End If
PathArray = Split(NewPath, "\", -1)
If DEBUGGING = TRUE Then
Wscript.echo "ServerName = " & PathArray(0)
End If
ServerName = PathArray(0)
If DEBUGGING = TRUE Then
Wscript.echo "ShareName = " & PathArray(1)
End If
ShareName = PathArray(1)
NewPath = "\\" & ServerName & "\" & ShareName
If DEBUGGING = TRUE Then
Wscript.echo "NewPath = " & NewPath
End If
Set DriveObject = objFileSystem.GetDrive(NewPath)
If No_Free_Space_Checking = False Then
If DriveObject.FreeSpace < MinFreeSpace Then
If DEBUGGING = TRUE Then
Wscript.echo "In RunEcmdm(), No_Free_Space_Checking = FALSE"
Wscript.echo "In RunTlist(), Err number after calling DriveObject.Freespace: " & err.number & " Err Description: " & err.description
Wscript.echo "In RunTlist(), Free space = " & DriveObject.FreeSpace
Wscript.echo "In RunTlist(), MinFreeSpace = " & MinFreeSpace
Wscript.echo ""
End If
If QuietMode = False Then
objShell.popup "AutodumpPlus has detected that there is not enough free space on the following network share " & CrashDir & ". AutodumpPlus requires at least 10Mb of free space. Please free up some space on that drive and try running AutodumpPlus again.",,"AutodumpPlus",0
Else
objShell.LogEvent 1, "AutodumpPlus has detected that there is not enough free space on the following network share " & CrashDir & ". AutodumpPlus requires at least 10Mb of free space. Please free up some space on that drive and try running AutodumpPlus again."
wscript.echo "AutodumpPlus has detected that there is not enough free space on the following network share " & CrashDir & ". AutodumpPlus requires at least 10Mb of free space. Please free up some space on that drive and try running AutodumpPlus again."
End If
DeleteDirectory(ShortCrashDir)
wscript.quit 1
End If
Else
If DEBUGGING = TRUE Then
Wscript.echo "In RunTlist(), No_Free_Space_Checking = TRUE"
Wscript.echo "In RunTlist(), Call to DriveObject.Freespace skipped!"
Wscript.echo "In RunTlist(), Err number after calling objFileSystem.GetDrive: " & err.number & " Err Description: " & err.description
Wscript.echo ""
End If
End If
End If
Else 'We are in hang mode
If Left(ShortHangDir,2) <> "\\" Then 'We are in hang mode but not logging to a UNC path
Set DriveObject = objFileSystem.GetDrive(Left(ShortHangDir,1))
If No_Free_Space_Checking = False Then
If DriveObject.FreeSpace < MinFreeSpace Then
If DEBUGGING = TRUE Then
Wscript.echo "In RunEcmdm(), No_Free_Space_Checking = FALSE"
Wscript.echo "In RunTlist(), Err number after calling DriveObject.Freespace: " & err.number & " Err Description: " & err.description
Wscript.echo "In RunTlist(), Free space = " & DriveObject.FreeSpace
Wscript.echo "In RunTlist(), MinFreeSpace = " & MinFreeSpace
Wscript.echo ""
End If
If QuietMode = False Then
objShell.popup "AutodumpPlus has detected that there is not enough free space on the " & Left(ShortCrashDir,2) & " drive. AutodumpPlus requires at least 10Mb of free space. Please free up some space on that drive and try running AutodumpPlus again.",,"AutodumpPlus",0
Else
objShell.LogEvent 1, "AutodumpPlus has detected that there is not enough free space on the " & Left(ShortCrashDir,2) & " drive. AutodumpPlus requires at least 10Mb of free space. Please free up some space on that drive and try running AutodumpPlus again."
wscript.echo "AutodumpPlus has detected that there is not enough free space on the " & Left(ShortCrashDir,2) & " drive. AutodumpPlus requires at least 10Mb of free space. Please free up some space on that drive and try running AutodumpPlus again."
End If
DeleteDirectory(ShortHangDir)
wscript.quit 1
End If
Else
If DEBUGGING = TRUE Then
Wscript.echo "In RunTlist(), No_Free_Space_Checking = TRUE"
Wscript.echo "In RunTlist(), Call to DriveObject.Freespace skipped!"
Wscript.echo "In RunTlist(), Err number after calling objFileSystem.GetDrive: " & err.number & " Err Description: " & err.description
Wscript.echo ""
End If
End If
Else 'We are in hang mode but logging to a UNC path
Path = ShortHangDir
If DEBUGGING = TRUE Then
Wscript.echo "Path = " & Path
End If
NewPath = Right(Path, Len(Path) - 2)
If DEBUGGING = TRUE Then
Wscript.echo "NewPath = " & NewPath
End If
PathArray = Split(NewPath, "\", -1)
If DEBUGGING = TRUE Then
Wscript.echo "ServerName = " & PathArray(0)
End If
ServerName = PathArray(0)
If DEBUGGING = TRUE Then
Wscript.echo "ShareName = " & PathArray(1)
End If
ShareName = PathArray(1)
NewPath = "\\" & ServerName & "\" & ShareName
If DEBUGGING = TRUE Then
Wscript.echo "NewPath = " & NewPath
End If
Set DriveObject = objFileSystem.GetDrive(NewPath)
If No_Free_Space_Checking = False Then
If DriveObject.FreeSpace < MinFreeSpace Then
If DEBUGGING = TRUE Then
Wscript.echo "In RunEcmdm(), No_Free_Space_Checking = FALSE"
Wscript.echo "In RunTlist(), Err number after calling DriveObject.Freespace: " & err.number & " Err Description: " & err.description
Wscript.echo "In RunTlist(), Free space = " & DriveObject.FreeSpace
Wscript.echo "In RunTlist(), MinFreeSpace = " & MinFreeSpace
Wscript.echo ""
End If
If QuietMode = False Then
objShell.popup "AutodumpPlus has detected that there is not enough free space on the following network share " & HangDir & ". AutodumpPlus requires at least 10Mb of free space. Please free up some space on that drive and try running AutodumpPlus again.",,"AutodumpPlus",0
Else
objShell.LogEvent 1, "AutodumpPlus has detected that there is not enough free space on the following network share " & HangDir & ". AutodumpPlus requires at least 10Mb of free space. Please free up some space on that drive and try running AutodumpPlus again."
wscript.echo "AutodumpPlus has detected that there is not enough free space on the following network share " & HangDir & ". AutodumpPlus requires at least 10Mb of free space. Please free up some space on that drive and try running AutodumpPlus again."
End If
DeleteDirectory(ShortHangDir)
wscript.quit 1
End If
Else
If DEBUGGING = TRUE Then
Wscript.echo "In RunTlist(), No_Free_Space_Checking = TRUE"
Wscript.echo "In RunTlist(), Call to DriveObject.Freespace skipped!"
Wscript.echo "In RunTlist(), Err number after calling objFileSystem.GetDrive: " & err.number & " Err Description: " & err.description
Wscript.echo ""
End If
End If
End If
End If
If CrashMode = true Then
strShell = "cmd /c " & chr(34) & InstallDir & "\tlist.exe" & Chr(34) & " -k >" & ShortCrashDir & "\Process_List.txt"
'Un-comment the line below in order to simulate the effects of a missing Process_List.txt file
'strShell = "cmd /c " & chr(34) & InstallDir & "\tlist.exe -k"
If DEBUGGING = TRUE Then
wscript.echo "In RunTlist(), about to run tlist.exe, the strShell (emcmd command string) is: " & StrShell
Wscript.Echo ""
wscript.echo "-----------------------"
End If
objShell.Run strShell,MINIMIZE_NOACTIVATE,TRUE
Else
strShell = "cmd /c " & chr(34) & InstallDir & "\tlist.exe" & Chr(34) & " -k >" & ShortHangDir & "\Process_List.txt"
'Un-comment the line below in order to simulate the effects of a missing Process_List.txt file
'strShell = "cmd /c " & chr(34) & InstallDir & "\tlist.exe -k"
If DEBUGGING = TRUE Then
wscript.echo "In RunTlist(), about to run tlist.exe, the strShell (emcmd command string) is: " & StrShell
Wscript.Echo ""
wscript.echo "-----------------------"
End If
objShell.Run strShell,MINIMIZE_NOACTIVATE,TRUE
End If
End Sub
'---------------------------------------------------------------------------------------------
' Function: CreateCDBScript
' This function is used to create the CDB scripts used by the debugger.
' If you wish to change the debug output for hangs, crashes, or quick mode, you can
' add the necessary debugger commands so that they are placed in the CDB scripts the
' next time AutodumpPlus is run.
'---------------------------------------------------------------------------------------------
Function CreateCDBScript(pid, packagename)
On Error Resume Next
Dim objFileSystem
Dim objTextFile
Dim strFile
Dim arResults
Dim objShell
Dim strShell
Dim versionFile
If CrashMode = True Then
strFile = CrashDir & "\CDBScripts"
CreateDirectory(strFile)
strFile = CrashDir & "\CDBScripts\" & "PID-" & pid & "__" & packagename & ".cfg"
Else
strFile = HangDir & "\CDBScripts"
CreateDirectory(strFile)
strFile = HangDir & "\CDBScripts\" & "PID-" & pid & "__" & packagename & ".cfg"
End If
If DEBUGGING = TRUE Then
Wscript.echo "---------------------------------------"
Wscript.echo "In the CreateCDBScript() function . . ."
Wscript.echo "In CreateCDBScript(), pid = " & pid
Wscript.echo "In CreateCDBScript(), packagename = " & packagename
Wscript.echo "In CreateCDBScript(), strFile (the name of the CDB script to create) = " & strFile
Wscript.echo ""
Wscript.echo "----------------------------------------"
End If
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Wscript.Shell")
Set objTextFile = objFileSystem.CreateTextFile(strFile,True)
If CrashMode = True Then
If No_CrashMode_Log = FALSE Then
objTextFile.Writeline ".logopen " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & ".log"
Else
End If
objTextFile.Writeline ".echotimestamps"
objTextFile.Writeline ".sympath"
objTextFile.Writeline "*"
objTextFile.Writeline "* --------- AutodumpPlus " & VERSION & " was started at: -----------"
objTextFile.Writeline ".time"
objTextFile.Writeline "* ------------------------------------------------------"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "* --------- AutodumpPlus " & VERSION & " was run on server: --------"
objTextFile.Writeline "* Server name: " & ComputerName
objTextFile.Writeline "* ------------------------------------------------------"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "* ------ OS Version Information displayed below. -------"
objTextFile.Writeline "!version"
objTextFile.Writeline "* ------------------------------------------------------"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
'Setup the debug break exception handler
If PageHeapMode = False Then
If Full_Dump_on_CONTRL_C = TRUE Then
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- Listing all thread stacks: ---;~*kb250;.echo;.echo --- Listing loaded modules: ---;lmv;.echo;.echo --- Modules with matching symbols:;lml;.echo;.echo --- Listing all locks: ---;!locks;.echo;.echo ----------------------------------------------------------------------;.echo CTRL-C was pressed to stop debugging this process!;.echo ----------------------------------------------------------------------;.echo Exiting the debugger at:;.time;.echo;.dump /mfh /c CTRL-C_was_pressed_to_stop_the_debugger_while_running_in_crash_mode.__Full_memory_dump_from_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__CTRL-C__full.dmp;!elog_str AutodumpPlus detected that CTRL-C was pressed to stop debugging " & packagename & " and has created a full memory dump of the process in the " & CrashDir & " directory;q" & Chr(34) & " bpe"
Else
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- Listing all thread stacks: ---;~*kb250;.echo;.echo --- Listing loaded modules: ---;lmv;.echo;.echo --- Modules with matching symbols:;lml;.echo;.echo --- Listing all locks: ---;!locks;.echo;.echo ----------------------------------------------------------------------;.echo CTRL-C was pressed to stop debugging this process!;.echo ----------------------------------------------------------------------;.echo Exiting the debugger at:;.time;.echo;.dump -u /m /c CTRL-C_was_pressed_to_stop_the_debugger_while_running_in_crash_mode.__Mini_memory_dump_from_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__CTRL-C__mini.dmp;!elog_str AutodumpPlus detected that CTRL-C was pressed to stop debugging " & packagename & " and has created a mini-memory dump of the process in the " & CrashDir & " directory;q" & Chr(34) & " bpe"
End If
Else
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- Debug Break exception - Faulting stack below! ---;~#;kvn250;.echo -----------------------------------;.dump /mfh /c Debug_break_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__Debug_break_exception__full.dmp;!elog_str AutodumpPlus generated a Debug Break Exception dump while running in pageheap mode;.echo;.echo;.echo --- A debug break exception was encountered ---;.echo - AutodumpPlus will now detach the debugger;.echo - and end the debugging session.;.echo -----------------------------------" & Chr(34) & " bpe"
End If
'Setup the invalid handle exception handler
If No_Dump_on_1st_Chance_Exception = True Then 'The user does not want a memory dump produced for a 1st chance exception.
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Invalid Handle exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance Invalid Handle exception - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_invalid_handle_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_invalid_handle__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Invalid Handle exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " ch"
Else 'The user does want a memory dump produced for a 1st chance exception, now figure out which kind of memory dump (full or mini).
If Create_Full_Dump_on_1st_Chance_Exception = TRUE Then
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Invalid Handle exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump /mfh /c 1st_chance_invalid_handle_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__1st_chance_Invalid_Handle__full.dmp;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance Invalid Handle exception - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_invalid_handle_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_invalid_handle__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Invalid Handle exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " ch"
Else
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Invalid Handle exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump -u /m /c 1st_chance_invalid_handle_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__1st_chance_Invalid_Handle__mini.dmp;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance Invalid Handle exception - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_invalid_handle_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_invalid_handle__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Invalid Handle exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " ch"
End If
End If
'Setup the illegal instruction exception handler
If No_Dump_on_1st_Chance_Exception = True Then 'The user does not want a memory dump produced for a 1st chance exception.
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Illegal Instruction exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance Illegal Instruction exception - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_Illegal_Instruction_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_Illegal_Instruction__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Illegal Instruction exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " ii"
Else 'The user does want a memory dump produced for a 1st chance exception, now figure out which kind of memory dump (full or mini).
If Create_Full_Dump_on_1st_Chance_Exception = TRUE Then
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Illegal Instruction exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump /mfh /c 1st_chance_Illegal_Instruction_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__1st_chance_Illegal_Instruction__full.dmp;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance Illegal Instruction exception - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_Illegal_Instruction_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_Illegal_Instruction__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Illegal Instruction exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " ii"
Else
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Illegal Instruction exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump -u /m /c 1st_chance_Illegal_Instruction_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__1st_chance_Illegal_Instruction__mini.dmp;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance Illegal Instruction exception - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_Illegal_Instruction_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_Illegal_Instruction__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Illegal Instruction exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " ii"
End If
End If
'Setup the Integer Divide by Zero exception handler
If No_Dump_on_1st_Chance_Exception = True Then 'The user does not want a memory dump produced for a 1st chance exception.
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Integer Divide by Zero exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance Integer Divide by Zero exception - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_Integer_Divide_by_Zero_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_Integer_Divide_by_Zero__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Integer Divide by Zero exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " dz"
Else 'The user does want a memory dump produced for a 1st chance exception, now figure out which kind of memory dump (full or mini).
If Create_Full_Dump_on_1st_Chance_Exception = TRUE Then
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Integer Divide by Zero exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump /mfh /c 1st_chance_Integer_Divide_by_Zero_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__1st_chance_Integer_Divide_by_Zero__full.dmp;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance Integer Divide by Zero exception - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_Integer_Divide_by_Zero_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_Integer_Divide_by_Zero__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Integer Divide by Zero exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " dz"
Else
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Integer Divide by Zero exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump -u /m /c 1st_chance_Integer_Divide_by_Zero_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__1st_chance_Integer_Divide_by_Zero__mini.dmp;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance Integer Divide by Zero exception - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_Integer_Divide_by_Zero_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_Integer_Divide_by_Zero__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Integer Divide by Zero exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " dz"
End If
End If
'Setup the Floating Point Divide by Zero exception handler
If No_Dump_on_1st_Chance_Exception = True Then 'The user does not want a memory dump produced for a 1st chance exception.
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Floating Point Divide by Zero exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance Floating Point Divide by Zero exception - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_Floating_Point_Divide_by_Zero_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_Floating_Point_Divide_by_Zero__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Floating Point Divide by Zero exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " c000008e"
Else 'The user does want a memory dump produced for a 1st chance exception, now figure out which kind of memory dump (full or mini).
If Create_Full_Dump_on_1st_Chance_Exception = TRUE Then
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Floating Point Divide by Zero exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump /mfh /c 1st_chance_Floating_Point_Divide_by_Zero_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__1st_chance_Floating_Point_Divide_by_Zero__full.dmp;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance Floating Point Divide by Zero exception - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_Floating_Point_Divide_by_Zero_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_Floating_Point_Divide_by_Zero__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Floating Point Divide by Zero exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " c000008e"
Else
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Floating Point Divide by Zero exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump -u /m /c 1st_chance_Floating_Point_Divide_by_Zero_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__1st_chance_Floating_Point_Divide_by_Zero__mini.dmp;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance Floating Point Divide by Zero exception - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_Floating_Point_Divide_by_Zero_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_Floating_Point_Divide_by_Zero__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Floating Point Divide by Zero exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " c000008e"
End If
End If
'Setup the Integer Overflow exception handler
If No_Dump_on_1st_Chance_Exception = True Then 'The user does not want a memory dump produced for a 1st chance exception.
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Integer Overflow exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance Integer Overflow exception - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_Integer_Overflow_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_Integer_Overflow__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Integer Overflow exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " dz"
Else 'The user does want a memory dump produced for a 1st chance exception, now figure out which kind of memory dump (full or mini).
If Create_Full_Dump_on_1st_Chance_Exception = TRUE Then
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Integer Overflow exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump /mfh /c 1st_chance_Integer_Overflow_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__1st_chance_Integer_Overflow__full.dmp;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance Integer Overflow exception - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_Integer_Overflow_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_Integer_Overflow__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Integer Overflow exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " dz"
Else
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Integer Overflow exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump -u /m /c 1st_chance_Integer_Overflow_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__1st_chance_Integer_Overflow__mini.dmp;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance Integer Overflow exception - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_Integer_Overflow_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_Integer_Overflow__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Integer Overflow exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " dz"
End If
End If
'Setup the Invalid Lock Sequence exception handler
If No_Dump_on_1st_Chance_Exception = True Then 'The user does not want a memory dump produced for a 1st chance exception.
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Invalid Lock Sequence exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance Invalid Lock Sequence exception - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_Invalid_Lock_Sequence_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_Invalid_Lock_Sequence__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Invalid Lock Sequence exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " lsq"
Else 'The user does want a memory dump produced for a 1st chance exception, now figure out which kind of memory dump (full or mini).
If Create_Full_Dump_on_1st_Chance_Exception = TRUE Then
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Invalid Lock Sequence exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump /mfh /c 1st_chance_Invalid_Lock_Sequence_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__1st_chance_Invalid_Lock_Sequence__full.dmp;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance Invalid Lock Sequence exception - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_Invalid_Lock_Sequence_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_Invalid_Lock_Sequence__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Invalid Lock Sequence exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " lsq"
Else
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Invalid Lock Sequence exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump -u /m /c 1st_chance_Invalid_Lock_Sequence_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__1st_chance_Invalid_Lock_Sequence__mini.dmp;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance Invalid Lock Sequence exception - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_Invalid_Lock_Sequence_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_Invalid_Lock_Sequence__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Invalid Lock Sequence exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " lsq"
End If
End If
'Setup the Acces Violation exception handler
If No_Dump_on_1st_Chance_Exception = True Then 'The user does not want a memory dump produced for a 1st chance exception.
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Access Violation - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance Acess Violation - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_access_violation_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_access_violation__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Access Violation exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " av"
Else 'The user does want a memory dump produced for a 1st chance exception, now figure out which kind of memory dump (full or mini).
If Create_Full_Dump_on_1st_Chance_Exception = TRUE Then
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Access Violation - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump /mfh /c 1st_chance_access_violation_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__1st_chance_access_violation__full.dmp;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance Acess Violation - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_access_violation_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_access_violation__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Access Violation exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " av"
Else
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Access Violation - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump -u /m /c 1st_chance_access_violation_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__1st_chance_access_violation__mini.dmp;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance Acess Violation - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_access_violation_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_access_violation__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Access Violation exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " av"
End If
End If
'Setup the Stack Overflow exception handler
If No_Dump_on_1st_Chance_Exception = True Then 'The user does not want a memory dump produced for a 1st chance exception.
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Stack Overflow - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance stack overflow - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_stack_overflow_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance__stack_overflow__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Stack Overflow exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " sov"
Else 'The user does want a memory dump produced for a 1st chance exception, now figure out which kind of memory dump (full or mini).
If Create_Full_Dump_on_1st_Chance_Exception = TRUE Then
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Stack Overflow - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump /mfh /c 1st_chance_stack_overflow_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__1st_chance_stack_overflow__full.dmp;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance stack overflow - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_stack_overflow_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance__stack_overflow__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Stack Overflow exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " sov"
Else
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Stack Overflow - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump -u /m /c 1st_chance_stack_overflow_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__1st_chance_stack_overflow__mini.dmp;.echo;.echo;gn" & Chr(34) & " -c2 " & Chr(34) & ".echo --- 2nd chance stack overflow - Faulting stack below ---;~#;kvn250;.dump /mfh /c 2nd_chance_stack_overflow_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance__stack_overflow__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Stack Overflow exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " sov"
End If
End If
'Setup the C++ EH exception handler
'By default C++ EH exceptions are only logged to the log file (if logging is enabled) and there is no memory dump produced to minimize the impact on performance.
If Dump_on_EH_Exceptions = TRUE AND No_Dump_on_1st_Chance_Exception = FALSE Then 'Check to see whether we should produce a mini dump or a full memory dump
If Create_Full_Dump_on_1st_Chance_Exception = TRUE Then
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance C++ EH exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump /mfh /c 1st_chance_C++_EH_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__1st_chance_C++_EH_exception__full.dmp;.echo;.echo;gn" & Chr(34) & "-c2 " & Chr(34) & ".echo --- 2nd chance C++ EH exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump /mfh /c 2nd_chance_C++_EH_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_C++_EH__full.dmp;!elog_str AutodumpPlus detected a 2nd chance EH exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " eh"
Else
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance C++ EH exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump -u /m /c 1st_chance_C++_EH_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__1st_chance_C++_EH_exception__mini.dmp;.echo;.echo;gn" & Chr(34) & "-c2 " & Chr(34) & ".echo --- 2nd chance C++ EH exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump /mfh /c 2nd_chance_C++_EH_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_C++_EH__full.dmp;!elog_str AutodumpPlus detected a 2nd chance EH exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " eh"
End If
Else 'By default, ADPlus does not produce a memory dump on 1st chance EH exceptions, it just logs the stack and continues without handling the exception (gn).
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance C++ EH exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.echo;.echo;gn" & Chr(34) & "-c2 " & Chr(34) & ".echo --- 2nd chance C++ EH exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump /mfh /c 2nd_chance_C++_EH_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_C++_EH__full.dmp;q" & Chr(34) & " eh"
End If
'Setup the unknown exception handler
'By default unknown exceptions are only logged to the log file (if logging is enabled) and there is no memory dump produced to minimize the impact on performance.
If Dump_on_Unknown_Exceptions = TRUE AND No_Dump_on_1st_Chance_Exception = FALSE Then 'Check to see whether we should produce a mini dump or a full memory dump
If Create_Full_Dump_on_1st_Chance_Exception = TRUE Then
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Unknown exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump /mfh /c 1st_chance_unknown_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__1st_chance_unknown_exception__full.dmp;.echo;.echo;gn" & Chr(34) & "-c2 " & Chr(34) & ".echo --- 2nd chance unknown exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump /mfh /c 2nd_chance_Unknown_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_unknown_exception__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Unknown exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " *"
Else
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Unknown exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump -u /m /c 1st_chance_unknown_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__1st_chance_unknown_exception__mini.dmp;.echo;.echo;gn" & Chr(34) & "-c2 " & Chr(34) & ".echo --- 2nd chance unknown exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump /mfh /c 2nd_chance_Unknown_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_unknown_exception__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Unknown exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " *"
End If
Else 'By default, ADPlus does not produce a memory dump on 1st chance unknown exceptions, it just logs the stack and continues without handling the exception (gn).
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- 1st chance Unknown exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.echo;.echo;gn" & Chr(34) & "-c2 " & Chr(34) & ".echo --- 2nd chance unknown exception - Faulting stack below ----;~#;kvn250;.echo -----------------------------------;.dump /mfh /c 2nd_chance_Unknown_exception_in_" & packagename & "_running_on_" & ComputerName & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__2nd_chance_unknown_exception__full.dmp;!elog_str AutodumpPlus detected a 2nd chance Unknown exception in process " & packagename & " and has created a full memory dump of the process at the time of the crash in the " & CrashDir & " directory;q" & Chr(34) & " *"
End If
'Setup the DLL Load exception handler
If Dump_Stack_on_DLL_Load = TRUE Then
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- A DLL was loaded - Stack back trace below ----;~#;kvn250;.echo -----------------------------------;.echo;gn" & Chr(34) & " ld"
End If
'Setup the DLL UnLoad exception handler
If Dump_Stack_on_DLL_UnLoad = TRUE Then
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo --- A DLL was un-loaded - Stack back trace below ----;~#;kvn250;.echo -----------------------------------;.echo;gn" & Chr(34) & " ud"
End If
'Setup the end process exception handler
If Create_Full_Dump_on_1st_Chance_Exception = TRUE Then
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo;.echo ----------------------------------------------------------------------;.echo This process is shutting down!;.echo;.echo This can happen for the following reasons:;.echo 1.) Someone killed the process with Task Manager or the kill command.;.echo;.echo 2.) If this process is an MTS or COM+ server package, it could be;.echo* exiting because an MTS/COM+ server package idle limit was reached.;.echo;.echo 3.) If this process is an MTS or COM+ server package,;.echo* someone may have shutdown the package via the MTS Explorer or;.echo* Component Services MMC snap-in.;.echo;.echo 4.) If this process is an MTS or COM+ server package,;.echo* MTS or COM+ could be shutting down the process because an internal;.echo* error was detected in the process (MTS/COM+ fail fast condition).;.echo ----------------------------------------------------------------------;.echo;.echo --- Listing all remaining threads at time of shutdown ----;~*kv250;.echo ----------------------------------------------------------------------;.echo;.echo The process was shut down at:;.time;.echo;.echo;.dump /mfh /c The_following_process_" & packagename & "_running_on_" & ComputerName & "_was_shutdown_or_killed" & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__Process_was_shutdown__full.dmp;!elog_str AutodumpPlus detected that the following process " & packagename & " is shutting down or was killed and has created a full memory dump of the process at the time of the shutdown in the " & CrashDir & " directory;" & Chr(34) & " epr"
Else
objTextFile.Writeline "sxe -c " & Chr(34) & ".echo;.echo ----------------------------------------------------------------------;.echo This process is shutting down!;.echo;.echo This can happen for the following reasons:;.echo 1.) Someone killed the process with Task Manager or the kill command.;.echo;.echo 2.) If this process is an MTS or COM+ server package, it could be;.echo* exiting because an MTS/COM+ server package idle limit was reached.;.echo;.echo 3.) If this process is an MTS or COM+ server package,;.echo* someone may have shutdown the package via the MTS Explorer or;.echo* Component Services MMC snap-in.;.echo;.echo 4.) If this process is an MTS or COM+ server package,;.echo* MTS or COM+ could be shutting down the process because an internal;.echo* error was detected in the process (MTS/COM+ fail fast condition).;.echo ----------------------------------------------------------------------;.echo;.echo --- Listing all remaining threads at time of shutdown ----;~*kv250;.echo ----------------------------------------------------------------------;.echo;.echo The process was shut down at:;.time;.echo;.echo;.dump -u /m /c The_following_process_" & packagename & "_running_on_" & ComputerName & "_was_shutdown_or_killed" & " " & ShortCrashDir & "\" & "PID-" & pid & "__" & packagename & "__Process_was_shutdown__mini.dmp;!elog_str AutodumpPlus detected that the following process " & packagename & " is shutting down or was killed and has created a mini-memory dump of the process at the time of the shutdown in the " & CrashDir & " directory;" & Chr(34) & " epr"
End If
objTextFile.Writeline "*"
objTextFile.Writeline "* AutodumpPlus is monitoring: " & packagename
objTextFile.Writeline "* for most types of 1st chance and 2nd chance exceptions."
objTextFile.Writeline "*"
objTextFile.Writeline "* When a first chance exception is encountered, the process is paused"
objTextFile.Writeline "* while the faulting thread's stack is logged to a .log file and a"
objTextFile.Writeline "* mini-memory dump is created. The process will then resume."
objTextFile.Writeline "*"
objTextFile.Writeline "* If a second chance exception is encountered, the process is paused"
objTextFile.Writeline "* while the faulting thread's stack is logged to a .log file and a"
objTextFile.Writeline "* full memory dump is created. The debugger then quits and the process"
objTextFile.Writeline "* may need to be re-started."
objTextFile.Writeline "*"
objTextFile.Writeline "* C++ EH and Unknown exceptions, by deafult, will not produce memory"
objTextFile.Writeline "* dumps on 1st chance exceptions (see Q286350 for more info)."
objTextFile.Writeline "*"
objTextFile.Writeline "* If this process hangs, or to stop debugging this process please press"
objTextFile.Writeline "* CTRL-C in this window to produce a memory dump and to stop debugging."
objTextFile.Writeline "*"
objTextFile.Writeline "* NOTE: To stop debugging this process, do NOT close this window by"
objTextFile.Writeline "* pressing the X button at the top-right corner, please press CTRL-C to"
objTextFile.Writeline "* stop debugging. After pressing CTRL-C in this window, you will need to"
objTextFile.Writeline "* re-start this process. If you are monitoring IIS 5.0, IIS 5.0 will be"
objTextFile.Writeline "* re-started automatically by the Windows 2000 Service Control Manager."
'Setup the DLL Load / Unload information
If (Dump_Stack_on_DLL_Load = TRUE or Dump_Stack_on_DLL_UnLoad) Then
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "* -------------------- Listing loaded modules -------------------------"
objTextFile.Writeline "lmv"
objTextFile.Writeline "* ---------------------------------------------------------------------"
End If
objTextFile.Writeline "g"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "* -------- AutodumpPlus " & VERSION & " finished running at: --------"
objTextFile.Writeline ".time"
objTextFile.Writeline "* -------------------------------------------------------"
'If the -notify switch was used then send a message to the computer or user specified on the command line
'Note on NT 4.0 LocalUserName will be blank because the Volatile Environment variable can only be quired on Windows 2000 to get the
'local username. So we must send the message from the NotifyTarget on NT 4.0, instead of the locally logged on user.
If NotifyAdmin = True Then
If OSVer = "4.0" Then
objTextFile.Writeline "!net_send " & ComputerName & " " & NotifyTarget & " " & NotifyTarget & " AutodumpPlus has finished running in crash mode on " & ComputerName & " for the following process: " & packagename & ". This could indicate that a crash has occurred, or that the debugging session was ended manually (CTRL-C was pressed to stop debugging). Please check the application event log on " & ComputerName & " for more information."
Else
objTextFile.Writeline "!net_send " & ComputerName & " " & NotifyTarget & " " & LocalUsername & " AutodumpPlus has finished running in crash mode on " & ComputerName & " for the following process: " & packagename & ". This could indicate that a crash has occurred, or that the debugging session was ended manually (CTRL-C was pressed to stop debugging). Please check the application event log on " & ComputerName & " for more information."
End If
End If
objTextFile.Writeline "q"
ElseIf QuickMode = True Then
objTextFile.Writeline ".logopen " & ShortHangDir & "\" & "PID-" & pid & "__" & packagename & "__" & DateTimeStamp & ".log"
objTextFile.Writeline "*.reload /s"
objTextFile.Writeline ".sympath"
objTextFile.Writeline "*"
objTextFile.Writeline "* --------- AutodumpPlus " & VERSION & " was started at: -----------"
objTextFile.Writeline ".time"
objTextFile.Writeline "* ------------------------------------------------------"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "* --------- OS Version Information: ---------------------"
objTextFile.Writeline "!version"
objTextFile.Writeline "* ------------------------------------------------------"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "* --------- AutodumpPlus " & VERSION & " was run on server: --------"
objTextFile.Writeline "* Server name: " & ComputerName
objTextFile.Writeline "* ------------------------------------------------------"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "* --------- Heap information: --------------------------"
objTextFile.Writeline "!heap 0 -k"
objTextFile.Writeline "* ------------------------------------------------------"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "* --------- Handle information: ------------------------"
objTextFile.Writeline "!handle 0 0"
objTextFile.Writeline "* ------------------------------------------------------"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "* -------- Thread stack backtrace information: ---------"
objTextFile.Writeline "~*kb250"
objTextFile.Writeline "* ------------------------------------------------------"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "* -------- Loaded modules: -----------------------------"
objTextFile.Writeline "lmv"
objTextFile.Writeline "* ------------------------------------------------------"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "* -------- Loaded modules with matching symbols: -------"
objTextFile.Writeline "lml"
objTextFile.Writeline "* ------------------------------------------------------"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "* -------- DLL Information: ----------------------------"
objTextFile.Writeline "!dlls"
objTextFile.Writeline "* ------------------------------------------------------"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "* -------- Critical section information: ---------------"
objTextFile.Writeline "!locks"
objTextFile.Writeline "* ------------------------------------------------------"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "* -------- Time & Uptime Statistics: -------------------"
objTextFile.Writeline "* Time & Uptime Statistics:"
objTextFile.Writeline ".time"
objTextFile.Writeline "* ------------------------------------------------------"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline "*"
objTextFile.Writeline ".dump -u /m /c " & Chr(34) & "Mini memory dump for " & packagename & " created by AutodumpPlus Version " & VERSION & " running on " & ComputerName & " in quick/hang mode!" & Chr(34) & " " & ShortHangDir & "\PID-" & pid & "__" & packagename & "__mini.dmp"
objTextFile.Writeline ".logclose"
objTextFile.Writeline "q"
Else
objTextFile.Writeline ".dump /mfh /c " & Chr(34) & "Full memory dump for " & packagename & " created by AutodumpPlus Version " & VERSION & " running on " & ComputerName & " in normal/hang mode!" & Chr(34) & " " & ShortHangDir & "\PID-" & pid & "__" & packagename & "__" & DateTimeStamp & "__full.dmp"
objTextFile.Writeline "q"
End If
objTextFile.Close
Set objFileSystem = nothing
Set objTextFile = nothing
Set objShell = nothing
CreateCDBScript = strFile
End Function
'---------------------------------------------------------------------------------------------
' Function: DumpIIS
' This is a rather large function and it is the main function used to dump
' all of the MTS / COM+ processes when running in either quick or normal mode.
' Generic processes (those specified by the -p or -pn switch) are dumped using the
' DumpAnyProc() function.
'---------------------------------------------------------------------------------------------
Sub DumpIIS(strFile,OSVersion)
On Error Resume Next
Dim objFileSystem
Dim oFS2
Dim objTextFile
Dim str
Dim arResults
Dim objShell
Dim strShell
Dim versionFile
Dim TempCounter
Dim i
Dim TotalPackageCount
Dim WheresTheSpace
If DEBUGGING = TRUE Then
Wscript.echo ""
Wscript.echo "-----------------------------------"
Wscript.echo "In the DumpIIS() function . . ."
Wscript.echo "In DumpIIS(), strFile = " & strFile
Wscript.echo "In DumpIIS(), OSVersion = " & OSVersion
Wscript.echo ""
End If
i = 0
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
Set oFS2 = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Wscript.Shell")
'Per the scripting team's advice, sleep for .5 second prior to calling this function.
Wscript.sleep 500
If CrashMode = true Then
If DEBUGGING = TRUE Then
Wscript.echo "In DumpIIS(), The Process_List.txt file should be located here: " & CrashDir & "\Process_List.txt"
Wscript.echo ""
End If
While not objFileSystem.FileExists(CrashDir & "\Process_List.txt")
Wscript.sleep 1000
If DEBUGGING = TRUE Then
wscript.echo "In DumpIIS(), The Process_List.txt file has not been created yet, sleeping for 1 second and trying again."
wscript.echo ""
End If
i = i +1
If i = 10 Then
If DEBUGGING = TRUE Then
wscript.echo "In DumpIIS(), Could not find the Process_List.txt file in the folder: " & CrashDir
wscript.echo "In DumpIIS(), Exiting AutodumpPlus now."
wscript.echo ""
End If
If QuietMode = False Then
objShell.PopUp "The file Process_List.txt could not be found in the " & CrashDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again.",,"AutodumpPlus",0
Else
Wscript.echo "The file Process_List.txt could not be found in the " & CrashDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again."
objShell.LogEvent 1, "The file Process_List.txt could not be found in the " & CrashDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again."
ErrorsDuringRuntime = True
End If
If HangMode = True Then
DeleteDirectory(HangDir)
Else
DeleteDirectory(CrashDir)
End If
wscript.quit 1
End If
Wend
Else 'Running in Hang or Quick modes . . .
If DEBUGGING = TRUE Then
Wscript.echo "In DumpIIS(), The Process_List.txt file should be located here: " & HangDir & "\Process_List.txt"
End If
While not objFileSystem.FileExists(HangDir & "\Process_List.txt")
Wscript.sleep 1000
If DEBUGGING = TRUE Then
wscript.echo "In DumpIIS(), The Process_List.txt file has not been created yet, sleeping for 1 second and trying again."
wscript.echo ""
End If
i = i +1
If i = 10 Then
If DEBUGGING = TRUE Then
wscript.echo "In DumpIIS(), Could not find the Process_List.txt file in the folder: " & HangDir
wscript.echo "In DumpIIS(), Exiting AutodumpPlus now."
wscript.echo ""
End If
If QuietMode = False Then
objShell.PopUp "The file Process_List.txt could not be found in the " & HangDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again.",,"AutodumpPlus",0
Else
Wscript.echo "The file Process_List.txt could not be found in the " & HangDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again."
objShell.LogEvent 1, "The file Process_List.txt could not be found in the " & HangDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again."
ErrorsDuringRuntime = True
End If
If HangMode = True Then
DeleteDirectory(HangDir)
Else
DeleteDirectory(CrashDir)
End If
wscript.quit 1
End If
Wend
End If
If HangMode = True Then
Set objTextFile = objFileSystem.OpenTextFile(HangDir & "\Process_List.txt",ForReading,TristateUseDefault)
Else
Set objTextFile = objFileSystem.OpenTextFile(CrashDir & "\Process_List.txt",ForReading,TristateUseDefault)
End If
i = 0
While objTextFile.AtEndOfStream
'Close the text file to let it finish writing and to get a new copy . . .
objTextFile.Close
wscript.sleep 1000
If DEBUGGING = TRUE Then
wscript.echo "In DumpIIS(), Waiting for Process_List.txt to finish writing (sleeping 1 second). . . "
wscript.echo ""
End If
i = i +1
If i = 10 Then
If HangMode = True Then
If DEBUGGING = TRUE Then
wscript.echo "In DumpIIS(), Process_List.txt was never closed (finished writing) in the folder: " & HangDir
wscript.echo "In DumpIIS(), Exiting AutodumpPlus now."
wscript.echo ""
End If
If QuietMode = False Then
objShell.PopUp "The file Process_List.txt was never closed (finished writing) by tlist.exe in the " & HangDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again.",,"AutodumpPlus",0
Else
Wscript.echo "The file Process_List.txt was never closed (finished writing) by tlist.exe in the " & HangDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again."
objShell.LogEvent 1, "The file Process_List.txt was never closed (finished writing) by tlist.exe in the " & HangDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again."
ErrorsDuringRuntime = True
End If
DeleteDirectory(HangDir)
wscript.quit 1
Else
If DEBUGGING = TRUE Then
wscript.echo "In DumpIIS(), Process_List.txt was never closed (finished writing) in the folder: " & CrashDir
wscript.echo "In DumpIIS(), Exiting AutodumpPlus now."
wscript.echo ""
End If
If QuietMode = False Then
objShell.PopUp "The file Process_List.txt was never closed (finished writing) by tlist.exe in the " & CrashDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again.",,"AutodumpPlus",0
Else
Wscript.echo "The file Process_List.txt was never closed (finished writing) by tlist.exe in the " & CrashDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again."
objShell.LogEvent 1, "The file Process_List.txt was never closed (finished writing) by tlist.exe in the " & CrashDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again."
ErrorsDuringRuntime = True
End If
DeleteDirectory(CrashDir)
wscript.quit 1
End If
End If
'Open the text file again before looping . . .
If HangMode = True Then
Set objTextFile = objFileSystem.OpenTextFile(HangDir & "\Process_List.txt",ForReading,TristateUseDefault)
Else
Set objTextFile = objFileSystem.OpenTextFile(CrashDir & "\Process_List.txt",ForReading,TristateUseDefault)
End If
Wend
While not objTextFile.AtEndofStream
str = objTextFile.ReadLine
Str = LTrim(Str)
arResults= split(Str," ",-1,1)
arResults(1)=trim(arResults(1))
arResults(1)=Replace(arResults(1),"/",",")
arResults(1)=Replace(arResults(1),"\",",")
arResults(1)=Replace(arResults(1),"<","(")
arResults(1)=Replace(arResults(1),">",")")
arResults(1)=Replace(arResults(1),":","")
arResults(1)=Replace(arResults(1),"*","")
arResults(1)=Replace(arResults(1),"?","")
arResults(1)=Replace(arResults(1),"|","")
If UCase(arResults(1)) = "INETINFO.EXE" Then
IISPid = Trim(arResults(0))
End If
Wend
objTextFile.Close
If DEBUGGING = True Then
wscript.echo ""
wscript.echo "In DumpIIS(), strFile = " & strFile
wscript.echo "In DumpIIS(), about to open strFile for reading . . ."
End If
'Open the Process_List.txt and count how many packages / applications are running.
'This code was updated to limit ADPlus to only attaching to up to MAX_APPLICATIONS_TO_DEBUG
'NOTE: If there are more than MAX_APPLICATIONS_TO_DEBUG applications running ADPlus will
'display an error and quit.
Set objTextFile = objFileSystem.OpenTextFile(strFile,ForReading,TristateUseDefault)
While not objTextFile.AtEndofStream
str = objTextFile.ReadLine
Str = LTrim(Str)
If InStr(Str, "Mts:") Then
arResults= split(Str,":",-1,1)
arResults(1)=trim(arResults(1))
arResults(1)=Replace(arResults(1),"/",",")
arResults(1)=Replace(arResults(1),"\",",")
arResults(1)=Replace(arResults(1),"<","(")
arResults(1)=Replace(arResults(1),">",")")
arResults(1)=Replace(arResults(1),":","")
arResults(1)=Replace(arResults(1),"*","")
arResults(1)=Replace(arResults(1),"?","")
arResults(1)=Replace(arResults(1),"|","")
arResults(0)=LTrim(arResults(0))
WheresTheSpace = InStr(arResults(0)," ")
arResults(0)= Left(arResults(0),(WheresTheSpace-1))
TotalPackageCount = TotalPackageCount+1
End if
Wend
'Close the text file.
objTextFile.Close
If DEBUGGING = TRUE Then
Wscript.echo "In DumpIIS() TotalPackageCount = " & TotalPackageCount
End If
'This is the logic to display the error message if too many packages / applications are running when
'used with the -IIS switch.
If TotalPackageCount > MAX_APPLICATIONS_TO_DEBUG Then
If OSVersion = "4.0" Then
If QuietMode = False Then
objShell.PopUp "AutodumpPlus has determined that there are currently " & TotalpackageCount & " MTS server packages running. AutodumpPlus when used with the '-IIS' switch, by default, will only monitor up to " & MAX_APPLICATIONS_TO_DEBUG & " MTS server packages because of the impact on system resources.",,"AutodumpPlus",0
Else
Wscript.echo "AutodumpPlus has determined that there are currently " & TotalpackageCount & " MTS server packages running. AutodumpPlus when used with the '-IIS' switch, by default, will only monitor up to " & MAX_APPLICATIONS_TO_DEBUG & " MTS server packages because of the impact on system resources."
objShell.LogEvent 1, "AutodumpPlus has determined that there are currently " & TotalpackageCount & " MTS server packages running. AutodumpPlus when used with the '-IIS' switch, by default, will only monitor up to " & MAX_APPLICATIONS_TO_DEBUG & " MTS server packages because of the impact on system resources."
ErrorsDuringRuntime = True
End If
'Delete the crash or hang mode directory since we are quitting.
If HangMode = True Then
Call DeleteDirectory(HangDir)
Else
Call DeleteDirectory(CrashDir)
End If
wscript.quit 1
Else
If QuietMode = False Then
objShell.PopUp "AutodumpPlus has determined that there are currently " & TotalpackageCount & " COM+ server applications running. AutodumpPlus when used with the '-IIS' switch, by default, will only monitor up to " & MAX_APPLICATIONS_TO_DEBUG & " COM+ server applications because of the impact on system resources.",,"AutodumpPlus",0
Else
Wscript.echo "AutodumpPlus has determined that there are currently " & TotalpackageCount & " COM+ server applications running. AutodumpPlus when used with the '-IIS' switch, by default, will only monitor up to " & MAX_APPLICATIONS_TO_DEBUG & " COM+ server applications because of the impact on system resources."
objShell.LogEvent 1, "AutodumpPlus has determined that there are currently " & TotalpackageCount & " COM+ server applications running. AutodumpPlus when used with the '-IIS' switch, by default, will only monitor up to " & MAX_APPLICATIONS_TO_DEBUG & " COM+ server applications because of the impact on system resources."
ErrorsDuringRuntime = True
End If
'Delete the crash or hang mode directory since we are quitting.
If HangMode = True Then
Call DeleteDirectory(HangDir)
Else
Call DeleteDirectory(CrashDir)
End If
wscript.quit 1
End If
End If
'Open the Process_List.txt
Set objTextFile = objFileSystem.OpenTextFile(strFile,ForReading,TristateUseDefault)
if not objTextFile.AtEndOfStream Then
If DEBUGGING = TRUE Then
wscript.echo "In DumpIIS(), Succesffully opened the file " & strFile & ". tlist.exe -k appears to have run."
wscript.echo ""
End If
If DEBUGGING = TRUE Then
wscript.echo "In DumpIIS(), The first line of " & strFile & " contains: " & Str
wscript.echo ""
End If
If HangMode = true and QuickMode = true Then
Wscript.Echo "The '-quick' switch was used, AutodumpPlus is running in 'quick hang' mode."
ElseIf HangMode = true Then
Wscript.echo "The '-hang' switch was used, Autdoump is running in 'hang' mode."
End If
If CrashMode = true Then
Wscript.Echo "The '-crash' switch was used, AutodumpPlus is running in 'crash' mode."
End If
If PageHeapMode = true Then
Wscript.Echo "The '-pageheap' switch was used, AutodumpPlus is running in 'pageheap' mode."
End If
If QuietMode = true Then
Wscript.Echo "The '-quiet' switch was used, AutodumpPlus will not display any"
Wscript.Echo "modal dialog boxes."
End If
If OSwitchUsed = true Then
Wscript.Echo "The '-o' switch was used. AutodumpPlus will place all files in"
Wscript.echo "the following directory: " & OutputDir
End If
If NotifyAdmin = true Then
Wscript.Echo "The '-notify' switch was used. AutodumpPlus will send notification to"
Wscript.echo "the following computer or user: " & NotifyTarget
End If
If CrashMode = True Then
If OSVersion = "4.0" Then
Wscript.Echo ""
Wscript.Echo "Monitoring IIS and all MTS server packages for crashes."
Wscript.echo "----------------------------------------------------------------------"
ElseIf CInt(OSBuildNumber) = 2195 Then
Wscript.Echo ""
Wscript.Echo "Monitoring IIS and all COM+ server applications"
Wscript.Echo "except for the System application for crashes."
Wscript.echo "----------------------------------------------------------------------"
ElseIf CInt(OSBuildNumber) > 2195 Then
Wscript.Echo ""
Wscript.Echo "Monitoring IIS and all COM+ server applications for crashes."
Wscript.echo "----------------------------------------------------------------------"
End If
ElseIf QuickMode = True Then
If OSVersion = "4.0" Then
Wscript.Echo ""
Wscript.Echo "Logging debug info for IIS and all MTS server packages."
Wscript.echo "----------------------------------------------------------------------"
ElseIf CInt(OSBuildNumber) = 2195 Then
Wscript.Echo ""
Wscript.Echo "Logging debug info for IIS and all COM+ server applications"
Wscript.Echo "except for the System application."
Wscript.echo "----------------------------------------------------------------------"
ElseIf CInt(OSBuildNumber) > 2195 Then
Wscript.Echo ""
Wscript.Echo "Logging debug info for IIS and all COM+ server applications."
Wscript.echo "----------------------------------------------------------------------"
End If
Else
If OSVersion = "4.0" Then
Wscript.Echo ""
Wscript.Echo "Dumping process info for IIS and all MTS server packages."
Wscript.echo "----------------------------------------------------------------------"
ElseIf CInt(OSBuildNumber) = 2195 Then
Wscript.Echo ""
Wscript.Echo "Dumping process info for IIS and all COM+ server applications"
Wscript.Echo "except for the System application."
Wscript.echo "----------------------------------------------------------------------"
ElseIf CInt(OSBuildNumber) > 2195 Then
Wscript.Echo ""
Wscript.Echo "Dumping process info for IIS and all COM+ server applications."
Wscript.echo "----------------------------------------------------------------------"
End If
End If
If CrashMode = true Then
If IISPid <> "" Then
PackageCount = PackageCount + 1
IISProcessCount = IISProcessCount + 1
Wscript.Echo "Attaching the CDB debugger to: IIS (inetinfo.exe)"
Wscript.Echo " (Process ID: " & IISPid & ")"
strShell = ShortInstallDir & "\cdb.exe -sfce -pn inetinfo.exe -c $<" & Chr(34) & CreateCDBScript(IISPid, "Inetinfo.exe") & Chr(34)
If DEBUGGING = TRUE Then
Wscript.echo "In DumpIIS(), just about to launch CDB.EXE with: " & strShell
End If
objShell.Run strShell,MINIMIZE_NOACTIVATE,FALSE
Else
Wscript.echo "The '-IIS' switch was used, but IIS is not currently running."
End If
ElseIf QuickMode = true Then
If IISPid <> "" Then
PackageCount = PackageCount + 1
IISProcessCount = IISProcessCount + 1
If OSVer = "4.0" Then
Wscript.Echo "Logging debug info for: IIS (inetinfo.exe)"
Wscript.Echo " (Process ID: " & IISPid & ")"
strShell = ShortInstallDir & "\cdb.exe -sfce -pv -pn inetinfo.exe -c $<" & Chr(34) & CreateCDBScript(IISPid, "Inetinfo.exe") & Chr(34)
objShell.Run strShell,MINIMIZE_NOACTIVATE,FALSE
Else
Wscript.Echo "Logging debug info for: IIS (inetinfo.exe)."
Wscript.Echo " (Process ID: " & IISPid & ")"
strShell = ShortInstallDir & "\cdb.exe -pv -pn inetinfo.exe -c $<" & Chr(34) & CreateCDBScript(IISPid, "Inetinfo.exe") & Chr(34)
objShell.Run strShell,MINIMIZE_NOACTIVATE,FALSE
End If
Else
Wscript.echo "The '-IIS' switch was used, but IIS is not currently running."
End If
Else
If IISPid <> "" Then
PackageCount = PackageCount + 1
IISProcessCount = IISProcessCount + 1
Wscript.Echo "Dumping process: IIS (inetinfo.exe)"
Wscript.Echo " (Process ID: " & IISPid & ")"
strShell = ShortInstallDir & "\cdb.exe -sfce -pv -pn inetinfo.exe -c $<" & Chr(34) & CreateCDBScript(IISPid, "Inetinfo.exe") & Chr(34)
objShell.Run strShell,MINIMIZE_NOACTIVATE,FALSE
Else
Wscript.echo "The '-IIS' switch was used, but IIS is not currently running."
End If
End If
'Enumerate all running MTS / COM+ server packages that are currently running and attach the debugger to them . . .
while not objTextFile.AtEndofStream
str = objTextFile.ReadLine
Str = LTrim(Str)
If InStr(Str, "Mts:") Then
arResults= split(Str,":",-1,1)
arResults(1)=trim(arResults(1))
arResults(1)=Replace(arResults(1),"/",",")
arResults(1)=Replace(arResults(1),"\",",")
arResults(1)=Replace(arResults(1),"<","(")
arResults(1)=Replace(arResults(1),">",")")
arResults(1)=Replace(arResults(1),":","")
arResults(1)=Replace(arResults(1),"*","")
arResults(1)=Replace(arResults(1),"?","")
arResults(1)=Replace(arResults(1),"|","")
arResults(0)=LTrim(arResults(0))
WheresTheSpace = InStr(arResults(0)," ")
arResults(0)= Left(arResults(0),(WheresTheSpace-1))
If DEBUGGING Then
Wscript.Echo "Enumerating all COM+ & MTS Processes from Process_List.txt"
Wscript.Echo "The Package Name is: " & arResults(1)
Wscript.echo "The Package PID is: " & arResults(0)
End if
'Dump all COM+ / MTS packages, including the system package if possible . . .
If arResults(1) <> "IIS In-Process Applications" Then 'Somtimes Inetinfo.exe shows up as "IIS In-Process Applications"
If QuickMode = true then
If OSVersion = "4.0" Then
PackageCount = PackageCount + 1
IISProcessCount = IISProcessCount + 1
Wscript.Echo "Logging debug info for: " & arResults(1)
Wscript.Echo " (Process ID: " & arResults(0) & ")"
strPackageName = Replace(Trim(arResults(1)), " ", "_")
If DEBUGGING = TRUE Then
Wscript.echo "In DumpIIS(), strPackageName = " & strPackageName
Wscript.echo ""
End If
strShell= ShortInstallDir & "\cdb.exe -sfce -pv -p " & arResults(0) & " -c $<" & Chr(34) & CreateCDBScript(arResults(0), strPackageName) & Chr(34)
If DEBUGGING = TRUE Then
Wscript.echo "In DumpIIS(), about to run the debugger with the following string, strShell = " & strShell
Wscript.echo ""
End If
objShell.Run strShell,MINIMIZE_NOACTIVATE,FALSE
Else
PackageCount = PackageCount + 1
IISProcessCount = IISProcessCount + 1
Wscript.Echo "Logging debug info for: " & arResults(1)
Wscript.Echo " (Process ID: " & arResults(0) & ")"
If DEBUGGING = TRUE Then
Wscript.echo "In DumpIIS(), strPackageName = " & strPackageName
Wscript.echo ""
End If
strPackageName = Replace(Trim(arResults(1)), " ", "_")
strShell= ShortInstallDir & "\cdb.exe -sfce -pv -p " & arResults(0) & " -c $<" & Chr(34) & CreateCDBScript(arResults(0), strPackageName) & Chr(34)
If DEBUGGING = TRUE Then
Wscript.echo "In DumpIIS(), about to run the debugger with the following string, strShell = " & strShell
Wscript.echo ""
End If
objShell.Run strShell,MINIMIZE_NOACTIVATE,FALSE
End If
ElseIf CrashMode = True Then
If OSVersion = "4.0" Then
PackageCount = PackageCount + 1
IISProcessCount = IISProcessCount + 1
Wscript.Echo "Attaching the CDB debugger to: " & arResults(1)
Wscript.Echo " (Process ID: " & arResults(0) & ")"
strPackageName = Replace(Trim(arResults(1)), " ", "_")
strPackageName = Replace(strPackageName, ",,", "-")
strPackageName = Replace(strPackageName, ",", "-")
If DEBUGGING = TRUE Then
Wscript.echo "In DumpIIS(), strPackageName = " & strPackageName
Wscript.echo ""
End If
strShell= ShortInstallDir & "\cdb.exe -sfce -p " & arResults(0) & " -c $<" & Chr(34) & CreateCDBScript(arResults(0), strPackageName) & Chr(34)
If DEBUGGING = TRUE Then
Wscript.echo "In DumpIIS(), about to run the debugger with the following string, strShell = " & strShell
Wscript.echo ""
End If
objShell.Run strShell,MINIMIZE_NOACTIVATE,FALSE
Else
PackageCount = PackageCount + 1
IISProcessCount = IISProcessCount + 1
Wscript.Echo "Attaching the CDB debugger to: " & arResults(1)
Wscript.Echo " (Process ID: " & arResults(0) & ")"
strPackageName = Replace(Trim(arResults(1)), " ", "_")
strPackageName = Replace(strPackageName, ",,", "-")
strPackageName = Replace(strPackageName, ",", "-")
If DEBUGGING = TRUE Then
Wscript.echo "In DumpIIS(), strPackageName = " & strPackageName
Wscript.echo ""
End If
strShell= ShortInstallDir & "\cdb.exe -sfce -p " & arResults(0) & " -c $<" & Chr(34) & CreateCDBScript(arResults(0), strPackageName) & Chr(34)
If DEBUGGING = TRUE Then
Wscript.echo "In DumpIIS(), about to run the debugger with the following string, strShell = " & strShell
Wscript.echo ""
End If
objShell.Run strShell,MINIMIZE_NOACTIVATE,FALSE
End If
Else
PackageCount = PackageCount + 1
IISProcessCount = IISProcessCount + 1
Wscript.Echo "Dumping process: " & arResults(1)
Wscript.Echo " (Process ID: " & arResults(0) & ")"
strPackageName = Replace(Trim(arResults(1)), " ", "_")
strPackageName = Replace(strPackageName, ",,", "-")
strPackageName = Replace(strPackageName, ",", "-")
If DEBUGGING = TRUE Then
Wscript.echo "In DumpIIS(), strPackageName = " & strPackageName
Wscript.echo ""
End If
strShell= ShortInstallDir & "\cdb.exe -sfce -pv -p " & arResults(0) & " -c $<" & Chr(34) & CreateCDBScript(arResults(0), strPackageName) & Chr(34)
If DEBUGGING = TRUE Then
Wscript.echo "In DumpIIS(), about to run the debugger with the following string, strShell = " & strShell
Wscript.echo ""
End If
objShell.Run strShell,MINIMIZE_NOACTIVATE,FALSE
End If
End If
End if
wend
Else
If QuietMode = False Then
objshell.popup "The command 'tlist.exe -k' does not appear to have run properly from the " & InstallDir & " directory. AutodumpPlus can not continue.",,"AutodumpPlus",0
ErrorsDuringRuntime = True
Else
objShell.LogEvent 1, "The command 'tlist.exe -k' does not appear to have run properly from the " & InstallDir & " directory. AutodumpPlus can not continue."
wscript.echo "The command 'tlist.exe -k' does not appear to have run properly from the " & InstallDir & " directory. AutodumpPlus can not continue."
ErrorsDuringRuntime = True
End If
Wscript.quit 1
End if
objTextFile.Close
Set objTextFile = nothing
Set objFileSystem = nothing
Set objShell = nothing
End sub
'---------------------------------------------------------------------------------------------
' Function: DumpAnyProc
' This is the code used to dump any processes specified on the command line.
'---------------------------------------------------------------------------------------------
Sub DumpAnyProc()
On Error Resume Next
If DEBUGGING = TRUE Then
Wscript.echo ""
Wscript.echo "-----------------------------------"
Wscript.echo "In the DumpAnyProc function . . ."
Wscript.echo "-----------------------------------"
Wscript.echo ""
End If
Dim objFileSystem
Dim objTextFile
Dim Str
Dim i
Dim x,y
Dim LineNumber
Dim args
Dim PIDArgItems
Dim PidArgItemsCount
Dim ProcArgItems
Dim ProcArgItemsCount
Dim arResults
Dim objShell
Dim strShell
Dim versionFile
Dim TempCounter
Dim strPackageName
Dim strProcName
Dim PidMatch
Dim ProcessMatch
Dim ProcNamePidArray()
Dim FirstCall
FirstCall = True
LineNumber = 1
PidMatch = false
ProcessMatch = false
x = 0
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Wscript.Shell")
'Per the scripting team's advice, sleep for .5 second prior to calling this function.
Wscript.sleep 500
If CrashMode = true Then
If DEBUGGING = TRUE Then
Wscript.echo "In DumpAnyProc(), The Process_List.txt file should be located here: " & CrashDir & "\Process_List.txt"
Wscript.echo ""
End If
While not objFileSystem.FileExists(CrashDir & "\Process_List.txt")
Wscript.sleep 1000
If DEBUGGING = TRUE Then
wscript.echo "In DumpAnyProc(), The Process_List.txt file has not been created yet, sleeping for 1 second and trying again."
wscript.echo ""
End If
i = i +1
If i = 10 Then
If DEBUGGING = TRUE Then
wscript.echo "In DumpAnyProc(), Could not find the Process_List.txt file in the folder: " & CrashDir
wscript.echo "In DumpAnyProc(), Exiting AutodumpPlus now."
wscript.echo ""
End If
If QuietMode = False Then
objShell.PopUp "The file Process_List.txt could not be found in the " & CrashDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again.",,"AutodumpPlus",0
Else
Wscript.echo "The file Process_List.txt could not be found in the " & CrashDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again."
objShell.LogEvent 1, "The file Process_List.txt could not be found in the " & CrashDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again."
ErrorsDuringRuntime = True
End If
If HangMode = True Then
DeleteDirectory(HangDir)
Else
DeleteDirectory(CrashDir)
End If
wscript.quit 1
End If
Wend
Else 'Running in Hang or Quick modes . . .
If DEBUGGING = TRUE Then
Wscript.echo "In DumpAnyProc(), The Process_List.txt file should be located here: " & HangDir & "\Process_List.txt"
End If
While not objFileSystem.FileExists(HangDir & "\Process_List.txt")
Wscript.sleep 1000
If DEBUGGING = TRUE Then
wscript.echo "In DumpAnyProc(), The Process_List.txt file has not been created yet, sleeping for 1 second and trying again."
wscript.echo ""
End If
i = i +1
If i = 10 Then
If DEBUGGING = TRUE Then
wscript.echo "In DumpAnyProc(), Could not find the Process_List.txt file in the folder: " & HangDir
wscript.echo "In DumpAnyProc(), Exiting AutodumpPlus now."
wscript.echo ""
End If
If QuietMode = False Then
objShell.PopUp "The file Process_List.txt could not be found in the " & HangDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again.",,"AutodumpPlus",0
Else
Wscript.echo "The file Process_List.txt could not be found in the " & HangDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again."
objShell.LogEvent 1, "The file Process_List.txt could not be found in the " & HangDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again."
ErrorsDuringRuntime = True
End If
If HangMode = True Then
DeleteDirectory(HangDir)
Else
DeleteDirectory(CrashDir)
End If
wscript.quit 1
End If
Wend
End If
If HangMode = True Then
Set objTextFile = objFileSystem.OpenTextFile(HangDir & "\Process_List.txt",ForReading,TristateUseDefault)
Else
Set objTextFile = objFileSystem.OpenTextFile(CrashDir & "\Process_List.txt",ForReading,TristateUseDefault)
End If
i = 0
While objTextFile.AtEndOfStream
'Close the text file to let it finish writing and to get a new copy . . .
objTextFile.Close
wscript.sleep 1000
If DEBUGGING = TRUE Then
wscript.echo "In DumpAnyProc(), Waiting for Process_List.txt to finish writing (sleeping 1 second). . . "
wscript.echo ""
End If
i = i +1
If i = 10 Then
If HangMode = True Then
If DEBUGGING = TRUE Then
wscript.echo "In DumpAnyProc(), Process_List.txt was never closed (finished writing) in the folder: " & HangDir
wscript.echo "In DumpAnyProc(), Exiting AutodumpPlus now."
wscript.echo ""
End If
If QuietMode = False Then
objShell.PopUp "The file Process_List.txt was never closed (finished writing) by tlist.exe in the " & HangDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again.",,"AutodumpPlus",0
Else
Wscript.echo "The file Process_List.txt was never closed (finished writing) by tlist.exe in the " & HangDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again."
objShell.LogEvent 1, "The file Process_List.txt was never closed (finished writing) by tlist.exe in the " & HangDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again."
ErrorsDuringRuntime = True
End If
DeleteDirectory(HangDir)
wscript.quit 1
Else
If DEBUGGING = TRUE Then
wscript.echo "In DumpAnyProc(), Process_List.txt was never closed (finished writing) in the folder: " & CrashDir
wscript.echo "In DumpAnyProc(), Exiting AutodumpPlus now."
wscript.echo ""
End If
If QuietMode = False Then
objShell.PopUp "The file Process_List.txt was never closed (finished writing) by tlist.exe in the " & CrashDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again.",,"AutodumpPlus",0
Else
Wscript.echo "The file Process_List.txt was never closed (finished writing) by tlist.exe in the " & CrashDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again."
objShell.LogEvent 1, "The file Process_List.txt was never closed (finished writing) by tlist.exe in the " & CrashDir & " directory after waiting for 10 seconds. This could indicate that there was a problem running tlist.exe or that the file could not be read using the Scripting.FileSystemObject. Please try running tlist.exe manually from the " & installdir & " directory or re-register scrrun.dll and try running AutodumpPlus again."
ErrorsDuringRuntime = True
End If
DeleteDirectory(CrashDir)
wscript.quit 1
End If
End If
'Open the text file again before looping . . .
If HangMode = True Then
Set objTextFile = objFileSystem.OpenTextFile(HangDir & "\Process_List.txt",ForReading,TristateUseDefault)
Else
Set objTextFile = objFileSystem.OpenTextFile(CrashDir & "\Process_List.txt",ForReading,TristateUseDefault)
End If
Wend
If IISMode = False then
If HangMode = true and QuickMode = true Then
Wscript.Echo "The '-quick' switch was used, AutodumpPlus is running in 'quick hang' mode."
ElseIf HangMode = true Then
Wscript.echo "The '-hang' switch was used, AutodumpPlus is running in 'hang' mode."
End If
If CrashMode = true Then
Wscript.Echo "The '-crash' switch was used, AutodumpPlus is running in 'crash' mode."
End If
If QuietMode = true Then
Wscript.Echo "The '-quiet' switch was used, AutodumpPlus will not display any modal dialog boxes."
End If
If OSwitchUsed = true Then
Wscript.Echo "The '-o' switch was used. AutodumpPlus will place all files in"
Wscript.echo "the following directory: " & OutputDir
End If
If NotifyAdmin = true Then
Wscript.Echo "The '-notify' switch was used. AutodumpPlus will send notification to"
Wscript.echo "the following computer or user: " & NotifyTarget
End If
End If
If GenericModePID = True Then
PidArgItems = GenericProcessPIDDictionary.Items
PidArgItemsCount = GenericProcessPIDDictionary.Count
If DEBUGGING = TRUE Then
wscript.echo "In DumpAnyProc, in the function to get the process name, given the '-p' switch."
wscript.echo ""
End If
For i = 0 to PidArgItemsCount -1
If HangMode = True Then
Set objTextFile = objFileSystem.OpenTextFile(HangDir & "\Process_List.txt",ForReading,TristateUseDefault)
Else
Set objTextFile = objFileSystem.OpenTextFile(CrashDir & "\Process_List.txt",ForReading,TristateUseDefault)
End If
While not objTextFile.AtEndofStream
str = objTextFile.ReadLine
Str = LTrim(Str)
arResults= split(Str," ",-1,1)
arResults(1)=trim(arResults(1))
arResults(1)=Replace(arResults(1),"/",",")
arResults(1)=Replace(arResults(1),"\",",")
arResults(1)=Replace(arResults(1),"<","(")
arResults(1)=Replace(arResults(1),">",")")
arResults(1)=Replace(arResults(1),":","")
arResults(1)=Replace(arResults(1),"*","")
arResults(1)=Replace(arResults(1),"?","")
arResults(1)=Replace(arResults(1),"|","")
If Trim(arResults(0)) = PidArgItems(i) Then
PidMatch = True
strProcName = Trim(arResults(1))
If DEBUGGING = TRUE Then
wscript.echo "In DumpAnyProc(), Logging debug info for: Process - " & strProcName & " with PID - " & PidArgItems(i)
wscript.echo ""
End If
End If
Wend
If CrashMode = True Then
strShell= ShortInstallDir & "\cdb.exe -sfce -p " & PidArgItems(i) & " -c $<" & Chr(34) & CreateCDBScript(PidArgItems(i), strProcName) & Chr(34)
If DEBUGGING = TRUE Then
wscript.echo "In DumpAnyProc(), running in CrashMode, strShell = " & strShell
wscript.echo ""
End If
Else
strShell= ShortInstallDir & "\cdb.exe -sfce -pv -p " & PidArgItems(i) & " -c $<" & Chr(34) & CreateCDBScript(PidArgItems(i), strProcName) & Chr(34)
If DEBUGGING = TRUE Then
wscript.echo "In DumpAnyProc(), running in Hang or Quick mode, strShell = " & strShell
wscript.echo ""
End If
End If
If PidMatch = True Then
If FirstCall = True Then
If CrashMode = True Then
Wscript.echo ""
Wscript.echo "Monitoring the processes that were specified"
Wscript.echo "on the command line for unhandled exceptions."
Wscript.echo "----------------------------------------------------------------------"
ElseIf QuickMode = True Then
Wscript.echo ""
Wscript.echo "Logging debug info for the processes that were"
Wscript.echo "specified on the command line."
Wscript.echo "----------------------------------------------------------------------"
Else
Wscript.echo ""
Wscript.echo "Dumping process information for the processes"
Wscript.echo "that were specified on the command line."
Wscript.echo "----------------------------------------------------------------------"
End If
End If
FirstCall = False
If CrashMode = True Then
wscript.echo "Attaching the CDB debugger to: Process - " & strProcName & " with PID - " & PidArgItems(i)
ElseIf QuickMode = True Then
wscript.echo "Logging debug info for: Process - " & strProcName & " with PID - " & PidArgItems(i)
Else
wscript.echo "Dumping Process: " & strProcName & " with PID - " & PidArgItems(i)
End If
'Now run the debugger . . .
If PackageCount < MAX_APPLICATIONS_TO_DEBUG Then
objShell.Run strShell,MINIMIZE_NOACTIVATE,FALSE
Else
wscript.echo "MAX_APPLICATIONS_TO_DEBUG has been exceeded, skipping the above process . . ."
End If
PackageCount = PackageCount + 1
Else
If QuietMode = False Then
objShell.PopUp "One or more process ID's specified on the command line using the '-p' switch, were not found. Please doublecheck the process ID(s) and run AutodumpPlus again.",,"AutodumpPlus",0
ErrorsDuringRuntime = True
Else
objShell.LogEvent 1, "One or more process ID's specified on the command line using the '-p' switch, were not found. Please doublecheck the process ID(s) and run AutodumpPlus again."
wscript.echo "One or more process ID's specified on the command line using the '-p' switch, were not found. Please doublecheck the process ID(s) and run AutodumpPlus again."
ErrorsDuringRuntime = True
End If
objTextFile.Close
If HangMode = True Then
DeleteDirectory(HangDir)
Else
DeleteDirectory(CrashDir)
End If
Wscript.quit 1
End If
Next
End If
If GenericModeProcessName = true Then
ProcArgItems = GenericProcessNameDictionary.Items 'Store the GenericProcessNameDictionary items collection in an array
ProcArgItemsCount = GenericProcessNameDictionary.Count 'Get the count of all the items in the array
If DEBUGGING = TRUE Then
Wscript.echo "In DumpAnyProc, in the function to get the process ID, given the '-pn' switch."
Wscript.echo ""
End If
For i = 0 to ProcArgItemsCount -1
x = 0
If HangMode = True Then
Set objTextFile = objFileSystem.OpenTextFile(HangDir & "\Process_List.txt",ForReading,TristateUseDefault)
Else
Set objTextFile = objFileSystem.OpenTextFile(CrashDir & "\Process_List.txt",ForReading,TristateUseDefault)
End If
While not objTextFile.AtEndofStream
str = objTextFile.ReadLine
Str = LTrim(Str)
arResults= split(Str," ",-1,1)
arResults(1)=trim(arResults(1))
arResults(1)=Replace(arResults(1),"/",",")
arResults(1)=Replace(arResults(1),"\",",")
arResults(1)=Replace(arResults(1),"<","(")
arResults(1)=Replace(arResults(1),">",")")
arResults(1)=Replace(arResults(1),":","")
arResults(1)=Replace(arResults(1),"*","")
arResults(1)=Replace(arResults(1),"?","")
arResults(1)=Replace(arResults(1),"|","")
If UCase(arResults(1)) = UCase(ProcArgItems(i)) Then
ProcessMatch = True
x = x + 1
End If
Wend
objTextFile.Close
'If the process name specified is invalid, display an error and then quit.
If ProcessMatch = False Then
If QuietMode = False Then
objShell.PopUp "One or more process names specified on the command line using the '-pn' switch, were not found. Please doublecheck the process name(s) and run AutodumpPlus again.",,"AutodumpPlus",0
ErrorsDuringRuntime = True
Else
objShell.LogEvent 1, "One or more process names specified on the command line using the '-pn' switch, were not found. Please doublecheck the process name(s) and run AutodumpPlus again."
wscript.echo "One or more process names specified on the command line using the '-pn' switch, were not found. Please doublecheck the process name(s) and run AutodumpPlus again."
ErrorsDuringRuntime = True
End If
'If there was nothing to dump or log, then display an error and clean up the directory
If IISMode = False Then
If HangMode = True Then
'Wscript.echo HangDir
DeleteDirectory(HangDir)
Else
'Wscript.echo CrashDir
DeleteDirectory(CrashDir)
End If
Wscript.quit 1
End If
End If
ReDim ProcNamePidArray(x)
x = 0
If HangMode = True Then
Set objTextFile = objFileSystem.OpenTextFile(HangDir & "\Process_List.txt",ForReading,TristateUseDefault)
Else
Set objTextFile = objFileSystem.OpenTextFile(CrashDir & "\Process_List.txt",ForReading,TristateUseDefault)
End If
If DEBUGGING = TRUE Then
wscript.echo "In DumpAnyProc, in GenericModeProcessName function."
wscript.echo ""
End If
If objTextFile.AtEndOfStream Then
wscript.echo "objTextFile is at EndOfStream"
wscript.echo ""
End If
While not objTextFile.AtEndofStream
str = objTextFile.ReadLine
Str = LTrim(Str)
arResults= split(Str," ",-1,1)
arResults(1)=trim(arResults(1))
arResults(1)=Replace(arResults(1)," ",",")
If UCase(arResults(1)) = UCase(ProcArgItems(i)) Then
ProcNamePidArray(x) = Trim(arResults(0))
If DEBUGGING = TRUE Then
wscript.echo "In DumpAnyProc(), ProcNamePidArray(x) = " & ProcNamePidArray(x)
wscript.echo ""
End If
x = x + 1
End If
Wend
If DEBUGGING = TRUE Then
wscript.echo "In DumpAnyProc(), Total number of CDB sessions to launch: " & UBound(ProcNamePidArray, 1)
wscript.echo ""
End If
For y = 0 to UBound(ProcNamePidArray, 1) - 1 'The For . . . Each syntax seemed to have an extra, empty array element which was causing problems
If DEBUGGING = True Then
Wscript.echo ""
Wscript.echo "In the DumpAnyProc(), PID = " & ProcNamePidArray(y)
End If
If CrashMode = true Then
strShell= ShortInstallDir & "\cdb.exe -sfce -p " & ProcNamePidArray(y) & " -c $<" & Chr(34) & CreateCDBScript(ProcNamePidArray(y), Trim(UCase(ProcArgItems(i)))) & Chr(34)
If DEBUGGING = True Then
Wscript.echo "In the DumpAnyProc(), strShell = " & strShell
Wscript.echo ""
End If
Else
strShell= ShortInstallDir & "\cdb.exe -sfce -pv -p " & ProcNamePidArray(y) & " -c $<" & Chr(34) & CreateCDBScript(ProcNamePidArray(y), Trim(UCase(ProcArgItems(i)))) & Chr(34)
If DEBUGGING = True Then
Wscript.echo "In the DumpAnyProc(), strShell = " & strShell
Wscript.echo ""
End If
End If
If FirstCall = True Then
If CrashMode = True Then
Wscript.echo ""
Wscript.echo "Monitoring the processes that were specified on the command line"
Wscript.echo "for unhandled exceptions."
Wscript.echo "----------------------------------------------------------------------"
ElseIf QuickMode = True Then
Wscript.echo ""
Wscript.echo "Logging debug info for the processes that were specified on the command line."
Wscript.echo "----------------------------------------------------------------------"
Else
Wscript.echo ""
Wscript.echo "Dumping process information for the processes that were specified"
Wscript.echo "on the command line."
Wscript.echo "----------------------------------------------------------------------"
End If
End If
FirstCall = False
If CrashMode = true Then
wscript.echo "Attaching the CDB debugger to: Process - " & Trim(UCase(ProcArgItems(i))) & " with PID - " & ProcNamePidArray(y)
ElseIf QuickMode = true Then
wscript.echo "Logging debug info for: Process - " & Trim(UCase(ProcArgItems(i))) & " with PID - " & ProcNamePidArray(y)
Else
wscript.echo "Dumping Process: " & Trim(UCase(ProcArgItems(i))) & " with PID - " & ProcNamePidArray(y)
End If
If PackageCount < MAX_APPLICATIONS_TO_DEBUG Then
objShell.Run strShell,MINIMIZE_NOACTIVATE,FALSE
Else
wscript.echo "MAX_APPLICATIONS_TO_DEBUG has been exceeded, skipping the above process . . ."
End If
PackageCount = PackageCount + 1
' objShell.Run strShell,MINIMIZE_NOACTIVATE,FALSE
Next
Next
End If
End Sub
'---------------------------------------------------------------------------------------------
' Function: ShowStatus
' This is the code used to display the pop-up summary at the end of AutodumpPlus.
'---------------------------------------------------------------------------------------------
Sub ShowStatus(OSVersion)
On Error Resume Next
If DEBUGGING = TRUE Then
Wscript.echo ""
Wscript.echo "-----------------------------------"
Wscript.echo "In the ShowStatus() function . . ."
Wscript.echo "-----------------------------------"
Wscript.echo ""
End If
Dim objFileSystem
Dim versionFile
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
If PackageCount = 1 Then
If QuickMode = true Then
If OSVersion = "4.0" Then
If QuietMode = False Then
objshell.popup "AutodumpPlus is now running in 'quick' mode and is logging information for all of the threads in the process you have chosen to examine. Quick mode is usually faster than 'hang' mode, however you may still see " & PackageCount & " minimized command shell window which is logging information about this process. AutodumpPlus is finished running when this window disappears. After AutodumpPlus completes, please check the " & HangDir & " directory to verify the log file for this process was created!",,"AutodumpPlus",0
Else
objShell.LogEvent 0, "AutodumpPlus is now running in 'quick' mode with the '-quiet' switch, and was started at: " & DateTimeStamp & "."
End If
Else
If QuietMode = False Then
objshell.popup "AutodumpPlus is now running in 'quick' mode and is logging information for all of the threads in the process you have chosen to examine. Quick mode is usually faster than 'hang' mode, however you may still see " & PackageCount & " minimized command shell window which is logging information about this process. AutodumpPlus is finished running when this window disappears. After AutodumpPlus completes, please check the " & HangDir & " directory to verify the log file for this process was created!",,"AutodumpPlus",0
Else
objShell.LogEvent 0, "AutodumpPlus is now running in 'quick' mode with the '-quiet' switch, and was started at: " & DateTimeStamp & "."
End If
End If
ElseIf CrashMode = True Then
If OSVersion = "4.0" Then
If QuietMode = False Then
objshell.popup "AutodumpPlus is now running in 'crash' mode and has attached the CDB debugger to the process you have chosen to monitor for crashes. You should see " & PackageCount & " minimized debugger window which is monitoring this process for any exceptions. A log file will be generated for the process you have chosen to monitor and when a 1st chance exception occurs, it will be logged to this log file and a mini-memory dump will be produced. If a 2nd chance exception occurs, it will be logged to this log file and a full memory dump will be produced. AutodumpPlus has probably captured a crash if and when the minimized debugger window disappears. If the process hangs while running in crash mode, or if you wish to stop debugging the process, please press CTRL-C in the minimized debugger window to stop debugging, and then re-start the process if necessary. After AutodumpPlus completes, please check the " & CrashDir & " directory to verify log files and possibly memory dump files for this process were created!",,"AutodumpPlus",0
Else
objShell.LogEvent 0, "AutodumpPlus is now running in 'crash' mode with the '-quiet' switch, and was started at: " & DateTimeStamp & "."
End If
Else
If QuietMode = False Then
objshell.popup "AutodumpPlus is now running in 'crash' mode and has attached the CDB debugger to the process you have chosen to monitor for crashes. You should see " & PackageCount & " minimized debugger window which is monitoring this process for any exceptions. A log file will be generated for the process you have chosen to monitor and when a 1st chance exception occurs, it will be logged to this log file and a mini-memory dump will be produced. If a 2nd chance exception occurs, it will be logged to this log file and a full memory dump will be produced. AutodumpPlus has probably captured a crash if and when the minimized debugger window disappears. If the process hangs while running in crash mode, or if you wish to stop debugging the process, please press CTRL-C in the minimized debugger window to stop debugging, and then re-start the process if necessary. After AutodumpPlus completes, please check the " & CrashDir & " directory to verify log files and possibly memory dump files for this process were created!",,"AutodumpPlus",0
Else
objShell.LogEvent 0, "AutodumpPlus is now running in 'crash' mode with the '-quiet' switch, and was started at: " & DateTimeStamp & "."
End If
End If
Else
If OSVersion = "4.0" Then
If QuietMode = False Then
objshell.popup "AutodumpPlus is now dumping the process you have chosen to examine. Depending upon the size of the process being dumped, AutodumpPlus could take anywhere from a few seconds to a few minutes to complete. You should see " & PackageCount & " minimized command shell window which is dumping the process. AutodumpPlus is finished when this window disappears. After AutodumpPlus completes, please check the " & HangDir & " directory to verify the memory dump was created!",,"AutodumpPlus",0
Else
objShell.LogEvent 0, "AutodumpPlus is now running in 'hang' mode with the '-quiet' switch, and was started at: " & DateTimeStamp & "."
End If
Else
If QuietMode = False Then
objshell.popup "AutodumpPlus is now dumping the process you have chosen to examine. Depending upon the size of the process being dumped, AutodumpPlus could take anywhere from a few seconds to a few minutes to complete. You should see " & PackageCount & " minimized command shell window which is dumping the process. AutodumpPlus is finished when this window disappears. After AutodumpPlus completes, please check the " & HangDir & " directory to verify the memory dump was created!",,"AutodumpPlus",0
Else
objShell.LogEvent 0, "AutodumpPlus is now running in 'hang' mode with the '-quiet' switch, and was started at: " & DateTimeStamp & "."
End If
End If
End If
ElseIf PackageCount > 0 Then
If QuickMode = true Then
If OSVersion = "4.0" Then
If QuietMode = False Then
objshell.popup "AutodumpPlus is now running in 'quick' mode and is logging information for all of the threads in the processes you have chosen to examine. Quick mode is usually faster than 'hang' mode, however you may still see at least " & PackageCount & " minimized command shell windows which are logging information about these processes. AutodumpPlus is finished running when these windows disappear. After AutodumpPlus completes, please check the " & HangDir & " directory to verify the log files for each process were created!",,"AutodumpPlus",0
Else
objShell.LogEvent 0, "AutodumpPlus is now running in 'quick' mode with the '-quiet' switch, and was started at: " & DateTimeStamp & "."
End If
Else
If QuietMode = False Then
objshell.popup "AutodumpPlus is now running in 'quick' mode and is logging information for all of the threads in the processes you have chosen to examine. Quick mode is usually faster than 'hang' mode, however you may still see at least " & PackageCount & " minimized command shell windows which are logging information about these processes. AutodumpPlus is finished running when these windows disappear. After AutodumpPlus completes, please check the " & HangDir & " directory to verify the log files for each process were created!",,"AutodumpPlus",0
Else
objShell.LogEvent 0, "AutodumpPlus is now running in 'quick' mode with the '-quiet' switch, and was started at: " & DateTimeStamp & "."
End If
End If
ElseIf CrashMode = true Then
If OSVersion = "4.0" Then
If QuietMode = False Then
objshell.popup "AutodumpPlus is now running in 'crash' mode and has attached the CDB debugger to the processes you have chosen to monitor for crashes. You should see " & PackageCount & " minimized debugger windows which are monitoring these processes for any exceptions. A log file will be generated for each process you have chosen to monitor and when a 1st chance exception occurs, it will be logged to this log file and a mini-memory dump will be produced. If a 2nd chance exception occurs, it will be logged to this log file and a full memory dump will be produced. AutodumpPlus has probably captured a crash if and when any of these minimized debugger windows disappear. If any of these processes hang while running in crash mode, or if you wish to stop debugging a process that has not crashed, please press CTRL-C in ALL minimized debugger windows to stop debugging, and then re-start the processes if necessary. After AutodumpPlus completes, please check the " & CrashDir & " directory to verify log files and possibly memory dump files for these processes were created!",,"AutodumpPlus",0
Else
objShell.LogEvent 0, "AutodumpPlus is now running in 'crash' mode with the '-quiet' switch, and was started at: " & DateTimeStamp & "."
End If
Else
If QuietMode = False Then
objshell.popup "AutodumpPlus is now running in 'crash' mode and has attached the CDB debugger to the processes you have chosen to monitor for crashes. You should see " & PackageCount & " minimized debugger windows which are monitoring these processes for any exceptions. A log file will be generated for each process you have chosen to monitor and when a 1st chance exception occurs, it will be logged to this log file and a mini-memory dump will be produced. If a 2nd chance exception occurs, it will be logged to this log file and a full memory dump will be produced. AutodumpPlus has probably captured a crash if and when any of these minimized debugger windows disappear. If any of these processes hang while running in crash mode, or if you wish to stop debugging a process that has not crashed, please press CTRL-C in ALL minimized debugger windows to stop debugging, and then re-start the processes if necessary. After AutodumpPlus completes, please check the " & CrashDir & " directory to verify log files and possibly memory dump files for these processes were created!",,"AutodumpPlus",0
Else
objShell.LogEvent 0, "AutodumpPlus is now running in 'crash' mode with the '-quiet' switch, and was started at: " & DateTimeStamp & "."
End If
End If
Else
If OSVersion = "4.0" Then
If QuietMode = False Then
objshell.popup "AutodumpPlus is now dumping the processes you have chosen to examine. Depending upon the number of processes being dumped, AutodumpPlus could take anywhere from a few seconds to a few minutes to complete. You should see at least " & PackageCount & " minimized command shell windows which are dumping processes. AutodumpPlus is finished dumping processes when these windows disappear. After AutodumpPlus completes, please check the " & HangDir & " directory to verify the memory dumps were created!",,"AutodumpPlus",0
Else
objShell.LogEvent 0, "AutodumpPlus is now running in 'hang' mode with the '-quiet' switch, and was started at: " & DateTimeStamp & "."
End If
Else
If QuietMode = False Then
objshell.popup "AutodumpPlus is now dumping the processes you have chosen to examine. Depending upon the number of processes being dumped, AutodumpPlus could take anywhere from a few seconds to a few minutes to complete. You should see at least " & PackageCount & " minimized command shell windows which are dumping processes. AutodumpPlus is finished dumping processes when these windows disappear. After AutodumpPlus completes, please check the " & HangDir & " directory to verify the memory dumps were created!",,"AutodumpPlus",0
Else
objShell.LogEvent 0, "AutodumpPlus is now running in 'hang' mode with the '-quiet' switch, and was started at: " & DateTimeStamp & "."
End If
End If
End If
Else
'There were no processes to dump based on the specified command line criteria, display an error and quit.
If QuietMode = False Then
objshell.popup "There were no processes found to examine based on the parameters specified on the command line. If the '-iis' switch was used, please ensure that IIS is running. If the '-pn' or '-p' switches were used, please ensure you typed the process name correctly or that you specified the right Process ID.",,"AutodumpPlus",0
Else
wscript.echo "There were no processes found to examine based on the parameters specified on the command line. If the '-iis' switch was used, please ensure that IIS is running. If the '-pn' or '-p' switches were used, please ensure you typed the process name correctly or that you specified the right Process ID."
objShell.LogEvent 0, "There were no processes found to examine based on the parameters specified on the command line. If the '-iis' switch was used, please ensure that IIS is running. If the '-pn' or '-p' switches were used, please ensure you typed the process name correctly or that you specified the right Process ID."
End If
'Clean up the directory since no output was produced.
If Crashmode = true Then
DeleteDirectory(CrashDir)
Else
DeleteDirectory(HangDir)
End If
Wscript.quit 1
End If
If CrashMode = true Then
err.clear
Set versionFile = objFileSystem.CreateTextFile(CrashDir & "\AutodumpPlus-report.txt",True)
If Err.number <> 0 Then
wscript.echo "Error encountered creating AutodumpPlus-report.txt"
wscript.echo "Error Description: " & err.description
wscript.echo "Error Number: " & err.number
End If
Else
err.clear
Set versionFile = objFileSystem.CreateTextFile(HangDir & "\AutodumpPlus-report.txt",True)
If Err.number <> 0 Then
wscript.echo "Error encountered creating AutodumpPlus-report.txt"
wscript.echo "Error Description: " & err.description
wscript.echo "Error Number: " & err.number
End If
End If
If DEBUGGING = TRUE Then
wscript.echo "In ShowStatus(), about to create AutodumpPlus-report.txt"
wscript.echo ""
End If
versionFile.writeline "'********************************************************************"
versionFile.writeline "'* File: AutodumpPlus-report.txt"
versionFile.writeline "'* AutodumpPlus version: " & VERSION
versionFile.writeline "'* Debuggers Installation Directory: " & InstallDir
versionFile.writeline "'* AutodumpPlus was run on: " & ComputerName
If HangMode = True Then
versionFile.writeline "'* Output Directory: " & HangDir
Else
versionFile.writeline "'* Output Directory: " & CrashDir
End If
If OSVer = "4.0" Then
versionFile.writeline "'* AutodumpPlus was run on NT 4.0."
Else
versionFile.writeline "'* AutodumpPlus was run on Windows 2000 or higher."
End If
If HangMode = True Then
versionFile.writeline "'* AutodumpPlus was run with the '-hang' switch."
End If
If QuickMode = true Then
versionFile.writeline "'* AutodumpPlus was run with the '-quick' switch."
End If
If CrashMode = true Then
versionFile.writeline "'* AutodumpPlus was run with the '-crash' switch."
End If
If PageHeapMode = true Then
versionFile.writeline "'* AutodumpPlus was run with the '-pageheap' switch."
End If
If QuietMode = true Then
versionFile.writeline "'* AutodumpPlus was run with the '-quiet' switch."
End If
If IISMode = True Then
versionFile.writeline "'* AutodumpPlus was run with the '-IIS' switch."
versionFile.writeline "'* IIS version: " & IISVer
End If
versionFile.writeline "'*"
versionFile.writeline "'* AutodumpPlus's constants had the following values:"
versionFile.writeline "'* DEBUGGING = " & DEBUGGING
versionFile.writeline "'* Full_Dump_on_CONTRL_C = " & Full_Dump_on_CONTRL_C
versionFile.writeline "'* Create_Full_Dump_on_1st_Chance_Exception = " & Create_Full_Dump_on_1st_Chance_Exception
versionFile.writeline "'* No_Dump_on_1st_Chance_Exception = " & No_Dump_on_1st_Chance_Exception
versionFile.writeline "'* Dump_on_EH_Exceptions = " & Dump_on_EH_Exceptions
versionFile.writeline "'* Dump_on_Unknown_Exceptions = " & Dump_on_Unknown_Exceptions
versionFile.writeline "'* Dump_Stack_on_DLL_Load = " & Dump_Stack_on_DLL_Load
versionFile.writeline "'* Dump_Stack_on_DLL_UnLoad = " & Dump_Stack_on_DLL_UnLoad
versionFile.writeline "'* No_CrashMode_Log = " & No_CrashMode_Log
versionFile.writeline "'* No_Free_Space_Checking = " & No_Free_Space_Checking
versionFile.writeline "'* "
versionFile.writeline "'* Date & Time AutodumpPlus was run: " & Now
If ErrorsDuringRuntime = True Then
versionFile.writeline "Error and warning information:"
versionFile.writeline "AutodumpPlus encountered one or more errors or warnings. Please check the event log for more information."
End If
If SymPathError = True Then
versionFile.writeline "'* WARNING! An '_NT_SYMBOL_PATH' environment variable is not set, as a result AutodumpPlus will be forced to use 'export' symbols (if present) to resolve function names in the stack trace information for each thread listed in the log file for the processes being debugged. To resolve this warning, please copy the appropriate symbols to a directory on the server and then create an environment variable with a name of '_NT_SYMBOL_PATH' and a value containing the path to the proper symbols (i.e. c:\winnt\symbols) before running AutodumpPlus in quick or crash modes again. NOTE: After creating the '_NT_SYMBOL_PATH' system environment variable you will need to close the current command shell and open a new one before running AutodumpPlus again."
End If
versionFile.writeline "'********************************************************************"
versionFile.close
End Sub
'---------------------------------------------------------------------------------------------
' Function: PrintHelp
' This is the code used to display the verbose help information.
'---------------------------------------------------------------------------------------------
Sub PrintHelp()
On Error Resume Next
If DEBUGGING = TRUE Then
Wscript.echo ""
Wscript.echo "-----------------------------------"
Wscript.echo "In the PrintHelp() function . . ."
Wscript.echo "-----------------------------------"
Wscript.echo ""
End If
Wscript.Echo "--------------------------------------------------------------------------------"
Wscript.Echo "AutodumpPlus Version " & VERSION
Wscript.Echo ""
Wscript.Echo "Purpose:"
Wscript.Echo "AutodumpPlus automatically generates memory dumps or log files containing"
Wscript.Echo "scripted debug output usefull for troubleshooting N-tier WinDNA / .Net"
Wscript.Echo "applications."
Wscript.Echo ""
Wscript.Echo "Since WinDNA / .Net applications often encompass multiple, interdependent"
Wscript.Echo "processes on one or more machines, when troubleshooting an 'application' hang"
Wscript.Echo "or crash it is often necessary to 'look' at all of the processes at the"
Wscript.Echo "same time. AutodumpPlus allows you to profile an application that is hanging"
Wscript.Echo "by taking 'snapshots' (memory dumps, or debug log files) of that application"
Wscript.Echo "and all of it's processes, all at the same time. Multiple 'snapshots' can"
Wscript.Echo "then be compared or analyzed to build a history or profile of an application"
Wscript.Echo "over time."
Wscript.Echo ""
Wscript.Echo "In addition to taking 'snapshots' of hung/non-responsive WinDNA / .Net "
Wscript.Echo "applications, AutodumpPlus can be used to troubleshoot applications that are"
Wscript.Echo "crashing or throwing unhandled exceptions which can lead to a crash."
Wscript.Echo ""
Wscript.Echo "Usage:"
Wscript.Echo "AutodumpPlus has 3 modes of operation: 'Hang', 'Quick' and 'Crash' mode."
Wscript.Echo ""
Wscript.Echo "In 'Hang' mode, AutodumpPlus assumes that a process is hung and it will attach"
Wscript.Echo "a debugger to the process(s) specified on the command line with either the '-p'"
Wscript.Echo "or '-pn' or '-iis' switches. After the debugger is attached to the process(s)"
Wscript.Echo "AutodumpPlus will dump the memory of each process to a .dmp file for later"
Wscript.Echo "analysis with a debugger (such as WinDBG). In this mode, processes are paused"
Wscript.Echo "briefly while their memory is being dumped to a file and then resumed."
Wscript.Echo ""
Wscript.Echo "In 'Quick' mode AutodumpPlus assumes that a process is hung and it will attach"
Wscript.ECho "a debugger to the process(s) specified on the command line with either the '-p'"
Wscript.Echo "or '-pn' or '-iis' switches. After the debugger is attached to the process(s)"
Wscript.ECho "AutodumpPlus will create text files for each process, containing commonly"
Wscript.Echo "requested debug information, rather than dumping the entire memory for each"
Wscript.Echo " process. 'Quick' mode is generally faster than 'Hang' mode, but requires"
Wscript.Echo "symbols to be installed on the server where AutodumpPlus is running."
Wscript.Echo ""
Wscript.Echo "In 'Crash' mode, AutodumpPlus assumes that a process will crash and it will"
Wscript.ECho "attach a debugger to the process(s) specified on the command line with either"
Wscript.Echo "the '-p' or '-pn' or '-iis' switches. After the debugger is attached to the"
Wscript.Echo "process(s) AutodumpPlus will configure the debugger to log 'first chance'"
Wscript.Echo "exceptions to a text file. When a 'second chance' exception occurs"
Wscript.Echo "the processes memory is dumped to a .dmp file for analysis"
Wscript.Echo "with a debugger such as WinDBG. In this mode, a debugger remains attached to"
Wscript.Echo "the process(s) until the process exits or the debugger is exited by pressing"
Wscript.Echo "CTRL-C in the minimized debugger window. When the process crashes, or CTRL-C"
Wscript.Echo "is pressed it will need to be re-started."
Wscript.Echo ""
Wscript.Echo "The '-pageheap' switch is only valid in 'crash' mode and should only be used"
Wscript.Echo "when Pageheap.exe or GFlags.exe has been used to turn on NTDLL's heap"
Wscript.Echo "debugging options for a specific process, for the purpose of troubleshooting"
Wscript.Echo "heap corruption issues."
Wscript.Echo "This switch causes AutodumpPlus to produce a full memory dump when a "
Wscript.Echo "'debug break' exception is thrown. After the memory dumps is produced, "
Wscript.Echo "AutodumpPlus exits the debugger which kills the process being monitored."
Wscript.Echo "These exceptions can be thrown by DLL's that were compiled in debug mode,"
Wscript.Echo "or if the process being monitored is running with pageheap options enabled."
Wscript.Echo ""
Wscript.Echo "The '-quiet' switch can be used to suppress all modal dialog boxes that"
Wscript.Echo "AutodumpPlus displays. This is usefull if you are running AutodumpPlus"
Wscript.Echo "inside of a remot command shell. When this switch is used, AutodumpPlus"
Wscript.Echo "will log information to the event log rather than popping up dialog boxes"
Wscript.Echo "to the local desktop. Logging to the event log requires Windows Scripting"
Wscript.Echo "version 5.5 or later."
Wscript.Echo ""
Wscript.Echo "The '-o' switch can be used to supply an output directory for AutodumpPlus."
Wscript.Echo "AutodumpPlus will place all log files and memory dumps in the supplied"
Wscript.Echo "directory. Long file names should be placed inside of double quotes and"
Wscript.Echo "UNC paths are supported."
Wscript.Echo ""
Wscript.Echo "The '-notify' switch can be used to supply computer name for AutodumpPlus."
Wscript.Echo "to notify (via NET SEND) when a debugger is finished running."
Wscript.Echo "A username can be specified but supplying a computer name to notify"
Wscript.Echo "is generally more reliable."
Wscript.Echo ""
Call PrintUsage()
Wscript.quit 1
End Sub
'---------------------------------------------------------------------------------------------
' Function: PrintUsage
' This is the code used to print the usage information.
'---------------------------------------------------------------------------------------------
Sub PrintUsage()
On Error Resume Next
If DEBUGGING = TRUE Then
Wscript.echo ""
Wscript.echo "-----------------------------------"
Wscript.echo "In the PrintUsage() function . . ."
Wscript.echo "-----------------------------------"
Wscript.echo ""
End If
Wscript.Echo "AutodumpPlus " & VERSION & " Usage Information"
Wscript.Echo "Switches: '-hang', '-quick', '-crash', '-iis', '-p <PID>', '-pn <Process Name>"
Wscript.echo " '-pageheap', '-quiet', '-o <output directory>, '-notify <target>"
Wscript.Echo ""
Wscript.Echo "Required: ('-hang', or '-quick', or '-crash') AND ('-iis' or '-p' or '-pn')"
Wscript.Echo ""
Wscript.Echo "Optional: '-pageheap', '-quiet', '-o <outputdir>', '-notify <computer>'"
Wscript.Echo ""
Wscript.Echo "Examples: 'ADPlus -hang -iis', Produces memory dumps of IIS and all "
Wscript.Echo " MTS/COM+ packages currently running."
Wscript.ECho ""
Wscript.Echo " 'ADPlus -crash -p 1896', Attaches the debugger to process with PID"
Wscript.Echo " 1896, and monitors it for 1st and 2nd"
Wscript.Echo " chance access violations (crashes)."
Wscript.Echo ""
Wscript.Echo " 'ADPlus -quick -pn mmc.exe', Attaches the debugger to all instances"
Wscript.Echo " of MMC.EXE and dumps debug information"
Wscript.Echo " about these processes to a text file."
Wscript.Echo ""
Wscript.Echo " 'ADPlus -?' or 'ADPlus -help': Displays detailed help."
Wscript.Echo "-------------------------------------------------------------------------------"
Wscript.Echo "For more information on using AutodumpPlus, please refer to the following KB:"
Wscript.Echo "http://support.microsoft.com/support/kb/articles/q286/3/50.asp"
Wscript.quit 1
End Sub
'---------------------------------------------------------------------------------------------
' Function: FileExists
' This is the code used to verify if a file exists.
'
'---------------------------------------------------------------------------------------------
Function FileExists(strFile )
On Error Resume Next
If DEBUGGING = TRUE Then
Wscript.echo ""
Wscript.echo "-----------------------------------"
Wscript.echo "In the FileExists() function . . ."
Wscript.echo "-----------------------------------"
Wscript.echo ""
End If
FileExists = true
Dim objFileSystem
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
FileExists = objFileSystem.FileExists(strFile)
set objFileSystem = nothing
End Function
'---------------------------------------------------------------------------------------------
' Function: CreateDirectory()
' This is the code used to create a directory on the file system or the network
' It checks to make sure you have proper permissions and displays/logs an error
' if you don't.
'---------------------------------------------------------------------------------------------
Sub CreateDirectory(strDirectory)
On Error Resume Next
Err.clear
Dim objFileSystem
Dim oFile
set objFileSystem = CreateObject("Scripting.FileSystemObject")
Set oFile = objFileSystem.CreateFolder(strDirectory)
If DEBUGGING = TRUE Then
Wscript.echo ""
Wscript.echo "-----------------------------------"
Wscript.echo "In the CreateDirectory() function . . ."
Wscript.echo "-----------------------------------"
Wscript.echo ""
End If
If err.number = -2147024784 Then 'The disk is full!
If DEBUGGING = TRUE Then
wscript.echo "In CreateDirectory(), Could not create the directory, the error number was: " & err.number & " and the error description was " & err.description
wscript.echo ""
End If
If QuietMode = False Then
objshell.popup "Could not create the " & strDirectory & " directory because the drive is full. Please free up some disk space and try running AutodumpPlus again!",,"AutodumpPlus",0
objShell.LogEvent 1, "Could not create the " & strDirectory & " directory because the drive is full. Please free up some disk space and try running AutodumpPlus again!"
Else
objShell.LogEvent 1, "Could not create the " & strDirectory & " directory because the drive is full. Please free up some disk space and try running AutodumpPlus again!"
wscript.echo "Could not create the " & strDirectory & " directory because the drive is full. Please free up some disk space and try running AutodumpPlus again!"
ErrorsDuringRuntime = True
End If
Wscript.Quit 1
ElseIf err.number = 76 Then 'Specified a subdirectory below a share that does not exist or path with more than one subdirectory that does not exist!
If DEBUGGING = TRUE Then
wscript.echo "In CreateDirectory(), Could not create the directory, the error number was: " & err.number
wscript.echo "In CreateDirectory(), the error description was " & err.description
End If
If QuietMode = False Then
objshell.popup "Could not create the " & strDirectory & " directory. If you are using the '-o' switch and specifying a UNC path, please ensure that the share and any sub-directories below the share you specified actually exist!",,"AutodumpPlus",0
objShell.LogEvent 1, "Could not create the " & strDirectory & " directory. If you are using the '-o' switch and specifying a UNC path, please ensure that the share and any sub-directories below the share you specified actually exist!"
Else
objShell.LogEvent 1, "Could not create the " & strDirectory & " directory. If you are using the '-o' switch and specifying a UNC path, please ensure that the share and any sub-directories below the share you specified actually exist!"
wscript.echo "Could not create the " & strDirectory & " directory. If you are using the '-o' switch and specifying a UNC path, please ensure that the share and any sub-directories below the share you specified actually exist!"
ErrorsDuringRuntime = True
End If
Wscript.quit 1
ElseIf err.number = 52 Then 'The share does not exist or can not connect to the UNC path.
If DEBUGGING = TRUE Then
wscript.echo "In CreateDirectory(), Could not create the directory, the error number was: " & err.number
wscript.echo "In CreateDirectory(), the error description was " & err.description
End If
If QuietMode = False Then
objshell.popup "Could not create the " & strDirectory & " directory. If you are using the '-o' switch and specifying a UNC path, please ensure that the UNC path you specified exists and that you are able to connect to it!",,"AutodumpPlus",0
objShell.LogEvent 1, "Could not create the " & strDirectory & " directory. If you are using the '-o' switch and specifying a UNC path, please ensure that the UNC path you specified exists and that you are able to connect to it!"
Else
objShell.LogEvent 1, "Could not create the " & strDirectory & " directory. If you are using the '-o' switch and specifying a UNC path, please ensure that the UNC path you specified exists and that you are able to connect to it!"
wscript.echo "Could not create the " & strDirectory & " directory. If you are using the '-o' switch and specifying a UNC path, please ensure that the UNC path you specified exists and that you are able to connect to it!"
ErrorsDuringRuntime = True
End If
Wscript.quit 1
ElseIf err.number <> 0 and err.number <> 58 Then 'Permissions problem
If DEBUGGING = TRUE Then
wscript.echo "In CreateDirectory(), Could not create the directory, the error number was: " & err.number & " and the error description was " & err.description
End If
If QuietMode = False Then
objshell.popup "Could not create the " & strDirectory & " directory. Please verify that you have permissions to create this directory and try running AutodumpPlus again!",,"AutodumpPlus",0
objShell.LogEvent 1, "Could not create the " & strDirectory & " directory. Please verify that you have permissions to create this directory and try running AutodumpPlus again!"
Else
objShell.LogEvent 1, "Could not create the " & strDirectory & " directory. Please verify that you have permissions to create this directory and try running AutodumpPlus again!"
wscript.echo "Could not create the " & strDirectory & " directory. Please verify that you have permissions to create this directory and try running AutodumpPlus again!"
ErrorsDuringRuntime = True
End If
Wscript.quit 1
End If
Set oFile = nothing
Set objFileSystem = nothing
End Sub
'---------------------------------------------------------------------------------------------
' Function: DeleteDirectory
' Code is used to delete a directory. Not sure if its used. May delete it after
' a code review.
'---------------------------------------------------------------------------------------------
Sub DeleteDirectory(strDirectory)
On Error Resume Next
If DEBUGGING = TRUE Then
Wscript.echo ""
Wscript.echo "-----------------------------------"
Wscript.echo "In the DeleteDirectory() function . . ."
Wscript.echo "-----------------------------------"
Wscript.echo ""
End If
Err.clear
Dim objFileSystem
Dim oFile
set objFileSystem = CreateObject("Scripting.FileSystemObject")
Set oFile = objFileSystem.DeleteFolder(strDirectory)
If (err.number <> 0) and (err.number <> 424) Then
If DEBUGGING = TRUE Then
Wscript.echo ""
Wscript.echo "-----------------------------------"
Wscript.echo "In DeleteDirectory(), after calling objFileSystem.DeleteFolder"
Wscript.echo "Directory to delete: " & strDirectory
Wscript.echo "err.number: " & err.number
Wscript.echo "err.description: " & err.description
Wscript.echo "-----------------------------------"
Wscript.echo ""
End If
If QuietMode = False Then
objshell.popup "Could not delete the " & strDirectory & " directory. This error can also occur if you have a file open in the " & strDirectory & " directory or if you don't have sufficient permissions. Please close any open files, check your permissions and try running AutodumpPlus again!",,"AutodumpPlus",0
Else
objShell.LogEvent 1, "Could not delete the " & strDirectory & " directory. This error can also occur if you have a file open in the " & strDirectory & " directory or if you don't have sufficient permissions. Please close any open files, check your permissions and try running AutodumpPlus again!"
wscript.echo "Could not delete the " & strDirectory & " directory. This error can also occur if you have a file open in the " & strDirectory & " directory or if you don't have sufficient permissions. Please close any open files, check your permissions and try running AutodumpPlus again!"
ErrorsDuringRuntime = True
End If
Wscript.quit 1
End If
set oFile = nothing
set objFileSystem = nothing
Err.clear
End Sub
'---------------------------------------------------------------------------------------------
' Function: DetectScriptEngine()
' This is the used to determine what script engine is currently running the script.
' It will prompt the user to switch the default script engine to cscript.exe if
' the script is running under wscript.exe.
'---------------------------------------------------------------------------------------------
Sub DetectScriptEngine ()
On Error Resume Next
Dim ScriptHost
Dim objShell
Dim CurrentPathExt
Dim EnvObject
Dim RegCScript
Dim RegPopupType ' This is used to set the pop-up box flags.
' I couldn't find the pre-defined names
RegPopupType = 32 + 4
set objShell = CreateObject("Wscript.Shell")
If DEBUGGING = TRUE Then
Wscript.echo ""
Wscript.echo "-----------------------------------"
Wscript.echo "In the DetectScriptEngine() function . . ."
Wscript.echo "-----------------------------------"
Wscript.echo ""
End If
On Error Resume Next
ScriptHost = WScript.FullName
ScriptHost = Right (ScriptHost, Len (ScriptHost) - InStrRev(ScriptHost,"\"))
If DEBUGGING = TRUE Then
Wscript.echo "In DetectScriptEngine(), the ScriptHost = " & ScriptHost
Wscript.echo ""
End If
If (UCase (ScriptHost) = "WSCRIPT.EXE") Then
' Create a pop-up box and ask if they want to register cscript as the default host.
Set objShell = WScript.CreateObject ("WScript.Shell")
' -1 is the time to wait. 0 means wait forever.
If QuietMode = False Then
RegCScript = objShell.PopUp ("Wscript.exe is currently your default script interpreter. This script requires the Cscript.exe script interpreter to work properly. Would you like to register Cscript.exe as your default script interpreter for VBscript?", 0, "Register Cscript.exe as default script interpreter?", RegPopupType)
Else 'Running in Quiet mode, assume the user would WANT to change their script default script interpreter if they were prompted.
RegCscript = 6
End If
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "To run this script using the CScript.exe script interpreter, type: ""CScript.exe " & WScript.ScriptName & """"
WScript.Quit 1
End If
' Check to see if the user pressed yes or no. Yes is 6, no is 7
If (RegCScript = 6) Then
objShell.RegWrite "HKEY_CLASSES_ROOT\VBSFile\Shell\Open\Command\", "%WINDIR%\System32\CScript.exe //nologo ""%1"" %*", "REG_EXPAND_SZ"
objShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\VBSFile\Shell\Open\Command\", "%WINDIR%\System32\CScript.exe //nologo ""%1"" %*", "REG_EXPAND_SZ"
' Check if PathExt already existed
CurrentPathExt = objShell.RegRead ("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\PATHEXT")
if Err.Number = &h80070002 Then
Err.Clear
Set EnvObject = objShell.Environment ("PROCESS")
CurrentPathExt = EnvObject.Item ("PATHEXT")
End If
objShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\PATHEXT", CurrentPathExt & ";.VBS", "REG_SZ"
If (Err.Number <> 0) Then
If QuietMode = True Then
objShell.Logevent 1, "Error trying to write the registry settings! The error number was: " & Err.Number & " and the error description was: " & err.description
Wscript.Quit (Err.Number)
Else
Wscript.echo "Error trying to write the registry settings! The error number was: " & Err.Number & " and the error description was: " & err.description
WScript.Quit (Err.Number)
End If
Else
If QuietMode = True Then
objShell.Logevent 0, "Since AutodumpPlus is running in 'Quiet' mode, the default script interpreter was automatically changed to CScript to ensure compatibility with this script. Autodump will now open a new command shell window and run ADPlus.vbs again with the argument passsed in on the command line. To change the default script engine back to Wscript, type 'wscript.exe //h:wscript' in a command shell."
Else
WScript.Echo "Successfully registered Cscript.exe as the default script interpreter! To change the default script engine back to Wscript, type 'wscript.exe //h:wscript' in a command shell."
End If
End If
Else 'The user does not want the script engine changed and didn't use the '-quiet' switch.
WScript.Echo "The default script interpreter was NOT changed to CScript. Press 'OK' to continue running AutodumpPlus with the Cscript.exe script interpreter. NOTE: AutodumpPlus will now open a new command shell to run ADPlus.vbs with the CScript script engine. A new command shell will be opened each time AutoDumpPlus is run until the default script interpreter is changed to Cscript.exe."
End If
Dim ProcString
Dim ArgIndex
Dim ArgObj
Dim Result
Dim StrShell
ProcString = "Cscript //nologo " & Chr(34) & WScript.ScriptFullName & Chr(34)
If DEBUGGING = TRUE Then
Wscript.echo "In DetectScriptEngine(), the ProcString = " & ProcString
Wscript.echo ""
End If
Set ArgObj = WScript.Arguments
If DEBUGGING = TRUE Then
Wscript.echo "In DetectScriptEngine(), there were: " & ArgObj.Count & " arguments specified on the command line."
Wscript.echo ""
End If
For ArgIndex = 0 To ArgObj.Count - 1
ProcString = ProcString & " " & ArgObj.Item (ArgIndex)
Next
strShell = "cmd /k " & ProcString
If DEBUGGING = TRUE Then
Wscript.echo "In DetectScriptEngine(), about to run the script with the following strShell: " & strShell
Wscript.echo ""
End If
objShell.Run strShell,ACTIVATE_AND_DISPLAY,TRUE
WScript.Quit 1
End If
End Sub
'---------------------------------------------------------------------------------------------
' Function: DetectOSVersion
' This function is responsible for determining which operating system we are
' running on and to ensure its NT 4.0 SP4 or higher.
'---------------------------------------------------------------------------------------------
Sub DetectOSVersion()
On Error Resume Next
If DEBUGGING = TRUE Then
Wscript.echo ""
Wscript.echo "-----------------------------------"
Wscript.echo "In the DetectOSVersion() function . . ."
Wscript.echo "-----------------------------------"
Wscript.echo ""
End If
Dim objShell
Dim SPLevel
Dim Temp, cnt
err.clear
Set objShell = CreateObject("Wscript.Shell")
OSVer = objShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion")
OSBuildNumber = objShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentBuildNumber")
If (Err.Number <> 0) Then
If QuietMode = True Then
objShell.Logevent 1, "There was an error trying to read the OS version information from the registry! The error number was: " & Err.Number & " and the error description was: " & err.description & " Please check the permissions on the key show and try running AutodumpPlus again."
Wscript.Quit (Err.Number)
Else
objShell.Popup "There was an error trying to read the OS version information from the registry! The error number was: " & Err.Number & " and the error description was: " & err.description & " Please check the permissions on the key show and try running AutodumpPlus again.",,"AutodumpPlus",0
WScript.Quit (Err.Number)
End If
Else
If DEBUGGING = TRUE Then
Wscript.echo "In DetectOSVersion(), after querying the registry for HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion: "
Wscript.echo "In DetectOSVersion(), the OSVer = " & OSVer
Wscript.echo "In DetectOSVersion(), the OSBuildNumber = " & OSBuildNumber
Wscript.echo ""
End If
If OSVer = "4.0" then
SPLevel = objShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CSDVersion")
If DEBUGGING = TRUE Then
Wscript.echo "In DetectOSVersin(), SPLevel = " & SPLevel
End If
Temp = Split(SPLevel,",")
If UBound(Temp) <> 0 Then 'The customer must not have a released service pack, make a best effor to get the version.
Wscript.echo " Temp: " & Temp(0) & Temp(1)
For cnt = 0 to UBound(Temp)
If instr(1,Temp(cnt),"sp",1) <> 0 then
SPLevel = Right(Temp(cnt), 1)
Wscript.echo "SPlevel = " & SPlevel
exit for
else
'continue to the next string in the list.....
End if
Next
Else
'Customer has a released version of the service pack, get the SP number.
SPLevel = Right(SPLevel, 1)
End If
If SPLevel < 4 then
Wscript.echo "Autodump.vbs requires NT 4.0 Service Pack 4 or higher, or Windows 2000 in order to run."
Wscript.quit 1
end if
End if
End If
End sub
'---------------------------------------------------------------------------------------------
' Function: DetectIISVersion
' This function is responsible for determining which version of IIS we are
' running on. Since the '-iis' switch does not work on IIS 3.0, AutodumpPlus
' checks for IIS 3.0 or lower in the registry and does not allow the switch to be
' used. If the version of IIS is greater than 5.x, AutodumpPlus also does not
' allow the switch to be used as IIS 6.0 was not tested in time for this release.
'---------------------------------------------------------------------------------------------
Sub DetectIISVersion()
On Error Resume Next
If DEBUGGING = TRUE Then
Wscript.echo ""
Wscript.echo "-----------------------------------"
Wscript.echo "In the DetectIISVersion() function . . ."
Wscript.echo "-----------------------------------"
Wscript.echo ""
End If
On Error Resume Next
Dim objShell
Dim AccessDeniedIIS4
Dim AccessDeniedIIS3
Dim NotFound
Dim Installed
Dim IIS3
Dim IIS4
Dim IIS4Key
Dim IIS3Key
NotFound = True
AccessDeniedIIS4 = False
AccessDeniedIIS3 = False
IIS3 = False
IIS4 = False
Installed = False
IIS4Key = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp\VersionString"
IIS3Key = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Inetsrv\CurrentVersion\ServiceName"
Set objShell = CreateObject("Wscript.Shell")
'Check the IIS 4.0 and 5.x registry key to see if the user is running IIS 4.0 or 5.0
IISVer = objShell.RegRead(IIS4Key)
If err.number = -2147024894 Then 'The key was not found, check for IIS 3.0
If DEBUGGING = TRUE Then
Wscript.echo "In DetectIISVersion(), after querying the registry for: " & IIS4Key
Wscript.echo "In DetectOSVersion(), the key was not found, checking for IIS 3.0"
Wscript.echo ""
End If
err.clear
IISVer = objShell.RegRead(IIS3Key)
If err.number = -2147024891 Then
'AutodumpPlus doesn't have permissions to read IIS 3.0's registry version key.
If DEBUGGING = TRUE Then
Wscript.echo "In DetectIISVersion(), after querying the registry for: " & IIS3Key
Wscript.echo "In DetectOSVersion(), access was denied trying to query the key."
Wscript.echo ""
End If
AccessDeniedIIS3 = True
ElseIf err.number = -2147024894 Then
'IIS 3.0 or higher is not installed.
If DEBUGGING = TRUE Then
Wscript.echo "In DetectIISVersion(), after querying the registry for: " & IIS3Key
Wscript.echo "In DetectIISVersion(), IIS 3.0, 4.0, or 5.0 were not detected. No IIS Key's exist in the registry."
Wscript.echo ""
End If
IISVer = "Not found"
Notfound = True
Installed = False
ElseIf err.number = 0 Then
'IIS 3.0 is installed and the version key can be read.
If DEBUGGING = TRUE Then
Wscript.echo "In DetectIISVersion(), after querying the registry for: " & IIS3Key
Wscript.echo "In DetectIISVersion(), the IIS3Key exists and can be read. Running either IIS 2.0 or 3.0."
Wscript.echo ""
End If
Installed = True
IIS3 = True
AccessDeniedIIS3 = False
Else
'Some other error has occurred accessing the version key's. Display an error and exit gracefully.
If DEBUGGING = TRUE Then
Wscript.echo "In DetectIISVersion(), after querying the registry for: " & IIS3Key
Wscript.echo "In DetectIISVersion(), There was an unknown problem accessing the registry."
Wscript.echo ""
End If
Wscript.echo "There was an error reading the registry. The error number was: " & err.number & " and the error description was: " & err.description
Wscript.quit (err.number)
End If
ElseIf err.number = -2147024891 Then 'They are running IIS 4.0 or 5.x (the key was found) but they don't have permissions
'AutodumpPlus doesn't have the proper permissions to read either the IIS 4.0 or 5.x registry keys but they exist.
If DEBUGGING = TRUE Then
Wscript.echo "In DetectIISVersion(), after querying the registry for: " & IIS4Key
Wscript.echo "In DetectIISVersion(), access was denied trying to query the key."
Wscript.echo ""
End If
AccessDeniedIIS4 = True
ElseIf err.number = 0 Then
If InStr(IISVer,"4") <> 0 or InStr(IISVer,"5") <>0 or InStr(IISVer,"6") <>0 Then
'IIS 4.0, 5.x, or 6.0 is installed and AutodumpPlus can access the version key.
IIS4 = True
Installed = True
If DEBUGGING = TRUE Then
Wscript.echo "In DetectIISVersion(), after querying the registry for: " & IIS4Key
Wscript.echo "In DetectIISVersion(), IIS 4.0, 5.x, or 6.0 was found."
Wscript.echo ""
End If
Else
'AutodumpPlus has detected a newer version of IIS that has not been tested. Display an error and disable the '-iis' switch to be safe.
If DEBUGGING = TRUE Then
Wscript.echo "In DetectIISVersion(), after querying the registry for: " & IIS4Key
Wscript.echo "In DetectIISVersion(), ADPlus has detected an unsupported version of IIS (possibly IIS 7.0 or higher)."
Wscript.echo ""
End If
If QuietMode = False Then
objShell.popup "You appear to have IIS " & IISVer & " installed. This has not been tested with the '-iis' switch. Please run AutodumpPlus again, without the '-iis' switch.",,"AutodumpPlus",0
Wscript.quit
Else
wscript.echo "You appear to have IIS " & IISVer & " installed. This has not been tested with the '-iis' switch. Please run AutodumpPlus again, without the '-iis' switch."
objShell.logevent 1, "You appear to have IIS " & IISVer & " installed. This has not been tested with the '-iis' switch. Please run AutodumpPlus again, without the '-iis' switch."
Wscript.quit
End If
End If
Else
If DEBUGGING = TRUE Then
Wscript.echo "In DetectIISVersion(), after querying the registry for: " & IIS3Key
Wscript.echo "In DetectIISVersion(), There was an unknown problem accessing the registry."
Wscript.echo ""
End If
Wscript.echo "There was an error reading the registry"
Wscript.quit (err.number)
End If
If AccessDeniedIIS3 = True and IISMode = True Then
If QuietMode = False Then
objShell.popup "You appear to be running IIS 3.0 or lower, however AutodumpPlus had trouble verifying the IIS version in the registry at the following location: '" & IIS3Key & "', because of a permissions problem. The '-IIS' switch only works on IIS 4.0 or higher. If you are trying to monitor IIS 2.0 or IIS 3.0 please using the '-pn' switch to monitor inetinfo.exe.",,"AutodumpPlus",0
Wscript.quit 1
Else
wscript.echo "You appear to be running IIS 3.0 or lower, however AutodumpPlus had trouble verifying the IIS version in the registry at the following location: '" & IIS3Key & "', because of a permissions problem. The '-IIS' switch only works on IIS 4.0 or higher. If you are trying to monitor IIS 2.0 or IIS 3.0 please using the '-pn' switch to monitor inetinfo.exe."
objShell.LogEvent 1, "You appear to be running IIS 3.0 or lower, however AutodumpPlus had trouble verifying the IIS version in the registry at the following location: '" & IIS3Key & "', because of a permissions problem. The '-IIS' switch only works on IIS 4.0 or higher. If you are trying to monitor IIS 2.0 or IIS 3.0 please using the '-pn' switch to monitor inetinfo.exe."
Wscript.quit 1
End If
ElseIf AccessDeniedIIS4 = True and IISMode = True Then
If QuietMode = False Then
objShell.popup "You appear to be running IIS 4.0 or higher, however AutodumpPlus had trouble verifying the IIS version in the registry at the following location: '" & IIS4Key & "', because of a permissions problem. The '-IIS' switch only works on IIS 4.0 or higher. If you are trying to monitor IIS 2.0 or IIS 3.0 please using the '-pn' switch to monitor inetinfo.exe.",,"AutodumpPlus",0
Wscript.quit 1
Else
wscript.echo "You appear to be running IIS 4.0 or higher, however AutodumpPlus had trouble verifying the IIS version in the registry at the following location: '" & IIS4Key & "', because of a permissions problem. The '-IIS' switch only works on IIS 4.0 or higher. If you are trying to monitor IIS 2.0 or IIS 3.0 please using the '-pn' switch to monitor inetinfo.exe."
objShell.logevent 1, "You appear to be running IIS 4.0 or higher, however AutodumpPlus had trouble verifying the IIS version in the registry at the following location: '" & IIS4Key & "', because of a permissions problem. The '-IIS' switch only works on IIS 4.0 or higher. If you are trying to monitor IIS 2.0 or IIS 3.0 please using the '-pn' switch to monitor inetinfo.exe."
Wscript.quit 1
End If
ElseIf IIS3 = True AND IISMode = True Then
If QuietMode = False then
objShell.popup "You have specified the '-iis' switch, however you appear to be running " & IISVer & ". The '-iis' switch only works with IIS 4.0 and higher.",,"Autodump",0
Wscript.quit 1
Else
wscript.echo "You have specified the '-iis' switch, however you appear to be running " & IISVer & ". The '-iis' switch only works with IIS 4.0 and higher."
objShell.logevent 1, "You have specified the '-iis' switch, however you appear to be running " & IISVer & ". The '-iis' switch only works with IIS 4.0 and higher."
Wscript.quit 1
End if
ElseIf Installed = False AND IISMode = True Then
If QuietMode = False then
objShell.popup "You have specified the '-iis' switch, however you do not appear to be running a supported version of IIS. The '-iis' switch only works with IIS 4.0 and higher.",,"Autodump",0
Wscript.quit 1
Else
wscript.echo "You have specified the '-iis' switch, however you do not appear to be running a supported version of IIS. The '-iis' switch only works with IIS 4.0 and higher."
objShell.logevent 1, "You have specified the '-iis' switch, however you do not appear to be running a supported version of IIS. The '-iis' switch only works with IIS 4.0 and higher."
Wscript.quit 1
End if
End If
Set objShell = nothing
End sub