преобразование имен файлов

Тема в разделе "WASM.WIN32", создана пользователем cresta, 28 мар 2006.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Есть ли функция конвертации вида

    \Device\HarddiskVolume1\1.txt -> C:\1.txt

    т.е. обратная к QueryDosDevice?
     
  2. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Не рулит. Видел этот топик.

    ZwOpenSymbolicLinkObject требует линк. Как из имени выделить линк, чтобы передать туда? Линки могут быть совершенно различного вида.

    Вижу только один способ: получить все девайсы и каждый из них сравнивать на n первых символов с именем файла. И так для каждого файла. Долго, неудобно и ненадёжно.
     
  4. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Там собственно та же информация.

    Думаю быстрее и надёжней будет подойти с обратной стороны: получить список имен дисков GetLogicalDriveStrings и список линков QueryDosDevice. Для каждого имени диска получить линк и сопоставить с \Device\HarddiskVolume1\1.txt
     
  6. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    Ну да) Как и в других темах делали)
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Ну тогда и мой вариант до кучи :)


    Код (Text):
    1. lpDevice  - input  buffer ptr        
    2. lpPathOut - output buffer ptr
    3. cbPathOut - output buffer length
    4.  
    5. ;=====================================================================  ==================
    6. DeviceToPath proc uses ebx esi lpDevice:DWORD, lpPathOut:DWORD, cbPathOut:DWORD
    7.     LOCAL logStrings[256]   :BYTE
    8.  
    9.     invoke  GetLogicalDriveStrings, 256, addr logStrings
    10.     .if     (eax)
    11.         lea     ebx,logStrings
    12.         .while  (byte ptr[ebx])
    13.             invoke  lstrlen, ebx
    14.             lea     eax,[eax+ebx-1]
    15.             mov     byte ptr[eax],0
    16.             invoke  QueryDosDevice, ebx, lpPathOut, cbPathOut
    17.             lea     esi,[eax-2]
    18.             .if     (esi)
    19.                 invoke  RtlCompareMemory, lpPathOut, lpDevice, esi
    20.                 .if     (eax==esi)
    21.                     invoke  lstrcpy, lpPathOut, ebx
    22.                     mov     eax,lpDevice
    23.                     add     eax,esi
    24.                     invoke  lstrcat, lpPathOut, eax
    25.                     or      eax,-1
    26.                     jmp     _ret
    27.                 .endif
    28.             .endif
    29.             .while  (byte ptr[ebx])
    30.                 inc     ebx
    31.             .endw
    32.             add     ebx,2
    33.         .endw
    34.     .endif
    35.     xor     eax,eax
    36. _ret:    
    37.     ret
    38. DeviceToPath endp
    39.  




    Хотя раз есть QueryDosDevice, должно было бы быть и обратное.