Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отключение дисков [D7, Win2k]


Работник ©   (2005-07-26 10:54:00) 

Привет. Вопрос в следущем, мне необходимо отключать диски (дисководы, флешки и т.п.)программно. Нашел для этого соответсвующий код, примерно такой:
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:35:00) [1]

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


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

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


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


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

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

P.S.

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо