Проблема с перечислением Handles

Для неординарных вопросов. Если вы опытный программист, попавший в трудную ситуацию, — вам сюда.

Модератор: gaidar

Правила форума
Этот раздел не предназначен для того, чтобы вы адресовали свою проблему профессионалам.
Этот раздел предназначен для профессионалов, которые столкнулись с проблемой и не могут решить ее самостоятельно.
Если вы считаете себя профессионалом, а свою проблему сложной — вам сюда.
Если модератор посчитает, что вы ошиблись, то на первый раз он перенесет ваше сообщение в основной раздел без последствий для автора. Во второй раз тема будет закрыта, а автору будет выписано нарушение. В третий раз автор будет забанен.
M.A.R.K
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 11.11.2007 (Вс) 11:50
Откуда: Иркутск

Проблема с перечислением Handles

Сообщение M.A.R.K » 02.02.2008 (Сб) 12:12

Привет всем.
Пишу программу на Visual Basic для перечисления всех Хэндлов в системе (Windows XP SP2).

Алгоритм:
Когда я нахожу количество всех Хэндлов
(С помощью NtQuerySystemInformation), я создаю цикл.
В этом цикле я копирую каждый Хэндл в свой процесс
(С помощью DuplicateHandle) и получаю информацию о нем (В остальных программах такого типа делают также).
Последний шаг - это закрыть скопированный Хэндл в своем процессе, я это делаю, но количество всех Хэндлов в системе (Как изображено на скриншоте) увеличивается
(Как будто я не закрывал этот Хэндл) и никакая CloseHandle не помогает.
В примерах на Deplhi (Перечисление открытых файлов и т.д.) в Таск Менеджере Windows Количество всех Хэндлов не изменяется.
Код одинаковый, в чем проблема?

Заранее благодарен.
Вложения
Handles.JPG
Количество Handle
Handles.JPG (45.66 Кб) Просмотров: 2250

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 02.02.2008 (Сб) 14:05

Наверное нужно код для начала показать.
Лучший способ понять что-то самому — объяснить это другому.

M.A.R.K
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 11.11.2007 (Вс) 11:50
Откуда: Иркутск

Сообщение M.A.R.K » 04.02.2008 (Пн) 10:40

Часть кода:
Код: Выделить всё
For i = 0 To Handles - 1
  hProc = OpenProcess(PROCESS_DUP_HANDLE,0,ProcessId)
  Call DuplicateObject(hProc,mHandle(i).HandleValue,GetCurrentProcess,hFileHandle,0,0,DUPLICATE_SAME_ATTRIBUTES)
  ..
  Обработка Handle
  ..
  CloseHandle hFileHandle
Next

M.A.R.K
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 11.11.2007 (Вс) 11:50
Откуда: Иркутск

Сообщение M.A.R.K » 19.02.2008 (Вт) 4:51

Возможно эта проблема связана с тем, что программа на VB интерпритируется MSVB6XXX.DLL...

Как вы считаете?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.02.2008 (Вт) 8:16

Этот процесс - не интерпретация.
Может ты не получаешь привилегии для закрытия хендла?
Чему равен Err.LastDllError после CloseHandle?
Lasciate ogni speranza, voi ch'entrate.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 19.02.2008 (Вт) 13:48

Блин, ну есть же статья на сайте и уже, даже, в книге. Сравни код и найди ошибку...

Может ты не получаешь привилегии для закрытия хендла?
Хэндл копируется с DUPLICATE_SAME_ATTRIBUTES (на самом деле DUPLICATE_SAME_ACCESS, но разницы нет), а процесс, породивший хэндл имеет права на его закрытие по-любому, так что мимо.

M.A.R.K
Перед закрытием хэндла посмотри значение переменной и убедись, есть ли такой хэндл вообще (ProcessExplorer или мой кривой код из статьи поможет).

ADDED:
Код: Выделить всё
For i = 0 To Handles - 1
  hProc = OpenProcess(PROCESS_DUP_HANDLE,0,ProcessId)
  Call DuplicateObject(hProc,mHandle(i).HandleValue,GetCurrentProcess,hFileHandle,0,0,DUPLICATE_SAME_ATTRIBUTES)
  ..
  Обработка Handle
  ..
  CloseHandle hFileHandle
Next
Это ты в цикле процесс открываешь при каждой иттерации, а закрыть забываешь? Ну-ну. Вот отсюда и растут хэндлы... А если так, то вопрос явно не в той ветке форума!
А я все практикую лечение травами...

M.A.R.K
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 11.11.2007 (Вс) 11:50
Откуда: Иркутск

Сообщение M.A.R.K » 22.02.2008 (Пт) 7:03

Twister, ты хочешь сказать что проблема вот в этой строчке:
hProc = OpenProcess(PROCESS_DUP_HANDLE,0,ProcessId)

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 22.02.2008 (Пт) 7:52

Да, ведь ты забываешь их закрывать
но количество всех Хэндлов в системе (Как изображено на скриншоте) увеличивается
(Как будто я не закрывал этот Хэндл) и никакая CloseHandle не помогает.
А я все практикую лечение травами...


Вернуться в Раздел для Профессионалов

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList