Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.27;
Скачать: 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 вся ветка

Текущий архив: 2003.11.27;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.037 c
14-90072
velial
2003-11-05 12:19
2003.11.27
Team Source или создание приложения в команде


3-89773
stud
2003-11-06 17:47
2003.11.27
отчеты........


3-89679
lovres
2003-11-06 09:26
2003.11.27
Как подключиться к Paradox-таблице без BDE?


1-89817
hawkins
2003-11-16 07:09
2003.11.27
Не могу установить RxLib для Delphi6


1-89815
Stah
2003-11-16 00:30
2003.11.27
Выплывающая панель