Вообщем моя цель такова: Берем процесс, узнаем его PID. Шлем PID в драйвер. В драйвере надо достать таблицу открытых описателей (Handle) нашим процессом. По полученным описателям обращаемся к объектам/ресурсам и изменяем пару параметров объекта. Думаю, что особой проблемы при обращении к объектам по хэндлам не будет, а вот как по пиду процесса вытащить индексы описателей? Извиняюсь, если данная тема уже поднималась. Всем буду благодарен за любую информацию.
Большое спасибо за ссылку на статью - очень помогла! Автору - отдельное пасибо! Назрел еще один вопрос... Если залезть в драйвер, который приведен в статье можно найти вот что: #define AC_GENERIC_READ 0x120089 #define AC_GENERIC_WRITE 0x120196 ..... Дефайны доступа. Данные переменные заносятся в маску доступа для изменения доступа к объекту, который привязан к файлу. Понятно, что полный доступ будет 0x12021F. При изменении Read на Write доступ меняется... Вообщем все отлично работает. При создании описателя на пользовательском уровне мы указываем GENERIC_WRITE | GENERIC_READ. Если залезть в winnt.h, можно найти: #define GENERIC_READ (0x80000000L) #define GENERIC_WRITE (0x40000000L) ..... Вообщем-то, если посмотреть на структуру маски доступа - все правильно. (Write | Read - C0000000 ) Но каким образом из 0xC0000000 получается 0x12021F ? Но, пожалуй, самый главный вопрос - есть ли тут какая-то закономерность для других типов объектов, к примеру - ключей реестра и т.п? Спасибо!
1) "#define AC_GENERIC_READ 0x120089" - не что иное как FILE_GENERIC_READ "#define AC_GENERIC_WRITE 0x120196" - с чего получилось легко догадаться FILE_GENERIC_WRITE|FILE_ATTRIBUTE_NORMAL. 2) Не путать dwDesiredAccess и dwFlagsAndAttributes + читать MSDN.
Сам сегодня копался в winnt.h . Там действительно есть задефайненный GENERIC_READ и выглядит он действительно так: #define GENERIC_READ (0x80000000L) Но! Есть еще и FILE_GENERIC_READ. И получается он так #define FILE_GENERIC_READ (STANDARD_RIGHTS_READ |\ FILE_READ_DATA |\ FILE_READ_ATTRIBUTES |\ FILE_READ_EA |\ SYNCHRONIZE) И он реально получается как 0x120089 #define FILE_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ FILE_WRITE_DATA |\ FILE_WRITE_ATTRIBUTES |\ FILE_WRITE_EA |\ FILE_APPEND_DATA |\ SYNCHRONIZE) Т.о. = 0x120196 Все вопрос исчерпан! Спасибо!