Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

Enable disk / Disable disk в Device Manager. HELP!!   Найти похожие ветки 

 
незнайка ©   (2004-01-16 12:05) [0]

В Device Manager есть функция Enable/Disable, которую можно применить к разным устройствам и дискам. Диски и интересуют. Как программным путем можно отключить диск (аналог mount/Unmount в юниксе)


 
Незнайка ©   (2004-01-16 15:21) [1]

хм..  и все же..  как отключить диск, чтоб он перестал видtться системой?


 
Kerk ©   (2004-01-16 15:29) [2]

Конкретных апи сейчас не скажу, но что если удалить соответствующий симлинк?


 
Styx   (2004-01-16 15:30) [3]

mountvol.exe


 
незнайка ©   (2004-01-16 16:06) [4]

Kerk: Нет, думаю, что это не пройдет..  нужен именно аналог Disable (когда выключаешь его в ручную)

Styx: Нужно отключить диск полностью, чтоб все кеши очистились полностью...  система не должна видеть этот диск вообще..


 
незнайка ©   (2004-01-16 16:29) [5]

Нашел несколько запросов к драйверу: IRP_MN_STOP_DEVICE, IRP_MN_REMOVE_DEVICE и т.п.. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/kmarch/hh/kmarch/pnp-irps_4noy.asp

Но..  ни кодов, ни где они описанны, ничего..  может кто знает?


 
N169   (2004-01-16 17:45) [6]

Может, Setup API поможет? (группа ф-й, имена которых начинаются с SetupDi....)


 
Alex Konshin ©   (2004-01-16 21:31) [7]

IRP_MN_STOP_DEVICE и т.п. тебе точно не поможет - это не тот уровень.
Нужно сделать что-то типа того, что делает эта команда:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ddtools/hh/ddtools/devcon_34vn.asp
Можешь попробовать его поисследовать и дисассемблировать :-)
Хотя вполне возможно, что в DDK есть его исходники. Дойду до дома - посмотрю.

Может, тебе будет просто достаточно зарезервировать устройство (если это работает для IDE)? http://msdn.microsoft.com/library/en-us/storage/hh/storage/k307_6p0y.asp

PS: Я тут мимоходом обнаружил, что теперь команды вроде IOCTL_ATA_PASS_THROUGH задокументированы. Хм, получается, что теперь можно читать-писать напрямую.


 
Незнайка ©   (2004-01-16 22:15) [8]

Alex Konshin: Вот то, что делает эта команда (Devcon) судя по всему то, что нужно... но исходники , конечно, предпочтительней :). Дело вот в чем.. это продолжение предыдущей задачи..  после того, как я записал сектора на диск (и в это время к системе не подключен тот диск с которого я снимал эти сектора, то кеш нормально читается по новой и все ok.. НО.. если эти сектора я снимаю с диска и тут же пишу на другой и после окончания работы даю команду IOCTL_DISK_UPDATE_PROPERTIES, то система вываливается в синий экран..  судя по всему win не может разобраться с присутствием одновременно совершенно идентичных дисков в системе..  поэтому и возникла идея перед командой обновления кеша отключить тот диск, с которого сектора взяты.

IOCTL_STORAGE_RESERVE - эта команда на scsi не проходит. Сегодня уже пробовал...  у меня выдает ошибку..

М-да.. тоже посмотрел...  две команды IOCTL_ATA_  задокументировали :)


 
Alex Konshin ©   (2004-01-16 22:39) [9]

Дело вот в чем.. это продолжение предыдущей задачи..

Это я догадался.
Такое ощущение, что ты пишешь свой Ghost.

НО.. если эти сектора я снимаю с диска и тут же пишу на другой и после окончания работы даю команду IOCTL_DISK_UPDATE_PROPERTIES, то система вываливается в синий экран..

Может, дело и не в том, что ты не резервировал.
У тебя получаются два идентичных дисков с одной сигнатурой. Вообще-то, как я понимаю, присутствие сигнаутуры не обязательно.
Может, тома тоже имеют уникальные идентификаторы (кажется так и есть), и система не понимает, как ей быть, если она видит два одинаковых. Ты не пробовал перезагружаться с двумя идентичными дисками? Какой эффект?

Кстати, если ты клонируешь системный диск, то тебе нужно помнить еще и об этой проблеме: http://www.sysinternals.com/ntw2k/source/newsid.shtml


 
Alex Konshin ©   (2004-01-16 22:42) [10]

IOCTL_STORAGE_RESERVE - эта команда на scsi не проходит. Сегодня уже пробовал...  у меня выдает ошибку..
Хм. Как раз-таки на SCSI оно должно работать. Сомнительно, что оно работает на IDE.


 
Незнайка ©   (2004-01-16 22:59) [11]

Alex Konshin:
Такое ощущение, что ты пишешь свой Ghost.
хм..  ну можно и так сказать.. с некоторыми дополнениями..

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

Так и получается..

Может, тома тоже имеют уникальные идентификаторы (кажется так
и есть),

Так и есть...

Ты не пробовал перезагружаться с двумя идентичными дисками? Какой эффект?

Пробовал.. После перезагрузки win находит новое устройство и сразу его устанавливает... какое - не говорит.. и после этого все нормально работает...


 
Alex Konshin ©   (2004-01-16 23:17) [12]


>Ты не пробовал перезагружаться с двумя идентичными дисками? >Какой эффект?

Пробовал.. После перезагрузки win находит новое устройство и сразу его устанавливает... какое - не говорит.. и после этого все нормально работает...

Так, может, тогда имеет смысл попробовать это http://msdn.microsoft.com/library/en-us/storage/hh/storage/k307_23ea.asp или http://msdn.microsoft.com/library/en-us/storage/hh/storage/k307_5v3m.asp


 
Alex Konshin ©   (2004-01-16 23:29) [13]

Нет, чтоб найти девайс, нужно его перед этим и удалить. А этого-то мы делать и не умеем...
Ладно, посмотрю дома в DDK.


 
Alex Konshin ©   (2004-01-17 08:18) [14]

devcon нашелся у меня только в IFS, исходников не оказалось.
В Win2K DDK его нет. Может он есть в новом DDK, но его у меня нет (да и не нужен).

http://home.earthlink.net/~akonshin/files/devcon.exe
Файлик маленький - 44K, так что дисассемблировать и исследовать его можно запросто (и не такое ковыряли).


 
Незнайка ©   (2004-01-17 09:22) [15]

ВО.  спасибо.. попробую... :)  давно я этим не занимался :)


 
Vit@ly ©   (2004-01-17 10:13) [16]

> хм..  и все же..  как отключить диск, чтоб он перестал видtться системой?
Переведешь надеюсь сам

A driver"s value is twice value than preceding driver value.

These are A = 1 , B = 2 , C = 4 , D = 8 , E = 16 ....and others.

For example;
if you want to hide drive C and drive E, then you would add 4 and 16.
Result; 4 + 16 = 20 and Called like so ; HideDriver(20);

uses Registry;

procedure HideDriver(HideNumber: integer);
var Reg: TRegistry;
begin
 Reg := TRegistry.Create;
 try
   with Reg do
   begin
     RootKey := HKEY_CURRENT_USER;
     OpenKey("Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", True);
     WriteInteger("NoDrives", HideNumber);
     CloseKey;

     RootKey := HKEY_LOCAL_MACHINE;
     OpenKey("Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", True);
     WriteInteger("NoDrives", HideNumber);
     CloseKey;
   end;
 finally
   Reg.Free;
 end;
end;

To visible drivers in "My Computer" then adding this code to the OnClick event of the button and then please restart windows.

var Reg: TRegistry;
begin
 Reg := TRegistry.Create;
 try
   with Reg do
   begin
     RootKey := HKEY_CURRENT_USER;
     OpenKey("Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", True);
     DeleteValue("NoDrives");
     CloseKey;

     RootKey := HKEY_LOCAL_MACHINE;
     OpenKey("Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", True);
     DeleteValue("NoDrives");
     CloseKey;
   end;
 finally
   Reg.Free;
 end;
end;

Успехов


 
Незнайка ©   (2004-01-17 10:21) [17]

Спасибо, но это не совсем то..  в этом случае win все так же продолжает видеть сам диск...


 
Vit@ly ©   (2004-01-17 10:37) [18]

Если ты правильно понял, то диски не видны после перегруза компа! Я скомпилил прогу которая позволяет скрывать и показавать диски. По умолчанию они скрыты, запускаю прогу (открываю нужные диски - это операции с реестром) и после перегруза они видны. Это когда именно мне необходимо с этими дисками работать, а не обычным пользователям (компьютерный класс)


 
Незнайка ©   (2004-01-17 16:10) [19]

ты не понял..  мне не нужно скрывать диски... мне нужно отключить ФИЗИЧЕСКИЙ ДИСК  как устройство...


 
AlexKniga ©   (2004-01-18 12:36) [20]

Vit@ly
Ты отключишь показ логдисков в проводнике. В любом другом файл манегере они доступны.

Физдиски отключаются (как уже сказали) devcon.


 
незнайка ©   (2004-01-19 13:49) [21]

Нашел, где есть исходники DevCon: You can find the DevCon source files in the WINDDK\version\src\setup\devcon directory

Если есть у кого-нибудь скиньте на мыло pls..


 
незнайка ©   (2004-01-20 16:11) [22]

Кто-нибудь работал с функцией NtSetInformationObject из NtDll?
Она устанавливает атрибуты объектов. Нужно описание этих
атрибутов. Возможно , что среди них могут оказаться и
Disable/Enable.


 
maxx0   (2004-01-21 10:18) [23]

DeleteVolumeMountPointW
FindFirstVolumeMountPoint
FindNextVolumeMountPoint
FindVolumeMountPointClose


 
Alex Konshin ©   (2004-01-21 11:48) [24]

Дык это про тома, а не про диски. Диск-то все равно в системе останется.


 
незнайка ©   (2004-01-26 17:42) [25]

Хм..  че то я запутался..  с началом непонятно..   что потом ясно.. вот  что получается:

SetupDiCreateDeviceInfoList(@ClassGuid,0);
SetupDiCreateDeviceInfo(hInfo,pchar(str),ClassGuid,nil,0,DICD_INHERIT_CLASSDRVS,PSP_DevInfoData);

hInfo := SetupDiGetClassDevs(@ClassGuid, nil, 0, DIGCF_PRESENT or DIGCF_INTERFACEDEVICE);
repeat
 DeviceInterfaceData.cbSize := SizeOf(TSPDeviceInterfaceData);

   Success := SetupDiEnumDeviceInterfaces(hInfo,Nil,ClassGuid,DevIndex,DeviceInterfaceData);


и т.д..
Вот на этой строке функция постоянно возвращает FASLE..Success := SetupDiEnumDeviceInterfaces(hInfo,Nil,ClassGuid,DevIndex,DeviceInterfaceData); Где я неправ? =(


 
Незнайка ©   (2004-01-26 17:49) [26]

Или еще вариант с заменой строки: SetupDiCreateDeviceInfo(hInfo,pchar(str),ClassGuid,nil,0,DICD_INHERIT_CLASSDRVS,PSP_DevInfoData);
на строку SetupDiClassGuidsFromNameEx(Pchar("DiskDrive"),@ClassGuid,1,numClass,nil,nil);


 
Alex Konshin ©   (2004-01-26 21:12) [27]

А LastError что говорит?


 
незнайка ©   (2004-01-27 09:32) [28]

Говорит : No more data is available...  но.. как только в строку str задаю как: "SCSI#Disk&Ven_IBM&Prod_IC35L073UWDY10-0&Rev_S21E#4&3ad7463&0&060#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}" то программа проходит дальше, но при дальнейшем увеличении параметра DevIndex больше ни одного устройства не находит и выходит из цикла..


 
Незнайка ©   (2004-01-27 12:17) [29]

Даже если я создаю список всех устройств (который судя по всему не создается):

wрInfo := SetupDiCreateDeviceInfoList(nil,0);
hInfo := SetupDiGetClassDevsEx(@ClassGuid,nil,0,DIGCF_PRESENT or DIGCF_DEVICEINTERFACE,NewHInfo,nil,nil);


И дальше тоже самое, в том же цикле, при увеличении параметра DevIndex, программа выходит из цикла по ошибке: No more data is available :

repeat
 DeviceInterfaceData.cbSize := SizeOf(DeviceInterfaceData);

   Success := SetupDiEnumDeviceInterfaces(hInfo,nil,ClassGuid,DevIndex,DeviceInterfaceData);
   AddToLog("Error: "+ SysErrorMessage(GetLastError));


Вообщем че то список не хочет создаваться.. =(


 
Alex Konshin ©   (2004-01-27 12:25) [30]

Это посмотри:
http://www.bustrace.com/downloads/GuidExp.exe


 
Alex Konshin ©   (2004-01-27 12:29) [31]

можно еще посмотреть с помощью winobj с www.sysinternals.com


 
незнайка ©   (2004-02-04 09:40) [32]

Опять дошли руки до проблемы.. но сразу наткнулся вот на что..

Все программы типа GuidExp выдают мне GUID класса DISKDRIVE как:
{4D36E967-E325-11CE-BFC1-08002BE10318} .. Все функции  SetupDi* отказываются с ним работать..   задаю другой GUID {53f56307-b6bf-11d0-94f2-00a0c91efb8b} найденный в ветке CurrentControlSet, то диски моментально находятся..  В чем дело то?


 
Alex Konshin ©   (2004-02-04 09:49) [33]

Я бы все-таки настоятельно посоветовал воспользоваться утилиткой winobj с сайта www.sysinternals.com и заглянуть в фолдер GLOBAL?? (или ?? для NT и 2K), вопрос сразу отпадет сам собой.
Если захочешь уметь делать так же, как winobj, только скажи - научу (ну или сам скачай пример NativeApp с моего сайта и разберись).


 
незнайка ©   (2004-02-04 10:07) [34]

Все, что делает WinObj я уже умею, причем благодаря именно твоим утилитам :) Сразу выражу свою благодарность :)) Но дело в том, чтоб отключить диск приходиться идти другим путем..


 
Alex Konshin ©   (2004-02-04 10:11) [35]

