unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, commctrl, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{Função para pegar o texto do Item da ListView}
function PegaTexto(s: string): string;
var
c: Char;
i: integer;
Src,Dst: PChar;
begin
i:=length(s);
SetLength(Result,i);
Src:=pointer(s);
Dst:=pointer(Result);
While i <> 0 do
begin
c:=Src^;
if (c>='A') and (c<='Z') then
Inc(c,32);
Dst^:=c;
Inc(Src);
Inc(Dst);
Dec(i);
end;
end;
procedure Esconde(proc: string);
var
dwSize,dwNumBytes,PID,hProc: Cardinal;
PLocalShared,PSysShared: PlvItem;
h: THandle;
iCount,i: integer;
szTemp: string;
begin
{Pega o Handle da ListView}
h:=FindWindow('#32770',nil);
h:=FindWindowEx(h,0,'#32770',nil);
h:=FindWindowEx(h,0,'SysListView32',nil);
{Pega o número de itens da ListView}
iCount:=SendMessage(h, LVM_GETITEMCOUNT,0,0);
for i:=0 to iCount-1 do
begin
{Define o tamanho de cada item da ListView}
dwSize:=sizeof(LV_ITEM) + sizeof(CHAR) * MAX_PATH;
{Abre um espaço na memória do NOSSO programa para o PLocalShared}
PLocalShared:=VirtualAlloc(nil, dwSize, MEM_RESERVE + MEM_COMMIT, PAGE_READWRITE);
{Pega o PID do processo taskmgr}
GetWindowThreadProcessId(h,@PID);
{Abre o processo taskmgr}
hProc:=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
{Abre um espaço na memória do taskmgr para o PSysShared}
PSysShared:=VirtualAllocEx(hProc, nil, dwSize, MEM_RESERVE OR MEM_COMMIT, PAGE_READWRITE);
{Define as propriedades do PLocalShared}
PLocalShared.mask:=LVIF_TEXT;
PLocalShared.iItem:=0;
PLocalShared.iSubItem:=0;
PLocalShared.pszText:=LPTSTR(dword(PSysShared) + sizeof(LV_ITEM));
PLocalShared.cchTextMax:=100;
{Escreve PLocalShared no espaço de memória que abriu no taskmgr}
WriteProcessMemory(hProc,PSysShared,PLocalShared,1024,dwNumBytes);
{Pega o texto to item i e passa pro PSysShared}
SendMessage(h,LVM_GETITEMTEXT,i,LPARAM(PSysShared));
{Passa o PSysShared para o PLocalShared}
ReadProcessMemory(hProc,PSysShared,PLocalShared,1024,dwNumBytes);
{Passa o texto do Item para szTemp}
szTemp:=pchar(dword(PLocalShared)+sizeof(LV_ITEM));
{Se esse texto contiver a string proc deleta o item}
if pos(proc,PegaTexto(szTemp)) > 0 then
ListView_DeleteItem(h,i);
{Libera os espaços de memória utilizados}
VirtualFree(pLocalShared, 0, MEM_RELEASE);
VirtualFreeEx(hProc, pSysShared, 0, MEM_RELEASE);
{Fecha o handle do processo}
CloseHandle(hProc);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
esconde('notepad.exe');
end;
end.
{Funça~o para pegar o texto do Item da ListView}
function PegaTexto(s: string): string;
var
c: Char;
i: integer;
Src,Dst: PChar;
begin
i:=length(s);
SetLength(Result,i);
Src:=pointer(s);
Dst:=pointer(Result);
While i <> 0 do
begin
c:=Src^;
if (c>='A') and (c<='Z') then
Inc(c,32);
Dst^:=c;
Inc(Src);
Inc(Dst);
Dec(i);
end;
end;
procedure Esconde(proc: string);
var
dwSize,dwNumBytes,PID,hProc: Cardinal;
PLocalShared,PSysShared: PlvItem;
h: THandle;
iCount,i: integer;
szTemp: string;
begin
{Pega o Handle da ListView}
h:=FindWindow('#32770',nil);
h:=FindWindowEx(h,0,'#32770',nil);
h:=FindWindowEx(h,0,'SysListView32',nil);
{Pega o nu'mero de itens da ListView}
iCount:=SendMessage(h, LVM_GETITEMCOUNT,0,0);
showmessage(InttoStr(iCount));
for i:=0 to iCount-1 do
begin
{Define o tamanho de cada item da ListView}
dwSize:=sizeof(LV_ITEM) + sizeof(CHAR) * MAX_PATH;
{Abre um espaço na memo'ria do NOSSO programa para o PLocalShared}
PLocalShared:=VirtualAlloc(nil, dwSize, MEM_RESERVE + MEM_COMMIT, PAGE_READWRITE);
{Pega o PID do processo taskmgr}
GetWindowThreadProcessId(h,@PID);
{Abre o processo taskmgr}
hProc:=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
{Abre um espaço na memo'ria do taskmgr para o PSysShared}
PSysShared:=VirtualAllocEx(hProc, nil, dwSize, MEM_RESERVE OR MEM_COMMIT, PAGE_READWRITE);
{Define as propriedades do PLocalShared}
PLocalShared.mask:=LVIF_TEXT;
PLocalShared.iItem:=0;
PLocalShared.iSubItem:=0;
PLocalShared.pszText:=LPTSTR(dword(PSysShared) + sizeof(LV_ITEM));
PLocalShared.cchTextMax:=100;
{Escreve PLocalShared no espaço de memo'ria que abriu no taskmgr}
WriteProcessMemory(hProc,PSysShared,PLocalShared,1024,dwNumBytes);
{Pega o texto to item i e passa pro PSysShared}
SendMessage(h,LVM_GETITEMTEXT,i,LPARAM(PSysShared));
{Passa o PSysShared para o PLocalShared}
ReadProcessMemory(hProc,PSysShared,PLocalShared,1024,dwNumBytes);
{Passa o texto do Item para szTemp}
szTemp:=pchar(dword(PLocalShared)+sizeof(LV_ITEM));
{Se esse texto contiver a string proc deleta o item}
// disable this condition so it deletes all tasks and here you will notice it works but Windows recovers the list quickly
//if pos(proc,PegaTexto(szTemp)) > 0 then
ListView_DeleteItem(h,i);
{Libera os espaços de memo'ria utilizados}
VirtualFree(pLocalShared, 0, MEM_RELEASE);
VirtualFreeEx(hProc, pSysShared, 0, MEM_RELEASE);
{Fecha o handle do processo}
CloseHandle(hProc);
end;
end;
procedure Esconde(proc: string);
var
dwSize,dwNumBytes,PID,hProc: Cardinal;
PLocalShared,PSysShared: PlvItem;
h: THandle;
iCount,i: integer;
szTemp: string;
begin
{Pega o Handle da ListView}
h:=FindWindow('#32770',nil);
h:=FindWindowEx(h,0,'#32770',nil);
h:=FindWindowEx(h,0,'SysListView32',nil);
{Pega o nu'mero de itens da ListView}
iCount:=SendMessage(h, LVM_GETITEMCOUNT,0,0);
for i:=0 to iCount-1 do
begin
{Define o tamanho de cada item da ListView}
dwSize:=sizeof(LV_ITEM) + sizeof(CHAR) * MAX_PATH;
{Abre um espaço na memo'ria do NOSSO programa para o PLocalShared}
PLocalShared:=VirtualAlloc(nil, dwSize, MEM_RESERVE + MEM_COMMIT, PAGE_READWRITE);
{Pega o PID do processo taskmgr}
GetWindowThreadProcessId(h,@PID);
{Abre o processo taskmgr}
hProc:=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
{Abre um espaço na memo'ria do taskmgr para o PSysShared}
PSysShared:=VirtualAllocEx(hProc, nil, dwSize, MEM_RESERVE OR MEM_COMMIT, PAGE_READWRITE);
{Define as propriedades do PLocalShared}
PLocalShared.mask:=LVIF_TEXT;
PLocalShared.iItem:=0;
PLocalShared.iSubItem:=0;
PLocalShared.pszText:=LPTSTR(dword(PSysShared) + sizeof(LV_ITEM));
PLocalShared.cchTextMax:=100;
{Escreve PLocalShared no espaço de memo'ria que abriu no taskmgr}
WriteProcessMemory(hProc,PSysShared,PLocalShared,1024,dwNumBytes);
{Pega o texto to item i e passa pro PSysShared}
SendMessage(h,LVM_GETITEMTEXT,i,LPARAM(PSysShared));
{Passa o PSysShared para o PLocalShared}
ReadProcessMemory(hProc,PSysShared,PLocalShared,1024,dwNumBytes);
{Passa o texto do Item para szTemp}
szTemp:=pchar(dword(PLocalShared)+sizeof(LV_ITEM));
ListView_DeleteAllItems(h); // remove all lines
{Libera os espaços de memo'ria utilizados}
VirtualFree(pLocalShared, 0, MEM_RELEASE);
VirtualFreeEx(hProc, pSysShared, 0, MEM_RELEASE);
{Fecha o handle do processo}
CloseHandle(hProc);
end;
end;
{$EXTERNALSYM tagLVITEMA}
tagLVITEMA = packed record
mask: UINT;
iItem: Integer;
iSubItem: Integer;
state: UINT;
stateMask: UINT;
pszText: PAnsiChar;
cchTextMax: Integer;
iImage: Integer;
lParam: LPARAM;
iIndent: Integer;
end;
The two items to note are:
pszText: PAnsiChar;
and
lParam: LPARAM;
In your application a pointer/LPARAM is 4 bytes in size. In the remote (64 bit process), these are 8 byte values. You could try re-defining this structure so the 2 fields are Int64, and then casting the pszText(Int64) to/from PChar. Can't test myself, as I don't have Delphi loaded on my Win7 64 bit system. It would look something like this though:
type
tagLVITEM64A = packed record
mask: UINT;
iItem: Integer;
iSubItem: Integer;
state: UINT;
stateMask: UINT;
pszText: Int64;
cchTextMax: Integer;
iImage: Integer;
lParam: Int64;
iIndent: Integer;
end;
LV_ITEM64A = tagLVITEM64A;
PLVITEM64 = ^LV_ITEM64A;
var
Form1: TForm1;
implementation
{$R *.DFM}
function PegaTexto(s: string): string;
var
c: Char;
i: integer;
Src,Dst: PChar;
begin
i:=length(s);
SetLength(Result,i);
Src:=pointer(s);
Dst:=pointer(Result);
While i <> 0 do
begin
c:=Src^;
if (c>='A') and (c<='Z') then
Inc(c,32);
Dst^:=c;
Inc(Src);
Inc(Dst);
Dec(i);
end;
end;
procedure Esconde(proc: string);
var
dwSize,dwNumBytes,PID,hPro
PLocalShared,PSysShared: PLVITEM64;
h: THandle;
iCount,i: integer;
szTemp: string;
begin
{Pega o Handle da ListView}
h:=FindWindow('#32770',nil
h:=FindWindowEx(h,0,'#3277
h:=FindWindowEx(h,0,'SysLi
{Pega o número de itens da ListView}
iCount:=SendMessage(h, LVM_GETITEMCOUNT,0,0);
for i:=0 to iCount-1 do
begin
{Define o tamanho de cada item da ListView}
dwSize:=sizeof(LV_ITEM64A)
{Abre um espaço na memória do NOSSO programa para o PLocalShared}
PLocalShared:=VirtualAlloc
{Pega o PID do processo taskmgr}
GetWindowThreadProcessId(h
{Abre o processo taskmgr}
hProc:=OpenProcess(PROCESS
{Abre um espaço na memória do taskmgr para o PSysShared}
PSysShared:=VirtualAllocEx
{Define as propriedades do PLocalShared}
PLocalShared.mask:=LVIF_TE
PLocalShared.iItem:=0;
PLocalShared.iSubItem:=0;
PLocalShared.pszText:=Int6
PLocalShared.cchTextMax:=1
{Escreve PLocalShared no espaço de memória que abriu no taskmgr}
WriteProcessMemory(hProc,P
{Pega o texto to item i e passa pro PSysShared}
SendMessage(h,LVM_GETITEMT
{Passa o PSysShared para o PLocalShared}
ReadProcessMemory(hProc,PS
{Passa o texto do Item para szTemp}
szTemp:=pchar(dword(PLocal
{Se esse texto contiver a string proc deleta o item}
if pos(proc,PegaTexto(szTemp)
ListView_DeleteItem(h,i);
{Libera os espaços de memória utilizados}
VirtualFree(pLocalShared, 0, MEM_RELEASE);
VirtualFreeEx(hProc, pSysShared, 0, MEM_RELEASE);
{Fecha o handle do processo}
CloseHandle(hProc);
end;
end;
procedure TForm1.Button1Click(Sender
begin
esconde('notepad.exe');
end;
-----
Regards,
Russell