· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› отключение диска.

. 1 . 2 . 3 . >>

Посл.отвђт Сообщенiе


Дата: Май 25, 2004 12:52:21

Нужно удалять логический/физический диск из системы. Видел софтину которая это делает, swap manager называется. Она разумеется платная. Нужно самому нечто подобное написать.


Дата: Май 25, 2004 14:31:22

насколько сильно удалить? физически удалить физический диск можно только напильником ;) ну или MBR пофиксить...
логически диски удаляются/создаются функций DefineDosDevice, описанной в Platform SDK.


Дата: Май 25, 2004 15:00:30 · Поправил: Maveric

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

удалить - не значит испоганить/отформатировать.
просто надо чтобы система скинула все буферы этого диска. и сделала вид, что этот диск отключен.
Чтобы больше гениальных предложений не поступало, я подробнее объясню зачем это надо. Возможно появятся другие предложения.

Есть sata-винчестер. Он подключается к компу с помощью MobileRack'a. Это даёт возможность производить горячую замену винта. Но это только если не производить запись на винт. Если отключить винчестер только поворотом ключа на MobileRack, то он конечно отключится :), но будет потеря данных(если имела место запись).

Пробовал использовать SwapManager - всё в шоколаде.
Если кто-то знает правильную последовательность действий для достижения такого результата, то очень прошу поделиться информацией.

:)


Дата: Май 25, 2004 16:01:23

значит, я неправильно понял. мне казалось, что речь идет о удалении буквы устройства, чтобы диск был "невидим",
а так нужно сделать unmount, а это уже DeviceIoControl и DDK. попробуйте FSCTL_DISMOUNT_VOLUME, если не подойдет, тогда дум бумать...


Дата: Май 25, 2004 16:24:04

дум бумать - это хорошо :)
я скачал исходники софтины filedisk. она делает виртуальные диски из файлов. в сорцах есть FSCTL_DISMOUNT_VOLUME. я попробовал заменить подставить туда логический диск(не созданый filedisk'ом) и нифига не вышло. я так понимаю это происходит из-за того, что обычные логические диски созданы системой, т.е. не хватает прав. придётся в kernel-mode спускаться.
и ещё вопрос. допустим том я размонтирую. а устройство физического драйва останется ?

ушёл бумать...


Дата: Май 25, 2004 17:22:54

я не понял, зачем нужен SwapManager? может речь идет о мастдае?
в w2k на Мой компьютер правый клик, Управление, диспетчер устройств, контроллеры IDE, разворачиваем, на нужном правый клик, Отключить.
я сам так винты в мобилрэке меняю.

если бы как нить промониторить вызовы апи при этом, да посмотреть...


Дата: Май 25, 2004 17:41:04

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


Дата: Май 25, 2004 18:48:07

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

если есть готовая софтина, которая отключает диск, то достаточно просто поставть на DeviceIoContorl бряк и подстотреть протокол взаимодействия с уствойством. если же DeviceIoControl не вызывается (что вряд ли), тогда ставим бряк на CreateFile и смотрим - какое устройство вообще открывается (устройство начинается с \\.\).

если и это не поможет - смотрим на список импортируемых API функций или юзаем API-шпион.

а отключать контроллер - это чудовищно.


Дата: Май 25, 2004 19:53:28

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


Дата: Май 25, 2004 20:20:21

> в списке контроллеров высвечиваются подключенные к
> этому контроллеру устройства, вот их и отключаем.
а что на счет драйвера файловой системы?
он-то об этом не узнает. так недолго и данные угробить.
этот способ не гарантирует корректного удаления устройства, т.к. перед этим нужно выполнить кучу других операций и демонтирование тома в том числе. где-то об этом была заметка в базе знаний. можно поискать по слову unmount.


Дата: Май 25, 2004 20:24:00

Из MSDN:
The following sample demonstrates how to mount a file system. For more information, see Mounting and Dismounting a Volume.


This sample uses the following functions: GetVolumeNameForVolumeMountPoint and SetVolumeMountPoint.

#define _WIN32_WINNT 0x0501

#include <windows.h>
#include <stdio.h>

#define BUFSIZE MAX_PATH 

void Syntax (char *argv)
{

   printf( "%s, mount a volume at a mount point.\n", argv );
   printf( "For example, \"mount c:\\mnt\\fdrive\\ f:\\\"\n" );
}

int
main( int argc, char *argv[] )
{
   BOOL bFlag;
   char Buf[BUFSIZE];     // temporary buffer for volume name

   if( argc != 3 ) 
   {
      Syntax( argv[0] );
      return( -1 );
   }

  // We should do some error checking on the inputs. Make sure
  // there are colons and backslashes in the right places, etc. 

   bFlag = GetVolumeNameForVolumeMountPoint(
              argv[2], // input volume mount point or directory
                  Buf, // output volume name buffer
               BUFSIZE // size of volume name buffer
           );

   if (bFlag != TRUE) 
   {
      printf( "Retrieving volume name for %s failed.\n", argv[2] );
      return (-2);
   }

   printf( "Volume name of %s is %s\n", argv[2], Buf );
   bFlag = SetVolumeMountPoint(
              argv[1], // mount point
                   Buf // volume to be mounted
           );

   if (!bFlag)
     printf ("Attempt to mount %s at %s failed.\n", argv[2], argv[1]);

   return (bFlag);



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


Дата: Май 25, 2004 20:49:57

кхм...
во-первых, не SetVolumeMountPoint, а Delete ;)
во-вторых, это только под w2k и старше...
#define _WIN32_WINNT 0x0500
#include "windows.h"
void Syntax (char *argv)
{
printf("%s unmounts a volume from the volume mount point.\n", argv);
printf ("E.g. \"%s c:\\mnt\\fdrive\\\"\n", argv);
}

int main(int argc, char *argv[])
{
   BOOL bFlag;

   if (argc != 2) 
   {
      Syntax (argv[0]);
      return (-1);
   }

// We should do some error checking on the path argument, such as
// ensuring that there is a trailing backslash.

   bFlag = DeleteVolumeMountPoint(
              argv[1] // Path of the volume mount point
           );

   printf ("%s %s in unmounting the volume at %s.\n",
           argv[0], bFlag ? "succeeded" : "failed", argv[1]);

   return (bFlag);
}



Дата: Май 25, 2004 21:06:14

а какие с FSCTL_DISMOUNT_VOLUME проблемы? сейчас проверил на нескольких осях со всеми типами накопителей. все фурычит со свистом. и съемные в том числе. правда, SATA в моем распоряжении не нашлось, но не думаю, чтобы там было все по другому. FSCTL_DISMOUNT_VOLUME это же высокоуровневая штука ;)
под 9x она конечно не работает, но там есть INT 21/AX 4405h/DRIVER CONTROL, доступна через DMPI симуляцию дос прерывания.


Дата: Май 26, 2004 10:39:48 · Поправил: Maveric

например, а хотел с помощью твоего когда размонтировать диск m: и иничего не вышло...
не мог бы та дать мне код с FSCTL_DISMOUNT_VOLUME. а то у меня фигня какая-то.


Дата: Май 26, 2004 12:35:47

ну в общем, под NT последовательность IOCTL'ов для удаления диска такая (мой zip во всяком случае демонтирует и выбрасывает, а если этого не сделать, просто нажав eject на аппарате - некоторые данные остаются незаписанными, особенно при записи из FAR'a, только все файлы должны быть заркрыты врунчую - иначе ласты):
FSCTL_LOCK_VOLUME
FSCTL_DISMOUNT_VOLUME
IOCTL_STORAGE_MEDIA_REMOVAL
IOCTL_DISK_EJECT_MEDIA
FSCTL_UNLOCK_VOLUME


хэндлер устройства открывается так:
hDevice = CreateFile("\\\\.\\X:",GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);


а вызов так:
DeviceIoControl(hDevice, FSCTL/IOCTL, 0, 0, 0, 0, &N, 0);


готовый пример можно дернуть из заметки Q165721 базы знаний (там громоздкий код, и приводить его здесь - только создавать траф). это что касается NT и прозводных от нее.

теперь о 9x. знаю, что маст дай, но верю, что пригодится, ибо FSCTRL_DISMOUNT там не работает. в заметке Q168180 показано как демонтировать и удалить диск. там право все криво и не работает под проверочным билдом, ибо основано на VWIN32_DIOC_DOS_IOCTL, зато готовый код, который можно просто выдрать и откомилить ;)
еще можно использовать ifsmgr (см. DDK) или через WM_DEVICECHANGE/BroadcastSystemMessage (об этом писал Юрий Харон в fido7.ru.cbuilder Дата:1998/11/14 в топике I can't DISMOUNT_VOLUME by DeviceIoControl. про int 21 via DMPI я уже говорил... может еще можно как, но что-то в голову больше никаких способов не приходит...

. 1 . 2 . 3 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.060