Определение Dos имени файла

Тема в разделе "WASM.WIN32", создана пользователем Crom, 24 дек 2005.

  1. Crom

    Crom New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2005
    Сообщения:
    9
    Приветствую уважаемый форум!

    Помогите решить следующую задачу:

    Работаю в режиме ядра. Необходимо по полному имени файла

    определить его Dos имя.

    Например: из C:\Documents and Settings\All Users\1.txt

    получить C:\DOCUME~2\ALLUSE~1\1.TXT



    Конечно можно посимвольно разобрать исходную строку,

    вручную произвести необходимые замены и т.д. Но мне

    кажется, что должен быть более простой способ.
     
  2. Sector

    Sector New Member

    Публикаций:
    0
    Регистрация:
    7 июл 2005
    Сообщения:
    49
    Адрес:
    Iceland
    Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal lBuffer As Long) As Long
     
  3. Crom

    Crom New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2005
    Сообщения:
    9
    А нельзя ли на C. И желательно поподробнее.



    Дело в том, что когда я добавляю в текст программы

    прототип этой функции, взятый из winbase.h, подключаю

    kernel32.lib, и пытаюсь вызвать эту функцию, Драйвер

    компилируется нормально, но при попытке запуска с помощью Monitor из DriverStudio возникает ошибка:

    Error (127) Unexpected Error Occured
     
  4. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Из драйвера нельзя вызывать функции kernel32.

    Чем спрашивать, лучше бы уже давно написал разбор строки вручную, тут делов то на 5 минут.
     
  5. Crom

    Crom New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2005
    Сообщения:
    9
    Если делов на пять минут, то может напишешь алгоритм как

    произвести такое преобразование.

    Например,

    исходные каталоги: 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 и т.д.
     
  6. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    В атаче соответствующий код из сорцов ReactOS.

    [​IMG] 294889830__text.txt
     
  7. Crom

    Crom New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2005
    Сообщения:
    9
    Спасибо за информацию
     
  8. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    ntoskrnl!RtlGenerate8dot3Name(,,,)
     
  9. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow


    Можно, если осторожно.
     
  10. Crom

    Crom New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2005
    Сообщения:
    9
    А нельзя ли поподробнее по поводу функции RtlGenerate8dot3Name, да и вообще про вызов функций kernel32 из режима ядра.



    Прототип этой функции я нашел, но все попытки ее использовать

    приводят к синему экрану.
     
  11. AndreyD

    AndreyD New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2006
    Сообщения:
    3
    Адрес:
    Ukraine
    лучше попробовать

    HANDLE FindFirstFile(LPCTSTR)lpFileName,LPWIN32_FIND_DATA lpFindFileData);



    а 8.3 имя вытенуть из lpFindFileData->cAlternateFileName