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

Вниз

Отключение дисков   Найти похожие ветки 

 
Работник   (2005-07-26 10:54) [0]

Привет. Вопрос в следущем, мне необходимо отключать диски (дисководы, флешки и т.п.)программно. Нашел для этого соответсвующий код, примерно такой:
var
LHandle: THandle;
BytesReturned: Cardinal;
MsgBuf: PChar;
FSCTL_LOCK_VOLUME: Integer;
Disk_s: string;

const
FILE_DEVICE_FILE_SYSTEM: Integer = $00000009;
METHOD_BUFFERED: Integer = $00000000;
FILE_ANY_ACCESS: Integer = $00000000;
function CTL_CODE(DeviceType, FunctionNo, Method, Access: Integer): Integer;
begin
Result := (DeviceType shl 16) or (Access shl 14) or (FunctionNo shl 2) or (Method);
end;

procedure CloseDisk;
begin
//Äàëåå áëîêèðóåì ðàáîòó óñòðîéñòâ
   FSCTL_LOCK_VOLUME := CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 6,
                                                 METHOD_BUFFERED, FILE_ANY_ACCESS);
LHandle := CreateFile(Pchar(Disk_s), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ
                     or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or
                     FILE_FLAG_DELETE_ON_CLOSE, 0);
 if LHandle <> 0 then
begin
  if DeviceIOControl(LHandle, FSCTL_LOCK_VOLUME, nil, 0, nil, 0, BytesReturned, nil) then
   
   i:=0;
 end;
Все нормально работает если пытаемся отключить 1 диск,  при передачи попытке отключить 2-й диск, никакого эффекта.
Disk_s:="\\.\a: .
Код не мой(я его тока слегка изменил), нашел в инете, так что слабо представляю, что какая переменная значит. Может кто подскажет как программно отключить 2-а и более диска,(плохо же писать для каждого диска отдельную процедуру)


 
Масяня ©   (2005-07-26 11:28) [1]

А ты сохрани код в dll"файле а потом загружай его для каждого диска

P.S.

Если у меня вдруг все слова слились в одно - то у меня просто браузер не умеет делать пробелы:(


 
kblc ©   (2005-07-26 11:33) [2]

Если я правильно тебя понял, возьми свой код и поменяй в нём procedure CloseDisk; на procedure CloseDisk(const Disk_s: string);, а потом используй так:
CloseDisk("\\.\D:");
CloseDisk("\\.\E:");


 Если я не правт, то уточню: какие диски именно ты хочешь отключить? может их просто нельзя отключить из-за "нужды" системы?


 
Работник   (2005-07-26 11:35) [3]

А все работает и так, просто оказываеться не могу заблокировать USB-DVDRom, надо подумать... А дисководы и флешки с помощью такого кода легко блокирует.
procedure TfmMain.Button1Click(Sender: TObject);
begin
   Disk_s:="\\.\a:";
  CloseDisk;
    Disk_s:="\\.\d:";
  CloseDisk;
  // и так далее, задача тока сводиться к определению букв дисков
end;



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

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

Наверх




Память: 0.45 MB
Время: 0.01 c
14-1124574469
Knight
2005-08-21 01:47
2005.09.18
У вас когда-нить йогурт в руках взрывался?


2-1123682514
Гость22
2005-08-10 18:01
2005.09.18
Вопрос


1-1125090563
ZMaximI
2005-08-27 01:09
2005.09.18
Поля документа Word


5-1099673282
gigabyte
2004-11-05 19:48
2005.09.18
ValueListEditor


3-1123248874
Павел
2005-08-05 17:34
2005.09.18
Сложение string-ов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский