Re[15]: Можно ли в драйвере получить имя юзера?
От: _cb_  
Дата: 11.02.04 14:40
Оценка:
Здравствуйте, Canavaro, Вы писали:

C>я тоже попробовал ловить на IRP_MJ_CREATE -> никакой разницы


возможно где-то Вы ошиблись...
можете попробовать еще один способ

http://www.rsdn.ru/Forum/Message.aspx?mid=525306&only=1
Автор: _cb_
Дата: 30.01.04



NTKERNELAPI
NTSTATUS
SeQueryInformationToken (
    IN PACCESS_TOKEN Token,
    IN TOKEN_INFORMATION_CLASS TokenInformationClass,
    OUT PVOID *TokenInformation
    );



в данный момент я пользуюсь именно им.. на irp_create получаю сид — запоминаю его в своем map-e, а потом использую по необходимости...

cb.
Re[7]: Можно ли в драйвере получить имя юзера?
От: Valerio Россия linkedin.com/in/boronin
Дата: 11.02.04 15:22
Оценка:
Здравствуйте, Canavaro, Вы писали:

C>Здравствуйте, Valerio, Вы писали:


V>>надо разбираться — возможно просто неправильно получен SID в ядре, может быть это LogonID у Вас?

V>>попробуйте с помощью разных программ в user mode получить то же самое для своих процессов — чей SID с ними ассоциирован через токен?

C>попробовал и получил совершено нормальный well-known Administartor SID S-1-5-21-1801674531-1957994488-842925246-500

значит ошибка у Вас

плюс прислушайтесь к _cb_: вытягивайте SID только в CREATE
во-вторых он правильно спросил в completion или нет Вы вытягиваете инфу: если в стеке есть хитрый драйвер вроде одной из версии NAV, то он может запросто переключить контекст на свой поток и Вы получите SID немного не тот... но в любом случае не такой странный, ИМХО
... << RSDN@Home 1.1.3 beta 1 >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[16]: Можно ли в драйвере получить имя юзера?
От: Canavaro Россия  
Дата: 11.02.04 16:20
Оценка:
Здравствуйте, _cb_, Вы писали:

__>можете попробовать еще один способ


__>http://www.rsdn.ru/Forum/Message.aspx?mid=525306&amp;only=1
Автор: _cb_
Дата: 30.01.04



__>
__>NTKERNELAPI
__>NTSTATUS
__>SeQueryInformationToken (
__>    IN PACCESS_TOKEN Token,
__>    IN TOKEN_INFORMATION_CLASS TokenInformationClass,
__>    OUT PVOID *TokenInformation
__>    );
__>



__>в данный момент я пользуюсь именно им.. на irp_create получаю сид — запоминаю его в своем map-e, а потом использую по необходимости...


огромное спасибо, так вроде пока работает !
Re[12]: Можно ли в драйвере получить имя юзера?
От: Canavaro Россия  
Дата: 12.02.04 09:14
Оценка:
Здравствуйте, _cb_, Вы писали:

__>на сколько я помню все проверки безопасности рекомендуется делать на irp_mj_create, а потом если Вам нужно знать какой пользователь посылает read, write и прочие запросы необходимо реализовать свой кеш открытых объектов. т.е на irp_mj_create получаете всю необходимую инфу и сохраняете ее в map-е где в качестве ключа используется file_object & fs_context, и при получении запросов ищете эту инфу в этом мапе...


если можно, то расскажите пожалуйста поподробнее про этот механизм, хотя бы в сторону каких функций копать.
Заранее спасибо!
Re[13]: Можно ли в драйвере получить имя юзера?
От: _cb_  
Дата: 12.02.04 09:46
Оценка:
Здравствуйте, Canavaro, Вы писали:

__>>на сколько я помню все проверки безопасности рекомендуется делать на irp_mj_create, а потом если Вам нужно знать какой пользователь посылает read, write и прочие запросы необходимо реализовать свой кеш открытых объектов. т.е на irp_mj_create получаете всю необходимую инфу и сохраняете ее в map-е где в качестве ключа используется file_object & fs_context, и при получении запросов ищете эту инфу в этом мапе...


C>если можно, то расскажите пожалуйста поподробнее про этот механизм, хотя бы в сторону каких функций копать.

C>Заранее спасибо!

рассказать про что именно?

— про механизм создания кеша открытых объектов?
— или про то как правильно помещать в кеш объекты и когда их оттуда удалять?

по поводу второго пункта — есть ссылка на osr

http://www.osr.com/ntinsider/2002/tracking/tracking.htm

про первый пункт — здесь Вы ограничены только своей изобретательностью:
Вам надо так или иначе сохранять свои данные и ассоциировать их с каким-то ключем. ключ вы однозначно получаете из самого irp-а (в данном случае в качестве ключа используется указатель на FileObject и указатель на FsContext), после получения ключа Вы просто ищете в своем кеше данные которые с этим ключем ассоциированы.
в stl есть готовая реализация подобной структуры — map. однако использование stl при разработки драйверов затруднено (хотя и возможно), поэтому скорее всего Вам придется придумать свой способ хранения этой информации...


cb.
Re[14]: Можно ли в драйвере получить имя юзера?
От: Canavaro Россия  
Дата: 17.02.04 08:19
Оценка:
Здравствуйте, _cb_, Вы писали:

__>Вам надо так или иначе сохранять свои данные и ассоциировать их с каким-то ключем. ключ вы однозначно получаете из самого irp-а (в данном случае в качестве ключа используется указатель на FileObject и указатель на FsContext), после получения ключа Вы просто ищете в своем кеше данные которые с этим ключем ассоциированы.


странно как то получается, но у меня на IRP_MJ_CREATE PtrCurrentStackLocation->FileObject->FsContext равно нулю ...
Re[15]: Можно ли в драйвере получить имя юзера?
От: _cb_  
Дата: 17.02.04 08:50
Оценка:
Здравствуйте, Canavaro, Вы писали:

C>Здравствуйте, _cb_, Вы писали:


__>>Вам надо так или иначе сохранять свои данные и ассоциировать их с каким-то ключем. ключ вы однозначно получаете из самого irp-а (в данном случае в качестве ключа используется указатель на FileObject и указатель на FsContext), после получения ключа Вы просто ищете в своем кеше данные которые с этим ключем ассоциированы.


C>странно как то получается, но у меня на IRP_MJ_CREATE PtrCurrentStackLocation->FileObject->FsContext равно нулю ...


В какой момент? до исполнения IRP_MJ_CREATE?
если до — то это правильно, потому что FsContext заполняется драйвером файловой системы в случае успешного открытия файла...

cb.
Re[16]: Можно ли в драйвере получить имя юзера?
От: Canavaro Россия  
Дата: 17.02.04 09:47
Оценка:
Здравствуйте, _cb_, Вы писали:

__>В какой момент? до исполнения IRP_MJ_CREATE?

__>если до — то это правильно, потому что FsContext заполняется драйвером файловой системы в случае успешного открытия файла...

точно ДО !!!
Заранее прошу прощения за вероятно глупый вопрос, но как мне после того как я слепил IRP и послал его дальше драйверу файловой системы [IoCallDriver(PtrTargetDeviceObject, Irp)] получить FsContext ?

PtrCurrentStackLocation = IoGetCurrentIrpStackLocation(PtrTargetDeviceObject->CurrentIrp);
context = PtrCurrentStackLocation->FileObject->FsContext;


или можно по другому, более правильно ?
Re[17]: Можно ли в драйвере получить имя юзера?
От: _cb_  
Дата: 17.02.04 10:11
Оценка:
Здравствуйте, Canavaro, Вы писали:

C>точно ДО !!!

C>Заранее прошу прощения за вероятно глупый вопрос, но как мне после того как я слепил IRP и послал его дальше драйверу файловой системы [IoCallDriver(PtrTargetDeviceObject, Irp)] получить FsContext ?

C>
C>PtrCurrentStackLocation = IoGetCurrentIrpStackLocation(PtrTargetDeviceObject->CurrentIrp);
C>context = PtrCurrentStackLocation->FileObject->FsContext;
C>


C>или можно по другому, более правильно ?


после вызова IoCallDriver IRP скорее всего станет невалидным, потому что IRP_MJ_CREATE выполняется синхронно.
поэтому видимо проще запомнить указатель на FILE_OBJECT, а после вызова драйвера файловой системы и успешного открытия файла проверить поле FsContext.

cb.
Re[18]: Можно ли в драйвере получить имя юзера?
От: Canavaro Россия  
Дата: 18.02.04 08:39
Оценка:
Здравствуйте, _cb_, Вы писали:

__>после вызова IoCallDriver IRP скорее всего станет невалидным, потому что IRP_MJ_CREATE выполняется синхронно.

__>поэтому видимо проще запомнить указатель на FILE_OBJECT, а после вызова драйвера файловой системы и успешного открытия файла проверить поле FsContext.

так работает, но есть одно "НО":
в качестве ключа как вы и говорили у меня выступает :

DWORD pr_key = (DWORD)FileObject & (DWORD)FileObject;

но при получении IRP_MJ_CREATE для одного и того же объекта файловой системы, одним и тем же процессом от имени одного и того же пользователя значение pr_key разное ... прочём разные получаются значения (DWORD)FileObjectа, а FsContext не меняется ... Может ли это означать что в такой маленький промежуток времени какой прошёл между обращениями, этот объет мог быть закрыт и открыт заново ?
Re[19]: Можно ли в драйвере получить имя юзера?
От: _cb_  
Дата: 18.02.04 08:53
Оценка: 4 (1)
Здравствуйте, Canavaro, Вы писали:

C>Здравствуйте, _cb_, Вы писали:


C>так работает, но есть одно "НО":

C>в качестве ключа как вы и говорили у меня выступает :

C>DWORD pr_key = (DWORD)FileObject & (DWORD)FileObject;


здесь видимо имеется ввиду ((DWORD)FileObject & (DWORD)FsContext)?
сорри что ввел в заблуждение... я не имел ввиду буквально операцию AND.
я имел ввиду что в Вашем хранилище должен быть быть учет обоих ключей (FileObject и FsContext). дело в том что некоторые FileObject создаются системой без посылки IRP_MJ_CREATE. такие FO ссылаются на реально открытый объект посредством FsContext, который совпадает с FsContext-ом реально открытого объекта. поэтому поиск в кеше можно делать как по FileObject так и по FsContext. но это всего лишь один из вариантов реализации кеша. Вы можете придумать свой.

я уже давал ссылку на статью в osr — где описываются алгоритмы построения кеша открытых объектов, там это сделано более грамотно чем я могу это изложить...

http://www.osr.com/ntinsider/2002/tracking/tracking.htm


C>но при получении IRP_MJ_CREATE для одного и того же объекта файловой системы, одним и тем же процессом от имени одного и того же пользователя значение pr_key разное ... прочём разные получаются значения (DWORD)FileObjectа, а FsContext не меняется ... Может ли это означать что в такой маленький промежуток времени какой прошёл между обращениями, этот объет мог быть закрыт и открыт заново ?


а вот этот пункт мне не очень понятен. раз Вы получили IRP_MJ_CREATE то это означает что происходит повторное открытие объекта. а вот должен ли при этом открытии поменяться FsContext видимо зависит от реализации FSD. возможно что для одного объекта файловой системы при повторном открытии не создается новый fs context, хотя мне лично это кажется маловероятным.
к сожалению тут я ничем помочь не могу — надо исследовать, я с этим не сталкивался.

cb.
Re[20]: Можно ли в драйвере получить имя юзера?
От: Valerio Россия linkedin.com/in/boronin
Дата: 19.02.04 05:40
Оценка:
__>я уже давал ссылку на статью в osr — где описываются алгоритмы построения кеша открытых объектов, там это сделано более грамотно чем я могу это изложить...

__>http://www.osr.com/ntinsider/2002/tracking/tracking.htm

мои 5 копеек, там есть псевдокод и была опечатка в конце статьи ставящяя все с ног на голову, be ready

C>>но при получении IRP_MJ_CREATE для одного и того же объекта файловой системы, одним и тем же процессом от имени одного и того же пользователя значение pr_key разное ... прочём разные получаются значения (DWORD)FileObjectа, а FsContext не меняется ... Может ли это означать что в такой маленький промежуток времени какой прошёл между обращениями, этот объет мог быть закрыт и открыт заново ?


