Может кто сталкивался с этим... Короче удаляю устройство таким путем - Код (Text): 1. invoke QueryDosDevice,DevName,Reserv,260 2. invoke DefineDosDevice,DDD_REMOVE_DEFINITION + DDD_EXACT_MATCH_ON_REMOVE + DDD_RAW_TARGET_PATH,DevName,Reserv Причем Reserv - это глобальный буфер куда сохраняется дос имя устройства... За тем я возвращаю устройство обратно таким способом - Код (Text): invoke DefineDosDevice,DDD_RAW_TARGET_PATH,DevName,Reserv Все встает на место... Устройство становиться доступно... НО все это я проделываю с флешкой... И после извлечения ее ... а за тем подключения ее обратно... вылезает такое сообщение - Вопрос.... если этот метод такой косячный, существует ли иной способ скрытия устройства..??? Поделитесь пожалста ...
Вобщем-то проблема в том, что после переопределения DOS имени девайса (удаление и назначение этого же имени точке монтирования) функция CM_Request_Device_Eject не удаляет переопределенное имя девайса.. и из-за этого 2 дос имени (старое и новое) назначены одной точке монтирования... и старое имя стоит первым... и естественно указывает в NULL... т.к. у устройства после очередного подключения определяется системой новое дос имя...
Видимо дело в том, что DefineDosDevice создает ссылку не в глобальном пространстве имен диспетчера объектов, а в пространстве имен сессии. Т.о. получается коллизия. Разберись как заставить DefineDosDevice генерить ссылку вида "\Global??\X:" или можно попробовать использовать. Вместо QueryDosDevice ZwOpenDirectoryObject ZwOpenSymbolicLinkObject ZwQuerySymbolicLinkObject Вместо DefineDosDevice ZwOpenDirectoryObject ZwCreateSymbolicLinkObject Готового рецепта у меня нет.
Four-F Спасибо огромное! Я все понял... Это единственный внятный, а главное понятный и грамотный ответ на мой вопрос.... Еще раз спасибо!
Four-F Я так понял что все таки надо использовать в симбиозе и натив апи и QueryDosDevice и DefineDosDevice... Первые для правки линка в глобале а вторые для правки сессии? Или глобала будет достаточно?
Нет, или-или. У Zw просто намного больше возможностей в плане управляемости. Можно точно определить куда именно нужно ссылку совать. Если внимательно покурить Defining an MS-DOS Device Name и Naming Files, Paths, and Namespaces, то наверное можно заставить и DefineDosDevice работать как надо (я предполагаю). Именно глобала и нужно добиться, если я всё правильно понимаю. Т.е. сессию не трогаем. Ссылку убиваем и создаём в глобальном пространстве имён, т.е. "\GLOBAL??\X:". Это под XP+. Под W2000, насколько я помню, "\GLOBAL??" нету. Там то ли явно нужно определять "\BasedNamedObjects", то ли вообще сессий нет. Не помню.
Хотя насчёт или-или может быть и не обязательно. Дёрнуть цель ссылки можно и через QueryDosDevice, а прибивать и создавать через Zw.
Согласен, но DefineDosDevice убивает и локальную и глобальную... но создает потом ссылку только сессионную ... Курить там особо нечего... там нет рецепта того как создать в глобале ссылку с при помощи DefineDosDevice, к сожалению... Собственно беда теперь в другом... а с ZwOpenDirectoryObject... с каким флагом открывать "\GLOBAL??" ? Перепробовал со всеми преведенными в мсдн.. постоянно возвращает разные коды ошибок, но чаще доступ запещен... И потом как я понял.. ZwCreateSymbolicLinkObject работает с хендлом созданного или инициализированного устройства, а не с хендлом открытого объекта? Или я ошибаюсь...? Просто какая должна быть связка, а самое главное с какими параметрами... информации нет... Код (Text): .data WSTR wsGlobal,"\GLOBAL??" .code local hObject :dword local UN :UNICODE_STRING local ObjectAttributes :OBJECT_ATTRIBUTES invoke RtlInitUnicodeString,addr UN,addr wsGlobal mov ObjectAttributes._Length,sizeof ObjectAttributes mov ObjectAttributes.RootDirectory,0 lea eax,UN mov ObjectAttributes.ObjectName,eax mov ObjectAttributes.Attributes,OBJ_CASE_INSENSITIVE mov ObjectAttributes.SecurityDescriptor,0 mov ObjectAttributes.SecurityQualityOfService,0 invoke ZwOpenDirectoryObject,addr hObject,20001h,addr ObjectAttributes И все.. на этом я застрял... Так как преведено в коде.. я открыл глобал.. но х.з. смогу ли я при этом создать в нем ссылку? И потом что дальше? Как передать именно букву диска ZwCreateSymbolicLinkObject-у? Обычно это передаеться через хендл устройства... Помогите в очередной раз пожалуйста... По натив апи в мсдн инфы крайне мало.. а уж по ZwCreateSymbolicLinkObject вообще нет... Меня интересует именно создание глобальной ссылки... т.к. прибить и глобал и сесию можно DefineDosDevice.
Деталей я к сожалению не знаю, разбираться некогда. Могу только указать направление. Инфу под Zw можно глянуть в книге "Windows NT/2000 Native API Reference" By Gary Nebbett. Насчёт "доступ запещен", может быть достаточно будет включить нужную привилегию... хз, мысли вслух. Код (Text): OpenProcessToken LookupPrivilegeValue( ..., SE_CREATE_SYMBOLIC_LINK_NAME, ...) 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 Для начала лучше в дебри не залезать, вполне возможно есть какой-то совсем простой солюшен.
В общем-то разобрался я с данной проблемой. Все оказалось до смешного банально... Для того чтобы DefineDosDevice создавал линк в глобале... необходимо чтобы обращение к DefineDosDevice происходило из контекста LocalSystem ... проще говоря из тела к примеру сервиса или проги запущенной в контексте системной службы (к примеру lsass).. В этом случае ссылка пишется непосредственно в глобал а не в сессию... Вот так...