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

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

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

Сообщение M.A.R.K » 21.04.2008 (Пн) 4:22

Есть пример www.delphisources.ru/pages/faq/base/loaded_drvs_nt.html :
Код: Выделить всё
const
   DRIVER_INFORMATION = 11;

type
   TPDWord = ^DWORD;

   TDriverInfo = packed record
     Address: Pointer;
     Unknown1: DWORD;
     Unknown2: DWORD;
     EntryIndex: DWORD;
     Unknown4: DWORD;
     Name: array [0..MAX_PATH + 3] of Char;
   end;

var
   NtQuerySystemInformation: function (infoClass: DWORD;
   buffer: Pointer;
   bufSize: DWORD;
   returnSize: TPDword): DWORD; stdcall = nil;

   function GetDriverInfo: string;
   var
      temp, Index, numBytes, numEntries: DWORD;
     buf: TPDword;
     driverInfo: ^TDriverInfo;
   begin
     if @NtQuerySystemInformation = nil then
       NtQuerySystemInformation := GetProcAddress(GetModuleHandle('ntdll.dll'),
         'NtQuerySystemInformation');

     // Obtain required buffer size
    NtQuerySystemInformation(DRIVER_INFORMATION, @temp, 0, @numBytes);
     // Allocate buffer
    buf := AllocMem(numBytes * 2);

     NtQuerySystemInformation(DRIVER_INFORMATION, buf, numBytes * 2, @numBytes);
     numEntries := buf^;
     driverInfo := Pointer(DWORD(buf) + 12);
     Result     := '';
     for Index := 1 to numEntries do
      begin
       Result := Result + #0$D#0$A+'Address: $' + IntToHex(DWORD(driverInfo^.Address), 8) +
         'Name: "' + (driverInfo^.Name) + '"';
       Inc(driverInfo);
     end;
     Delete(Result, 1, 2);
     FreeMem(buf);
   end;

Перевожу код на VB.
Путем копирования из буфера 4 байтов, получаю число драйверов( все работает), но последующие копирования "летят к черту..."
Код: Выделить всё
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" (pDst As Any, pSrc As Any, 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 Type DriverInfo
    dwAddress As Long
    dwUnknown1 As Long
    dwUnknown2 As Long
    dwEntryIndex As Long
    dwUnknown4 As Long
    sName As String
End Type
Private Sub Command1_Click()
Dim Ret As Long
Dim Buffer As Long
Dim NumDrivers As Long
Dim DI As DriverInfo
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 NumDrivers, ByVal Buffer, 4
MsgBox NumDrivers 'Показываем число драйверов
Buffer = Buffer + 12 'Задаем смещение
CopyMemory Temp, ByVal Buffer, 4 'Пытаюсь копировать, но VB стреляется...
MsgBox Temp
End Sub

Пожалуйста, подскажите что не так...
Заранее благодарен...
-Решил Хакер блины печь...
-Первый блин у него вышел, как обычно - Комом...
-А второй - Экзешником...

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

Сообщение Twister » 21.04.2008 (Пн) 7:40

Код: Выделить всё
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal pDst As Long, ByVal pSrc As Long, ByVal ByteLen As Long)

Код: Выделить всё
CopyMemory ByVal VarPtr(Temp), ByVal Buffer, 4

Когда начнем думать головой, а не копировать объявления функций хрен знает откуда?
А я все практикую лечение травами...

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

Сообщение M.A.R.K » 21.04.2008 (Пн) 7:58

Twister, вот что:
1) Кажется, я это уже пробовал и в итоге - тю-тю, VB "летит"...
2) Это смешно, но в ближайшее время я не могу проверить код.
Twister, пожалуйста, проверь работоспособность всего кода у себя и скажи результат... :)
-Решил Хакер блины печь...
-Первый блин у него вышел, как обычно - Комом...
-А второй - Экзешником...

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

Сообщение Twister » 21.04.2008 (Пн) 10:48

пожалуйста, проверь работоспособность всего кода у себя и скажи результат...
У меня нет VB и не скоро будет... ;)
Операции с копированием плоков памяти можешь посмотреть вот в этой статье.

* какая универсальная статья получилась - я уже, наверное, не на один десяток вопросов отвечал: посмотри статью... :)
А я все практикую лечение травами...

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

Сообщение RayShade » 21.04.2008 (Пн) 13:45

Гораздо проще, безглючнее и всячески удобнее, использовать WMI, а не переводить кривые дельфийные исходники, удаляющие гланды через технологически не приспособленные для этого места.
I don't understand. Sorry.

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

Сообщение Twister » 21.04.2008 (Пн) 14:28

Гораздо проще, безглючнее и всячески удобнее, использовать WMI, а не переводить кривые дельфийные исходники, удаляющие гланды через технологически не приспособленные для этого места
Сейчас холивар начну! :wink:
Зачем использовать тормознутый WMI, который как раз-таки "удаляет гланды через технологически не приспособленные для этого места", если можно написать элегантный, быстрый и надежный код с использованием WinAPI? В конце концов - весь функционал системы - это API, а WMI лишь обертка. Не легче ли миновав обертку, обращаться напрямую к функциям системы?
А я все практикую лечение травами...

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

Сообщение RayShade » 21.04.2008 (Пн) 17:05

Не надо тут разводить холиворы :)

WMI - прекрасно работающая обертка, дающая стандартизованный способ получения любой инфы о системе.

Обращение напрямую к системе - не прерогатива программ на VB и всегда чревата разнообразными глюками и кривостями.

И да, WMI - не тормознутый :)
I don't understand. Sorry.

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

Сообщение M.A.R.K » 22.04.2008 (Вт) 3:43

Twister, RayShade:
1) Каждый алгоритм (WinAPI и WMI) хорош по своему... (но я склоняюсь к WinAPI) :)
2) Кто-нибудь знает описание возвращаемой NtQuerySystemInformatio (с флагом INFORMATION_DRIVER) структуры?
-Решил Хакер блины печь...
-Первый блин у него вышел, как обычно - Комом...
-А второй - Экзешником...

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

Сообщение Twister » 22.04.2008 (Вт) 6:36

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

Кто-нибудь знает описание возвращаемой NtQuerySystemInformatio (с флагом INFORMATION_DRIVER) структуры?

Нет такого флага INFORMATION_DRIVER. Есть класс информации SystemModuleInformation.

Код: Выделить всё
typedef struct _SYSTEM_MODULE_INFORMATION { // Information Class 11
    ULONG Reserved[2];
    PVOID Base;
    ULONG Size;
    ULONG Flags;
    USHORT Index;
    USHORT Unknown;
    USHORT LoadCount;
    USHORT ModuleNameOffset;
    CHAR ImageName[256];
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;


Base
The base address of the module.
Size
The size of the module.
Flags
A bit array of flags describing the state of the module.
Index
The index of the module in the array of modules.
Unknown
Normally contains zero; interpretation unknown.
LoadCount
The number of references to the module.
ModuleNameOffset
The offset to the final filename component of the image name.
ImageName
The filepath of the module.

The data returned to the SystemInformation buffer is a ULONG count of the number of
modules followed immediately by an array of SYSTEM_MODULE_INFORMATION.
The system modules are the Portable Executable (PE) format files loaded into the
kernel address space (ntoskrnl.exe, hal.dll, device drivers, and so on) and ntdll.dll.
The PSAPI function EnumDeviceDrivers uses this information class to obtain a list of
the device drivers in the system. It is also used by the PSAPI functions
GetDeviceDriverFileName and GetDeviceDriverBaseName.
А я все практикую лечение травами...

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

Сообщение M.A.R.K » 22.04.2008 (Вт) 7:42

Twister:
1)
Код: Выделить всё
typedef struct _SYSTEM_MODULE_INFORMATION { // Information Class 11
    ULONG Reserved[2];
    PVOID Base;
    ULONG Size;
    ULONG Flags;
    USHORT Index;
    USHORT Unknown;
    USHORT LoadCount;
    USHORT ModuleNameOffset;
    CHAR ImageName[256];
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
Я это и имел ввиду... :wink:

2)
На VB эта структура будет иметь такой вид:
Код: Выделить всё
Private Type SYSTEM_MODULE_INFORMATION
    dwReserved(2) as long
    dwBase as long
    dwSize as long
    dwFlags as long
    iIndex as integer
    iUnknown as integer
    iLoadCount as integer
    iModuleNameOffset as integer
    sImageName as string * 256
