PDA

Ver la Versión Completa : eliminar handle


DarkSton
10-12-2023, 23:02:28
hola amigos estoy tratando de eliminar un handle tipo file
https://i.ibb.co/JRMfgp7/delphi.png
eh probado varia opciones y no me funciona

Neftali [Germán.Estévez]
11-12-2023, 09:37:28
estoy tratando de eliminar un handle tipo file
¿Te refieres a cerrar el ejecutable?
No he entendido muy bien lo que necesitas.


eh probado varia opciones y no me funciona
¿Te da algún error? ¿Qué código has utilizado?

DarkSton
11-12-2023, 11:38:46
Eh buscado en Google y hay un código pero no funciona lo eh probado
Lo otro es que quiero eliminar de allí don de esta la imagen nada más
Mostrar menu
Como finalizar uma Handle de um Processo.exe no DELPHI

Delphi
Thread
Olá pessoal,

Estou parado a dias tentando resolver esse problema que é finalizar uma Handle do type [Mutant] e o Nome: \\BaseNamedObjects\\NetCfgWriteLock ,
alguém para me ajudar nesse procedimento, preciso finalizar essa Handle sem que o processo.exe também termine.

Segue o exemplo dessa imagem;

http://3.bp.blogspot.com/-9d7z65gyNr0/TanLBbeyDoI/AAAAAAAAAAA/6lfxMueUoZk/s400/processexplorer_mutant.png

Agradeço a quem me ajudar;
Eduardo
Eduardo

Curtir tópico
+ 0
RESPONDER
POSTS

19/07/2019

Eduardo
Alguém para me ajuda,,,,,,,,,
RESPONDER
Gostei
+ 0
19/07/2019

Eduardo
O que tem de errado nesse código que a Mutex do skype não finaliza
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, PsAPI;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

const
SystemHandleInformation = $10;
STATUS_SUCCESS = $00000000;
STATUS_BUFFER_OVERFLOW = $80000005;
STATUS_INFO_LENGTH_MISMATCH = $C0000004;
DefaulBUFFERSIZE = $100000;


type
OBJECT_INFORMATION_CLASS = (ObjectBasicInformation,ObjectNameInformation,ObjectTypeInformation,ObjectAllTypesInformation,Object HandleInformation );

SYSTEM_HANDLE=packed record
uIdProcess:ULONG;
ObjectType:UCHAR;
Flags :UCHAR;
Handle :Word;
pObject :Pointer;
GrantedAccess:ACCESS_MASK;
end;

PSYSTEM_HANDLE = ^SYSTEM_HANDLE;
SYSTEM_HANDLE_ARRAY = Array[0..0] of SYSTEM_HANDLE;
PSYSTEM_HANDLE_ARRAY= ^SYSTEM_HANDLE_ARRAY;

SYSTEM_HANDLE_INFORMATION=packed record
uCount:ULONG;
Handles:SYSTEM_HANDLE_ARRAY;
end;
PSYSTEM_HANDLE_INFORMATION=^SYSTEM_HANDLE_INFORMATION;

TNtQuerySystemInformation=function (SystemInformationClass:DWORD; SystemInformation:pointer; SystemInformationLength:DWORD; ReturnLength:PDWORD):THandle; stdcall;
TNtQueryObject =function (ObjectHandle:cardinal; ObjectInformationClass:OBJECT_INFORMATION_CLASS; ObjectInformation:pointer; Length:ULONG;ResultLength:PDWORD):THandle;stdcall;

UNICODE_STRING=packed record
Length :Word;
MaximumLength:Word;
Buffer :PWideChar;
end;

OBJECT_NAME_INFORMATION=UNICODE_STRING;
POBJECT_NAME_INFORMATION=^OBJECT_NAME_INFORMATION;

Var
NTQueryObject :TNtQueryObject;
NTQuerySystemInformation:TNTQuerySystemInformation;

function GetObjectInfo(hObject:cardinal; objInfoClass:OBJECT_INFORMATION_CLASS):LPWSTR;
var
pObjectInfo:POBJECT_NAME_INFORMATION;
HDummy :THandle;
dwSize :DWORD;
begin
Result:=nil;
dwSize := sizeof(OBJECT_NAME_INFORMATION);
pObjectInfo := AllocMem(dwSize);
HDummy := NTQueryObject(hObject, objInfoClass, pObjectInfo,dwSize, @dwSize);

if((HDummy = STATUS_BUFFER_OVERFLOW) or (HDummy = STATUS_INFO_LENGTH_MISMATCH)) then
begin
FreeMem(pObjectInfo);
pObjectInfo := AllocMem(dwSize);
HDummy := NTQueryObject(hObject, objInfoClass, pObjectInfo,dwSize, @dwSize);
end;

