gpt4 book ai didi

multithreading - Delphi XE2中的异步ReadFile

转载 作者:行者123 更新时间:2023-12-03 18:37:57 24 4
gpt4 key购买 nike

我正在写一个小型的PE文件分析器,我必须阅读PE文件的内容。我正在通过ReadFile函数执行此操作,如下所示:

function TMainForm.GetPEData(var filename: string) : boolean;
var
hFile: DWORD;
IDH: TImageDosHeader;
INH: TImageNtHeaders;
ISH: TImageSectionHeader;
dwRead: DWORD;
szBuff: array[0..7] of Char;
i: WORD;
PE: TPEFile;
begin
Result := False;
PE := TPeFile.Create;
if PE.LoadFromFile (filename) then
Form2.edEntryPoint.Text := IntToHex(PE.RvaToFileOffset(PE.AddressOfEntryPoint), 8);
SplashScreen.sLabel1.Caption := 'PE File Loaded';
hFile := CreateFile(PChar(filename), GENERIC_READ,
FILE_SHARE_WRITE, nil,
OPEN_EXISTING, 0, 0);
if hFile <> INVALID_HANDLE_VALUE then
begin
SetFilePointer(hFile, 0, nil, FILE_BEGIN);
SplashScreen.sLabel1.Caption := 'Reading DOS File Headers...';
ReadFile(hFile, IDH, 64, dwRead, nil);
if IDH.e_magic = IMAGE_DOS_SIGNATURE then
begin
SetFilePointer(hFile, IDH._lfanew, nil, FILE_BEGIN);
SplashScreen.sLabel1.Caption := 'Reading NT File Headers...';
//Here is where the UI freezes while the file is read...
ReadFile(hFile, INH, 248, dwRead, nil);
if INH.Signature = IMAGE_NT_SIGNATURE then
begin
Form2.edImageBase.Text := IntToHex(INH.OptionalHeader.ImageBase, 8);
Form2.edSizeOfImage.Text := IntToHex(INH.OptionalHeader.SizeOfImage, 8);
Form2.edLinkerVersion.Text := IntToStr(INH.OptionalHeader.MajorLinkerVersion) + '.' +
IntToStr(INH.OptionalHeader.MinorLinkerVersion);
Form2.edFileAlignment.Text := IntToHex(INH.OptionalHeader.FileAlignment, 8);
Form2.edSectionAlignment.Text := IntToHex(INH.OptionalHeader.SectionAlignment, 8);
Form2.edSubSystem.Text := IntToHex(INH.OptionalHeader.Subsystem, 4);
Form2.edEPFilestamp.Text := IntToStr(INH.FileHeader.TimeDateStamp);
Form2.edFileType.Text := GetPEFileType(PE.ImageNtHeaders.Signature);

for i := 0 to INH.FileHeader.NumberOfSections - 1 do
begin
SetFilePointer(hFile, IDH._lfanew + 248 + i * 40, nil, FILE_BEGIN);
ReadFile(hFile, ISH, 40, dwRead, nil);
CopyMemory(@szBuff[0], @ISH.Name[0], 8);

with Form2.sListView1.Items.Add do
begin
Caption := ShortString(szBuff);
SubItems.Add(IntToHex(ISH.VirtualAddress, 8));
SubItems.Add(IntToHex(ISH.Misc.VirtualSize, 8));
SubItems.Add(IntToHex(ISH.PointerToRawData, 8));
SubItems.Add(IntToHex(ISH.SizeOfRawData, 8));
SubItems.Add(IntToHex(ISH.Characteristics, 8));
end;
end;
end;
end;
CloseHandle(hFile);
Result := True;
end;
end;

坏事是,我注意到,取决于文件的大小, ReadFile通常会滞后-并且它是同步发生的。同时,UI冻结并给用户带来可怕的错误,他们很想终止它。我已经考虑过线程化,但是我只想看看是否有任何方法可以在异步模式下使用 ReadFile。如果没有,即使代码中有很多需要修改的地方,我也会跳转到线程。

先感谢您。

最佳答案

在这种情况下,我总是将整个文件读取到内存中,并且我使用TFileStream类来简化操作。

将整个文件保存在内存中比较简单,PE文件通常很小。

  type
TSections = array [0..0] of TImageSectionHeader;
PSections = ^TSections;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
FS : TFileStream;
fisier : PImageDosHeader;
INH : PImageNtHeaders;
ISH : PSections;
i : Word;
begin
FS := TFileStream.Create('fisierul_tau.exe',fmOpenRead);
GetMem(fisier,FS.size); //Aloci memorie pentru fisier
FS.Read(fisier^,FS.Size); // Il citesti;
FS.Free;
INH := PImageNtHeaders(DWORD(fisier) + DWORD(fisier^._lfanew));
ISH := PSections(DWORD(INH) + SizeOf(TImageNtHeaders));
for i := 0 to INH^.FileHeader.NumberOfSections - 1 do
begin
ShowMessage(PAnsiChar(@ISH[i].Name[0]));
end;
end;

关于multithreading - Delphi XE2中的异步ReadFile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11529639/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com