Надо знать, когда идет обращение к флопу. Как?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Надо знать, когда идет обращение к флопу. Как?

Сообщение GRS » 08.07.2005 (Пт) 14:44

Привет.

Форум я просмотрел на предмет наличия обсуждения тем и, даже, знаете чё нашел? Кошмар - "...как программно отключить светодиод флоппика?..." :shock: я б даже не придумал (а может можно программно поднять шторку этого флопика? :lol: )
Ладно, не суть. Я все к тому, что немного в тупик зашел.

Есть такая API [CallWindowProc] и, как я понял она выдает определенные сообщения при определенных, опять-таки, событиях системы. Еще нашел константу [WM_DEVICECHANGE = &H219], только в API Viwer'е ее, почему-то, нет. Пиплы этой апи, вернее сообщением WM_DEVICECHANGE определяют реакции устройств в системе (я, конкретно, нашел пример определения диска в CD-Rom'е).

Теперь я не могу разораться в этом примере и понять - можно его как-то "модернизировать" и следить за обращением к дисководу, вместо CD.

Вот найденный пример:

Код: Выделить всё
'Проверка действия примера очень проста: запустите ваш VB Project на
'выполнение, затем отктройте дверцу СД-РОМа, вставьте диск, закройте СД-
'РОМ и смотрите на сообщение на вашей форме.

'КОД МОДУЛЯ

Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC = (-4)
Public Const WM_DEVICECHANGE = &H219
Public glngPrevWndProc As Long

Public Function MyWindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If Msg = WM_DEVICECHANGE Then
    Select Case wParam
    ' Событие возникает при появлении нового диска в CD-ROM'е.
    Case &H8000&
    Call Form1.DeviceArrival
    ' Событие возникает при изъятии диска из CD-ROM'а
    Case &H8004&
    Call Form1.DeviceRemoveComplete
    End Select
    MyWindowProc = 0
    Exit Function
    End If
    ' остальные сообщения передаются для обработки стандартной процедуре окна
    MyWindowProc = CallWindowProc(glngPrevWndProc, hwnd, Msg, wParam, lParam)
End Function

'КОД ФОРМЫ
'Как определить когда появляется и изымается компакт-диск из устройства CD-ROM?

Private Sub Form_Load()
    ' Перенаправление сообщений Windows от формы к собственной
    ' процедуре обработки сообщений Module1.MyWindowProc
    glngPrevWndProc = GetWindowLong(hwnd, GWL_WNDPROC)
    SetWindowLong hwnd, GWL_WNDPROC, AddressOf MyWindowProc
End Sub

Private Sub Form_Unload(Cancel As Integer)
    ' Возвращение управления форме
    SetWindowLong hwnd, GWL_WNDPROC, glngPrevWndProc
End Sub

Sub DeviceArrival()
    ' Здесь вы можете поместить код, который будет выполнятся при
    ' появление компакт-диска в устройстве CD-ROM
    Label1.Caption = "Появилось устройство"
End Sub

Sub DeviceRemoveComplete()
    ' Здесь вы можете поместить код, который будет выполнятся при
    ' удалении компакт-диска из устройства CD-ROM
    Label2.Caption = "Устройство исчезло"
End Sub


Помогите разобраться. Я вообще тем путем иду? Или есть иные способы? Потому что я за 2 минуты чуть не повешался, когда сделал программу, обращающуюся к дисководу через интервал времени. Капец! Этот скрежет! Кажется даже тараканы выбегать начали... :x
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.07.2005 (Пт) 14:52

GRS писал(а):Я вообще тем путем иду?

Нет :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 08.07.2005 (Пт) 17:41

GSerg писал(а):Нет :)


хм... нормально, блин. :evil: А как :shock: :?: Ну должна же быть API какая-то, вроде чтения с носителя или как-то так, или нет :?:
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

Шурик
Самогонщик
Самогонщик
Аватара пользователя
 
Сообщения: 1657
Зарегистрирован: 30.06.2003 (Пн) 13:27
Откуда: из запоя :))))) Матных сообщений: 972

Сообщение Шурик » 08.07.2005 (Пт) 19:44

смотри на использования прерывания :)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.07.2005 (Пт) 21:03

Шурик писал(а):смотри на использования прерывания :)

чё-чё? какие прерывания? :-?
Изображение

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 08.07.2005 (Пт) 21:16


Шурик
Самогонщик
Самогонщик
Аватара пользователя
 
Сообщения: 1657
Зарегистрирован: 30.06.2003 (Пн) 13:27
Откуда: из запоя :))))) Матных сообщений: 972

Сообщение Шурик » 09.07.2005 (Сб) 14:36

tyomitch писал(а):
Шурик писал(а):смотри на использования прерывания :)

чё-чё? какие прерывания? :-?


а разве флоп не использует прерывание???
наверно есть какая-нить функция, для определения использования прерыванея??? или нет???

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 09.07.2005 (Сб) 15:30

Собственно, пока, что мне в голову пришло - так взаимодействие с функциями БИОС. Только вот посредством чего? Есть такие API? С прерываниями вообще интересно: как я понял, прерывание int13 отвечает за обслуживание файловой системы, но в яндексе нашел еще IRQ6 - прерывание дисковода. Судя по всему, речь идет о разных вещах, хотя бы взять то, что в одном случае IRQ, а в другом INT. Что означает одно, а что другое, я пока не искал.

Но вот еще о чем подумал: дисковод - это устройство довольно медленное. Стало быть, даже если моя порграмма получт данные типа "ахтунг! юзаем флоп!", то следующим же действием будет много ошибок, потому как "мгновенно" никакой инфы не будет. Думаю, и меня, и о чем я говорю вы понимаете. Хотя, с этим справиться можно куда легче, к тому же - одна теория.

Так что вопрос остается открытым. Казалось бы такое незатейливое устройство, ан нет - поимейтесь!... :roll:
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 09.07.2005 (Сб) 16:44

...вот, что еще нашел http://www.relib.com/forums/topic.asp?id=738684

но это, конечно, кошмар, ведь с этим методом дисковод будет "хрюкать" с заданным интервалом времени - жутко неудобно.

Кстати, в XP работает именно проверка для 9х почему-то. Правда есть там тоже небольшая ошибочка (в константе), но все ж...

Парни, ну подскажите, идею подкиньте, чё так тихо?... :roll: как мне отловить обращение к флоппу? Ну, как???

О, мрак! :shock: Слушайте! :shock: А как мне отловить сообщения файловой системы? :shock: :?: Т.е., я хочу скахать, что когда мы че-то открываем (путь, файл) это ж как-то фиксируется? Хотя бы FileMon программка - она ж знает откуда-то! Я бы тогда ПУТЬ проверял и если есть a:\ (b:\), то...

Ну? :shock:
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 09.07.2005 (Сб) 17:34

2 GRS

FileMon (равно как и RegMon) работает на своём виртуальном драйвере (FILEVXD.VXD, кажется). На VB тебе не грозит драйвер написать.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

JohnCR
Обычный пользователь
Обычный пользователь
 
Сообщения: 75
Зарегистрирован: 14.06.2005 (Вт) 19:03

Сообщение JohnCR » 09.07.2005 (Сб) 18:24

GRS
Сделать это в принципе можно, и даже так, чтобы не было постоянного обращения к дисководу твоей же программой.
Нужно работать с прерываниями (Int13). VB, к сожалению, не позволяет делать вставки на асме, но можно написать длл-ку на Си или на Делфи и подключать её к своей программе.

В аттаче функции на паскале.

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

Изменяются регистры.
Вложения
floppy.rar
Int13
(771 байт) Скачиваний: 16

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 09.07.2005 (Сб) 19:04

2GRS: IRQ используется дисководом для общения с компом, а int13 - компом для общения с дисководом :-) Т.ч. это не просто разные вещи, а противоположные.

Самое важное, Шурику и остальным: досовские штучки, типа "взаимодействия с функциями БИОС", "какой-нить функции, для определения использования прерыванея" и т.п. - в Win32 не работают. Забудьте про них поскорее, вам же легче жить будет :-)

2BV: VxD остались в Win9x. В WinNT драйвера не-виртуальные, и называются SYS. FileMon (равно как и RegMon) хранит у себя в ресурсах оба SYS и VxD, и использует нужный в зависимости от типа Винды.

JohnCR, в твоём аттаче нет никакого ассемблерного кода, т.ч. он 100% переносим на VB. Другое дело, что он использует VWIN32, который есть только в Win9x - в WinNT он работать не будет.
Изображение

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 09.07.2005 (Сб) 21:41

В таком случае, что остается? Хотите сказать - это не осуществимо что ли? :roll:
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 10.07.2005 (Вс) 16:12

Хэй, пиплы! :roll: КАК и КАКИЕ сообщения нужно перехватить, что бы знать используем дисковод или нет? :shock: :shock: :shock: :?: :?: :?:
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.07.2005 (Вс) 16:43

Нет этих сообщений!
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot, Yandex-бот и гости: 76

    TopList  
cron