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

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