Delphi编译器生成代码问题
kongfoo/2004.4.29
版本:7.0 build 4.453(D版)
以前写代码时就遇到过ReadFile不能成功调用的问题,都是不了了之。
今天又要用ReadFile,跟踪一下发现是编译器生成代码出问题了。
调用代码:
pMem:=GlobalAlloc(...);
ReadFile(hFile,pMem,fileSize,readed,nil)
第二个参数是缓冲区的handle,按理说这样的调用应该成功,但编译
生成的代码却是这样:
lea eax,[ebp-x]
push eax
传入的却是放handle的地址。把lea改成mov才能成功调用。
完整代码:
try
hFile:=CreateFile(pchar(cb1.Text),GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,0,0);
fileSize:=GetFileSize(hFile,nil);
pMem:=GlobalAlloc(GMEM_FIXED + GMEM_ZEROINIT,fileSize);
asm //编译器生成的ReadFile有BUG,要改它的代码才能调用成功
call @@1
@@1:
pop eax
mov memAddr,eax
end;
VirtualQuery(pointer(memAddr),mbi,1024);
VirtualProtect(pointer(memAddr),1024,PAGE_READWRITE,@mbi);
asm
call @@2
@@2:
pop eax
mov byte ptr [eax+12],$8b //打补丁后传入ReadFile的才是正确参数
end;
ReadFile(hFile,pMem,fileSize,d,nil);
finally
GlobalFree(pMem);
CloseHandle(hFile);
end;
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课