проблема с DefineDosDevice

Тема в разделе "WASM.WIN32", создана пользователем DaRKSiDE_AHTeam, 18 окт 2009.

  1. DaRKSiDE_AHTeam

    DaRKSiDE_AHTeam New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2005
    Сообщения:
    22
    Адрес:
    Russia
    Может кто сталкивался с этим...
    Короче удаляю устройство таким путем -

    Код (Text):
    1.    1. invoke QueryDosDevice,DevName,Reserv,260
    2.    2. invoke DefineDosDevice,DDD_REMOVE_DEFINITION + DDD_EXACT_MATCH_ON_REMOVE + DDD_RAW_TARGET_PATH,DevName,Reserv
    Причем Reserv - это глобальный буфер куда сохраняется дос имя устройства...

    За тем я возвращаю устройство обратно таким способом -

    Код (Text):
    1. invoke DefineDosDevice,DDD_RAW_TARGET_PATH,DevName,Reserv
    Все встает на место... Устройство становиться доступно...
    НО все это я проделываю с флешкой...
    И после извлечения ее ... а за тем подключения ее обратно... вылезает такое сообщение -

    [​IMG]

    Вопрос.... если этот метод такой косячный, существует ли иной способ скрытия устройства..???
    Поделитесь пожалста ...
     
  2. DaRKSiDE_AHTeam

    DaRKSiDE_AHTeam New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2005
    Сообщения:
    22
    Адрес:
    Russia
    Я так понял никто никогда не использовал DefineDosDevice?
    Тяжелый случай :dntknw:
     
  3. DaRKSiDE_AHTeam

    DaRKSiDE_AHTeam New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2005
    Сообщения:
    22
    Адрес:
    Russia
    Вобщем-то проблема в том, что после переопределения DOS имени девайса (удаление и назначение этого же имени точке монтирования) функция CM_Request_Device_Eject не удаляет переопределенное имя девайса.. и из-за этого 2 дос имени (старое и новое) назначены одной точке монтирования... и старое имя стоит первым... и естественно указывает в NULL... т.к. у устройства после очередного подключения определяется системой новое дос имя...
     
  4. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Видимо дело в том, что DefineDosDevice создает ссылку не в глобальном пространстве имен диспетчера объектов, а в пространстве имен сессии. Т.о. получается коллизия.

    [​IMG]

    Разберись как заставить DefineDosDevice генерить ссылку вида "\Global??\X:" или можно попробовать использовать.

    Вместо QueryDosDevice
    ZwOpenDirectoryObject
    ZwOpenSymbolicLinkObject
    ZwQuerySymbolicLinkObject

    Вместо DefineDosDevice
    ZwOpenDirectoryObject
    ZwCreateSymbolicLinkObject

    Готового рецепта у меня нет.
     
  5. DaRKSiDE_AHTeam

    DaRKSiDE_AHTeam New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2005
    Сообщения:
    22
    Адрес:
    Russia
    Four-F
    Спасибо огромное! Я все понял...
    Это единственный внятный, а главное понятный и грамотный ответ на мой вопрос....
    Еще раз спасибо! :)
     
  6. DaRKSiDE_AHTeam

    DaRKSiDE_AHTeam New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2005
    Сообщения:
    22
    Адрес:
    Russia
    Four-F

    Я так понял что все таки надо использовать в симбиозе и натив апи и QueryDosDevice и DefineDosDevice...
    Первые для правки линка в глобале а вторые для правки сессии?
    Или глобала будет достаточно?
     
  7. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Нет, или-или. У Zw просто намного больше возможностей в плане управляемости. Можно точно определить куда именно нужно ссылку совать. Если внимательно покурить Defining an MS-DOS Device Name и Naming Files, Paths, and Namespaces, то наверное можно заставить и DefineDosDevice работать как надо (я предполагаю).

    Именно глобала и нужно добиться, если я всё правильно понимаю. Т.е. сессию не трогаем. Ссылку убиваем и создаём в глобальном пространстве имён, т.е. "\GLOBAL??\X:". Это под XP+. Под W2000, насколько я помню, "\GLOBAL??" нету. Там то ли явно нужно определять "\BasedNamedObjects", то ли вообще сессий нет. Не помню.
     
  8. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Хотя насчёт или-или может быть и не обязательно. Дёрнуть цель ссылки можно и через QueryDosDevice, а прибивать и создавать через Zw.
     
  9. DaRKSiDE_AHTeam

    DaRKSiDE_AHTeam New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2005
    Сообщения:
    22
    Адрес:
    Russia
    Согласен, но DefineDosDevice убивает и локальную и глобальную... но создает потом ссылку только сессионную ...
    Курить там особо нечего... там нет рецепта того как создать в глобале ссылку с при помощи DefineDosDevice, к сожалению...

    Собственно беда теперь в другом... а с ZwOpenDirectoryObject... с каким флагом открывать "\GLOBAL??" ?
    Перепробовал со всеми преведенными в мсдн.. постоянно возвращает разные коды ошибок, но чаще доступ запещен...
    И потом как я понял.. ZwCreateSymbolicLinkObject работает с хендлом созданного или инициализированного устройства, а не с хендлом открытого объекта? Или я ошибаюсь...? Просто какая должна быть связка, а самое главное с какими параметрами... информации нет... :dntknw:
    Код (Text):
    1. .data
    2. WSTR               wsGlobal,"\GLOBAL??"
    3.  
    4. .code
    5.  
    6.             local hObject       :dword
    7.             local UN        :UNICODE_STRING        
    8.             local ObjectAttributes  :OBJECT_ATTRIBUTES
    9.  
    10.             invoke RtlInitUnicodeString,addr UN,addr wsGlobal
    11.            
    12.             mov ObjectAttributes._Length,sizeof ObjectAttributes
    13.             mov ObjectAttributes.RootDirectory,0
    14.             lea eax,UN
    15.             mov ObjectAttributes.ObjectName,eax
    16.             mov ObjectAttributes.Attributes,OBJ_CASE_INSENSITIVE
    17.             mov ObjectAttributes.SecurityDescriptor,0
    18.             mov ObjectAttributes.SecurityQualityOfService,0
    19.             invoke ZwOpenDirectoryObject,addr hObject,20001h,addr ObjectAttributes
    И все.. на этом я застрял... :dntknw: Так как преведено в коде.. я открыл глобал.. но х.з. смогу ли я при этом создать в нем ссылку?
    И потом что дальше? Как передать именно букву диска ZwCreateSymbolicLinkObject-у?
    Обычно это передаеться через хендл устройства...

    Помогите в очередной раз пожалуйста... По натив апи в мсдн инфы крайне мало.. а уж по ZwCreateSymbolicLinkObject вообще нет... :dntknw:

    Меня интересует именно создание глобальной ссылки... т.к. прибить и глобал и сесию можно DefineDosDevice.
     
  10. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Деталей я к сожалению не знаю, разбираться некогда. Могу только указать направление.

    Инфу под Zw можно глянуть в книге "Windows NT/2000 Native API Reference" By Gary Nebbett.

    Насчёт "доступ запещен", может быть достаточно будет включить нужную привилегию... хз, мысли вслух.
    Код (Text):
    1. OpenProcessToken
    2. LookupPrivilegeValue( ..., SE_CREATE_SYMBOLIC_LINK_NAME, ...)
    3. AdjustTokenPrivileges
    DefineDosDevice обращается к серверу подсистемы клиент-сервер через CsrClientCallServer. Может посмотреть в ту сторону, хз.

    Ссылки по теме Global/Local
    http://www.osronline.com/custom.cfm?name=articlePrint.cfm&id=117
    http://www.nynaeve.net/?p=92
    http://msdn.microsoft.com/en-us/library/ms794719.aspx

    Для начала лучше в дебри не залезать, вполне возможно есть какой-то совсем простой солюшен.
     
  11. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    ОСЬ - Виста?
     
  12. DaRKSiDE_AHTeam

    DaRKSiDE_AHTeam New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2005
    Сообщения:
    22
    Адрес:
    Russia
    Нет... ХР...
    Four-F
    Спасибо!
     
  13. DaRKSiDE_AHTeam

    DaRKSiDE_AHTeam New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2005
    Сообщения:
    22
    Адрес:
    Russia
    В общем-то разобрался я с данной проблемой. Все оказалось до смешного банально... :)
    Для того чтобы DefineDosDevice создавал линк в глобале... необходимо чтобы обращение к DefineDosDevice происходило из контекста LocalSystem ... проще говоря из тела к примеру сервиса или проги запущенной в контексте системной службы (к примеру lsass).. В этом случае ссылка пишется непосредственно в глобал а не в сессию...

    Вот так... ;)