[Win32] Есть ли в kernel'е аналоги функций GetShortPathName() and GetLongPathName() ?29.05.02 22:33 Число просмотров: 1136 Автор: vim Статус: Незарегистрированный пользователь
---
> > > > Не, это я знаю. Не подходит. Для этой функции нужен > > FileHandle, т.е. файл предварительно должен быть > открыт. А > > мне наоборот, по имени файла нужно решить разрешать ли > его > > открывать или нет. > > > > Исходные данные - это строка текста с именем файла. > > Из-за того, что у файла может быть два имени - длинное > и > > короткое, их оба нужно проверить. В этом вся проблема. > Voobche to GetShortFielNAme()/GetLongFileNAme() otkryvet > file, queryinfo, zakryvaet file, tak chto drugogo puti net > > FILEMONITOR TRACE dlia: >
[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
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 Статус: Незарегистрированный пользователь
---
> > > > Не, это я знаю. Не подходит. Для этой функции нужен > > FileHandle, т.е. файл предварительно должен быть > открыт. А > > мне наоборот, по имени файла нужно решить разрешать ли > его > > открывать или нет. > > > > Исходные данные - это строка текста с именем файла. > > Из-за того, что у файла может быть два имени - длинное > и > > короткое, их оба нужно проверить. В этом вся проблема. > Voobche to GetShortFielNAme()/GetLongFileNAme() otkryvet > file, queryinfo, zakryvaet file, tak chto drugogo puti net > > FILEMONITOR TRACE dlia: >
> 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
---
> > > > > > Не, это я знаю. Не подходит. Для этой функции > нужен > > > FileHandle, т.е. файл предварительно должен быть > > открыт. А > > > мне наоборот, по имени файла нужно решить > разрешать ли > > его > > > открывать или нет. > > > > > > Исходные данные - это строка текста с именем > файла. > > > Из-за того, что у файла может быть два имени - > длинное > > и > > > короткое, их оба нужно проверить. В этом вся > проблема. > > Voobche to GetShortFielNAme()/GetLongFileNAme() > otkryvet > > file, queryinfo, zakryvaet file, tak chto drugogo puti > net > > > > FILEMONITOR TRACE dlia: > >
> > 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 Статус: Незарегистрированный пользователь
---
> > > > > > > > Не, это я знаю. Не подходит. Для этой > функции > > нужен > > > > FileHandle, т.е. файл предварительно должен > быть > > > открыт. А > > > > мне наоборот, по имени файла нужно решить > > разрешать ли > > > его > > > > открывать или нет. > > > > > > > > Исходные данные - это строка текста с именем > > файла. > > > > Из-за того, что у файла может быть два имени > - > > длинное > > > и > > > > короткое, их оба нужно проверить. В этом вся > > проблема. > > > Voobche to GetShortFielNAme()/GetLongFileNAme() > > otkryvet > > > file, queryinfo, zakryvaet file, tak chto drugogo > puti > > net > > > > > > FILEMONITOR TRACE dlia: > > >
---
> > > > Да, в принципе так она и должна работать. > > Но проблема в том что это делается в 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 Статус: Незарегистрированный пользователь
---
> > > > > > > > > > Не, это я знаю. Не подходит. Для этой > > функции > > > нужен > > > > > FileHandle, т.е. файл предварительно > должен > > быть > > > > открыт. А > > > > > мне наоборот, по имени файла нужно > решить > > > разрешать ли > > > > его > > > > > открывать или нет. > > > > > > > > > > Исходные данные - это строка текста с > именем > > > файла. > > > > > Из-за того, что у файла может быть два > имени > > - > > > длинное > > > > и > > > > > короткое, их оба нужно проверить. В > этом вся > > > проблема. > > > > Voobche to > GetShortFielNAme()/GetLongFileNAme() > > > otkryvet > > > > file, queryinfo, zakryvaet file, tak chto > drugogo > > puti > > > net > > > > > > > > FILEMONITOR TRACE dlia: > > > >
---
> > > > > > Да, в принципе так она и должна работать. > > > Но проблема в том что это делается в 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-милисекунд вроде бы не должна сильно тормозить. По крайне мере в теории.