Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реально ли? никогда не пытался.... 
:(
    Опции темы
WildSpy
Дата 10.7.2007, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 5.11.2005

Репутация: нет
Всего: нет



Такой вопрос, реально ли на VB получить низкоуровневый доступ к устройству, например винту?
И вообще, как это реализуется на любых языках?
Объясните плз...
PM MAIL   Вверх
cardinal
Дата 10.7.2007, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Цитата(WildSpy @  10.7.2007,  15:21 Найти цитируемый пост)
И вообще, как это реализуется на любых языках?

Через драйверы.

Это сообщение отредактировал(а) cardinal - 10.7.2007, 22:27


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Akina
Дата 10.7.2007, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Что разумеется под словами "низкоуровневый доступ"?
Хочешь напрямую с портами ввода-вывода работать? пожалуйста, есть драйвер DirectIO... вот только ОС, пожалуй, обидится... можно напрямую с драйвером устройства поработать - через IOCTL или DirectIOControl, например... 

А вот самостоятельный драйвер устройства на VB, пожалуй, нереализуем. То есть формально это возможно, но получится сплошь инлайновый ассемблер...




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
WildSpy
Дата 11.7.2007, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 5.11.2005

Репутация: нет
Всего: нет



Просто мне нужно считать файл не стандартной функцией, а максимально быстро. И я так думаю, что для этого нужно получить низкоуровневый доступ к винту, как это делает например антивирус.
А потом ещё разобраться как считать файл.

Подскажите что-нибудь.
PM MAIL   Вверх
Akina
Дата 11.7.2007, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(WildSpy @  11.7.2007,  09:46 Найти цитируемый пост)
мне нужно считать файл не стандартной функцией, а максимально быстро.

C этого места поподробнее. Задачу полностью, от самого начала. Почему максимально быстро? Один файл или то, какой файл потребуется, выбирается программно? его прогнозируемый размер? расположение (локальный, сетевой)? 
А то есть подозрение, что ты собрался микроскопом орехи колоть...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
W4FhLF
Дата 11.7.2007, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 3
Всего: 121



Цитата(Akina @  10.7.2007,  22:24 Найти цитируемый пост)
То есть формально это возможно, но получится сплошь инлайновый ассемблер...


Это невозможно ни в каком виде при использовании компилятора VB. 

Цитата(WildSpy @  11.7.2007,  08:46 Найти цитируемый пост)
Просто мне нужно считать файл не стандартной функцией, а максимально быстро. И я так думаю, что для этого нужно получить низкоуровневый доступ к винту, как это делает например антивирус.


Самое быстрое, что тут можно придумать, помимо разбирая файловой системы, т.е. работы в RAW режиме, это самостоятельная посылка пакета в disk.sys, но в ВБ это нереализуемо. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
WildSpy
Дата 11.7.2007, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 5.11.2005

Репутация: нет
Всего: нет



Да нет, файл определяется пользователем. Тут не суть важно, размер неизвестен. Но в среднем не больше 10 мег.

Файл бинарный, нужно как можно быстрее загрузить его в память.

и еще один вопрос, есть код:

Код

Dim sX As Double
Dim llen As Double
Dim sBytes As String
Dim sTemp As String

llen = Len(sBytes)
    
    For sX = 1 To llen
          sTemp = Hex(Asc(Mid(sBytes, sX, 1)))
            If sTemp = "0" Then
                sTemp = "00"
            ElseIf Len(sTemp) = 1 Then
                sTemp = "0" & sTemp
            End If
        packbytes = packbytes & sTemp
    Next sX


это код переводит файл в hex, типа как это делают WinHEX и т.д.

Вопрос, как этот код ускорить, а то он работает ужасно медленно.
PM MAIL   Вверх
W4FhLF
Дата 11.7.2007, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 3
Всего: 121



Цитата(WildSpy @  11.7.2007,  09:44 Найти цитируемый пост)
это код переводит файл в hex, типа как это делают WinHEX и т.д.


Покажи, что у тебя на входе и что должно быть на выходе


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
WildSpy
Дата 11.7.2007, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 5.11.2005

Репутация: нет
Всего: нет



Цитата(W4FhLF @ 11.7.2007,  10:39)
Цитата(WildSpy @  11.7.2007,  09:44 Найти цитируемый пост)
это код переводит файл в hex, типа как это делают WinHEX и т.д.


Покажи, что у тебя на входе и что должно быть на выходе

Код

Dim sX As Double
    Dim llen As Double
    Dim sBytes As String
    Dim sTemp As String
    packbytes = ""
    
    Open (file) For Binary Access Read As #1
        a = FileLen(file)
        sBytes = Space(a)
        
        Get #1, , sBytes
        
    Close #1
    
    llen = Len(sBytes)
    
    For sX = 1 To llen
          sTemp = Hex(Asc(Mid(sBytes, sX, 1)))
            If sTemp = "0" Then
                sTemp = "00"
            ElseIf Len(sTemp) = 1 Then
                sTemp = "0" & sTemp
            End If
        packbytes = packbytes & sTemp
    Next sX

    
    packbytes = Trim(packbytes)



так понятнее?

Это сообщение отредактировал(а) WildSpy - 11.7.2007, 11:43
PM MAIL   Вверх
mihanik
Дата 11.7.2007, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 11
Всего: 109



Цитата(WildSpy @  11.7.2007,  09:44 Найти цитируемый пост)
Вопрос, как этот код ускорить, а то он работает ужасно медленно. 


Естественно!

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

Сформулируй поточнее саму задачу, а не то, как ты её решал!!!




--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
WildSpy
Дата 11.7.2007, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 5.11.2005

Репутация: нет
Всего: нет



Цитата(mihanik @ 11.7.2007,  12:02)
Цитата(WildSpy @  11.7.2007,  09:44 Найти цитируемый пост)
Вопрос, как этот код ускорить, а то он работает ужасно медленно. 


Естественно!

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

Сформулируй поточнее саму задачу, а не то, как ты её решал!!!

Открыть файл и перевести его в hex, типа как это реализовано в hex-Редакторах типа WinHEX
PM MAIL   Вверх
W4FhLF
Дата 11.7.2007, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 3
Всего: 121



Код

Dim Bytes() As Byte
Dim sSump As String
Dim szDump As String
Dim i As Long

Private Sub Form_Load()
    Bytes = LoadFile("E:\Temp\untitled1")
    sDump = Space(szDump * 4 + 1)
    For i = 1 To szDump - 1
        Mid(sDump, 3 * i, 2) = Left$("00", 2 - IIf(Bytes(i) > &HF, 2, 1)) & Hex(Bytes(i))
    Next i
    Text1.Text = Trim$(sDump)
End Sub

Function LoadFile(ByVal sName As String) As Byte()
    Dim arrFile() As Byte
    Dim nFile As Integer

    nFile = FreeFile
    Open sName For Binary As #nFile
        ReDim arrFile(1 To (LOF(nFile) - 1))
        szDump = UBound(arrFile) + 1
        Get #nFile, , arrFile
    Close #nFile
    LoadFile = arrFile
End Function


В Text1 поставь шрифт Courier New

Это сообщение отредактировал(а) W4FhLF - 11.7.2007, 13:44


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Akina
Дата 11.7.2007, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Читать лучше через FileSystemObject.ReadAll - 10 мег всасывается мгновенно. Это не лимитирует.
Лимитирует именно конвертация - медленные строковые функции... и совершенно правильное решение ускорить процесс за счет работы с фиксированным буфером.




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
WildSpy
Дата 11.7.2007, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 5.11.2005

Репутация: нет
Всего: нет



Огромное спасибо, работает. =)
PM MAIL   Вверх
WildSpy
Дата 11.7.2007, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 5.11.2005

Репутация: нет
Всего: нет



Ещё один маленький вопрос, код написан достаточно сложно, т.е. как можно более компактно и не совсем понятен для меня.

Так вот, такой ламерский вопрос, как избавится от пробелов на выходе? т.е. чтобы между цифрами и буквами не было пробелов?

убирать их replace'ом долго, а откуда они берутся не могу найти.

Это сообщение отредактировал(а) WildSpy - 11.7.2007, 14:33
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.1164 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.