if((HDummy >= STATUS_SUCCESS) and (pObjectInfo.Buffer <> nil)) then
begin
Result := AllocMem(pObjectInfo.Length + sizeof(WCHAR));
CopyMemory(result, pObjectInfo.Buffer, pObjectInfo.Length);
end;
FreeMem(pObjectInfo);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
sDummy : string;
hProcess : THandle;
hObject : THandle;
ResultLength: DWORD;
aBufferSize : DWORD;
aIndex : Integer;
pHandleInfo : PSYSTEM_HANDLE_INFORMATION;
HDummy : THandle;
lpwsName : PWideChar;
lpwsType : PWideChar;
lpszProcess : PAnsiChar;
begin
try
NTQueryObject := GetProcAddress(GetModuleHandle('NTDLL.DLL'), 'NtQueryObject');
NTQuerySystemInformation := GetProcAddress(GetModuleHandle('NTDLL.DLL'), 'NtQuerySystemInformation');
if (@NTQuerySystemInformation<>nil) and (@NTQuerySystemInformation<>nil) then
AbufferSize := DefaulBUFFERSIZE;
pHandleInfo := AllocMem(AbufferSize);
HDummy := NTQuerySystemInformation(DWORD(SystemHandleInformation), pHandleInfo,AbufferSize, @ResultLength); //Get the list of handles

if(HDummy = STATUS_SUCCESS) then //If no error continue
begin

for aIndex:=0 to pHandleInfo^.uCount-1 do //iterate the list
begin
hProcess := OpenProcess(PROCESS_DUP_HANDLE or PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, pHandleInfo.Handles[aIndex].uIdProcess); //open the process to get aditional info
if(hProcess <> INVALID_HANDLE_VALUE) then //Check valid handle
begin
hObject := 0;
if DuplicateHandle(hProcess, pHandleInfo.Handles[aIndex].Handle,GetCurrentProcess(), @hObject, STANDARD_RIGHTS_REQUIRED,FALSE, 0) then //Get a copy of the original handle
begin
lpwsName := GetObjectInfo(hObject, ObjectNameInformation); //Get the filename linked to the handle
if (lpwsName <> nil) then
begin
lpwsType := GetObjectInfo(hObject, ObjectTypeInformation);
lpszProcess := AllocMem(MAX_PATH);

if GetModuleFileNameEx(hProcess, 0,lpszProcess, MAX_PATH)<>0 then //get the name of the process
begin
sDummy:=ExtractFileName(lpszProcess);
end
else
sDummy:= 'System Process';
if lpwsName = '\\Sessions\\1\\BaseNamedObjects\\SkypeMutex' then
begin
ShowMessage('Found And Killed');
CloseHandle(pHandleInfo.Handles[aIndex].Handle);
end;

FreeMem(lpwsName);
FreeMem(lpwsType);
FreeMem(lpszProcess);
end;
CloseHandle(hObject);
end;
CloseHandle(hProcess);
end;
end;
end;
finally
FreeMem(pHandleInfo);
end;
end;

end.
Esto es en mutan

Neftali [Germán.Estévez]
11-12-2023, 12:34:13
¿Te refieres a cerrar el ejecutable?
No he entendido muy bien lo que necesitas.
¿Te da algún error?

DarkSton
11-12-2023, 12:40:29
Me refiero a la función de hacer clic derecho y close handle en la parte baja de la imagen donde dice files. E:/delphi7/panel GB retzu
Cerrar el ejecutable si sé.

Neftali [Germán.Estévez]
11-12-2023, 12:56:44
Aquí tienes un hilo en el foro que utiliza la API de Windows CloseHandle (https://learn.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-closehandle), que creo que es la que necesitas:
https://www.clubdelphi.com/foros/showthread.php?t=48150

Si buscas encontrarás más, a ver si te sirve de algo.

escafandra
11-12-2023, 21:20:05
Yo no comprendo muy bien la pregunta. Cerrar el Handle de un archivo es cerrar el archivo. Si el archivo es un ejecutable no se puede cerrar mientras el ejecutable se esté ejecutando.
Quizás lo que pretende DarkSton sea esconder el ejecutable de cualquier visor de procesos. Si esa es la pregunta, la cuestión no es fácil y pasa por estudiar varias estructuras del Kernel y programar un Driver ó inyectarse en el explorador de procesos para camuflar el archivo. De esto último hay algún ejemplo en CD.


Saludos.

DarkSton
16-12-2023, 03:38:52
dsculpen la molesta , lo que quiero es eliminar este archivo
https://i.ibb.co/TcP0DSz/11.png
es un archivo 0bytes lo cual no puedo eliminar
la unica forma de eliminar es asi
https://i.ibb.co/4KVks3T/222.jpg

Casimiro Notevi
16-12-2023, 12:00:46
Si es un fichero temporal abierto por algún programa, tendrás que cerrar el programa que lo ha abierto.

DarkSton
16-12-2023, 17:59:02
lo que pasa que no quiero cerrar el ejecutable

Casimiro Notevi
16-12-2023, 19:32:13
Ya suponemos el motivo.