End type
Правильно?

3)
Код: Выделить всё
numEntries := buf^;
driverInfo := Pointer(DWORD(buf) + 12);

Какой элемент структуры считывает 1 строка кода?
-Решил Хакер блины печь...
-Первый блин у него вышел, как обычно - Комом...
-А второй - Экзешником...

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

Сообщение RayShade » 22.04.2008 (Вт) 11:47

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



Код: Выделить всё
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")
Set colDrivers = objWMIService.ExecQuery _
    ("Select * from Win32_DriverVXD")

For Each objDrivers in colDrivers
    Wscript.Echo "Name: " & objDriver.Name
    Wscript.Echo "Version: " & objDriver.Version
Next




Если надо получать какую то еще инфу про какие-то дргуие драйвера, можно поискать в списке WMI классов подходящий.
I don't understand. Sorry.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.04.2008 (Вт) 11:56

RayShade
Нифига. Склоняться надо к тому варианту, который лучше, красивее и правильнее.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение Twister » 22.04.2008 (Вт) 11:57

RayShade
Склоняться надо к тому методу, который позволяет быстрее достичь результата.
Тут наши мнения расходятся... А потом мы удивляемся, почему в последнее время новички становятся все тупее и ленивее? Да потому, что их просто напросто отучают думать и изучать. Отловить ошибку - пожалуйста: On Error Goto <туда-то>. Получить список дров - пожалуйста: Set objWMIService = GetObject...
А шаг влево или вправо - все, начинается поток тупейших вопросов на форумы. Я не прав?

M.A.R.K
dwReserved(2) as long
Нет
Код: Выделить всё
dwReserved(1) as long
Или измени Option Base

Какой элемент структуры считывает 1 строка кода?
Никакой. Она считывает кол-во элементов. Я же тебе процитировал Нэббета:
The data returned to the SystemInformation buffer is a ULONG count of the number of
modules followed immediately by an array of SYSTEM_MODULE_INFORMATION.
А я все практикую лечение травами...

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

Сообщение RayShade » 22.04.2008 (Вт) 12:21

Тут надо определиться с подходом.

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

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

Во втором - можно попытаться собрать велосипед самому из подручных гаечек.

Профессионализм программиста определяется его способностью быстро решать поставленные задачи, а не хитрожопостью используемых им технологий. Period.
I don't understand. Sorry.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.04.2008 (Вт) 12:43

RayShade писал(а):Профессионализм программиста определяется его способностью быстро решать поставленные задачи, а не хитрожопостью используемых им технологий.

С одним "но". Если не копать время от времени вглубь, знания так и останутся неглубокими. И тогда человек неспособен будет ни на что, кроме выбора из того, что уже имеется.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение RayShade » 22.04.2008 (Вт) 12:46

И пусть остаются :) Их просто должно хватать на решение определенных проблем. Я например знаю как устроены кишки ОС. Но мне это в работе никак не помогает :) Не знал бы - все было бы точно так же :)
I don't understand. Sorry.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.04.2008 (Вт) 13:11

RayShade
Нет.

Это вопрос знания технологий.

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

Программа всегда пишется для одного - для того, чтобы что-то делать. Это "что-то" она может делать несколькими путями. В данном случае: через WMI и через WinAPI.

Ты утверждаешь, что если программист выберет путь "через WMI" -- то он выиграет во времени. Т.е. по твоему - ценный программист, профессиональный программист - должен выбрать WMI и выиграть по времени.

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

Хорошо. WMI позволяет быстрее достичь результата? WMI позволяет быстрее достичь результата, да, - позволяет - тебе.

Потому что WMI ты отлично знаешь, а о вышеупомянутых WinAPI видимо слышешь впервые. Поэтому, совершенно естественно, что для тебя он быстрейший, потому как иначе бы тебе пришлось вникать во все тоноксти WinAPI-related подхода, наступать на те же грабли, что и автор темы, а с WMI у тебя всё сразу готово. Поэтому ты имеешь полное право заявлять, что WMI позволит достичь цели быстрее, но с одной маленькой поправкой - позволит тебе. И наверное многим другим. Но не всем.

Если чел отлично знает вышеупомянутые API, но при этом он понятия не имеет, что означает строчка "Select * from Win32_DriverVXD" в этом коде - быстрее достичь результата ему поможет способ с API. И он, возможно, достигнет результата быстрее, чем ты с WMI.

Ты можешь сказать, что это проблемный малограмотный чел, раз он не знает, что такое WMI и не понимает, что делает SQL-запрос ""Select * from Win32_DriverVXD".

Хорошо, возьмём чела, который одинаково хорошо знает WMI-способ и WinAPI-способ получения списка драйверов. В этом случае, результата он достигнет одинаково быстро. Какой тогда способ лучше?

Очевидно WinAPI-шный, потому как он быстрее, чем WMI.

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


Это всё равно что говорить, что VB лучше C++, только потому, что с VB я смогу достичь результатов быстрее, чем если бы я писал на С++.
Это справедливо только для говорящего, т.е. только для меня, потому что иной программист быстрее решит задачу на С++, ибо VB он вообще не будет знать.

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

Что же касается WMI, то это делако не надстройка. Она гораздо глубже уходит в ядро, чем кажется. И тем не менее, она медленнее WinAPI, потому что позднее связывание.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.04.2008 (Вт) 13:20

Хакер, это что было?
У тебя 10 абзацев описывают одно и то же разными словами.
На форуме все-таки обитают дееспособные люди, им настолько разжёвывать не надо. Я надеюсь.
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.04.2008 (Вт) 13:31

У тебя 10 абзацев описывают одно и то же разными словами.

Неправда. У каждой пары абзацев есть свой смысл.
Хакер писал(а):[Вступление]
Ты утверждаешь, что если программист выберет путь "через WMI" -- то он выиграет во времени. Т.е. по твоему - ценный программист, профессиональный программист - должен выбрать WMI и выиграть по времени.

[Рассматривает случай, когда чел знает WMI но не знает WinAPI]
Хорошо. WMI позволяет быстрее достичь результата? WMI позволяет быстрее достичь результата, да, - позволяет - тебе.

Потому что WMI ты отлично знаешь, а о вышеупомянутых WinAPI видимо слышешь впервые. Поэтому, совершенно естественно, что для тебя он быстрейший, потому как иначе бы тебе пришлось вникать во все тоноксти WinAPI-related подхода, наступать на те же грабли, что и автор темы, а с WMI у тебя всё сразу готово. Поэтому ты имеешь полное право заявлять, что WMI позволит достичь цели быстрее, но с одной маленькой поправкой - позволит тебе. И наверное многим другим. Но не всем.


[Рассматривается случай, когда чел не знает WMI, но знает WinAPI]
Если чел отлично знает вышеупомянутые API, но при этом он понятия не имеет, что означает строчка "Select * from Win32_DriverVXD" в этом коде - быстрее достичь результата ему поможет способ с API. И он, возможно, достигнет результата быстрее, чем ты с WMI.

Ты можешь сказать, что это проблемный малограмотный чел, раз он не знает, что такое WMI и не понимает, что делает SQL-запрос ""Select * from Win32_DriverVXD".


[Рассматривается случай, когда чел знает и WMI, и WinAPI]
Хорошо, возьмём чела, который одинаково хорошо знает WMI-способ и WinAPI-способ получения списка драйверов. В этом случае, результата он достигнет одинаково быстро. Какой тогда способ лучше?

Очевидно WinAPI-шный, потому как он быстрее, чем WMI.


