Сейчас на форуме: tyns777, zds (+3 невидимых)

 eXeL@B —› Программирование —› проблема с DefineDosDevice
Посл.ответ Сообщение


Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 17 октября 2009 17:44
· Личное сообщение · #1

Может кто сталкивался с этим...
Короче удаляю устройство таким путем -
Code:
  1. invoke QueryDosDevice,DevName,Reserv,260
  2. invoke DefineDosDevice,DDD_REMOVE_DEFINITION + DDD_EXACT_MATCH_ON_REMOVE + DDD_RAW_TARGET_PATH,DevName,Reserv


Причем Reserv - это глобальный буфер куда сохраняется дос имя устройства...

За тем я возвращаю устройство обратно таким способом -
Code:
  1. invoke DefineDosDevice,DDD_RAW_TARGET_PATH,DevName,Reserv


Все встает на место... Устройство становиться доступно...
НО все это я проделываю с флешкой...
И после извлечения ее ... а за тем подключения ее обратно... вылезает такое сообщение -


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

-----
aLL rIGHTS rEVERSED!





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 18 октября 2009 08:53
· Личное сообщение · #2

Неужели никто и никогда не юзал данные выше функции?? Не верю... Или инфой в лом делиться?!

-----
aLL rIGHTS rEVERSED!




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 18 октября 2009 10:28 · Поправил: Clerk
· Личное сообщение · #3

Окно может быть от csrss и от проводника. Если первое - используем ProcessDefaultHardErrorMode, во втором случае необходимо уведомить проводник об отключении носителя, либо удалять устройство средствами сетупапи(CM_Request_Device_Eject etc.), хотя оно к рпк вызову и сводится как обычно.




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 18 октября 2009 10:58 · Поправил: DaRKSiDE
· Личное сообщение · #4

Clerk пишет:
либо удалять устройство средствами сетупапи

так я его не удаляю... физически он остается в гнезде...
т.е. я его на время удаляю дос имя чтобы скрыть из папки Мой компьютер и закрываю доступ с консоли... а потом восстанавливаю в нормальное состояние..

-----
aLL rIGHTS rEVERSED!





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 18 октября 2009 12:40
· Личное сообщение · #5

Лучше сделать драйвер фильтр может?! Сложнее , но эффективнее , со скрытием играть можно как хочешь.

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 21 октября 2009 08:36 · Поправил: DaRKSiDE
· Личное сообщение · #6

Clerk

Ты можешь привести пример кода, если не можно?

И еще вопрос, как можно извлечь флешку без CM_Request_Device_Eject? Просто я ее как раз и извлекаю CM_Request_Device_Eject и этот способ дает выше описанную ошибку...

-----
aLL rIGHTS rEVERSED!




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 21 октября 2009 09:00
· Личное сообщение · #7

DaRKSiDE
В гугле найдёте код. Ошибка - вполне вероятно, ведь устройство использовалось, а затем неожиданно было удалено, а ресурсы/ссылки не освобождены. Эта не та ситуация, которую можно обойти легально. Окно проводника - перезапустите его




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 22 октября 2009 07:01 · Поправил: DaRKSiDE
· Личное сообщение · #8

Clerk

Бесполезно... перезапуск проводника ни к чему хорошему не привел.. все осталось как и было...
Кстати... заметил такую закономерность...Если я удаляю дос имя и затем произвожу выброс флешки CM_Request_Device_Eject то повторное подключение проходит корректно, т.е. ошибка не вылазиет...
А вот если была последовательность... удаление дос имени-> присвоение дос имени... (причем после этого можно работать с флешкой до первого реконекта) то после выброса и подключения заново имеет место неверная ссылка... Причем после возникновения данного косяка если опять повторить последовательность комманд -
Code:
  1.  
  2.  
  3.    1. invoke QueryDosDevice,DevName,Reserv,260
  4.    2. invoke DefineDosDevice,DDD_REMOVE_DEFINITION + DDD_EXACT_MATCH_ON_REMOVE + DDD_RAW_TARGET_PATH,DevName,Reserv
  5.  
  6.  


то флешка не удаляется а становиться доступной... т.е. касяк с неверной ссылкой правиться...
но это не есть гуд....
т.е. как я понял косяк кроиться именно в назначении дос имени

Code:
  1.  
  2. invoke DefineDosDevice,DDD_RAW_TARGET_PATH,DevName,Reserv
  3.  


Т.е. по логике вещей видимо нужна какая-то предварительная операция с дос именем чтоли?
Но какая?! Х.з....

Может ты знаешь? Подскажи, плиз....

-----
aLL rIGHTS rEVERSED!





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 22 октября 2009 14:39
· Личное сообщение · #9

DaRKSiDE книженция www.megaupload.com/?d=OS4I3UN0
в архиве 2 книги , автор тот же но там толи издания разные толи что то исправлено, и в одном исходники по размеру больше. Там 2 комплекта... прочитай первые главы ..там есть этапы индентификации устройства, этот порядок важен , также стоит прочитать про освобождение буфера информации о усб. А вообще начни с главы 11 , пролистай все сначала , все что тебя интересует там описано, может упустил мелочь.

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 23 октября 2009 07:28
· Личное сообщение · #10

mak
Спасибо!

-----
aLL rIGHTS rEVERSED!





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 24 октября 2009 12:47
· Личное сообщение · #11

DaRKSiDE пишет:
mak


Того что нужно.. там нет... к сожалению...
Вобщем-то проблема в том, что после переопределения DOS имени девайса (удаление и назначение этого же имени точке монтирования) функция CM_Request_Device_Eject не удаляет переопределенное имя девайса.. и из-за этого 2 дос имени (старое и новое) назначены одной точке монтирования... и старое имя стоит первым... и естественно указывает в NULL... т.к. у устройства после очередного подключения определяется системой новое дос имя...
Так что касяк именно в -
Code:
  1. invoke DefineDosDevice,DDD_RAW_TARGET_PATH,DevName,Reserv

Почему-то система игнорирует при удалении устройства старое дос имя и не удаляет его вместе с девайсом...
Может всетаки ктото знает как решить эту проблему???

-----
aLL rIGHTS rEVERSED!





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 25 октября 2009 12:27
· Личное сообщение · #12

Получается что никто с кряклаба никогда не сталкивался с подобной проблемой? или не располагает инфой?
Или в лом делиться особо ценной информацией???

-----
aLL rIGHTS rEVERSED!




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 25 октября 2009 14:13
· Личное сообщение · #13

Никогда не удаляют то, что уже создано и используется. В противном случае это вызывает коллизии и крах. Если требуется сокрытие чеголибо, то делайте это до того, как ктото обнаружит и начнёт использовать.




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 09 ноября 2009 10:24
· Личное сообщение · #14

В общем-то разобрался я с данной проблемой. Все оказалось до смешного банально...
Для того чтобы DefineDosDevice создавал линк в глобале... необходимо чтобы обращение к DefineDosDevice происходило из контекста LocalSystem ... проще говоря из тела к примеру сервиса или проги запущенной в контексте системной службы (к примеру lsass).. В этом случае ссылка пишется непосредственно в глобал а не в сессию...

-----
aLL rIGHTS rEVERSED!



 eXeL@B —› Программирование —› проблема с DefineDosDevice
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати