Получение списка драйверов в системе

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
M.A.R.K
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 11.11.2007 (Вс) 11:50
Откуда: Иркутск

Сообщение M.A.R.K » 23.04.2008 (Ср) 7:56

Код: Выделить всё
Option Explicit

Private Declare Function NtQuerySystemInformation Lib "ntdll.dll" (ByVal infoClass As Long, ByVal Buffer As Long, ByVal BufferSize As Long, ByVal Ret As Long) As Long
Private Declare Function VirtualAlloc Lib "kernel32.dll" (ByVal Address As Long, ByVal dwSize As Long, ByVal AllocationType As Long, ByVal Protect As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal pDst As Long, ByVal pSrc As long, ByVal ByteLen As Long)
Private Const DRIVER_INFORMATION = 11
Private Const PAGE_READWRITE = &H4
Private Const MEM_RELEASE = &H8000
Private Const MEM_COMMIT = &H1000

Private Sub Command1_Click()
Dim Ret As Long
Dim Buffer As Long
Dim NumDrivers As Long
Dim Temp As Long

NtQuerySystemInformation DRIVER_INFORMATION, 0, 0, VarPtr(Ret)
Buffer = VirtualAlloc(0, Ret * 2, MEM_COMMIT, PAGE_READWRITE)
NtQuerySystemInformation DRIVER_INFORMATION, Buffer, Ret * 2, VarPtr(Ret)
CopyMemory ByVal varPtr(NumDrivers), ByVal Buffer, 4
MsgBox NumDrivers
Buffer = Buffer + 12
CopyMemory Byval VarPtr(Temp), ByVal Buffer, 4 'Пытаюсь читать, читается...
MsgBox Temp
End Sub
Twister, сейчас код работает (не вылетает), но все таки объясни мне, пожалуйста это:
1) Здесь, в буфере (смещение 12) начинаются драйвера... Правильно?
2) Если первые 4 байта, в буфере - это DWORD количество драйверов, то (12 - 4) = 8. Это что?
-Решил Хакер блины печь...
-Первый блин у него вышел, как обычно - Комом...
-А второй - Экзешником...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 23.04.2008 (Ср) 14:50

Код должен быть примерно таким:
Код: Выделить всё
CopyMemory ByVal varPtr(NumDrivers), ByVal Buffer, 4
MsgBox NumDrivers
Buffer = Buffer + 4 'Перемещаемся на начало первой структуры
CopyMemory ByVal varPtr(<переменная_типа_SYSTEM_MODULE_INFORMATION>), ByVal Buffer, Length(<переменная_типа_SYSTEM_MODULE_INFORMATION>)

1) Здесь, в буфере (смещение 12) начинаются драйвера... Правильно?
Триста раз уже цитировал Нэббета, уже можно было воспользоваться переводчиком. Ответ: нет.
2) Если первые 4 байта, в буфере - это DWORD количество драйверов, то (12 - 4) = 8. Это что?
Даже не буду вникать в тот Дельфовый код - больше похоже на программерскую криворукость. :)
А я все практикую лечение травами...

M.A.R.K
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 11.11.2007 (Вс) 11:50
Откуда: Иркутск

Сообщение M.A.R.K » 24.04.2008 (Чт) 8:58

Twister, огромное спасибо, код написал...
Код: Выделить всё
Option Explicit

Private Declare Function SysAllocString Lib "oleaut32.dll" (ByVal pOlechar As Long) As String
Private Declare Function NtQuerySystemInformation Lib "ntdll.dll" (ByVal infoClass As Long, ByVal Buffer As Long, ByVal BufferSize As Long, ByVal Ret As Long) As Long
Private Declare Function VirtualAlloc Lib "kernel32.dll" (ByVal Address As Long, ByVal dwSize As Long, ByVal AllocationType As Long, ByVal Protect As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal pDst As Long, ByVal pSrc As Long, ByVal ByteLen As Long)

Private Const DRIVER_INFORMATION = 11
Private Const PAGE_READWRITE = &H4
Private Const MEM_RELEASE = &H8000
Private Const MEM_COMMIT = &H1000

Private Sub Command1_Click()
Dim Ret As Long
Dim NumDrivers As Long
Dim i As Long
Dim Temp As String
Dim Temp_Pointer As Long
Dim Original_Buffer As Long
Dim Buffer As Long

NtQuerySystemInformation DRIVER_INFORMATION, 0, 0, VarPtr(Ret)
Buffer = VirtualAlloc(0, Ret, MEM_COMMIT, PAGE_READWRITE)
NtQuerySystemInformation DRIVER_INFORMATION, Buffer, Ret, VarPtr(Ret)

CopyMemory ByVal VarPtr(NumDrivers), ByVal Buffer, 4
MsgBox "Коливо драйверов:" & NumDrivers
Original_Buffer = Buffer
Buffer = Original_Buffer + 32 ' (12 - смещение на начало описывающих структур) + (20 - смещещение на начало пути к файлу)
For i = 0 To 30
    CopyMemory ByVal VarPtr(Temp_Pointer), ByVal Buffer, 1
    Temp = Temp + Chr(Temp_Pointer)
    Buffer = Buffer + 1
Next
MsgBox Left$(Temp, InStr(1, Temp, Chr$(0)) - 1)
Buffer = Original_Buffer + 32 + 284 ' (12 - смещение на начало описывающих структур) + (20 - смещещение на начало пути к файлу) + (284 - смещение на следующую  структуру)
Temp = ""
For i = 0 To 30
    CopyMemory ByVal VarPtr(Temp_Pointer), ByVal Buffer, 1
    Temp = Temp + Chr(Temp_Pointer)
    Buffer = Buffer + 1
Next
MsgBox Left$(Temp, InStr(1, Temp, Chr$(0)) - 1)
End Sub
P.S. Код "не отлажен" (не имеет проверок и т.д.) т.к. имеет статус примера... :wink:
-Решил Хакер блины печь...
-Первый блин у него вышел, как обычно - Комом...
-А второй - Экзешником...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 24.04.2008 (Чт) 9:38

Какая жуть... :?

1. Я не погу понять, при чем тут "12 - смещение на начало описывающих структур", когда оно равно четырем?

2. Не видел большего извращения, чем копировать строку из памяти посимвольно.

Я тебе последний раз рекомендую посмотреть внимательно мою статью. Особенно обратить внимание на обработку строк.

Код "не отлажен"
Это очень громко сказано.
имеет статус примера
Не стоит публиковать такие примеры...
А я все практикую лечение травами...

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 24.04.2008 (Чт) 11:24

Я этот пост читаю просто, чисто поржать, вместо башорга :)

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

Продолжайте, мне интересно чем это кончится.
I don't understand. Sorry.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 24.04.2008 (Чт) 13:49

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

Продолжайте, мне интересно чем это кончится.
Я верю в людей - думаю на автора, рано или поздно, снизайдет дао и кончится это его просветлением. Я надеюсь...
А я все практикую лечение травами...

M.A.R.K
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 11.11.2007 (Вс) 11:50
Откуда: Иркутск

Сообщение M.A.R.K » 26.04.2008 (Сб) 6:27

RayShade:
1. Пожалуйста, не навязывай свое мнение...
2. Я учел твой вариант с WMI
Twister,
Код: Выделить всё
Option Explicit

Private Declare Function SysAllocString Lib "oleaut32.dll" (ByVal pOlechar As Long) As String
Private Declare Function NtQuerySystemInformation Lib "ntdll.dll" (ByVal infoClass As Long, ByVal Buffer As Long, ByVal BufferSize As Long, ByVal Ret As Long) As Long
Private Declare Function VirtualAlloc Lib "kernel32.dll" (ByVal Address As Long, ByVal dwSize As Long, ByVal AllocationType As Long, ByVal Protect As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal pDst As Long, ByVal pSrc As Long, ByVal ByteLen As Long)

'##################################################################################

Private Const DRIVER_INFORMATION = 11
Private Const PAGE_READWRITE = &H4
Private Const MEM_RELEASE = &H8000
Private Const MEM_COMMIT = &H1000
'----------------------------------------------------------------------------------
Private Sub Command1_Click()
Dim Driver       As String
Dim Ret            As Long
Dim Driver_Pointer As Long
Dim Source_Buffer  As Long
Dim Buffer         As Long
Dim i              As Long
Dim NumDrivers     As Long

NtQuerySystemInformation DRIVER_INFORMATION, 0, 0, VarPtr(Ret)
Source_Buffer = VirtualAlloc(0, Ret, MEM_COMMIT, PAGE_READWRITE)
NtQuerySystemInformation DRIVER_INFORMATION, Source_Buffer, Ret, VarPtr(Ret)

Call CopyMemory(ByVal VarPtr(NumDrivers), ByVal Source_Buffer, 4)
Buffer = Source_Buffer + 32
Driver_Pointer = VirtualAlloc(0, 255, MEM_COMMIT, PAGE_READWRITE)

For i = 0 To NumDrivers - 1
    Buffer = Source_Buffer + 32 + (284 * i)
    Call CopyMemory(ByVal Driver_Pointer, ByVal Buffer, 255)
    Driver = SysAllocString(Driver_Pointer)
    List1.AddItem "[" & Print_Position(i + 1) & "] " & Driver
Next
End Sub
'---------------------------------------------------------------------------------
Private Function Print_Position(N As Integer) As String
If N < 10 Then
    Print_Position = "00" & N
Else
    If N < 100 Then
        Print_Position = "0" & N
    Else
        If N < 1000 Then
            Print_Position = N
        End If
    End If
End If
End Function
Я надеюсь, что сейчас все норм. :wink:
-Решил Хакер блины печь...
-Первый блин у него вышел, как обычно - Комом...
-А второй - Экзешником...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 28.04.2008 (Пн) 6:26

Я надеюсь, что сейчас все норм.
Даже не надейся. :wink:

Задача, конечно, решена, но код для примера не подойдет явно.

1. Ты работаешь со смещениями. Это не очень хорошо, учитывая то, что структуры все описаны и документированы.
2. Очеь порадовала функция Print_Position. :lol: Тебе стоит воспользоваться функцией Format и не изобретать велосипед.
А я все практикую лечение травами...

Пред.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23

    TopList