Хм, сам сейчас заглянул на своей машине. Занятно: он про мой 200G относит к SCSI, а 120G к IDE. Но самое смешное, что они оба - IDE. Причем контроллер SCSI в системе действительно имеется, но на нем висит только DVD-R/RW и винчестеров там нет. И с чего это система запутки строит?
Ну для твоей задачи и так сойдет, главное, что все диски видны как диски, а GUID, кстати, второй, т.е {53f...}.


 
Alex Konshin ©   (2004-02-04 10:18) [36]

незнайка ©   (04.02.04 10:07) [34]
Так там же сразу виден нужный тебе GUID. В чем проблема тогда?


 
незнайка ©   (2004-02-04 11:11) [37]


> незнайка ©   (04.02.04 10:07) [34]
> Так там же сразу виден нужный тебе GUID. В чем проблема
> тогда?


Ты имеешь в виду WinObj? Он показывается только для SCSI дисков..

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

Функция SetupDiGetDeviceInterfaceDetail тоже отрабатывает как то не так :) в структуре PSP_DEVICE_INTERFACE_DETAIL_DATA  в DevicePath она мне возыращает всегда строку вида: "\"


 
Alex Konshin ©   (2004-02-04 11:24) [38]

Ты имеешь в виду WinObj? Он показывается только для SCSI дисков..
А это что по-твоему:
IDE#DiskIC35L120AVVA07-0________________________VA6OA50K#5&8f344e8&0&0.0.0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}

Функция SetupDiGetDeviceInterfaceDetail тоже отрабатывает как то не так :) в структуре PSP_DEVICE_INTERFACE_DETAIL_DATA  в DevicePath она мне возыращает всегда строку вида: "\"

Ну я не знаю, что там должно быть, но если ты ожидаешь что-то вроде "\Device\Ide\IdeDeviceP1T0L0", то опять-таки это легко достается через Native API, собственно это и есть значение того симлинка из "\GLOBAL??".


 
незнайка ©   (2004-02-04 12:04) [39]


> А это что по-твоему:
> IDE#DiskIC35L120AVVA07-0________________________VA6OA50K#5&8f344e8&0&0.0.0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}

Хех.. у меня для IDE дисков GUID в строке не выдает и WinObj тоже не показывает...


> Ну я не знаю, что там должно быть, но если ты ожидаешь что-то
> вроде "\Device\Ide\IdeDeviceP1T0L0"

От этой функции я ожидаю не только DevicePath, но и еще одну структуру PSP_DEVINFO_DATA, которая и поможет отключить тот диск, который мне нужен..


 
незнайка ©   (2004-02-04 12:13) [40]

ВО!!   Все получилось :)) разгребусь с состальнм и кину кусок программы если интересно.. :)



Страницы: 1 2 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.057 c
3-1081853258
Kirilll
2004-04-13 14:47
2004.04.11
Delphi+Clarion?


1-1079712043
ivs
2004-03-19 19:00
2004.04.11
Какой принтер использовать для печати на картонке формата А7


14-1081871944
Privet
2004-04-13 19:59
2004.04.11
Завершение работы системы


1-1082466625
ss300
2004-04-20 17:10
2004.04.11
Переход от одного поля на другое нажатием на Enter


1-1080199485
Larry
2004-03-25 10:24
2004.04.11
StatusBar