__>а вот этот пункт мне не очень понятен. раз Вы получили IRP_MJ_CREATE то это означает что происходит повторное открытие объекта. а вот должен ли при этом открытии поменяться FsContext видимо зависит от реализации FSD. возможно что для одного объекта файловой системы при повторном открытии не создается новый fs context, хотя мне лично это кажется маловероятным.

__>к сожалению тут я ничем помочь не могу — надо исследовать, я с этим не сталкивался.
с одного FCB (FsContext) свисает много FileObject. Например 2 экземпляра одного файла дадут Вам такое дело. Такое поведение FsContext действительно забота писателя FSD, но сейчас оно гарантируется для локальных FSD, поставляемых с ОС. Сетевые FSD (редиректоры) этого уже не гарантируют хотя LanMan redirector пока соответствует.

__>cb.
... << RSDN@Home 1.1.3 beta 1 >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[18]: Можно ли в драйвере получить имя юзера?
От: Canavaro Россия  
Дата: 25.02.04 14:58
Оценка:
Здравствуйте, _cb_, Вы писали:


__>после вызова IoCallDriver IRP скорее всего станет невалидным, потому что IRP_MJ_CREATE выполняется синхронно.

__>поэтому видимо проще запомнить указатель на FILE_OBJECT, а после вызова драйвера файловой системы и успешного открытия файла проверить поле FsContext.

но тогда получается, что после проверки имени файла и DesiredAccess я не смогу зарубить IRP_MJ_CREATE ...
или можно ещё каким способом узнать имя файла, ведь перед посылкой запроса на открытие к драйверу файловой системы где-то должно храниться имя открываемого объкта ...
Re[19]: Можно ли в драйвере получить имя юзера?
От: _cb_  
Дата: 25.02.04 17:47
Оценка:
Здравствуйте, Canavaro, Вы писали:

__>>после вызова IoCallDriver IRP скорее всего станет невалидным, потому что IRP_MJ_CREATE выполняется синхронно.

__>>поэтому видимо проще запомнить указатель на FILE_OBJECT, а после вызова драйвера файловой системы и успешного открытия файла проверить поле FsContext.

C>но тогда получается, что после проверки имени файла и DesiredAccess я не смогу зарубить IRP_MJ_CREATE ...

C>или можно ещё каким способом узнать имя файла, ведь перед посылкой запроса на открытие к драйверу файловой системы где-то должно храниться имя открываемого объкта ...


вот здесь описано как сделать cancel irp_mj_create

http://www.osronline.com/article.cfm?id=17#Q6

про получение имени до выполнения открытия объекта могу сказать, что это достаточно сложная процедура, плюс не дающая 100% гарантии получения верного результата. я бы не рекомендовал Вам идти этим путем. если Вы все же решите попробовать этот вариант, то напишите мне по почте — я вышлю Вам код, который я использовал для этого, или посмотрите ранние версии ifskit_2k\src\filesys\filter\filespy, там есть пример получения имени до выполнения irp_mj_create.

cb.
Re[20]: Можно ли в драйвере получить имя юзера?
От: Аноним  
Дата: 26.02.04 07:37
Оценка:
Здравствуйте, _cb_, Вы писали:

__>вот здесь описано как сделать cancel irp_mj_create


__>http://www.osronline.com/article.cfm?id=17#Q6


понятно ...

__>про получение имени до выполнения открытия объекта могу сказать, что это достаточно сложная процедура, плюс не дающая 100% гарантии получения верного результата. я бы не рекомендовал Вам идти этим путем. если Вы все же решите попробовать этот вариант, то напишите мне по почте — я вышлю Вам код, который я использовал для этого,


послал письмо, жду ответа ...

и ещё, читал в этом форуме что если в pIrpStack->Parameters.Create.Options установлен флаг FILE_OPEN_BY_FILE_ID, то файл открывается по FILE_ID и его как то можно преобразовать в имя файла ...
Re[21]: Можно ли в драйвере получить имя юзера?
От: _cb_  
Дата: 26.02.04 08:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>послал письмо, жду ответа ...


ок.

