Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   eliminar handle (https://www.clubdelphi.com/foros/showthread.php?t=96538)

DarkSton 10-12-2023 23:02:28

eliminar handle
 
hola amigos estoy tratando de eliminar un handle tipo file

eh probado varia opciones y no me funciona

Neftali [Germán.Estévez] 11-12-2023 09:37:28

Cita:

Empezado por DarkSton (Mensaje 553525)
estoy tratando de eliminar un handle tipo file

¿Te refieres a cerrar el ejecutable?
No he entendido muy bien lo que necesitas.


Cita:

Empezado por DarkSton (Mensaje 553525)
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
Código Delphi [-]
   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/-9d7z65gyNr...rer_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, 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

es un archivo 0bytes lo cual no puedo eliminar
la unica forma de eliminar es asi

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.


La franja horaria es GMT +2. Ahora son las 05:28:34.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi