Вниз
Скачать: CL | DM;

Кто держит файл   Найти похожие ветки 

 
GROL ©   (2003-09-15 22:49) [0]

Пытаюсь в программе удалить папку с файлами, но те могут быть кем то заняты, к примеру, doc-и вордом, и соответственно не удалятся. Есть ли способ определить, какая программа "держит" файл?


 
NightAngel ©   (2003-09-15 23:00) [1]

Есть, и даже не один. Всё зависит от того под какую платформу это нужно сделать.


 
GROL ©   (2003-09-15 23:20) [2]

Под все Win


 
GROL ©   (2003-09-16 20:15) [3]

Ну и че, типа можно, но как, ни кто не в курсе?


 
NightAngel ©   (2003-09-16 22:49) [4]

Способ номер раз:
При помощи ф-ции ZwQuerySystemInformation получить SystemHandleInformation, далее пройтись по всем полученным handle, отобразить их в свой процесс и исследовать (не забывая их закрывать, а то таблица описателей разрастётся, а также будет заблокирована на время работы своего процесса возможность уничтожения объектов).

Способ номер два:
Более трудный, но более быстрый. Надо написать свой драйвер, получить через handle указатель на объект (ObReferenceObjectByHandle), далее получить указатель на заголовок объекта (по смещению - 0x18 ниже адреса объекта).
typedef struct _OBJECT_HEADER
{
/*000*/ DWORD PointerCount; // number of references
/*004*/ DWORD HandleCount; // number of open handles
/*008*/ POBJECT_TYPE ObjectType;
/*00C*/ BYTE NameOffset; // -> OBJECT_NAME
/*00D*/ BYTE HandleDBOffset; // -> OBJECT_HANDLE_DB
/*00E*/ BYTE QuotaChargesOffset; // -> OBJECT_QUOTA_CHARGES
/*00F*/ BYTE ObjectFlags; // OB_FLAG_*
/*010*/ union
{ // OB_FLAG_CREATE_INFO ? ObjectCreateInfo : QuotaBlock
/*010*/ PQUOTA_BLOCK QuotaBlock;
/*010*/ POBJECT_CREATE_INFO ObjectCreateInfo;
/*014*/ };
/*014*/ PSECURITY_DESCRIPTOR SecurityDescriptor;
/*018*/ }
OBJECT_HEADER,
* POBJECT_HEADER,
**PPOBJECT_HEADER;
Далее по смещению HandleDBOffset от указателя на объект (по моему от него все отсчитывают, но это легко проверить или самому, или у Шрайбера почитать) в сторону уменьшения адресов получить указатель на структуру _OBJECT_HANDLE_DB, в этой структуре если счетчик == 1 то в объединении указатель на процесс владелец, если больше единицы - указатель на структуру _OBJECT_HANDLE_DB_LIST которая содержит массив структур OBJECT_HANDLE_DB с указателями на процессы. Утиочнить все это можно в книге C. Шрайбер "Недокументированные возможности Windows 2000". У меня её под рукой сейчас нет.


 
Е-Моё имя ©   (2003-09-17 09:54) [5]


> NightAngel ©

респекты



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.023 c
1-89871
Мыш
2003-11-15 21:03
2003.11.27
ОЧЕНЬ много вопросов об указателях


1-89955
ghg
2003-11-18 15:57
2003.11.27
string и memo1.Lines


1-89894
Кен
2003-11-12 07:04
2003.11.27
Почему массивы Boolean сохраняются на диск как одно


1-89860
Сергей Петров
2003-11-16 04:55
2003.11.27
Как открыть файл, зарегистрированный в системе (mp3,m3u,avi,...)


6-90018
MakNik
2003-10-03 11:25
2003.11.27
Socket




   Наверх