Newsgroup: it.comp.programmare.win32
Titolo: File lock

Avrei bisogno di scrivere una funzione-utility che determina i processi che 
hanno in uso un certo file (mi serve in particolare su un terminal server, 
come potrete immaginare).
Che voi sapete esiste questa possibilità?
-- 
---
In silenzio anche un idiota sembra intelligente. Ma non c'è problema,
l'idiota vuol sempre dire la sua.

 Che voi sapete esiste questa possibilità?
dovrebbe essere l'api
BOOL LockFile(
  HANDLE hFile,           // handle of file to lock
  DWORD dwFileOffsetLow,  // low-order word of lock region offset
  DWORD dwFileOffsetHigh,  // high-order word of lock region offset
  DWORD nNumberOfBytesToLockLow,
                          // low-order word of length to lock
  DWORD nNumberOfBytesToLockHigh
                          // high-order word of length to lock
);
ciao

 BOOL LockFile(
Mmmm... il contrario, dovrei sapere (in pratica) chi sta lockando il file.
Praticamente espongo il problema: ho un programma powerbuilder che usa un 
numero sconsiderato di librerie, decine di utenti che lo usano sullo stesso 
server, dovendo sostituire una libreria avrei bisogno di sapere quali 
processi la tengono lockata, buttando fuori solo il numero di utenti 
strettamente necessario.
Volevo fare una piccola utility per questo. 


 Volevo fare una piccola utility per questo.
ah,ecco
avevo capito male :-(
di preciso al momento non saprei,mi ricordo solo che con OpenProcess puoi
ottenere l'haldle dei vari processi e anche killarli
ora provo a dare un occhiata su msdn
ciao

 Volevo fare una piccola utility per questo.
Ho paura che dovrai inoltrarti nel campo del *non documentato*!
Kiuhnm

 Ho paura che dovrai inoltrarti nel campo del *non documentato*!
Sono già depresso... :-(
-- 
---
In silenzio anche un idiota sembra intelligente. Ma non c'è problema,
l'idiota vuol sempre dire la sua.

 Che voi sapete esiste questa possibilità?
http://www.sysinternals.com/ntw2k/freeware/procexp.shtml
Ciao.
--
BSD is for UNIX-lovers -- linux is for Windows-haters.

Volevo fare una piccola utility per questo. 
Di norma il SO ti dice solo se il file e' lokkato o meno.  Che io
sappia non c'e' modo di risalire al/i proprietario/i del lock.
Nel caso di una DLL credo sia possibile risalire al numero di lock
attivi, interrogando il registry, anche in questo caso pero' credo che
risalire ai proprietari sia dura.
ciao, acc.   
a...@libero.it

 sappia non c'e' modo di risalire al/i proprietario/i del lock.
A questo punto pensavo ad una app che monitorasse l'accesso ai suddetti 
file.
Purtroppo quelle librerie non sono dll ma librerie compilate in p-code, a 
cui l'eseguibile principale (o meglio, una vm) accede a modo suo... perņ vi 
accede solo quando deve usare un oggetto contenuto, per cui non č detto che 
l'exe in esecuzione lokki per forza una libreria, anzi. Spesso su 
installazioni TS mi capita di dover uccidere 50 sessioni per sostituire una 
libreria che magari č lokkata da un solo utente, e questo non č bello :-) 
-- 
---
In silenzio anche un idiota sembra intelligente. Ma non c'č problema,
l'idiota vuol sempre dire la sua.

 su un terminal server, come potrete immaginare).
prendi nthandle dal sito di Russinovich. L'ho usato spessissimo e 
funziona quasi sempre. Se serve, posso darti anche del codice per 
disattivare/controllare il mandatory locking (flag FILE_SHARE_*)
-- 
 < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
     Don't stand, REACT!      version 0.0.20. C, C++ and ASM developers
                              and beta testers are welcome!

 modo suo...
"purtroppo"? molto meglio. I veri eseguibili sono oggetto di una serie 
di limitazioni alquanto gratuite, con i file normali è più semplice
Guarda, la procedura ideale è questa:
 - attiva i privilegi SeRestorePrivilege e SeDebugPrivilege
 - apri il file in questione
 - salvati il security descriptor da qualche parte
 - cambia il security descriptor per consentire l'accesso solo a te
 - leggi l'i-node (o quello che è) del file
 - per ogni processo:
    - apri il processo
    - per ogni handle:
       - se è un file:
          - duplicalo nel tuo processo
          - leggi l'i-node (chiudi l'handle)
          - se corrisponde a quello salvato:
             - leggi in che sessione si trova e avverti l'utente? naaah
             - termina il processo (e qui ci sarebbe da andare cauti)
             - esci dal ciclo
    - chiudi il processo
 - sostituisci il file scrivendoci direttamente attraverso l'handle
 - ripristina il security descriptor salvato
 - chiudi il file
 - disattiva i privilegi
Le parti non documentate (ma fattibilissime) sono:
 - leggere l'i-node di un file
 - enumerare gli handle di un processo
 - determinare il tipo di oggetto puntato da un handle
Dimmi tu se per te vale la pena. Considera oltretutto che potrebbe 
richiedere un riavvio del server per un parametro del kernel che 
potrebbe essere necessario cambiare


 disattivare/controllare il mandatory locking (flag FILE_SHARE_*)
Ne sarei interessato. Se vuoi:
marco...@plangroup.it