["Логика применима не только к данному случаю, но и ко всем остальным подобным спорам"]
Но вообще, это относится ко всем спорам, точнее аргументам в них вроде "Эта технология лучше той, потому что с этой я смогу быстрее достичь результата, чем с той". Это всё не аргументы. Потому что эта технология действительно лучше той только в рамках владения ею программиста, говорящего эту фразу.

    [Пример]
    Это всё равно что говорить, что VB лучше C++, только потому, что с VB я смогу достичь результатов быстрее, чем если бы я писал на С++.
    Это справедливо только для говорящего, т.е. только для меня, потому что иной программист быстрее решит задачу на С++, ибо VB он вообще не будет знать.

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

—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение RayShade » 22.04.2008 (Вт) 13:41

Хакер, не разводи софистику. Если я тут начну перечислять что я знаю и как могу чего написать, ты скролить устанешь :) И именно поэтому, я советую делать так, как советую - через WMI :)

Потому что это легче, проще и удобнее.

Я конечно понимаю, что в определенных программистских кругах отчего то все любят делать через жопу и гордиться этим, по принципу "не как у других", и через это WinAPI шный способ выглядит привлекательнее, со всеми копаниями в куче структур с помощью языка, в котором и средств то толком для этого нет.

Но мне все таки ближе и понятнее простые вещи, которые просто работают :)
I don't understand. Sorry.

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

Сообщение Twister » 22.04.2008 (Вт) 14:47

RayShade
Потому что это легче, проще и удобнее.
Тут уже говорили, что для кого-как.
Я например знаю как устроены кишки ОС. Но мне это в работе никак не помогает
Странная работа, если ни как не помогает. Вот, к примеру, писанное тобой вдруг вылетает с непонятной ошибкой, типа access violation. Без элементарных познаний в отладке, без представления об организации памяти, без знаний ассемблера, в конце-концов, а лишь со знанием WMI вряд-ли удастся исправить ошибку. Нет?
Я конечно понимаю, что в определенных программистских кругах отчего то все любят делать через жопу и гордиться этим, по принципу "не как у других", и через это WinAPI шный способ выглядит привлекательнее, со всеми копаниями в куче структур с помощью языка, в котором и средств то толком для этого нет.
В языке нет - в WinAPI есть. И умение выкрутиться без средств языка даст лишний плюс прогеру, чего нельзя сказать о WMI...
Профессионализм программиста определяется его способностью быстро решать поставленные задачи, а не хитрожопостью используемых им технологий.
И тут я поспорить могу. Задача: сделать программу для поиска файлов в заданной директории. Ярый делфист берет два компонента, кидает на форму. Задача решена. Вопрос: прогер профессионал?

alibek
С одним "но". Если не копать время от времени вглубь, знания так и останутся неглубокими. И тогда человек неспособен будет ни на что, кроме выбора из того, что уже имеется.
+1
Я уже говорил об этом, только другими словами...
Последний раз редактировалось Twister 22.04.2008 (Вт) 14:57, всего редактировалось 1 раз.
А я все практикую лечение травами...

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

Сообщение RayShade » 22.04.2008 (Вт) 14:53

То что я пишу, никогда не вылетает с непонятными ошибками :)

И происходит это именно потому что я всегда использую правильные методы решения задач.

Спорить я дальше с вами не буду - позанимаетесь девелопментом еще лет 5-7 и сами все поймете :)
I don't understand. Sorry.

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

Сообщение Twister » 22.04.2008 (Вт) 15:00

То что я пишу, никогда не вылетает с непонятными ошибками
Программ без ошибок не бывает. Бывает? Плохо искали.

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

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

Сообщение RayShade » 22.04.2008 (Вт) 15:14

Для справки - WMI, совсем не готовое решение.

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

А назвать профессиональным подход, при котором для решения элементарной задачи привлекается куча малоподходящих инструментов, я не могу.
I don't understand. Sorry.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.04.2008 (Вт) 15:16

Если я тут начну перечислять что я знаю и как могу чего написать, ты скролить устанешь

:?

А действительно, начни.

Скажем, ты уже упомянул это:
RayShade писал(а):Я например знаю как устроены кишки ОС


