mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
685 lines
20 KiB
685 lines
20 KiB
;========================================
|
|
; REGISTRY MANIPULATION
|
|
;========================================
|
|
|
|
[RegistryConstants]
|
|
|
|
MaskAllAccess = 33554432
|
|
NoTitle = 0
|
|
RegLastError = $(!REG_ERROR_SUCCESS)
|
|
|
|
|
|
;-----------------------------------------------------------------------
|
|
; ROUTINE: GetNTSource
|
|
;
|
|
; DESCRIPTION: Reads the software entry to find out where the installation
|
|
; medium was.
|
|
;
|
|
; INPUTS: $0: None
|
|
;
|
|
; OUTPUTS: $R0: Status: STATUS_SUCCESSFUL
|
|
; STATUS_FAILED
|
|
;
|
|
; $R1: NTSource
|
|
;
|
|
;------------------------------------------------------------------------
|
|
|
|
[GetNTSource]
|
|
|
|
set Status = STATUS_SUCCESSFUL
|
|
read-syms RegistryConstants
|
|
set NTSource = A:\
|
|
|
|
;
|
|
; Open the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
|
|
; key
|
|
|
|
set KeyName = "Software\Microsoft\Windows NT\CurrentVersion"
|
|
OpenRegKey $(!REG_H_LOCAL) "" $(KeyName) $(!REG_KEY_READ) KeyHandle
|
|
ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
|
|
Debug-Output "REGISTRY.INF: Couldn't open windows nt software key for read access"
|
|
goto end_getntsource
|
|
endif
|
|
|
|
;
|
|
; read the sourcepath entry
|
|
;
|
|
|
|
GetRegValue $(KeyHandle) "SourcePath" SourcePathValue
|
|
ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
|
|
CloseRegKey $(KeyHandle)
|
|
goto end_getntsource
|
|
endif
|
|
|
|
set NTSource = *($(SourcePathValue), 4)
|
|
CloseRegKey $(KeyHandle)
|
|
end_getntsource = +
|
|
Return $(Status) $(NTSource)
|
|
|
|
;-----------------------------------------------------------------------
|
|
; ROUTINE: MakeServicesEntry
|
|
;
|
|
; DESCRIPTION: Creates an entry for a services node
|
|
;
|
|
; INPUTS: $0: Services node
|
|
; $1: Services Value Entries
|
|
; $2: Parameters Value Entries( "" if no parameters key is to be
|
|
; created. )
|
|
; $3: List of Devicen specific Value Entries:
|
|
; {{Value List For Device0}, {Value List For Device1}...}
|
|
; $4: Eventlog Value Entries
|
|
; $5: Name of first-level subkey (ie, Device0 | Parameters )
|
|
; $6: Full path to service binary
|
|
;
|
|
;
|
|
; OUTPUTS: $R0: Status: STATUS_SUCCESSFUL
|
|
; STATUS_FAILED
|
|
;
|
|
;
|
|
;------------------------------------------------------------------------
|
|
[MakeServicesEntry]
|
|
|
|
set Status = STATUS_FAILED
|
|
read-syms RegistryConstants
|
|
|
|
Debug-Output "REGISTRY.INF: Creating Services node: "$($0)
|
|
|
|
;
|
|
; Make the entry corresponding to the option
|
|
;
|
|
; Open the services key
|
|
;
|
|
|
|
OpenRegKey $(!REG_H_LOCAL) "" "system\"$(!STF_CONTROLSET)"\services" $(MaskAllAccess) ServicesKey
|
|
ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
|
|
Debug-Output "REGISTRY.INF: Failed to open services key"
|
|
goto finish_MakeServicesEntry
|
|
endif
|
|
|
|
;
|
|
; Examine the values passed in. If the values are not out of a standard
|
|
; set then we need to go ahead and make the entries ourselves. The
|
|
; standard set values will be established by the service controller.
|
|
;
|
|
|
|
set StandardSet = { Type, +
|
|
Start, +
|
|
ErrorControl, +
|
|
Group, +
|
|
Dependencies, +
|
|
StartName, +
|
|
Password, +
|
|
BinaryPathName, +
|
|
DisplayName +
|
|
}
|
|
|
|
ForListDo $(StandardSet)
|
|
set $($) = ""
|
|
EndForListDo
|
|
|
|
set KeyValues = {}
|
|
ForListDo $($1)
|
|
set Var = *($($), 1)
|
|
set Value = *($($), 4)
|
|
ifcontains(i) $(Var) in $(StandardSet)
|
|
set $(Var) = $(Value)
|
|
else
|
|
set KeyValues = >($(KeyValues), $($))
|
|
endif
|
|
EndForListDo
|
|
set Error = NO
|
|
ForListDo { Type, Start, ErrorControl, BinaryPathName }
|
|
ifstr(i) $($($)) == ""
|
|
set Error = YES
|
|
endif
|
|
EndForListDo
|
|
ifstr(i) $(Error) == YES
|
|
Debug-Output "REGISTRY.INF: MakeServicesEntry was not passed in one of the three values: Type, Start, ErrorControl"
|
|
CloseRegKey $(ServicesKey)
|
|
goto finish_MakeServicesEntry
|
|
endif
|
|
|
|
;
|
|
; call the service controller to make a services entry
|
|
;
|
|
|
|
set ServiceName = $($0)
|
|
LibraryProcedure STATUS, $(!LIBHANDLE), SetupCreateService $(ServiceName) +
|
|
$(DisplayName) +
|
|
$(Type) +
|
|
$(Start) +
|
|
$(ErrorControl) +
|
|
$(BinaryPathName) +
|
|
$(Group) +
|
|
$(Dependencies) +
|
|
$(StartName) +
|
|
$(Password)
|
|
|
|
|
|
|
|
ifstr(i) $(STATUS) != "SUCCESS"
|
|
Debug-Output "REGISTRY.INF: MakeServicesEntry: SetupCreateService function failed"
|
|
CloseRegKey $(ServicesKey)
|
|
goto finish_MakeServicesEntry
|
|
endif
|
|
|
|
;
|
|
; Create a key for the service mentioned ( this is so that the values
|
|
; other than the standard set get updated - for example if the caller
|
|
; wants to put his own tag field.
|
|
|
|
set KeyPath = {{$($0), $(NoTitle), $(MaskAllAccess)}}
|
|
|
|
shell "" CreateKey $(ServicesKey) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
Debug-Output "REGISTRY.INF: Failed to shell CreateKey."
|
|
CloseRegKey $(ServicesKey)
|
|
goto error_MakeServicesEntry
|
|
endif
|
|
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
Debug-Output "REGISTRY.INF: Failed to create services node."
|
|
CloseRegKey $(ServicesKey)
|
|
goto error_MakeServicesEntry
|
|
endif
|
|
|
|
set MiniportKey = $($R1)
|
|
|
|
;
|
|
; Create the parameters for the miniport mentioned
|
|
;
|
|
|
|
ifstr(i) $($2) != ""
|
|
set KeyPath = {{$($5), $(NoTitle), $(MaskAllAccess)}}
|
|
set KeyValues = $($2)
|
|
|
|
shell "" CreateKey $(MiniportKey) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
CloseRegKey $(ServicesKey)
|
|
CloseRegKey $(MiniportKey)
|
|
goto error_MakeServicesEntry
|
|
endif
|
|
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
CloseRegKey $(ServicesKey)
|
|
CloseRegKey $(MiniportKey)
|
|
goto error_MakeServicesEntry
|
|
endif
|
|
|
|
set ParametersKey = $($R1)
|
|
|
|
ForListDo $($3)
|
|
|
|
set-sub DeviceNum = $(#) 1
|
|
set EntryName = "Device"$(DeviceNum)
|
|
set KeyPath = {{$(EntryName), $(NoTitle), $(MaskAllAccess)}}
|
|
set KeyValues = $($3)
|
|
|
|
shell "" CreateKey $(ParametersKey) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
CloseRegKey $(ServicesKey)
|
|
CloseRegKey $(MiniportKey)
|
|
CloseRegKey $(ParametersKey)
|
|
goto error_MakeServicesEntry
|
|
endif
|
|
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
CloseRegKey $(ServicesKey)
|
|
CloseRegKey $(MiniportKey)
|
|
CloseRegKey $(ParametersKey)
|
|
goto error_MakeServicesEntry
|
|
endif
|
|
CloseRegKey $($R1)
|
|
|
|
EndForListDo
|
|
|
|
CloseRegKey $(ParametersKey)
|
|
|
|
endif
|
|
CloseRegKey $(MiniportKey)
|
|
|
|
|
|
;
|
|
; see if we need to make an event log entry for this
|
|
;
|
|
|
|
ifstr(i) $($4) != {}
|
|
;
|
|
; Open the eventlog\system key in the services area.
|
|
;
|
|
|
|
OpenRegKey $(ServicesKey) "" "eventlog\system" $(MaskAllAccess) EventLogKey
|
|
ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
|
|
Debug-Output "REGISTRY.INF: Failed to open eventlog key"
|
|
CloseRegKey $(ServicesKey)
|
|
goto error_MakeServicesEntry
|
|
endif
|
|
|
|
;
|
|
; create the key for the current service
|
|
;
|
|
|
|
set KeyPath = {{$($0), $(NoTitle), $(MaskAllAccess)}}
|
|
set KeyValues = $($4)
|
|
shell "" CreateKey $(EventLogKey) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
CloseRegKey $(ServicesKey)
|
|
CloseRegKey $(EventLogKey)
|
|
goto error_MakeServicesEntry
|
|
endif
|
|
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
CloseRegKey $(ServicesKey)
|
|
CloseRegKey $(EventLogKey)
|
|
goto error_MakeServicesEntry
|
|
endif
|
|
CloseRegKey $($R1)
|
|
CloseRegKey $(EventLogKey)
|
|
endif
|
|
|
|
CloseRegKey $(ServicesKey)
|
|
set Status = STATUS_SUCCESSFUL
|
|
goto finish_MakeServicesEntry
|
|
|
|
error_MakeServicesEntry = +
|
|
shell "" ModifyServicesEntry $($0) $(!SERVICE_DISABLED)
|
|
finish_MakeServicesEntry = +
|
|
Return $(Status)
|
|
|
|
|
|
;-----------------------------------------------------------------------
|
|
; ROUTINE: GetServicesEntryStart
|
|
;
|
|
; DESCRIPTION: Finds out about the Start value of the Service Entry
|
|
;
|
|
; INPUTS: $0: Services node
|
|
;
|
|
; OUTPUTS: $R0: Status: STATUS_SUCCESSFUL
|
|
; STATUS_FAILED
|
|
;
|
|
; $R1: Start value: $(!SERVICE_BOOT_START) | $(!SERVICE_SYSTEM_START) |
|
|
; $(!SERVICE_AUTO_START) | $(!SERVICE_DEMAND_START) |
|
|
; $(!SERVICE_DISABLED)
|
|
;
|
|
;------------------------------------------------------------------------
|
|
[GetServicesEntryStart]
|
|
set Status = STATUS_FAILED
|
|
set StartValue = ""
|
|
read-syms RegistryConstants
|
|
Debug-Output "REGISTRY.INF: Get Services node Start value: "$($0)
|
|
|
|
;
|
|
; Open the HKEY_LOCAL_MACHINE\System\$(!STF_CONTROLSET)\Services\ServicesEntry key
|
|
; key
|
|
|
|
set KeyName = "system\"$(!STF_CONTROLSET)"\services\"$($0)
|
|
OpenRegKey $(!REG_H_LOCAL) "" $(KeyName) $(!REG_KEY_READ) KeyHandle
|
|
ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
|
|
Debug-Output "REGISTRY.INF: Couldn't open services node for read access"
|
|
goto finish_GetServicesEntryStart
|
|
endif
|
|
|
|
;
|
|
; read the Start entry
|
|
;
|
|
|
|
GetRegValue $(KeyHandle) "Start" StartValueList
|
|
ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
|
|
Debug-Output "REGISTRY.INF: Couldn't read Start value"
|
|
CloseRegKey $(KeyHandle)
|
|
goto finish_GetServicesEntryStart
|
|
endif
|
|
CloseRegKey $(KeyHandle)
|
|
set StartValue = *($(StartValueList), 4)
|
|
|
|
set Status = STATUS_SUCCESSFUL
|
|
finish_GetServicesEntryStart = +
|
|
Return $(Status) $(StartValue)
|
|
|
|
;-----------------------------------------------------------------------
|
|
; ROUTINE: RemoveServicesEntry
|
|
;
|
|
; DESCRIPTION: Removes an entry for a services node. Currently just
|
|
; disables it
|
|
;
|
|
; INPUTS: $0: Services node
|
|
;
|
|
; OUTPUTS: $R0: Status: STATUS_SUCCESSFUL
|
|
; STATUS_FAILED
|
|
;
|
|
;
|
|
;------------------------------------------------------------------------
|
|
[RemoveServicesEntry]
|
|
|
|
set Status = STATUS_FAILED
|
|
read-syms RegistryConstants
|
|
|
|
Debug-Output "REGISTRY.INF: Removing Services node: "$($0)
|
|
shell "" ModifyServicesEntry $($0) $(!SERVICE_DISABLED)
|
|
Return $($R0)
|
|
|
|
;-----------------------------------------------------------------------
|
|
; ROUTINE: MakeSetupKey
|
|
;
|
|
; DESCRIPTION: Creates the setup key under the current control
|
|
; set\control. This key is created with admin all access.
|
|
; Whenever setup has to do an operation which should be
|
|
; restricted to admin.
|
|
;
|
|
; INPUTS: None
|
|
;
|
|
;
|
|
; OUTPUTS: $R0: Status: STATUS_SUCCESSFUL
|
|
; STATUS_FAILED
|
|
;
|
|
;
|
|
;------------------------------------------------------------------------
|
|
[MakeSetupKey]
|
|
set Status = STATUS_FAILED
|
|
read-syms RegistryConstants
|
|
|
|
;
|
|
; Open the control key
|
|
;
|
|
|
|
OpenRegKey $(!REG_H_LOCAL) "" "system\"$(!STF_CONTROLSET)"\control" $(MaskAllAccess) ControlKey
|
|
ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
|
|
Debug-Output "REGISTRY.INF: Failed to open services key"
|
|
goto finish_MakeSetupKey
|
|
endif
|
|
|
|
;
|
|
; Create a key for setup
|
|
;
|
|
|
|
set KeyPath = { +
|
|
{"Setup", $(NoTitle), $(MaskAllAccess)} +
|
|
}
|
|
|
|
;
|
|
; Form the value info structures for the setup entry
|
|
;
|
|
|
|
set KeyValues = {}
|
|
|
|
shell "" CreateKey $(ControlKey) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
CloseRegKey $(ControlKey)
|
|
goto finish_MakeSetupKey
|
|
endif
|
|
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
CloseRegKey $(ControlKey)
|
|
goto finish_MakeSetupKey
|
|
endif
|
|
|
|
CloseRegKey $($R1)
|
|
CloseRegKey $(ControlKey)
|
|
|
|
set Status = STATUS_SUCCESSFUL
|
|
finish_MakeSetupKey = +
|
|
Return $(Status)
|
|
|
|
|
|
;-----------------------------------------------------------------------
|
|
; ROUTINE: CheckSetupModify
|
|
;
|
|
; DESCRIPTION: Checks to see if setup has admin privileges
|
|
;
|
|
; INPUTS: None
|
|
;
|
|
;
|
|
; OUTPUTS: $R0: Status: STATUS_SUCCESSFUL
|
|
; STATUS_FAILED
|
|
;
|
|
;
|
|
;------------------------------------------------------------------------
|
|
[CheckSetupModify]
|
|
set Status = STATUS_FAILED
|
|
read-syms RegistryConstants
|
|
|
|
;
|
|
; Call the library function to see if we have admin privileges
|
|
;
|
|
|
|
LibraryProcedure STATUS, $(!LIBHANDLE), TestAdmin
|
|
ifstr(i) $(STATUS) == "YES"
|
|
set Status = STATUS_SUCCESSFUL
|
|
endif
|
|
|
|
Return $(Status)
|
|
|
|
;-----------------------------------------------------------------------
|
|
; ROUTINE: MakeSetupOptionEntry
|
|
;
|
|
; DESCRIPTION: Creates an entry for a miniport driver and also enters the
|
|
; miniport driver group entry into the service group order
|
|
;
|
|
; INPUTS: $0: OptionType [ Video ]
|
|
; $1: OptionID
|
|
;
|
|
; OUTPUTS: $R0: Status: STATUS_SUCCESSFUL
|
|
; STATUS_FAILED
|
|
;
|
|
;
|
|
;------------------------------------------------------------------------
|
|
[MakeSetupOptionEntry]
|
|
set Status = STATUS_FAILED
|
|
read-syms RegistryConstants
|
|
|
|
|
|
;
|
|
; Make the entry corresponding to the option
|
|
;
|
|
; Open the control key
|
|
;
|
|
|
|
OpenRegKey $(!REG_H_LOCAL) "" "system\"$(!STF_CONTROLSET)"\control" $(MaskAllAccess) ControlKey
|
|
ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
|
|
Debug-Output "REGISTRY.INF: Failed to open services key"
|
|
goto finish_MakeSetupOptionEntry
|
|
endif
|
|
|
|
;
|
|
; Create a key for the miniport mentioned
|
|
;
|
|
;
|
|
; Make the parameters
|
|
;
|
|
set KeyPath = { +
|
|
{"Setup", $(NoTitle), $(MaskAllAccess)} +
|
|
}
|
|
|
|
;
|
|
; Form the value info structures for the WinNT entry
|
|
;
|
|
set KeyValues = { +
|
|
{$($0), $(NoTitle), $(!REG_VT_SZ), $($1)} +
|
|
}
|
|
|
|
|
|
shell "" CreateKey $(ControlKey) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
CloseRegKey $(ControlKey)
|
|
goto finish_MakeSetupOptionEntry
|
|
endif
|
|
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
CloseRegKey $(ControlKey)
|
|
goto finish_MakeSetupOptionEntry
|
|
endif
|
|
|
|
CloseRegKey $($R1)
|
|
CloseRegKey $(ControlKey)
|
|
|
|
set Status = STATUS_SUCCESSFUL
|
|
finish_MakeSetupOptionEntry = +
|
|
Return $(Status)
|
|
|
|
;-----------------------------------------------------------------------
|
|
; ROUTINE: ModifyServicesEntry
|
|
;
|
|
; DESCRIPTION: Changes the "Start" value entry on a services key.
|
|
;
|
|
; INPUTS: $0: Services entry
|
|
; $1: Start Type $(!SERVICE_BOOT_START) | $(!SERVICE_SYSTEM_START) |
|
|
; $(!SERVICE_AUTO_START) | $(!SERVICE_DEMAND_START) |
|
|
; $(!SERVICE_DISABLED)
|
|
;
|
|
; OUTPUTS: $R0: Status: STATUS_SUCCESSFUL
|
|
; STATUS_FAILED
|
|
;
|
|
;------------------------------------------------------------------------
|
|
[ModifyServicesEntry]
|
|
read-syms RegistryConstants
|
|
set Status = STATUS_FAILED
|
|
set StartValue = $($1)
|
|
|
|
LibraryProcedure STATUS, $(!LIBHANDLE), SetupChangeServiceStart $($0) $(StartValue)
|
|
ifstr(i) $(STATUS) != "SUCCESS"
|
|
Debug-Output "REGISTRY.INF: ModifyServicesEntry: SetupChangeServiceStart function failed"
|
|
goto finish_ModifyServicesEntry
|
|
endif
|
|
|
|
set Status = STATUS_SUCCESSFUL
|
|
|
|
finish_ModifyServicesEntry = +
|
|
Return $(Status)
|
|
|
|
|
|
|
|
;-----------------------------------------------------------------------
|
|
; ROUTINE: CreateKey
|
|
;
|
|
; DESCRIPTION: Creates a key and fixes the values indicated.
|
|
; Key is Handle\Key1\Key2\...\Keyn. Value list
|
|
; is for Valuen.
|
|
;
|
|
; INPUTS: $0: Handle into registry
|
|
; $1: KeyTreeComponents {Key1Info, Key2Info..}
|
|
; $2: ValueList {Value1Info, Value2Info, Value3Info}
|
|
;
|
|
; OUTPUTS: $R0: Status: STATUS_SUCCESSFUL
|
|
; STATUS_FAILED
|
|
; STATUS_ERROR_CREATEKEY
|
|
; STATUS_ERROR_CREATEVALUE
|
|
;
|
|
; $R1: Handle to created key
|
|
;
|
|
;------------------------------------------------------------------------
|
|
|
|
[CreateKey]
|
|
|
|
;
|
|
; Initialize
|
|
;
|
|
|
|
set Status = STATUS_FAILED
|
|
read-syms RegistryConstants
|
|
|
|
;
|
|
; traverse down the keytreecomponents and open/create components as
|
|
; you go along
|
|
;
|
|
|
|
set BaseHandle = $($0)
|
|
set KeyHandle = $(BaseHandle)
|
|
|
|
ForListDo $($1)
|
|
|
|
set KeyInfo = $($)
|
|
set KeyName = *($(KeyInfo), 1)
|
|
|
|
;
|
|
; Try opening the key first
|
|
|
|
OpenRegKey $(BaseHandle) "" $(KeyName) $(MaskAllAccess) KeyHandle
|
|
ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
|
|
;
|
|
; Key doesn't exist
|
|
;
|
|
Debug-Output "REGISTRY.INF: Key"$(KeyName)"doesn't exist. Will create key"
|
|
|
|
set RegLastError = 0
|
|
CreateRegKey $(BaseHandle) $(KeyInfo) "" $(MaskAllAccess) "" KeyHandle
|
|
ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
|
|
set Status = STATUS_ERROR_CREATEKEY
|
|
Debug-Output "REGISTRY.INF: Error in creating key"
|
|
goto endcreate
|
|
endif
|
|
endif
|
|
|
|
ifstr(i) $(BaseHandle) != $($0)
|
|
CloseRegKey $(BaseHandle)
|
|
ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
|
|
set Status = STATUS_ERROR_CREATEKEY
|
|
Debug-Output "REGISTRY.INF: Error in closing base handle"
|
|
goto endcreate
|
|
endif
|
|
endif
|
|
|
|
set BaseHandle = $(KeyHandle)
|
|
|
|
EndForListDo
|
|
|
|
ifstr(i) $($2) != {}
|
|
shell "" AddValueList $(KeyHandle) $($2)
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
set Status = STATUS_ERROR_CREATEVALUE
|
|
goto endcreate
|
|
endif
|
|
endif
|
|
set Status = STATUS_SUCCESSFUL
|
|
|
|
endcreate = +
|
|
ifstr(i) $(Status) != STATUS_SUCCESSFUL
|
|
Debug-Output "REGISTRY.INF: CreateKey Error:"$(Status)
|
|
endif
|
|
Return $(Status) $(KeyHandle)
|
|
|
|
|
|
;*************************************************************************
|
|
;
|
|
; SECTION: AddValueList
|
|
;
|
|
; PURPOSE: Given a nested list of value items, add each to the given
|
|
; key. Key is left open.
|
|
;
|
|
; ARGUMENTS: $0 Registry key handle
|
|
; $1 List of value items; for example:
|
|
; { {ValueName1,0,$(!REG_VT_SZ),$(ValueData1)}, +
|
|
; {ValueName2,0,$(!REG_VT_SZ),$(ValueData2)} }
|
|
;
|
|
; RETURNS: $R0 Status
|
|
;
|
|
;
|
|
;*************************************************************************
|
|
|
|
[AddValueList]
|
|
set Status = STATUS_FAILED
|
|
read-syms RegistryConstants
|
|
|
|
ForListDo $($1)
|
|
SetRegValue $($0) $($)
|
|
ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
|
|
Debug-Output "REGISTRY.INF: CreateValue failed:"$($)
|
|
goto end_addvaluelist
|
|
endif
|
|
EndForListDo
|
|
set Status = STATUS_SUCCESSFUL
|
|
|
|
end_addvaluelist = +
|
|
return $(Status)
|
|
|
|
|
|
[EnableCrashDump]
|
|
OpenRegKey $(!REG_H_LOCAL) "" system\currentcontrolset\control\CrashControl $(!REG_KEY_SET_VALUE) CrashControlKey
|
|
ifstr $(CrashControlKey) != ""
|
|
|
|
shell "" AddValueList $(CrashControlKey) {{LogEvent ,0,$(!REG_VT_DWORD),1},+
|
|
{SendAlert ,0,$(!REG_VT_DWORD),1},+
|
|
{CrashDumpEnabled,0,$(!REG_VT_DWORD),1},+
|
|
{AutoReboot ,0,$(!REG_VT_DWORD),1}}
|
|
CloseRegKey $(CrashControlKey)
|
|
endif
|
|
return
|