Приветствую уважаемый форум! Помогите решить следующую задачу: Работаю в режиме ядра. Необходимо по полному имени файла определить его Dos имя. Например: из C:\Documents and Settings\All Users\1.txt получить C:\DOCUME~2\ALLUSE~1\1.TXT Конечно можно посимвольно разобрать исходную строку, вручную произвести необходимые замены и т.д. Но мне кажется, что должен быть более простой способ.
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal lBuffer As Long) As Long
А нельзя ли на C. И желательно поподробнее. Дело в том, что когда я добавляю в текст программы прототип этой функции, взятый из winbase.h, подключаю kernel32.lib, и пытаюсь вызвать эту функцию, Драйвер компилируется нормально, но при попытке запуска с помощью Monitor из DriverStudio возникает ошибка: Error (127) Unexpected Error Occured
Из драйвера нельзя вызывать функции kernel32. Чем спрашивать, лучше бы уже давно написал разбор строки вручную, тут делов то на 5 минут.
Если делов на пять минут, то может напишешь алгоритм как произвести такое преобразование. Например, исходные каталоги: Dos имена: C:\Docum1\Text Document\ C:\DOCUM1\TE815C~1 C:\Docum1\Text Documents1\ C:\DOCUM1\TEXTDO~1 C:\Docum1\Text Documents2\ C:\DOCUM1\TEXTDO~2 C:\Docum1\Text Documents3\ C:\DOCUM1\TEXTDO~3 C:\Docum1\Text Documents4\ C:\DOCUM1\TEXTDO~4 C:\Docum1\Text Documents5\ C:\DOCUM1\TE5C71~1 При этом в зависимости от порядка создания исходных Windows каталогов, Dos имена будут различаться. Наример, вместо C:\DOCUM1\TE815C~1 можно получить C:\DOCUM1\TE5С31~1 и т.д.
А нельзя ли поподробнее по поводу функции RtlGenerate8dot3Name, да и вообще про вызов функций kernel32 из режима ядра. Прототип этой функции я нашел, но все попытки ее использовать приводят к синему экрану.
лучше попробовать HANDLE FindFirstFile(LPCTSTR)lpFileName,LPWIN32_FIND_DATA lpFindFileData); а 8.3 имя вытенуть из lpFindFileData->cAlternateFileName