Мне почему-то думается, что ты нифига не знаешь, как устроены кишки ОС. Потому что если бы ты действительно знал, ты бы сразу же как только увидел фразу "WMI - обёртка" -- возразил бы. Потому как WMI это не обёртка, а механизм, работающий на уровне ядра ОС, - на том самом уровне (кишечном), который ты якобы знаешь.

Вместо этого, ты подцепил эту фразу, и даже дополнил её:
RayShade писал(а):WMI - прекрасно работающая обертка, дающая стандарти...
.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение RayShade » 22.04.2008 (Вт) 15:25

Хакер, не цепляйся к словам. В рамках данного топика WMI упоминается как обертка, которая дает нам стандартизованный и далее по тексту, как я написал. То, как она внутри работает - это отдельная тема.
I don't understand. Sorry.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 22.04.2008 (Вт) 15:27

Перечитай:
Twister писал(а):В конце концов - весь функционал системы - это API, а WMI лишь обертка. Не легче ли миновав обертку, обращаться напрямую к функциям системы?


Упоминается как раз как обёртка над API.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение RayShade » 22.04.2008 (Вт) 15:30

:) С Твистером и спорь, на тему того что он пишет - я не собираюсь объяснять что он имел в виду.

А WMI Scripting, про который я тут пишу это в самом деле обертка, которой удобно пользоваться. Для работы с WMI.
I don't understand. Sorry.

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

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

RayShade, Хакер, Twister, alibek, (короче все):
1) Я за API... :wink:
2) Пожалуйста, давайте перейдем к теме... :arrow:
3) Пример на Delphi (см. 1 пост)...
1. NtQuerySystemInformation пишет инф. в указаный нами буфер (выделенная нами память).
2. Выходит:
Код: Выделить всё
numEntries := buf^;
Читает 4 байта (Количество драйверов) из буфера.
Код: Выделить всё
driverInfo := Pointer(DWORD(buf) + 12);
Здесь, в буфере (смещение 12) начинаются драйвера...
Сразу Question: Если первые 4 байта, в буфере - это DWORD количество драйверов, то (12 - 4) = 8. Это что?
3. Я сначала не понял это:
Код: Выделить всё
Inc(driverInfo);
Это типа смещение в буфере на размер всей структуры... Правильно?
-Решил Хакер блины печь...
-Первый блин у него вышел, как обычно - Комом...
-А второй - Экзешником...

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

Сообщение Twister » 23.04.2008 (Ср) 7:11

Конкретно по поводу того, что WMI обертка поясняю что я имел ввиду.
Это не обертка вокруг WinAPI (иначе оно бы работало еще медленнее, чем работает), это, очень грубо говоря, обертка вокруг сервисов ядра.

Хакер
Ты говоришь, что располагаешь сорцами WMI? Давай проведем небольшое исследование. Скажи мне, каким образом WMI достает список дров в ядре? Я знаю несколько более или менее документированных способов:
1. Пройтись вручную по двусвязным спискам MODULE_ENTRY - именно в них и ни где больше хранится информация о загруженных драйверах.
2. Воспользоваться экспортом ntoskrnl.exe - функцией ZwQuerySystemInformation с классом информации SystemModuleInformation. Собственно говоря, функция с этим классом информации реализует в себе первый метод.
3. Брутфорс памяти на предмет структур MODULE_ENTRY, но этот метод вряд-ли используется кем-то, кроме антируткитов.

Даю голову на отсечение, хоть и заранее не знаю верного ответа, что WMI использует второй метод. А если так, то в этом плане WMI - чистая обертка.
Если в сорцах откопать ни чего не удастся, могу предложить еще вариант исследования - я напишу драйверок (а можно вообще, взять уже готовый руткит), скрывающий сам себя от первого и второго способа, по выбору. И посмотрю, на каком способе обломится WMI - если только на первом, значит перебор MODULE_ENTRY производится без участия ZwQuerySystemInformation и я забераю свои слова по поводу тормознутой обертки назад... :)

M.A.R.K
Ну забей ты на эти кривые сорцы... Абстрагируйся от них вообще. Я тебе дал всю информацию, необходимую для решения задачи. Напиши код сам и все.
А я все практикую лечение травами...

След.

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

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

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

    TopList