Re[4]: Перечисление открытых объектов типа 'File'
От: MShura  
Дата: 24.01.06 13:42
Оценка:
V>Кстати. Я пытался сделать нечто похожее, обойдясь user-mode, через CreateRemoteThread. Почти получилось, не смог обработать только процесс System. Верно ли я понимаю, что kernel-mode драйвер нужен именно для него, а из user-mode с ним никак не совладать?

Никак. Драйвер нужен чтобы преодолеть зависание NtQueryObject на получении имен пайпов, открытых для синхронного доступа и которые имеют pending операции чтения/записи. Все сервисы имеют такие пайпы для коммуникации с SCM.
Re: Перечисление открытых объектов типа 'File'
От: EqWu Россия  
Дата: 25.01.06 16:13
Оценка:
Здравствуйте, MShura, Вы писали:

MS>Эта программа работает аналогично программе тов Руссиновича handle.

MS>http://www.sysinternals.com/ntw2k/freeware/handle.shtml

MS>Поводом для создания такой программы стала необходимость определения процессов, имеющих открытые файлы на каком-либо томе.

MS>С помощью замечательной программы IDA программа handle была изучена и написана своя — более простая.

А такой метод не кактит?
http://wasm.ru/article.php?article=lockfileswork
Re[2]: Перечисление открытых объектов типа 'File'
От: MShura  
Дата: 25.01.06 18:03
Оценка:
EW>А такой метод не кактит?
EW>http://wasm.ru/article.php?article=lockfileswork

Подход действительно хороший.
В моем коде корень — функция NtQueryObject( ... ObjectNameInformation )
В статье корень — функция NtQueryInformationFile( ... FileNameInformation )

В результате основной недостаток — отсутствие той части полного пути файла, которая указывает на том.
В моей задача, для которой я и исследовал программу Руссиновича, эта часть была необходима.
Re[5]: Перечисление открытых объектов типа 'File'
От: gear nuke  
Дата: 03.03.06 20:49
Оценка:
Здравствуйте, IceStudent, Вы писали:

IS>А вот примерный код загрузки драйвера.


IS>
[]
IS>        GetFullPathNameW(szDrvFileName,MAX_PATH,acDriverPath, &szfPart);

IS>        // Регистрируем драйвер

IS>        hService = CreateService(hSCManager, szDrvName, szDrvDescription,
IS>            SERVICE_START | DELETE, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, 
IS>            SERVICE_ERROR_IGNORE, acDriverPath, NULL, NULL, NULL, NULL, NULL);
[]

В этом коде есть ошибка.
MSDN:

CreateService
[...]
lpBinaryPathName
[in] Pointer to a null-terminated string that contains the fully qualified path to the service binary file. If the path contains a space, it must be quoted so that it is correctly interpreted. For example, "d:\\my share\\myservice.exe" should be specified as "\"d:\\my share\\myservice.exe\"".
The path can also include arguments for an auto-start service. For example, "d:\\myshare\\myservice.exe arg1 arg2". These arguments are passed to the service entry point (typically the main function).

People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re: Перечисление открытых объектов типа 'File'
От: MShura  
Дата: 28.12.06 17:42
Оценка:
Исправлена ошибка в драйвере. Посыпаю голову пеплом. Теперь работает и под Vista.


MS>Здесь лежит собственно программа.

MS>http://www.rsdn.ru/File/24534/handle.zip
Re[2]: Перечисление открытых объектов типа 'File'
От: swiss2  
Дата: 14.01.07 20:01
Оценка:
Здравствуйте, MShura, Вы писали:

MS>Возвращаясь к "первоисточнику" обнаружил, что Руссинович совершенно не выгружает драйвер после окончания работы. Об этом красноречиво говорит утилита drivers.exe из DDK.

MS>Собственно он даже не использует функцию NtUnloadDriver.

MS>Причины по которой было сделано так, мне не известны.


Для handle они мне тоже не известны, но по крайней мере для regmon'а 4.35 Руссинович пояснил:

regsys.c

#if DBG

        //
        // Its extremely unsafe to unload a system-call hooker, so this
        // is only enabled in the debug version for testing purposes.
        //
        DriverObject->DriverUnload                          = RegmonUnload;
#endif
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.