{    ,  ImagePath.
            -  SafeZone.cc
        VirusNet.Info . }
var DescriptionTextWuauServ, DispayNameTextWuauServ, DescriptionTextBITS: String;
 DispayNameTextBITS, FullPathSystem32, NameFolderSystem32, FileServiceDll: String;  
 ImagePathStr, RootStr, SubRootStr, LangID: string;
 AllRoots, AllKeys, RootsRestored, KeysRestored, KeysFixed: integer;
 FinishMsg, RestoreMsg, FixMsg, CheckMsg: String; 
 RegSectMsg, ParamMsg, ParamValueMsg, InRegSectMsg, CorrectMsg, RestMsg: String;

procedure CheckAndRestoreSection(Root: String);
begin
 Inc(AllRoots);
 if RegKeyExistsEx('HKLM', Root) then
   RegKeyResetSecurity('HKLM', Root)
 else
  begin
    Inc(RootsRestored);
    RegKeyCreate('HKLM', Root);
    AddToLog(RegSectMsg + Root + RestMsg);
   end;
end;

procedure CheckAndRestoreSubSection;
begin
  CheckAndRestoreSection(SubRootStr);
end;

procedure RestoredMsg(Root, Param: String);
begin
  AddToLog(ParamMsg + Param + InRegSectMsg + Root + RestMsg);
  Inc(KeysRestored);
end;

procedure FixedMsg(Root, Param: String);
begin
  AddToLog(ParamValueMsg + Param + InRegSectMsg + Root + CorrectMsg);
  Inc(KeysFixed);
end;

procedure RestoreStrParam(Root, Param, Value: String);
begin
  RegKeyStrParamWrite('HKLM', Root, Param, Value);
  RestoredMsg(Root, Param);
end;

procedure CheckAndRestoreStrParam(Root, Param, Value: String);
begin
  Inc(AllKeys);
  if not RegKeyParamExists('HKLM', Root, Param) then
    RestoreStrParam(Root, Param, Value);
end;

procedure CheckAndRestoreIntParam(Root, Param: String; Value: Integer);
begin
 Inc(AllKeys);
 if not RegKeyParamExists('HKLM', Root, Param) then 
  begin
    RegKeyIntParamWrite('HKLM', Root, Param, Value);
    RestoredMsg(Root, Param);
  end;
end;

