Форум: "Система";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];
ВнизКто держит файл Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.009 c