А>и ещё, читал в этом форуме что если в pIrpStack->Parameters.Create.Options установлен флаг FILE_OPEN_BY_FILE_ID, то файл открывается по FILE_ID и его как то можно преобразовать в имя файла ...


я слышал что у файла теоретически может не быть символического имени — есть только ID. реально я с таким не сталкивался. а преобразования как такового нет — можно получить информацию о файле, там и можно увидеть его символическое имя.

cb.
Re[20]: Можно ли в драйвере получить имя юзера?
От: Аноним  
Дата: 26.02.04 11:57
Оценка:
Здравствуйте, _cb_, Вы писали:

__>вот здесь описано как сделать cancel irp_mj_create


__>http://www.osronline.com/article.cfm?id=17#Q6


я так понял что IoCancelFileOpen() нужно использовать в CREATE CompletionRoutine, но опять тот же вопрос — к этому времени я буду знать имя файла ? Ведь наскока я понимаю управление ещё не вернётся в мой Dispatcher ...
Спрошу проще: можно ли при помощи IoCancelFileOpen() реализовать схему :

IoCallDriver(...);
if (!Check(FileObj->FileName))
{
CancelCreate();
return STATUS_UNSUCCESSFUL;
}
Re[21]: Можно ли в драйвере получить имя юзера?
От: _cb_  
Дата: 26.02.04 12:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>я так понял что IoCancelFileOpen() нужно использовать в CREATE CompletionRoutine, но опять тот же вопрос — к этому времени я буду знать имя файла ? Ведь наскока я понимаю управление ещё не вернётся в мой Dispatcher ...


имя можно получить и в completion routine. потому что irp_mj_create всегда выполняется на passive_level и является синхронной операцией.

А>Спрошу проще: можно ли при помощи IoCancelFileOpen() реализовать схему :


А>IoCallDriver(...);

А>if (!Check(FileObj->FileName))
А>{
А>CancelCreate();
А>return STATUS_UNSUCCESSFUL;
А>}

лично я IoCancelFileOpen не использовал поэтому точно не могу сказать где именно она должна вызываться. однако судя по документации описанный Вами сценарий вполне работоспособен, надо только не забыть изменить значение pIrp->IoStatus.Status на STATUS_UNSUCCESSFUL.

cb.
Re[22]: Можно ли в драйвере получить имя юзера?
От: Злость Россия  
Дата: 26.02.04 13:11
Оценка:
Здравствуйте, _cb_, Вы писали:

__>Здравствуйте, Аноним, Вы писали:


А>>я так понял что IoCancelFileOpen() нужно использовать в CREATE CompletionRoutine, но опять тот же вопрос — к этому времени я буду знать имя файла ? Ведь наскока я понимаю управление ещё не вернётся в мой Dispatcher ...


__>имя можно получить и в completion routine. потому что irp_mj_create всегда выполняется на passive_level и является синхронной операцией.


А>>Спрошу проще: можно ли при помощи IoCancelFileOpen() реализовать схему :


А>>IoCallDriver(...);

А>>if (!Check(FileObj->FileName))
А>>{
А>>CancelCreate();
А>>return STATUS_UNSUCCESSFUL;
А>>}

Не ясно как вы будете FileObj->FileName использовать после IoCallDriver — или FileObj->FileName эта ваша внутрення переменная и вы уже скопировали имя файла до вызова IoCallDriver ?

__>лично я IoCancelFileOpen не использовал поэтому точно не могу сказать где именно она должна вызываться. однако судя по документации описанный Вами сценарий вполне работоспособен, надо только не забыть изменить значение pIrp->IoStatus.Status на STATUS_UNSUCCESSFUL.


__>cb.
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re[21]: Можно ли в драйвере получить имя юзера?
От: Valerio Россия linkedin.com/in/boronin
Дата: 27.02.04 05:34
Оценка:
А>и ещё, читал в этом форуме что если в pIrpStack->Parameters.Create.Options установлен флаг FILE_OPEN_BY_FILE_ID, то файл открывается по FILE_ID и его как то можно преобразовать в имя файла ...
точно так же, как и в случае короткого имени например — выполнить подзапрос на получение имени файла
... << RSDN@Home 1.1.3 beta 1 >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.