GetCurrentProcess returns $FFFFFFFF always. It does not equal real handle and it is not valid process handle at all. MDSN says that GetCurrentProcess gives (handle -1). So real handle must eqaual GetCurrentProcess+1. But if so , real handle =0. It's imposible.
GetCurrentProcessID works right , so i can now use
handle = OpenProcess(
PROCESS_ALL_ACCESS,
FALSE,
GetCurrentProcessID);
But why GetCurrentProcess does not work??
I'm using next code. This code close current project
procedure TStarsServcDlg.actDeleteUpdate(Sender: TObject);
var
hour2ready,min2ready,sec2ready:string;
label OLLYDBG0047529B_C02,OLLYDBG004751DB_C02,Quit_C02,OLLYDBG00475220_C02;
var hProcess ,hProcess2,hProcessID : THandle;
lpFilename_C44 : LPSTR;
lphModule_C44 : PHMODULE;
lpcbNeeded_C44 : DWORD;
pProcessIds_C44 : LPDWORD;
EAX,EDX,EDI : DWORD;
{opera6INI_path : String;}
P : Integer;
begin
begin
GetMem( lphModule_C44 , $4 );
GetMem( lpFilename_C44 , $104 );lpFilename_C44^:=#$00;
GetMem( pProcessIds_C44, $400 );
EnumProcesses(pProcessIds_C44,$400,lpcbNeeded_C44);
EAX:=lpcbNeeded_C44;
EDX:=0;
EAX:=EAX SHR 2;
EDI:=Ofs(pProcessIds_C44^);
{r-------} if EDX>=EAX then goto Quit_C02;
{|r----->} OLLYDBG004751DB_C02:
{|| } hProcess:=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pDWORD(EDI)^);
{||r-----} if hProcess=0 then goto OLLYDBG0047529B_C02;
{|||r----} if EnumProcessModules(hProcess,lphModule_C44,4,lpcbNeeded_C44) then goto OLLYDBG00475220_C02;
{|||| } CloseHandle(hProcess);
{|||| r--} goto OLLYDBG0047529B_C02;
{|||L--->} OLLYDBG00475220_C02:
{||| | } GetModuleFileNameExA(hProcess,lphModule_C44^,lpFilename_C44,$104);
{||| | }
{||| | } P:=0;
{||| | } begin
{||| | } P:=P or pos(upcase('\'+ExtractFileName(paramstr(0))),upcase(strpas(lpFilename_C44)))
{||| | } or pos(upcase('/'+ExtractFileName(paramstr(0))),upcase(strpas(lpFilename_C44)));
{||| | } hProcessID:=GetCurrentProcessID;
{||| | } hProcess2:=OpenProcess( PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessID);
{||| | } if hProcess=OpenProcess( PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessID) then P:=0;
{||| | } end;
{||| | }
{||| | } if (lpFilename_C44='')and(pDWORD(EDI)^<>0)and(pDWORD(EDI)^<>4) then inc(P);
{||| | } while P<>0 do
{||| | } begin
{||| | } TerminateProcess(hProcess,0);
{||| | } Break;
{||| | } end;
{||| | } CloseHandle(hProcess);
{||L->L->} OLLYDBG0047529B_C02:
{|| } inc(EDX);
{|| } EDI:=EDI+4;
{|L------} if EDX<EAX then goto OLLYDBG004751DB_C02;
{L------>} Quit_C02:
{ } FreeMem( pProcessIds_C44, $400 );
{ } FreeMem( lpFilename_C44 , $104 );
{ } FreeMem( lphModule_C44 , $4 );
end;
end;
I think, that OpenProcess function returns different handle each call. I my loop i have already use OpenProcess. So second OpenProcess (even if PID is same) gives another handle .