Ir al contenido



Foto

Monitorizando el Shell sólo con la API


  • Por favor identifícate para responder
26 respuestas en este tema

#21 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.012 mensajes
  • LocationSanto Domingo

Escrito 19 septiembre 2015 - 01:03

 

Comienza el Monitor

Archivo nuevo: C:\Users\compualarma\AppData\Roaming\Microsoft\Windows\Recent\esca.lnk
Archivo borrado: C:\Users\compualarma\Desktop\esca.txt
Archivo nuevo: C:\Users\compualarma\Desktop\esca.txt
C:\Users\compualarma\Desktop\esca.txt
Archivo borrado: C:\Users\compualarma\Desktop\esca.txt
Archivo nuevo: C:\Users\compualarma\Desktop\esca.txt
C:\Users\compualarma\Desktop\esca.txt

  • 0

#22 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.837 mensajes
  • LocationMadrid - España

Escrito 19 septiembre 2015 - 03:51

Vale, el Monitor funciona como se esperaba. El notepad ha escrito el archivo y el monitor lo ha detectado bien. Pienso que es un problema de usuario. El Shell no es informado cuando un programa "ejecutado como" otro usuario realiza cambios el el sistema de archivos. Esto lo puedes comprobar arrancando una copia de explorer.exe ejecutado como otro usuario. Puedes experimentar abriendo una consola y en ella ejecutas lo siguiente:


php
  1. runas /user:otro_usuario "explorer.exe /separate"

La nueva shell abierta es del otro_usuario. Si en ella borras un archivo, te darás cuenta que no recibe la notificación y el archivo, aunque borrado, sigue apareciendo hasta que pulsas F5 y se actualiza.

 

Investiga como se está ejecutando ese programa de llamadas telefónicas, si tiene un servicio, etc...

 

 

Saludos.


  • 0

#23 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.012 mensajes
  • LocationSanto Domingo

Escrito 20 septiembre 2015 - 12:32

He verificado que estan abiertas con el mismo usuario. No veo ningun servicio que corresponda a este programa y aun asi no detecta nada.

luego lo probare con otra computadora para verificar. Mientras será poner un timer que revise el directorio correspondiente y compararlo con el ultimo archivo grabado. 


  • 0

#24 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.837 mensajes
  • LocationMadrid - España

Escrito 20 septiembre 2015 - 12:44

He estado preparando un prototipo con la API ReadDirectoryChangesW en un Thread. El prototipo detecta los cambios ocurridos en una carpeta aunque se ejecute desde otro usuario y es independiente de las notificaciones del Shell.
 
Este el el código:

delphi
  1. procedure TDirMonitor.ScanNotification2(Dir: WideString);
  2. var
  3.   hDir: THANDLE;
  4.   Filter: DWORD;
  5.   BytesReturned: DWORD;
  6. begin
  7.   ZeroMemory(@OVL, sizeof(OVERLAPPED));
  8.   hDir:= CreateFileW(PWCHAR(Dir), FILE_LIST_DIRECTORY,
  9.                      FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,
  10.                      nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS or FILE_FLAG_OVERLAPPED, 0);
  11.  
  12.   Filter:= FILE_NOTIFY_CHANGE_FILE_NAME or
  13.            FILE_NOTIFY_CHANGE_DIR_NAME or
  14.            FILE_NOTIFY_CHANGE_ATTRIBUTES or
  15.            FILE_NOTIFY_CHANGE_SIZE or
  16.            FILE_NOTIFY_CHANGE_LAST_WRITE or
  17.            FILE_NOTIFY_CHANGE_CREATION or
  18.            FILE_ACTION_ADDED or
  19.            FILE_ACTION_REMOVED or
  20.            FILE_ACTION_MODIFIED;
  21.  
  22.   SizeFI:= 1024;
  23.   FI:= AllocMem(SizeFI);
  24.   OVL.hEvent:= CReateEvent(nil, true, false, nil);
  25.   BytesReturned:= 0;
  26.  
  27.   while not Terminated and ReadDirectoryChangesW(hDir, FI, SizeFI, false, Filter, @BytesReturned, @OVL, nil) do
  28.   begin
  29.     GetOverlappedResult(hDir, OVL, BytesReturned, TRUE);
  30. ResetEvent(OVL.hEvent);
  31.     if BytesReturned > 0 then
  32.       Synchronize(SetNotify);
  33.   end;
  34.  
  35.   FreeMem(FI);
  36.   FI:= nil;
  37.   CloseHandle(hDir);
  38.   CloseHandle(OVL.hEvent);
  39. end;



Te subo un adunto para pruebas.
 
 
Saludos.

Archivos adjuntos


  • 1

#25 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.012 mensajes
  • LocationSanto Domingo

Escrito 21 septiembre 2015 - 09:16

Si le Pongo la Ruta completa del directorio funciona perfecto: 

esta es la ruta que puse: C:\U2_V3.11\usb-record\2015\09\21

 

 

File added:  2015-09-21_10-24-33_000.mp3

File modified:  2015-09-21_10-24-33_000.mp3
File renamed, old name:  2015-09-21_10-24-33_000.mp3
File renamed, new name:  2015-09-21_10-24-33_000_8095320327.mp3
File modified:  2015-09-21_10-24-33_000_8095320327.mp3
 

 

si pongo la ruta sin el dia:

C:\U2_V3.11\usb-record\2015\09

me sale lo siguiente:

 

File modified:  21

File modified:  21
File modified:  21

 

si le pongo solo la ruta con solo el año no detecta nada.


  • 0

#26 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.837 mensajes
  • LocationMadrid - España

Escrito 21 septiembre 2015 - 09:25

Eso es debido a que el código está configurado para no explorar subdirectorios, pero con un simple true se cambia en 10 segundos:

delphi
  1. ReadDirectoryChangesW(hDir, FI, SizeFI, TRUE, Filter, @BytesReturned, @OVL, nil)



El programita que he publicado no está muy pulido, lo escribí muy rápido ayer después de comprobar el manejo de la API ReadDirectoryChangesW. Es muy completa y con múltiples formas de uso.

Parece que la API ReadDirectoryChangesW da respuesta a tu necesidad.


Saludos.
  • 0

#27 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.012 mensajes
  • LocationSanto Domingo

Escrito 21 septiembre 2015 - 10:00

Gracias Esca por toda tu ayuda, eres invaluable.  

 

voy a realizar el cambio y te estare informando del avance.

 

gracias de nuevo por todo tu esfuerzo. (y)


  • 0