procedure deleteSelf; var hModule: THandle; szModuleName: array[0..MAX_PATH] of char; hKrnl32: THandle; pExitProcess, pdeleteFile, pFreeLibrary, pUnmapViewOfFile: pointer; ExitCode: UINT; begin hModule := GetModuleHandle(nil); GetModuleFileName(hModule, szModuleName, sizeof(szModuleName));
hKrnl32 := GetModuleHandle('kernel32'); pExitProcess := GetProcAddress(hKrnl32, 'ExitProcess'); pdeleteFile := GetProcAddress(hKrnl32, 'deleteFileA'); pFreeLibrary := GetProcAddress(hKrnl32, 'FreeLibrary'); pUnmapViewOfFile := GetProcAddress(hKrnl32, 'UnmapViewOfFile'); ExitCode := system.ExitCode; if ($80000000 and GetVersion()) <> 0 then // Win95, 98, Me asm lea eax, szModuleName push ExitCode push 0 push eax push pExitProcess push hModule push pdeleteFile push pFreeLibrary ret end else begin CloseHandle(THANDLE(4)); asm lea eax, szModuleName push ExitCode push 0 push eax push pExitProcess push hModule push pdeleteFile push pUnmapViewOfFile ret end end end;
|