procedure CheckAndRestoreMultiSZParam(Param, Value: String);
begin
 Inc(AllKeys);
 if not RegKeyParamExists('HKLM', RootStr, Param) then
  begin
    ExecuteFile('REG ADD HKLM\' + RootStr + ' /v ' + Param + Value, '', 0, 10000, true);
    RestoredMsg(RootStr, Param);
  end;
end;

//    ImagePath   'wuauserv'  'BITS'
procedure ImagePathFix(Node, Srv: String);
var RegStr: String;
begin
 RegStr := 'SYSTEM\' + Node + '\Services\' + Srv;
 if RegKeyExistsEx('HKLM', RegStr) then
  begin
    Inc(AllKeys);
    RegKeyResetSecurity('HKLM', RegStr);
    RegKeyStrParamWrite('HKLM', RegStr, 'ImagePath', ImagePathStr);
    FixedMsg(RegStr, 'ImagePath');
  end;
end;

{       -
   'HKLM\SYSTEM\CurrentControlSet\Services\BITS'  'HKLM\SYSTEM\CurrentControlSet\Services\wuauserv'}
procedure CorrectRegistryRoot(DescriptionText, DisplayNameText, Srv: String);
var FileServiceDll, CCSNumber: string;
     i : integer;
begin
 if Srv = 'BITS' then
   FileServiceDll := FullPathSystem32 + 'qmgr.dll'
 else
   FileServiceDll := FullPathSystem32 + 'wuauserv.dll';
 RootStr:= 'SYSTEM\CurrentControlSet\Services\' + Srv;

 CheckAndRestoreSection(RootStr);

 CheckAndRestoreStrParam(RootStr, 'Description', DescriptionText);
 CheckAndRestoreStrParam(RootStr, 'DisplayName', DisplayNameText);
 CheckAndRestoreStrParam(RootStr, 'ObjectName', 'LocalSystem');

 Inc(AllKeys);
 if not RegKeyParamExists('HKLM', RootStr, 'ImagePath') then
   RestoreStrParam(RootStr, 'ImagePath', ImagePathStr)
 else
  begin
    Dec(AllKeys);
    if LowerCase(RegKeyStrParamRead('HKLM', RootStr, 'ImagePath')) <> LowerCase(ImagePathStr) then
      for i:= 0 to 999 do
       begin
         if i > 0 then
           CCSNumber := FormatFloat('ControlSet000', i)
         else
           CCSNumber := 'CurrentControlSet';
         ImagePathFix(CCSNumber, Srv);
      end;
   end;

 CheckAndRestoreIntParam(RootStr, 'ErrorControl', 1);
 CheckAndRestoreIntParam(RootStr, 'Start', 2);
 CheckAndRestoreIntParam(RootStr, 'Type', 32);

 if Srv = 'BITS' then
  begin
    CheckAndRestoreMultiSZParam('DependOnService', ' /t REG_MULTI_SZ /d RpcSs');
    CheckAndRestoreMultiSZParam('DependOnGroup', ' /t REG_MULTI_SZ');
  end;

 SubRootStr:= RootStr + '\Enum';
 CheckAndRestoreSubSection;

 CheckAndRestoreStrParam(SubRootStr, '0', 'Root\LEGACY_' + UpperCase(Srv) + '\0000');
 CheckAndRestoreIntParam(SubRootStr, 'Count', 1);
 CheckAndRestoreIntParam(SubRootStr, 'NextInstance', 1);

 SubRootStr := RootStr + '\Security';
 CheckAndRestoreSubSection;

 Inc(AllKeys);
 if not RegKeyParamExists('HKLM', SubRootStr, 'Security') then
  begin
    RegKeyBinParamWrite('HKLM', SubRootStr, 'Security', '01,00,14,80,78,00,00,00,84,00,00,00,14,00,00,00,30,00,00,00,02,00,1c,00,01,00,00,00,02,80,14,00,ff,00,0f,00,01,01,00,00,00,00,00,01,00,00,00,00,02,00,48,00,03,00,00,00,00,00,14,00,9d,00,02,00,01,01,00,00,00,00,00,05,0b,00,00,00,00,00,18,00,ff,01,0f,00,01,02,00,00,00,00,00,05,20,00,00,00,20,02,00,00,00,00,14,00,ff,01,0f,00,01,01,00,00,00,00,00,05,12,00,00,00,01,01,00,00,00,00,00,05,12,00,00,00,01,01,00,00,00,00,00,05,12,00,00,00');
    RestoredMsg(SubRootStr, 'Security');
  end;

 SubRootStr:= RootStr + '\Parameters';
 CheckAndRestoreSubSection;

 Inc(AllKeys);
 if not RegKeyParamExists('HKLM', SubRootStr, 'ServiceDll') then
  begin
    RegKeyParamWrite('HKLM', SubRootStr, 'ServiceDll', 'REG_EXPAND_SZ', FileServiceDll);
    RestoredMsg(SubRootStr, 'ServiceDll');
  end
 else if LowerCase(RegKeyStrParamRead('HKLM', SubRootStr, 'ServiceDll')) <> LowerCase(FileServiceDll) then
  begin
    RegKeyParamWrite('HKLM', SubRootStr, 'ServiceDll', 'REG_EXPAND_SZ', FileServiceDll);
    FixedMsg(SubRootStr, 'ServiceDll');
  end
end;

{   }
begin
 ClearLog;
 ExpRegKey('HKLM', 'SYSTEM\CurrentControlSet\Services\wuauserv', 'wuauserv.reg');
 ExpRegKey('HKLM', 'SYSTEM\CurrentControlSet\Services\BITS', 'BITS.reg');
 LangID:= RegKeyStrParamRead('HKLM', 'SYSTEM\CurrentControlSet\Control\Nls\Language', 'InstallLanguage'); 
 if LangID = '0419' then
  begin
    DescriptionTextWuauServ := '     Windows.   ,            -   Windows.';
    DispayNameTextWuauServ := ' ';
    DescriptionTextBITS := '         .   BITS ,  ,  Windows Update,    .';
    DispayNameTextBITS := '    (BITS)';
    AddToLog('  - ');
    FinishMsg := '   ';
    RestoreMsg := ' \: ';
    FixMsg := ' : ';
    CheckMsg := ' \: ';
    RegSectMsg := '  HKLM\';
    ParamMsg := ' ';
    ParamValueMsg := '  ';
    InRegSectMsg := '    HKLM\';
    CorrectMsg := '   .';
    RestMsg := '.';
  end
 else if LangID = '0409' then
  begin
    DescriptionTextWuauServ := 'Enables the download and installation of Windows updates. If this service is disabled, this computer will not be able to use the Automatic Updates feature or the Windows Update Web site.';
    DispayNameTextWuauServ := 'Automatic Updates'; 
    DescriptionTextBITS := 'Transfers data between clients and servers in the background. If BITS is disabled, features such as Windows Update will not work correctly.';
    DispayNameTextBITS := 'Background Intelligent Transfer Service';
    AddToLog('Operation system - english');
    FinishMsg := ' Restoration finished ';
    RestoreMsg := 'Sections\parameters restored: ';
    FixMsg := 'Parameters corrected: ';
    CheckMsg := 'Sections\parameters checked: ';
    RegSectMsg := 'Registry section HKLM\';
    ParamMsg := 'Parameter ';
    ParamValueMsg := 'Value of parameter ';
    InRegSectMsg := ' in registry section HKLM\';
    CorrectMsg := ' corrected on original.';
    RestMsg := ' restored.';
  end;
 AddToLog('');

{   X:\Windows\System32\ }
 NameFolderSystem32 := RegKeyStrParamRead('HKLM', 'SYSTEM\CurrentControlSet\Control\Windows', 'SystemDirectory');
 ImagePathStr := NameFolderSystem32 + '\svchost.exe -k netsvcs';
 Delete(NameFolderSystem32, 1, pos('\', NameFolderSystem32) - 1);
 FullPathSystem32 := GetEnvironmentVariable('WinDir') + NameFolderSystem32 + '\';
 
 AllRoots := 0;
 AllKeys := 0;
 RootsRestored := 0;
 KeysRestored := 0;
 KeysFixed := 0;

 CorrectRegistryRoot(DescriptionTextBITS, DispayNameTextBITS, 'BITS');
 CorrectRegistryRoot(DescriptionTextWuauServ, DispayNameTextWuauServ, 'wuauserv');

 AddToLog('');
 AddToLog(FinishMsg);
 AddToLog('');
 AddToLog(RestoreMsg + IntToStr(RootsRestored) + ' \ ' + IntToStr(KeysRestored));
 AddToLog(FixMsg + IntToStr(KeysFixed));
 AddToLog(CheckMsg + IntToStr(AllRoots) + ' \ ' + IntToStr(AllKeys));
 SaveLog(RegKeyStrParamRead('HKEY_CURRENT_USER', 'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', 'Desktop') + '\Correct_wuauserv&BITS.log');
end.