This source code file is available for download here: cmd_v12_2004_09_27.zip(~1 MB)
1: | program bexec; |
2: | |
3: | {$APPTYPE CONSOLE} |
4: | |
5: | uses |
6: | SysUtils,ExeHdr,Classes,basShell,Chip; |
7: | |
8: | function GetStream:TStream; |
9: | var dosHdr:TImageDosHeader; |
10: | var peHdr:TImageNTHeaders; |
11: | var peOfs:integer; |
12: | var i:integer; |
13: | var sec:TImageSectionHeader; |
14: | begin |
15: | Result:=TFileStream.Create(ParamStr(0),fmOpenRead or fmShareDenyWrite); |
16: | Result.ReadBuffer(dosHdr,sizeof(dosHdr)); |
17: | peOfs:=dosHdr.e_lfanew; |
18: | Result.Position:=peOfs; |
19: | Result.ReadBuffer(peHdr,sizeof(peHdr)); |
20: | |
21: | for i:=peHdr.FileHeader.NumberOfSections-1 downto 0 do begin |
22: | Result.Position:=peOfs+sizeof(TImageNTHeaders)+i*sizeof(TImageSectionHeader); |
23: | Result.ReadBuffer(sec,sizeof(sec)); |
24: | |
25: | if (sec.PointerToRawData<>0) and (sec.SizeOfRawData<>0) then begin |
26: | Result.Position:=sec.PointerToRawData+sec.SizeOfRawData; |
27: | exit |
28: | end |
29: | end; |
30: | Result.Free; |
31: | Result:=nil // TODO: |
32: | end; |
33: | |
34: | function Command:string; |
35: | var src:TStream; |
36: | begin |
37: | src:=GetStream; |
38: | if Assigned(src) then begin |
39: | SetLength(Result,src.Size-src.Position); |
40: | try |
41: | if Result<>'' then src.ReadBuffer(Result[1],Length(Result)) |
42: | finally |
43: | src.Free |
44: | end |
45: | end else |
46: | Result:='' |
47: | end; |
48: | |
49: | var Script:Chip.TBasic; |
50: | begin |
51: | Script:=basShell.TBasic.Create; |
52: | try |
53: | Script.input:=@input; |
54: | Script.output:=@output; |
55: | Script.Run(Command+#13#10'RUN') |
56: | finally |
57: | Script.Free |
58: | end |
59: | end. |