'********************************************************************************************* '* 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 ', '-pn '* '-pageheap', '-quiet', '-o , '-notify '* '* '* Required: ('-hang', or '-quick', or '-crash') AND ('-iis' or '-p' or '-pn') '* '* Optional: '-pageheap', '-quiet', '-o ', '-notify ' '* '* 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 ', '-pn " Wscript.echo " '-pageheap', '-quiet', '-o , '-notify " Wscript.Echo "" Wscript.Echo "Required: ('-hang', or '-quick', or '-crash') AND ('-iis' or '-p' or '-pn')" Wscript.Echo "" Wscript.Echo "Optional: '-pageheap', '-quiet', '-o ', '-notify '" 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