Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | |
[Win32] Есть ли в kernel'е аналоги функций GetShortPathName() and GetLongPathName() ? 29.05.02 22:33 Число просмотров: 1055
Автор: vim Статус: Незарегистрированный пользователь
|
> > > > > >
> > > NTSYSAPI
> > > NTSTATUS
> > > NTAPI
> > > ZwQueryInformationFile(
> > > IN HANDLE FileHandle,
> > > OUT PIO_STATUS_BLOCK IoStatusBlock,
> > > OUT PVOID FileInformation,
> > > IN ULONG Length,
> > > IN FILE_INFORMATION_CLASS
> FileInformationClass
> > > );
> > > ---
> > > > Не, это я знаю. Не подходит. Для этой функции нужен > > FileHandle, т.е. файл предварительно должен быть > открыт. А > > мне наоборот, по имени файла нужно решить разрешать ли > его > > открывать или нет. > > > > Исходные данные - это строка текста с именем файла. > > Из-за того, что у файла может быть два имени - длинное > и > > короткое, их оба нужно проверить. В этом вся проблема. > Voobche to GetShortFielNAme()/GetLongFileNAme() otkryvet > file, queryinfo, zakryvaet file, tak chto drugogo puti net > > FILEMONITOR TRACE dlia: > > char sz[200];
> ::GetShortPathName("c:\\Program Files",sz, 200);
> ---
> > 10:25:20 AM temp.exe:245 IRP_MJ_CREATE C:\Program
> Files SUCCESS Attributes: Any Options: Open
> 10:25:20 AM temp.exe:245 IRP_MJ_QUERY_INFORMATION
> C:\Program Files SUCCESS
> FileAlternateNameInformation
> 10:25:20 AM temp.exe:245 IRP_MJ_CLEANUP C:\Program
> Files SUCCESS
> 10:25:20 AM temp.exe:245 IRP_MJ_CLOSE C:\Program
> Files SUCCESS
> ---
Да, в принципе так она и должна работать.
Но проблема в том что это делается в user mode, а не в kernel.
|
<programming>
|
[Win32] Есть ли в kernel'е аналоги функций GetShortPathName() and GetLongPathName() ? 25.05.02 01:41
Автор: vim Статус: Незарегистрированный пользователь
|
Нужно по имени файла получить его длинное и/или короткое имя
В Windows API это делается просто:
GetShortPathName(...)
GetLongPathName(...)
а в kernel'e подобных функций не нашел
но очень нужно
Подскажите может кто сталкивался с этим ?
|
|
[Win32] Есть ли в kernel'е аналоги функций GetShortPathName() and GetLongPathName() ? 25.05.02 03:47
Автор: + <Mikhail> Статус: Elderman Отредактировано 25.05.02 04:09 Количество правок: 2
|
NTSYSAPI
NTSTATUS
NTAPI
ZwQueryInformationFile(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID FileInformation,
IN ULONG Length,
IN FILE_INFORMATION_CLASS FileInformationClass
);
---
|
| |
[Win32] Есть ли в kernel'е аналоги функций GetShortPathName() and GetLongPathName() ? 25.05.02 11:01
Автор: vim Статус: Незарегистрированный пользователь
|
> >
> NTSYSAPI
> NTSTATUS
> NTAPI
> ZwQueryInformationFile(
> IN HANDLE FileHandle,
> OUT PIO_STATUS_BLOCK IoStatusBlock,
> OUT PVOID FileInformation,
> IN ULONG Length,
> IN FILE_INFORMATION_CLASS FileInformationClass
> );
> ---
Не, это я знаю. Не подходит. Для этой функции нужен FileHandle, т.е. файл предварительно должен быть открыт. А мне наоборот, по имени файла нужно решить разрешать ли его открывать или нет.
Исходные данные - это строка текста с именем файла.
Из-за того, что у файла может быть два имени - длинное и короткое, их оба нужно проверить. В этом вся проблема.
|
| | |
[Win32] Есть ли в kernel'е аналоги функций GetShortPathName() and GetLongPathName() ? 29.05.02 21:18
Автор: + <Mikhail> Статус: Elderman
|
> > > >
> > NTSYSAPI
> > NTSTATUS
> > NTAPI
> > ZwQueryInformationFile(
> > IN HANDLE FileHandle,
> > OUT PIO_STATUS_BLOCK IoStatusBlock,
> > OUT PVOID FileInformation,
> > IN ULONG Length,
> > IN FILE_INFORMATION_CLASS FileInformationClass
> > );
> > ---
> > Не, это я знаю. Не подходит. Для этой функции нужен > FileHandle, т.е. файл предварительно должен быть открыт. А > мне наоборот, по имени файла нужно решить разрешать ли его > открывать или нет. > > Исходные данные - это строка текста с именем файла. > Из-за того, что у файла может быть два имени - длинное и > короткое, их оба нужно проверить. В этом вся проблема. Voobche to GetShortFielNAme()/GetLongFileNAme() otkryvet file, queryinfo, zakryvaet file, tak chto drugogo puti net
FILEMONITOR TRACE dlia:
char sz[200];
::GetShortPathName("c:\\Program Files",sz, 200);
---
10:25:20 AM temp.exe:245 IRP_MJ_CREATE C:\Program Files SUCCESS Attributes: Any Options: Open
10:25:20 AM temp.exe:245 IRP_MJ_QUERY_INFORMATION C:\Program Files SUCCESS FileAlternateNameInformation
10:25:20 AM temp.exe:245 IRP_MJ_CLEANUP C:\Program Files SUCCESS
10:25:20 AM temp.exe:245 IRP_MJ_CLOSE C:\Program Files SUCCESS
---
|
| | | |
[Win32] Есть ли в kernel'е аналоги функций GetShortPathName() and GetLongPathName() ? 29.05.02 22:33
Автор: vim Статус: Незарегистрированный пользователь
|
> > > > > >
> > > NTSYSAPI
> > > NTSTATUS
> > > NTAPI
> > > ZwQueryInformationFile(
> > > IN HANDLE FileHandle,
> > > OUT PIO_STATUS_BLOCK IoStatusBlock,
> > > OUT PVOID FileInformation,
> > > IN ULONG Length,
> > > IN FILE_INFORMATION_CLASS
> FileInformationClass
> > > );
> > > ---
> > > > Не, это я знаю. Не подходит. Для этой функции нужен > > FileHandle, т.е. файл предварительно должен быть > открыт. А > > мне наоборот, по имени файла нужно решить разрешать ли > его > > открывать или нет. > > > > Исходные данные - это строка текста с именем файла. > > Из-за того, что у файла может быть два имени - длинное > и > > короткое, их оба нужно проверить. В этом вся проблема. > Voobche to GetShortFielNAme()/GetLongFileNAme() otkryvet > file, queryinfo, zakryvaet file, tak chto drugogo puti net > > FILEMONITOR TRACE dlia: > > char sz[200];
> ::GetShortPathName("c:\\Program Files",sz, 200);
> ---
> > 10:25:20 AM temp.exe:245 IRP_MJ_CREATE C:\Program
> Files SUCCESS Attributes: Any Options: Open
> 10:25:20 AM temp.exe:245 IRP_MJ_QUERY_INFORMATION
> C:\Program Files SUCCESS
> FileAlternateNameInformation
> 10:25:20 AM temp.exe:245 IRP_MJ_CLEANUP C:\Program
> Files SUCCESS
> 10:25:20 AM temp.exe:245 IRP_MJ_CLOSE C:\Program
> Files SUCCESS
> ---
Да, в принципе так она и должна работать.
Но проблема в том что это делается в user mode, а не в kernel.
|
| | | | |
[Win32] Есть ли в kernel'е аналоги функций GetShortPathName() and GetLongPathName() ? 29.05.02 22:57
Автор: + <Mikhail> Статус: Elderman Отредактировано 29.05.02 23:35 Количество правок: 2
|
> > > > > > > >
> > > > NTSYSAPI
> > > > NTSTATUS
> > > > NTAPI
> > > > ZwQueryInformationFile(
> > > > IN HANDLE FileHandle,
> > > > OUT PIO_STATUS_BLOCK IoStatusBlock,
> > > > OUT PVOID FileInformation,
> > > > IN ULONG Length,
> > > > IN FILE_INFORMATION_CLASS
> > FileInformationClass
> > > > );
> > > > ---
> > > > > > Не, это я знаю. Не подходит. Для этой функции > нужен > > > FileHandle, т.е. файл предварительно должен быть > > открыт. А > > > мне наоборот, по имени файла нужно решить > разрешать ли > > его > > > открывать или нет. > > > > > > Исходные данные - это строка текста с именем > файла. > > > Из-за того, что у файла может быть два имени - > длинное > > и > > > короткое, их оба нужно проверить. В этом вся > проблема. > > Voobche to GetShortFielNAme()/GetLongFileNAme() > otkryvet > > file, queryinfo, zakryvaet file, tak chto drugogo puti > net > > > > FILEMONITOR TRACE dlia: > > > > char sz[200];
> > ::GetShortPathName("c:\\Program Files",sz, 200);
> > ---
> > > > 10:25:20 AM temp.exe:245 IRP_MJ_CREATE
> C:\Program
> > Files SUCCESS Attributes: Any Options: Open
> > 10:25:20 AM temp.exe:245
> IRP_MJ_QUERY_INFORMATION
> > C:\Program Files SUCCESS
> > FileAlternateNameInformation
> > 10:25:20 AM temp.exe:245 IRP_MJ_CLEANUP
> C:\Program
> > Files SUCCESS
> > 10:25:20 AM temp.exe:245 IRP_MJ_CLOSE
> C:\Program
> > Files SUCCESS
> > ---
> > Да, в принципе так она и должна работать. > Но проблема в том что это делается в user mode, а не в > kernel.
Voobche to vsia rabota s filami delaetsia v kernel mode! (ring0)
I kogda ta function vyzyvaetsia proishodit perekluchenie v ring0 dlia kazdoi API raboty s failomi i tam vyzyvaetsi to chto nado , v dannom sluchae open file, query info, close.
P.S. Tak chto sozdai svoi functions GetShortfileName()/GetLongfileAme() i vnutri ih otkryvai file query info i t.d...
|
| | | | | |
[Win32] Есть ли в kernel'е аналоги функций GetShortPathName() and GetLongPathName() ? 29.05.02 23:32
Автор: vim Статус: Незарегистрированный пользователь
|
> > > > > > > > > >
> > > > > NTSYSAPI
> > > > > NTSTATUS
> > > > > NTAPI
> > > > > ZwQueryInformationFile(
> > > > > IN HANDLE FileHandle,
> > > > > OUT PIO_STATUS_BLOCK
> IoStatusBlock,
> > > > > OUT PVOID FileInformation,
> > > > > IN ULONG Length,
> > > > > IN FILE_INFORMATION_CLASS
> > > FileInformationClass
> > > > > );
> > > > > ---
> > > > > > > > Не, это я знаю. Не подходит. Для этой > функции > > нужен > > > > FileHandle, т.е. файл предварительно должен > быть > > > открыт. А > > > > мне наоборот, по имени файла нужно решить > > разрешать ли > > > его > > > > открывать или нет. > > > > > > > > Исходные данные - это строка текста с именем > > файла. > > > > Из-за того, что у файла может быть два имени > - > > длинное > > > и > > > > короткое, их оба нужно проверить. В этом вся > > проблема. > > > Voobche to GetShortFielNAme()/GetLongFileNAme() > > otkryvet > > > file, queryinfo, zakryvaet file, tak chto drugogo > puti > > net > > > > > > FILEMONITOR TRACE dlia: > > > > > > char sz[200];
> > > ::GetShortPathName("c:\\Program Files",sz, 200);
> > > ---
> > > > > > 10:25:20 AM temp.exe:245 IRP_MJ_CREATE
> > C:\Program
> > > Files SUCCESS Attributes: Any Options: Open
> > > 10:25:20 AM temp.exe:245
> > IRP_MJ_QUERY_INFORMATION
> > > C:\Program Files SUCCESS
> > > FileAlternateNameInformation
> > > 10:25:20 AM temp.exe:245 IRP_MJ_CLEANUP
> > C:\Program
> > > Files SUCCESS
> > > 10:25:20 AM temp.exe:245 IRP_MJ_CLOSE
> > C:\Program
> > > Files SUCCESS
> > > ---
> > > > Да, в принципе так она и должна работать. > > Но проблема в том что это делается в user mode, а не в > > kernel. > > Voobche to vsia rabota s filami delaetsia v kernel mode! > (ring0) > > I kogda ta function vyzyvaetsia proishodit perekluchenie v > ring0 dlia kazdoi API raboty s failomi i tam vyzyvaetsi to > chto nado , v dannom sluchae open file, query info, close. > > P.S. Tak chto sozdai svoi functions > GetShortfileName()/GetLongfileAme() i vnutri ih otkryvai > file query info i t.d...
Точно, я что-то сразу не въехал :-((
Ок, попробую, спасибо
|
| | | | | | |
[Win32] нет, так не работает, но нашел другой способ 30.05.02 23:22
Автор: vim Статус: Незарегистрированный пользователь
|
> > > > > > > > > > > >
> > > > > > NTSYSAPI
> > > > > > NTSTATUS
> > > > > > NTAPI
> > > > > > ZwQueryInformationFile(
> > > > > > IN HANDLE FileHandle,
> > > > > > OUT PIO_STATUS_BLOCK
> > IoStatusBlock,
> > > > > > OUT PVOID FileInformation,
> > > > > > IN ULONG Length,
> > > > > > IN FILE_INFORMATION_CLASS
> > > > FileInformationClass
> > > > > > );
> > > > > > ---
> > > > > > > > > > Не, это я знаю. Не подходит. Для этой > > функции > > > нужен > > > > > FileHandle, т.е. файл предварительно > должен > > быть > > > > открыт. А > > > > > мне наоборот, по имени файла нужно > решить > > > разрешать ли > > > > его > > > > > открывать или нет. > > > > > > > > > > Исходные данные - это строка текста с > именем > > > файла. > > > > > Из-за того, что у файла может быть два > имени > > - > > > длинное > > > > и > > > > > короткое, их оба нужно проверить. В > этом вся > > > проблема. > > > > Voobche to > GetShortFielNAme()/GetLongFileNAme() > > > otkryvet > > > > file, queryinfo, zakryvaet file, tak chto > drugogo > > puti > > > net > > > > > > > > FILEMONITOR TRACE dlia: > > > > > > > > char sz[200];
> > > > ::GetShortPathName("c:\\Program Files",sz,
> 200);
> > > > ---
> > > > > > > > 10:25:20 AM temp.exe:245
> IRP_MJ_CREATE
> > > C:\Program
> > > > Files SUCCESS Attributes: Any Options:
> Open
> > > > 10:25:20 AM temp.exe:245
> > > IRP_MJ_QUERY_INFORMATION
> > > > C:\Program Files SUCCESS
> > > > FileAlternateNameInformation
> > > > 10:25:20 AM temp.exe:245
> IRP_MJ_CLEANUP
> > > C:\Program
> > > > Files SUCCESS
> > > > 10:25:20 AM temp.exe:245
> IRP_MJ_CLOSE
> > > C:\Program
> > > > Files SUCCESS
> > > > ---
> > > > > > Да, в принципе так она и должна работать. > > > Но проблема в том что это делается в user mode, а > не в > > > kernel. > > > > Voobche to vsia rabota s filami delaetsia v kernel > mode! > > (ring0) > > > > I kogda ta function vyzyvaetsia proishodit > perekluchenie v > > ring0 dlia kazdoi API raboty s failomi i tam > vyzyvaetsi to > > chto nado , v dannom sluchae open file, query info, > close. > > > > P.S. Tak chto sozdai svoi functions > > GetShortfileName()/GetLongfileAme() i vnutri ih > otkryvai > > file query info i t.d... > > Точно, я что-то сразу не въехал :-(( > Ок, попробую, спасибо ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Попробовал, не работает
ZwQueryInformationFile() возвращает точно такое же имя файла, которое ты задал при его открытии по ZwCreateFile().
Нашел другую функцию, которая вроде бы должна возвращать оба имени -
Zw(Nt)QueryDirectoryFile() с параметром FileBothDirectoryInformation.
Только работы много получается: придется самому разбивать имя файла на составляющие поддиректории и каждую из них открывать и сканировать на поиск нужного элемента.
vim
|
| | | | | | | |
[Win32] нет, так не работает, но нашел другой способ 31.05.02 09:29
Автор: cb <cb> Статус: Member
|
> Только работы много получается: придется самому разбивать > имя файла на составляющие поддиректории и каждую из них > открывать и сканировать на поиск нужного элемента.
IMHO - может быть все это лучше проделать заранее т.е. добавить в список все возможные варианты имени?
cb.
|
| | | | | | | | |
[Win32] нет, так не работает, но нашел другой способ 31.05.02 10:21
Автор: vim Статус: Незарегистрированный пользователь
|
> > Только работы много получается: придется самому > разбивать > > имя файла на составляющие поддиректории и каждую из > них > > открывать и сканировать на поиск нужного элемента. > > > IMHO - может быть все это лучше проделать заранее т.е. > добавить в список все возможные варианты имени? > > cb.
Да, тоже вариант
Для имени файла с N поддиректориями это будет 2^N возможных имен
Вряд ли N будет превышать глубину в несколько директорий
vim
|
| | |
[Win32] Есть ли в kernel'е аналоги функций GetShortPathName() and GetLongPathName() ? 29.05.02 11:11
Автор: cb <cb> Статус: Member
|
> Исходные данные - это строка текста с именем файла. > Из-за того, что у файла может быть два имени - длинное и > короткое, их оба нужно проверить. В этом вся проблема.
если список файлов для фильтрации передается драйверу из usermode то как вариант можно сделать следующее:
в usermode получить оба имени - длинное и короткое - и добавить оба
cb.
btw
я так понимаю речь идет про winnt/2k/xp?
|
| | | |
[Win32] Есть ли в kernel'е аналоги функций GetShortPathName() and GetLongPathName() ? 29.05.02 22:26
Автор: vim Статус: Незарегистрированный пользователь
|
> > Исходные данные - это строка текста с именем файла. > > Из-за того, что у файла может быть два имени - длинное > и > > короткое, их оба нужно проверить. В этом вся проблема. > > если список файлов для фильтрации передается драйверу из > usermode то как вариант можно сделать следующее: > > в usermode получить оба имени - длинное и короткое - и > добавить оба > > cb. > > btw > я так понимаю речь идет про winnt/2k/xp?
Нет, немного не так.
У меня есть список файлов, которые должны быть ReadOnly.
При попытке открытия файла я проверяю его наличие в списке R/O файлов, и если он там есть, то делаю access denied.
Задавать оба имени сразу – нельзя, так как помимо первых двух вариантов (длинное или короткое), может быть и третий – часть имени длинная, часть короткая, а это уже ни под какую заранее составленную маску не подходит.
Похоже единственный вариант который я вижу это сделать некий сервис в usermode и ему из драйвера посылать на проверку имя файла (к примеру через shared memory). Тогда он будет вызывать GetLongPathName() и возвращать в драйвер полученное имя.
Не очень красиво, но другой способ не просматривается.
Теоретически на быстродействии сказаться не должно. Операция открытия файла на запись довольно редкая, поэтому задержка на n-милисекунд вроде бы не должна сильно тормозить. По крайне мере в теории.
vim
|
|
|