Как получить DeviceName в DefineDosDevice(), зная TargetPath?

Тема в разделе "WASM.NT.KERNEL", создана пользователем Xerx, 24 апр 2007.

  1. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    т.е. был вызов
    Код (Text):
    1. invoke DefineDosDevice, DDD_RAW_TARGET_PATH, addr Path, $CTA0("\\Device\\MyDriver")
    где Path - имя диска ('D:',0)
    Все корректно создалось, ну и работает дальше.

    В какой-то момент понадобилось получить это самое название диска (Path = 'D:',0), зная '\Device\MyDriver'.
    Т.е., совсем по-идиотски выражаясь, как по третьему параметру DefineDosDevice() получить второй? Известно, что для одного драйвера создается только один диск.

    Жду любой помощи.
     
  2. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Эх, я дурак. Разобрался. Сделал перебор от 'A' до 'Z' (можно конечно и используя GetLogicalDrives, но да не в том суть), для каждой буквы вызываю QueryDosDevice, где первый параметр соответственно диск (A:, B:, ...), второй буфер. Если функция отработала успешно, то сравниваю содержимое буфера с нужной мне строкой. Вот и все.

    Если есть варианты лучше, то готов их выслушать :)
     
  3. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
  4. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Ну, суть таже. только у меня намного короче :derisive:
    DRIVER_TARGET - что-то из '\Device\'
    На выходе в al - буква диска или 0

    Код (Text):
    1. GetUsedDriveLetter proc
    2. LOCAL buff[1024] : BYTE
    3. LOCAL dn[4] : BYTE
    4.  
    5.     mov     dword ptr [dn], 00003A41H ; 'A:',0,0
    6. @@GUDL_loop:
    7.  
    8.     invoke  QueryDosDevice, addr dn, addr buff, 1024
    9.     .IF (eax != 0)
    10.         invoke  szCmp, addr buff, addr DRIVER_TARGET
    11.         .IF (eax != 0)
    12.             ; нашел диск
    13.             mov     al,     byte ptr [dn]
    14.             ;return(eax)
    15.             ret
    16.         .ENDIF
    17.     .ENDIF
    18.     lea     eax,    dn
    19.     inc     byte ptr [eax]
    20.     cmp     byte ptr [eax], 'Z'
    21.     jna     @@GUDL_loop
    22.    
    23.     return(0)
    24. GetUsedDriveLetter endp