mov edx, 0

advertisement
Содержание
Введение ................................................................................................................... 7
1. Теоретические сведения ..................................................................................... 8
1.1 MASM и WINAPI .......................................................................................... 8
1.2 MASM32 .................................................................................................................................... 8
1.3 Информация об устройствах компьютерной системы ....................................10
1.4 Спецификация WBEM ............................................................................. 100
1.5 COM и DCOM........................................................................................... 102
1.6 WMI…… .................................................................................................... 103
1.6.1 Обзор .................................................................................................... 103
1.6.2 Классы, события и безопасность WMI ............................................. 104
1.6.3 Язык запросов WMI ............................................................................ 107
2. Реализация программы для получения информации о системe ................... 10
3. Руководство пользователя .............................................................................. 199
Заключение ............................................................................................................ 20
Список использованных источников .................................................................. 21
ПРИЛОЖЕНИЯ ..................................................................................................... 22
ВВЕДЕНИЕ
В данной курсовой работе рассмотрен пример реализации сбора и
вывода
сведений
об
аппаратных
устройствах
системы
(процессоре,
видеоподсистеме и т.п.) на языке ассемблера высокого уровня MASM.
Компьютер был всегда совокупностью нескольких аппаратных устройств,
взаимодействующих между собой тем или иным способом. И для работы с
этими устройствами или правильного использования компьютера иногда
требуется знать фирму производителя, модель и другие характеристики
системы. Вся эта информация зачастую больше полезна операционной
системе, нежели пользователям, или программистам прикладных программ.
Но такие программы на данный момент пользуются спросом и у обычных
пользователей. Для сбора информации используется обращение к объектам
WMI через API функции. Для упрощения работы пользователя с программой
создано диалоговое окно.
7
1. Теоретические сведения
1.1 MASM и WINAPI
Ассемблер
Microsoft,
был
высокого
в
течение
уровня
MASM,
некоторого
изобретенный
времени
самым
компанией
популярным
ассемблером, доступным для неё. Это поддерживало широкое разнообразие
макросредств
конструкции
и
структурированность
высокого
уровня
для
программных
повторов,
идиом,
вызовов
включая
процедур
и
чередований. Все это делает MASM весьма удобным средством написания
программ. Одним из основных достоинств MASM является возможность
использования стандартных функций WINAPI, в отличие, к примеру, от
TASM.
WINAPI – это общее наименование целого набора базовых функций
интерфейсов в программирования приложений операционных систем
семейств Microsoft Windows корпорации «Майкрософт» и совместимой с
ними свободной бесплатной операционной системы ReactOS. Использование
функций WINAPI намного облегчает работу с прерываниями, файлами и
внешними устройствами. Однако применение WINAPI несет с собой и
некоторые трудности, в частности – достаточно сложная отладка и привязка
к определенной компьютерной платформе.
1.2 MASM 32
За последние 15 – 20 лет мир операционных систем персональных
компьютеров в корне изменился. На смену однозадачным 16 – разрядным
операционным системам пришли многозадачные 32(64) – разрядные
операционные системы с графическим интерфейсом. Вряд ли в настоящее
время удастся застать человека, работающего, к примеру, в операционной
системе MSDOS, разве что, в учебных целях.
8
В связи с этим программы были ориентированы на 32(64) – разрядную
операционную систему Windows. Для этого использовался пакет MASM32,
собранный Стивенсом Хатчинсоном. В данный пакет входит огромное
множество облегчающих разработку программ вещей – пользовательские
макросы, встроенные функции и макросы, дебаггер и еще много различных
программ, помогающих программисту в написании программ.
Создание исполнительного .exe файла можно представить в виде трех
этапов, изображенных на рисунке 1:
1) Написание .asm файла
2) Создание .obj файла
3) Создание .exe файла
Рисунок 1 – Этапы создания .exe файла
При написании .asm файла следует быть внимательным с кодировкой
файла, однако в пакете MASM32 предусмотрен текстовый редактор Masm32
9
editor, автоматически подстраивающий нужную кодировку для данного типа
файла. После написания .asm файла следует создать .obj файл с помощью
транслятора ml.exe и далее отлинковать его линковщиком link.exe.
Транслятор и линковщик предусмотрены в пакете MASM32.
1.3 Информация об устройствах компьютерной системы
Поскольку в Windows нельзя напрямую обращаться к устройствам
системы, доступ к ним, а также сбор информации осуществляется через
средства самой операционной системы. И из-за расширяемости количества
устройств и их вида, сбор информации о них нельзя произвести, используя
простой вызов API функций для соответствующих устройств. Для этого в
Windows существует несколько технологий. Но в данной программе мы
будем использовать реализацию стандарта WBEM для Windows – WMI,
доступ к которому осуществляется через модель DCOM.
1.4 Спецификация WBEM
Web-based Enterprise Management (WBEM) (можно перевести как вебориентированное управление предприятием) — это инициатива, технология,
поддержанная
многими
ведущими
производителями программного и
аппаратного обеспечения (Microsoft, Compaq, ВМС, Cisco и Intel) и
направленная на решение проблемы сбора и использования диагностической
и
управляющей
информации
в
корпоративных
сетях,
включающих
оборудование от различных поставщиков и использующих многочисленные
разнообразные протоколы, операционные системы и распределенные
прикладные системы.
Традиционно,
в
управлении
сложными
сетями
используются
различные протоколы и интерфейсы: например, протокол Simple Network
Management Protocol (SNMP) применяется для управления сетевыми
10
ресурсами (концентраторами, маршрутизаторами и т. д.), а для управления
настольными системами может использоваться Desktop Management Interface
(DMI). Технология WBEM предполагает создание открытой среды для
средств администрирования, позволяющей им свободно взаимодействовать
друг с другом и со всеми объектами управления, а также максимальное
использование уже существующих технологий и стандартов. Поставленная
цель сравнима с задачей, решаемой сетью World Wide Web: связать воедино
поставщиков и потребителей информации, ничего не "знающих" о том, как
работают конкретные системы на другом конце цепочки передачи этой
информации.
Перспектива
использования
веб-технологий
для
более
традиционных инструментов администрирования и определила появление в
названии новой инициативы слов Web-based.
WBEM — это не протокол, модель или интерфейс, а инициатива,
предлагающая некоторый набор стандартов для управления корпоративной
сетью. Эти стандарты должны решать следующие задачи:
- Определить структуру и соглашения, необходимые для получения
информации об объектах управления.
- Обеспечить централизованный доступ к этой информации, чтобы
различные
клиенты
и
средства
администрирования
могли
поставлять данные, получать и анализировать их.
- Обеспечить авторизованный доступ к объектам управления из
любой точки сети для анализа состояния этих объектов и
управления ими.
В основе WBEM лежит реализация общей информационной модели
(Common Information Model, CIM) — объектно-ориентированной схемы
(schema) объектов управления. Объекты управления — это представления
системных (сетевых) ресурсов, а схема — единый механизм описания
данных всех имеющихся типов. WBEM предлагает некий информационный
стандарт, определяющий способы представления данных, и функциональный
стандарт, описывающий механизмы взаимодействия компонентов
11
Схема CIM образуется из модели ядра (Core), применяемой во всех
областях администрирования, и множества общих (Common) моделей,
описывающих типовую информационную структуру конкретных типов
объектов администрирования — систем, сетей, баз данных, приложений и
устройств. Схема является расширяемой: схемы-расширения представляют
собой дополнения общей схемы, ориентированные на конкретные объекты,
например,
может
существовать
схема-расширение
для
некоторой
операционной системы.
1.5 COM и DCOM
COM
(англ.
Component
Object
Model
—
объектная
модель
компонентов; произносится как [ком]) — это технологический стандарт от
компании
Microsoft,
предназначенный
для
создания
программного
обеспечения на основе взаимодействующих компонентов, каждый из
которых может использоваться во многих программах одновременно.
Стандарт воплощает в себе идеи полиморфизма и инкапсуляции объектноориентированного
программирования.
Стандарт
COM
мог
бы
быть
универсальным и платформо-независимым, но закрепился в основном на
операционных системах семейства Microsoft Windows. В современных
версиях Windows COM используется очень широко. На основе COM были
реализованы технологии: Microsoft OLE Automation, ActiveX, DCOM, COM+,
DirectX, а также XPCOM.
Выпущенная в 1996 году технология DCOM (англ. Distributed COM —
распределённая COM) основана на технологии DCE/RPC (разновидности
RPC). DCOM позволяет COM-компонентам взаимодействовать друг с другом
по
сети.
Главным
конкурентом
DCOM
является
другая
известная
распределённая технология — CORBA.
12
Как DCOM, так и CORBA решают задачу вызова метода объекта,
расположенного на другой машине, а также передачу ссылки на объект с
одной машины на другую.
Сетевой уровень DCOM называется ORPC (Object RPC) и является
объектно-ориентированным расширением DCE RPC.
Технология DCOM обеспечивает базовые установки безопасности,
позволяя задавать, кто и из каких машин может создавать экземпляры
объекта и вызывать его методы.
1.6 WMI
Windows Management Instrumentation (WMI) в дословном переводе —
это инструментарий управления Windows. Если говорить более развернутo,
то WMI — это одна из базовых технологий для централизованного
управления и слежения за работой различных частей компьютерной
инфраструктуры под управлением платформы Windows.
1.6.1 Обзор
Технология WMI — это расширенная и адаптированная под Windows
реализация стандарта WBEM (на англ.), принятого многими компаниями, в
основе
которого
лежит
идея
создания
универсального
интерфейса
мониторинга и управления различными системами и компонентами
распределенной информационной среды предприятия с использованием
объектно-ориентированных идеологий и протоколов HTML и XML.
В основе структуры данных в WBEM лежит Common Information
Model
(CIM),
реализующая
объектно-ориентированный
подход
к
представлению компонентов системы. CIM является расширяемой моделью,
что позволяет программам, системам и драйверам добавлять в неё свои
классы, объекты, методы и свойства.
13
WMI,
основанный
на
CIM,
также
является
открытой
унифицированной системой интерфейсов доступа к любым параметрам
операционной
системы,
устройствам
и
приложениям,
которые
функционируют в ней.
Важной особенностью WMI является то, что хранящиеся в нём
объекты соответствуют динамическим ресурсам, то есть параметры этих
ресурсов постоянно меняются, поэтому параметры таких объектов не
хранятся постоянно, а создаются по запросу потребителя данных. Хранилище
свойств
в
объектов
системной
WMI
называется
папке
репозиторием
операционной
и
расположено
системы
Windows:
%SystemRoot%\System32\WBEM\Repository.
1.6.2 Классы, события и безопасность WMI
Так как WMI построен по объектно-ориентированному принципу, то
все данные операционной системы представлены в виде объектов и их
свойств и методов.
Все классы группируются в пространства имен, которые иерархически
упорядочены и логически связаны друг с другом по определенной
технологии или области управления. В WMI имеется одно корневое
пространство имен Root, которое в свою очередь имеет 4 подпространства:
CIMv2, Default, Security и WMI.
Классы имеют свойства и методы и находятся в иерархической
зависимости друг от друга, то есть классы-потомки могут наследовать или
переопределять свойства классов-родителей, а также добавлять свои
свойства.
Свойства классов используются для однозначной идентификации
экземпляра класса и для описания состояния используемого ресурса. Обычно
все свойства классов доступны только для чтения, хотя некоторые из них
14
можно модифицировать определенным методом. Методы классов позволяют
выполнить действия над управляемым ресурсом.
Каждому экземпляру класса можно обратиться по полному пути,
который имеет следующую структуру:
[\\ComputerName\NameSpace][:ClassName][.KeyProperty1=Value1][,Ke
yProperty2=Value2]…] , где :
- ComputerName – имя компьютера
- NameSpace – название пространства имен
- ClassName – имя класса
KeyProperty1=Value1, KeyProperty2=Value2 – свойства объекта и значе
по которому он идентифицируется.
Пример обращения к процессу с именем «Calc.exe», который запущен
на локальной машине: \\.\CIMv2:Win32_Process.Name="Calc.exe"
Экземпляры классов могут генерировать события, к которым можно
подписываться. При наступлении события WMI автоматически создает
экземпляр того класса, которому соответствует это событие. Такой механизм
удобно
использовать
для
выполнения
определенной
команды
при
наступлении определенного события, то есть следить за состоянием объектов
операционной системы.
Общая безопасность в WMI реализуется на уровне операционной
системы, а дополнительная политика безопасности основана на уровнях
пространств имен и протокола DCOM. То есть если пользователь не имеет
права делать какое-то действие через операционную систему, он не сможет
это сделать и через WMI. Если же пользователю дано какое-то право в
операционной системе, то это ещё не означает, что это право будет и в WMI,
так как в WMI действуют дополнительные параметры безопасности на
уровне пространств имен.
Каждый объект операционной системы имеет свое описание
безопасности (SD) со своим списком доступа (ACL), в котором перечислены
идентификаторы пользователей (SID) и их привилегии. Каждое пространство
15
имен может иметь собственное SD со своим ACL, где пользователям могут
быть назначены разрешения на чтение данных, выполнение методов, запись
классов и данных и другие. Данные о дополнительных разрешениях хранятся
в репозитории WMI. Отдельные классы из пространств имен не имеют
собственных описаний безопасности, они наследуют их от своего
пространства имен.
По умолчанию администратор компьютера имеет полные права на
использование WMI, а остальные пользователи могут лишь вызывать
методы, считывать данные и записывать в репозиторий экземпляры классов
провайдеров WMI.
Для доступа к инфраструктуре WMI используется протокол DCOM,
через который пользователь подключается к WMI. Чтобы определить, какие
права будут у подключившегося пользователя, используется механизмы
олицетворения и аутентификации протокола DCOM.
Средства работы с WMI :
- wmimgmt.msc — оснастка консоли управления MMC для настройки
WMI на локальном компьютере.
- winmgmt.exe — консольная утилита управления WMI локального
компьютера.
- wbemtest.exe — графическая утилита для взаимодействия со
структурой WMI на локальном или удаленном компьютере.
- wmic.exe — консольная утилита для взаимодействия со структурой
WMI на локальном или удаленном компьютере.
- mofcomp.exe
структуры
—
компилятор
MOF-файлов
для
расширения
WMI,
управления
библиотекой
классов WMI
и
восстановления репозитория.
16
1.6.3 Язык запросов WMI
Для обращения к объектам WMI используется специфический язык
запросов WMI Query Language (WQL), который является одним из
разновидностей SQL. Основное его отличие от ANSI SQL — это
невозможность изменения данных, то есть с помощью WQL возможна лишь
выборка данных с помощью команды SELECT. Помимо ограничений на
работу с объектами, WQL не поддерживает такие операторы как DISTINCT,
JOIN, ORDER, GROUP, математические функции. Конструкции IS и NOT IS
применяются только в сочетании с константой NULL.
Запросы WQL обычно применяются в скриптах, но их также можно
протестировать в программе Wbemtest и в консольной утилите Wmic
(утилита wmic не требует написания ключевого слова SELECT и полей
выборки).
17
2.
Реализация программы для получения информации о системе
Любая программа, написанная под Windows с использованием
WINAPI должна иметь строго определенную структуру, а именно: содержать
некую «стартовую» функцию, которой передается управление при запуске
программы и оконную функцию, которая позволяет обрабатывать события,
происходящие в этой программе.
Программа, описываемая в данном курсовом проекте, работает
следующим образом. Сначала идет создание и регистрация класса окна,
потом создание, отображение и обновление самого окна, после чего в
оконной функции при получении сообщения WM_PAINT идет сбор данных
о различных частях компьютерной системы и производится отрисовка
полученных данных. Т.к. в начале мы обновляем окно, то в оконную
функцию посылается сообщение WM_PAINT и данные, полученные из WMI
выводятся на экран при старте программы.
Процесс получения этих данных заключается в следующем. Прежде
всего
инициализируется
COM
библиотека
при
помощью
функции
CoInitialize. Задаются настройки безопасности через CoInitializeSecurity,
определяющие уровни доступа для работы с объектами на текущей машине,
а также на других компьютерах в сети. Далее идет создание объекта
WbemLocator и получение указателя на интерфейс для работы с ним. У него
есть всего один метод - ConnectServer, с помощью которого мы соединяемся
через DCOM с пространством имен WMI и получаем указатель на интерфейс
IWbemServices объекта WbemServices. И через метод ExecQuery, посылая
определенные
запросы
на
языке
WQL,
мы
уже
можем
получить
непосредственный доступ к объектам, описывающим части компьютерной
системы. Так например, в соответствии с приложением, запрос для
получения объекта, описывающего центральный процессор будет выглядеть
следующим образом : «SELECT * FROM Win32_Processor».
18
3. Руководство пользователя
Для получения данных об аппаратных устройствах компьютерной
системы необходимо просто запустить программу и подождать 2-3 секунды,
пока идет сбор данных.
19
ЗАКЛЮЧЕНИЕ
При написании данного курсового проекта были рассмотрены и
реализованы принципы программирования на ассемблере высокого уровня
MASM с использованием WINAPI, COM и WMI; изучены принципы
построения основных компонентов в семействе операционных систем
Windows и принципы сбора информации об аппаратных устройствах
системы.
20
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1.
Калашников
О.А.
Ассемблер
–
это
просто.
Учимся
программировать: учебное пособие/ О.А.Калашников – Москва: ОМД Групп,
2011. – 329 с.
2.
Зубков С.В. Ассемблер для DOS, WindowsиUNIX: учебное
пособие/ С.В.Зубков – Москва: Изд-во МГТУ им. Н.Э.Баумана, 2007. – 405 с.
3.
Функции WINAPI [Электронный ресурс]. – Режим доступа:
http://msdn.microsoft.com/ru-RU/. – Загл. С экрана.
4.
Windows Management Instrumentation (WMI)
[Электронный
ресурс]. – Режим доступа: https://ru.wikipedia.org/wiki/WMI . – Загл. С экрана.
21
ПРИЛОЖЕНИЕ А
(обязательное)
«Код программы – сборщика информации об аппаратных устройствах
системы»
. .586
.model flat,stdcall
option casemap:none
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
_lstrlen proto :DWORD
_memcopy proto :DWORD, :DWORD, :DWORD
WMIProc proto
include ../include/windows.inc
include ../include/kernel32.inc
include ../include/user32.inc
include ../include/masm32.inc
include ../include/ole32.inc
include ../include/Oleaut32.inc
include Struct.inc ;<========Struct.inc
includelib ../lib/kernel32.lib
includelib ../lib/user32.lib
includelib ../lib/masm32.lib
includelib ../lib/ole32.lib
includelib ../lib/Oleaut32.lib
.data
; Window Data
ClassName db "WinClass",0
AppName db "Information Ship",0
; WMI Data
;--------------------------22
Продолжение Приложения А
buf db
'good',0 ;Just use to Test
fmt db
'%d',0 ;also use output MaxprocessorClockSpeedResult
;--------------------------include WMI_COM.inc
;<========WMI_COM.inc
stresource
stlanguage
word
;//
word
;//
'R','O','O','T','\','C','I','M','V','2',0
L"ROOT\\CIMV2"
'W','Q','L',0
L"WQL"
processorQuery
word 'S','E','L','E','C','T',' ','*',' ','F','R','O','M','
','W','i','n','3','2','_','P','r','o','c','e','s','s','o','r',0
videocardQuery
word 'S','E','L','E','C','T',' ','*',' ','F','R','O','M','
','W','i','n','3','2','_','V','i','d','e','o','C','o','n','t','r','o','l','l','e','r',0
motherboardQuery
word 'S','E','L','E','C','T',' ','*',' ','F','R','O','M','
','W','i','n','3','2','_','M','o','t','h','e','r','b','o','a','r','d','D','e','v','i','c','e',0
physicalMemoryQuery
word 'S','E','L','E','C','T',' ','*',' ','F','R','O','M','
','W','i','n','3','2','_','P','h','y','s','i','c','a','l','M','e','m','o','r','y',0
diskDriveQuery
word 'S','E','L','E','C','T',' ','*',' ','F','R','O','M','
','W','i','n','3','2','_','D','i','s','k','D','r','i','v','e',0
networkAdapterQuery
word 'S','E','L','E','C','T',' ','*',' ','F','R','O','M','
','W','i','n','3','2','_','N','e','t','w','o','r','k','A','d','a','p','t','e','r',0
cdROMQuery
word 'S','E','L','E','C','T',' ','*',' ','F','R','O','M','
','W','i','n','3','2','_','C','D','R','O','M','D','r','i','v','e',0
reLine
db
0dh,0ah,0
23
Продолжение Приложения А
; Queries
;---------------------------------------------------------------------------------------;---------------------------------------------------------------------------------------nameQuery word
'N','a','m','e',0
; Processor Queries
;---------------------------------processorIdQuery word
'P','r','o','c','e','s','s','o','r','I','d',0
processorMaxClockSpeedQuery word
processorNumCoresQuery word
'M','a','x','C','l','o','c','k','S','p','e','e','d',0
'N','u','m','b','e','r','O','f','C','o','r','e','s',0
;----------------------------------------------------------------------------------------; Video Queries
;----------------------------------
videoProcessorQuery word 'V','i','d','e','o','P','r','o','c','e','s','s','o','r',0
videoRAMQuery word 'A','d','a','p','t','e','r','R','A','M',0
motherboardSpecQuery word 'D','e','v','i','c','e','I','D',0
;----------------------------------------------------------------------------------------; Physical Memory Queries
;----------------------------------
24
Продолжение Приложения А
physicalMemoryModelQuery word 'C','a','p','t','i','o','n',0
physicalMemoryManufacturerQuery word 'S','t','a','t','u','s',0
;---------------------------------------------------------------------------------------;---------------------------------------------------------------------------------------; Disk Drive Queries
;----------------------------------
diskDriveNameQuery word 'C','a','p','t','i','o','n',0
diskDriveMemSizeQuery word 'S','i','z','e',0
;---------------------------------------------------------------------------------------;----------------------------------------------------------------------------------------
; Strings
;---------------------------------------------------------------------------------------;---------------------------------------------------------------------------------------; Processor Strings
;---------------------------------processorItemStr db
0dh,0ah,' Процессор : ',0dh,0ah,0dh,0ah,0
processorNameStr
db
' Имя : ',0
processorMaxClockSpeedStr db
' Частота (в Mегагерцах): ',0
processorNumOfCoresStr db
' Число ядер : ',0
processorIdStr
db ' ProcessorId : ',0
;----------------------------------------------------------------------------------------25
Продолжение Приложения А
; Video Strings
;---------------------------------videoItemStr
videoNameStr
videoProcessorStr
videoMemSizeStr
db ' Видеокарта : ',0dh,0ah,0dh,0ah,0
db ' Модель : ',0
db ' Видео процессор : ',0
db ' Кол-во памяти ( в мегабайтах ) : ',0
;----------------------------------------------------------------------------------------; Motherboard Strings
;---------------------------------motherboardItemStr
motherboardNameStr
db ' Материнская плата : ',0dh,0ah,0dh,0ah,0
db ' Модель : ',0
;-----------------------------------------------------------------------------------------; Physical Memory Strings
;---------------------------------physicalMemoryItemStr
db ' Оперативная память : ',0dh,0ah,0dh,0ah,0
physicalMemoryNameStr
db ' Имя : ',0
physicalMemoryModelStr db
0dh,0ah,' Модель : ',0
physicalMemoryManufacturerStr db 0dh,0ah,' Производитель : ',0dh,0ah,0dh,0ah,0
;---------------------------------------------------------------------------------------;----------------------------------------------------------------------------------------
; Disk Drive Strings
;---------------------------------diskDriveItemStr
diskDriveNameStr
diskDriveMemSizeStr
db ' Жесткий диск : ',0dh,0ah,0dh,0ah,0
db ' Модель : ',0
db ' Кол-во памяти ( в мегабайтах ) : ',0
;----------------------------------------------------------------------------------------26
Продолжение Приложения А
; Network Adapter Strings
;---------------------------------networkAdapterItemStr
networkAdapterNameStr
db ' Сетевой адаптер : ',0dh,0ah,0dh,0ah,0
db ' Модель : ',0
;----------------------------------------------------------------------------------------; CDROM Strings
;---------------------------------cdROMItemStr
cdROMNameStr
db ' CD-ROM : ',0dh,0ah,0dh,0ah,0
db ' Модель : ',0
;-----------------------------------------------------------------------------------------
; Results
;---------------------------------------------------------------------------------------;---------------------------------------------------------------------------------------; Processor Results
;---------------------------------processorMaxClockSpeedResult
into ASCII_String
processorNumberOfCoresResult
processorNameResult
processorNameSizeResult
processorIdResult
db 80
processorIdSizeResult
db
20
dup(?) ;MaxprocessorClockSpeedResult
db
20
dup(?)
db 100 dup(?)
equ $-processorNameResult
dup(?)
equ $-processorIdResult
bufStr dw 1000 dup(0)
27
Продолжение Приложения А
;----------------------------------------------------------------------------------------; Video Results
;---------------------------------videoNameResult
videoNameSizeResult
db 40 dup(?)
equ $-videoNameResult
videoProcessorResult
db 40
videoProcessorSizeResult
dup(?)
equ $-videoProcessorResult
videoMemSizeResult
20
db
dup(?)
;-----------------------------------------------------------------------------------------; Motherboard Results
;---------------------------------motherboardNameResult
motherboardNameSizeResult
db 40 dup(?)
equ $-motherboardNameResult
;-----------------------------------------------------------------------------------------; Physical Memory Strings
;---------------------------------physicalMemoryNameResult
physicalMemoryNameSizeResult
db 40 dup(?)
equ $-videoNameResult
physicalMemoryModelResult
db 40
physicalMemoryModelSizeResult
physicalMemoryManufacturerResult
physicalMemoryManufacturerSizeResult
dup(?)
equ $-videoProcessorResult
db 40 dup(?)
equ $-videoNameResult
;-----------------------------------------------------------------------------------------; Disk Drive Results
;---------------------------------28
Продолжение Приложения А
diskDriveNameResult
diskDriveNameSizeResult
db 80 dup(?)
equ $-videoNameResult
diskDriveMemSizeResult
db
50
dup(?)
;-----------------------------------------------------------------------------------------; Network Adapter Results
;---------------------------------networkAdapterNameResult
networkAdapterNameSizeResult
db 80 dup(?)
equ $-videoNameResult
;-----------------------------------------------------------------------------------------; CD ROM Results
;---------------------------------cdROMNameResult
cdROMNameSizeResult
db 80 dup(?)
equ $-videoNameResult
;------------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------;----------------------------------------------------------------------------------------
.data?
locator
dd
?
services
dd
?
results
dd
?
;-------------------------;lpBSTR
resource
dd
?
_language
dd
?
query
dd
?
;--------------------------
;->IWbemLocator
;->IWbemServices
;->IEnumWbemClassObject
29
Продолжение Приложения А
result
dd
?
returnedCount dd
?
_name
dd
?
speed
dd
?
ProcessorId dd
?
hInstance HINSTANCE ?
CommandLine LPSTR ?
.code
include wmi.asm
include strings.asm
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
call WMIProc
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc
hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
30
Продолжение Приложения А
mov wc.hIconSm,0
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
hInst,NULL
mov hwnd,eax
INVOKE ShowWindow, hwnd,SW_SHOWNORMAL
INVOKE UpdateWindow, hwnd
.WHILE TRUE
INVOKE GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
INVOKE TranslateMessage, ADDR msg
INVOKE DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL rect:RECT
.IF uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_PAINT
invoke BeginPaint,hWnd, ADDR ps
mov hdc,eax
invoke GetClientRect,hWnd, ADDR rect
invoke _lstrcat, ADDR bufStr, ADDR processorItemStr
invoke _lstrcat, ADDR bufStr, ADDR processorNameStr
invoke _lstrcat, ADDR bufStr, ADDR processorNameResult
invoke _lstrcat, ADDR bufStr, ADDR reLine
invoke _lstrcat, ADDR bufStr, ADDR processorMaxClockSpeedStr
invoke _lstrcat, ADDR bufStr, ADDR processorMaxClockSpeedResult
invoke _lstrcat, ADDR bufStr, ADDR reLine
invoke _lstrcat, ADDR bufStr, ADDR processorNumOfCoresStr
31
Продолжение Приложения А
invoke _lstrcat, ADDR bufStr, ADDR processorNumberOfCoresResult
invoke _lstrcat, ADDR bufStr, ADDR reLine
invoke _lstrcat, ADDR bufStr, ADDR processorIdStr
invoke _lstrcat, ADDR bufStr, ADDR processorIdResult
invoke _lstrcat, ADDR bufStr, ADDR reLine
invoke _lstrcat, ADDR bufStr, ADDR reLine
invoke _lstrcat, ADDR bufStr, ADDR videoItemStr
invoke _lstrcat, ADDR bufStr, ADDR videoNameStr
invoke _lstrcat, ADDR bufStr, ADDR videoNameResult
invoke _lstrcat, ADDR bufStr, ADDR reLine
invoke _lstrcat, ADDR bufStr, ADDR videoProcessorStr
invoke _lstrcat, ADDR bufStr, ADDR videoProcessorResult
invoke _lstrcat, ADDR bufStr, ADDR reLine
invoke _lstrcat, ADDR bufStr, ADDR videoMemSizeStr
invoke _lstrcat, ADDR bufStr, ADDR videoMemSizeResult
;invoke _lstrcat, ADDR bufStr, ADDR reLine
;invoke _lstrcat, ADDR bufStr, ADDR reLine
;invoke _lstrcat, ADDR bufStr, ADDR motherboardItemStr
;invoke _lstrcat, ADDR bufStr, ADDR motherboardNameStr
;invoke _lstrcat, ADDR bufStr, ADDR motherboardNameResult
;invoke _lstrcat, ADDR bufStr, ADDR reLine
;invoke _lstrcat, ADDR bufStr, ADDR reLine
;invoke _lstrcat, ADDR bufStr, ADDR physicalMemoryItemStr
;invoke _lstrcat, ADDR bufStr, ADDR physicalMemoryNameStr
;invoke _lstrcat, ADDR bufStr, ADDR physicalMemoryNameResult
;invoke _lstrcat, ADDR bufStr, ADDR physicalMemoryModelStr
;invoke _lstrcat, ADDR bufStr, ADDR physicalMemoryModelResult
;invoke _lstrcat, ADDR bufStr, ADDR physicalMemoryManufacturerStr
;invoke _lstrcat, ADDR bufStr, ADDR physicalMemoryManufacturerResul
invoke _lstrcat, ADDR bufStr, ADDR reLine
invoke _lstrcat, ADDR bufStr, ADDR reLine
invoke _lstrcat, ADDR bufStr, ADDR diskDriveItemStr
invoke _lstrcat, ADDR bufStr, ADDR diskDriveNameStr
invoke _lstrcat, ADDR bufStr, ADDR diskDriveNameResult
;invoke _lstrcat, ADDR bufStr, ADDR reLine
32
Окончание Приложения А
;invoke _lstrcat, ADDR bufStr, ADDR diskDriveMemSizeStr
;invoke _lstrcat, ADDR bufStr, ADDR diskDriveMemSizeResult
invoke _lstrcat, ADDR bufStr, ADDR reLine
invoke _lstrcat, ADDR bufStr, ADDR reLine
invoke _lstrcat, ADDR bufStr, ADDR networkAdapterItemStr
invoke _lstrcat, ADDR bufStr, ADDR networkAdapterNameStr
invoke _lstrcat, ADDR bufStr, ADDR networkAdapterNameResult
invoke _lstrcat, ADDR bufStr, ADDR reLine
invoke _lstrcat, ADDR bufStr, ADDR reLine
invoke _lstrcat, ADDR bufStr, ADDR cdROMItemStr
invoke _lstrcat, ADDR bufStr, ADDR cdROMNameStr
invoke _lstrcat, ADDR bufStr, ADDR cdROMNameResult
invoke DrawText, hdc,ADDR bufStr,-1, ADDR rect, DT_LEFT or DT_TOP
invoke EndPaint,hWnd, ADDR ps
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
end start
33
ПРИЛОЖЕНИЕ Б
(обязательное)
«Код функции WMIProc »
getProcessorInfo proc
invoke SysAllocString,offset processorQuery
mov
query,eax
;Into BSTR
mov
edx, services
mov
eax, [edx].IWbemServices.lpVtbl
invoke [eax].IWbemServicesVtbl.ExecQuery, edx, _language, query, 0, NULL,offset results
;--------------------------------------------------
.if
results!=0
mov
result,0
mov
returnedCount,0
C100:
mov
edx, results
mov
eax, [edx].IEnumWbemClassObject.lpVtbl ;call eax,[eax]
invoke [eax].IEnumWbemClassObjectVtbl.Next,edx,-1, 1,offset result,offset
returnedCount
;--------------------------------------------------
;*****************************************************************************
*********
.if
eax==0
mov edx, result
mov eax, [edx].IWbemClassObject.lpVtbl
invoke [eax].IWbemClassObjectVtbl.Get,edx,offset nameQuery, 0,offset _name, 0, 0
;---------------------------------------------------mov esi,offset _name
;<==Note the _name!
mov eax,[esi].VARIANT.bstrVal
;///Key!!VARIANT
invoke WideCharToMultiByte,CP_ACP,WC_COMPOSITECHECK,eax,-1,offset
processorNameResult,processorNameSizeResult,0,0
34
Продолжение Приложения Б
mov edx, result
mov eax, [edx].IWbemClassObject.lpVtbl
invoke [eax].IWbemClassObjectVtbl.Get,edx,offset processorMaxClockSpeedQuery,
0, offset processorMaxClockSpeedResult, 0, 0
;---------------------------------------------------mov
esi,offset processorMaxClockSpeedResult
mov
eax,[esi].VARIANT.ulVal ;///Key!!VARIANT
;<==Note the speed!
,eax=MaxprocessorClockSpeedResult
invoke
wsprintf,offset processorMaxClockSpeedResult,offset fmt,eax
mov edx, result
mov eax, [edx].IWbemClassObject.lpVtbl
invoke [eax].IWbemClassObjectVtbl.Get,edx,offset processorNumCoresQuery, 0,
offset processorNumberOfCoresResult, 0, 0
;---------------------------------------------------mov
esi,offset processorNumberOfCoresResult
mov
eax,[esi].VARIANT.ulVal ;///Key!!VARIANT
;<==Note the speed!
,eax=MaxprocessorClockSpeedResult
invoke
wsprintf,offset processorNumberOfCoresResult,offset fmt,eax
mov edx, result
mov eax, [edx].IWbemClassObject.lpVtbl
invoke [eax].IWbemClassObjectVtbl.Get,edx,offset processorIdQuery, 0,offset
ProcessorId, 0, 0
;---------------------------------------------------mov esi,offset ProcessorId
mov eax,[esi].VARIANT.bstrVal
invoke WideCharToMultiByte,CP_ACP,WC_COMPOSITECHECK,eax,-1,offset
processorIdResult , processorIdSizeResult,0,0
;///
result->lpVtbl->Release(result);
mov edx, DWORD PTR result
35
Продолжение Приложения Б
mov eax, [edx].IWbemClassObject.lpVtbl
invoke [eax].IWbemClassObjectVtbl.Unknown.Release,edx
;---------------------------------------------------jmp
C100
.endif
;*****************************************************************************
***********
.endif
mov
edx, results
mov
eax, [edx].IEnumWbemClassObject.lpVtbl
invoke [eax].IEnumWbemClassObjectVtbl.Unknown.Release,edx
ret
getProcessorInfo endp
getVideoInfo proc
invoke SysAllocString,offset videocardQuery
mov
query,eax
;Into BSTR
mov
edx, services
mov
eax, [edx].IWbemServices.lpVtbl
invoke [eax].IWbemServicesVtbl.ExecQuery, edx, _language, query, 0, NULL,offset results
;--------------------------------------------------
.if
results!=0
mov
result,0
mov
returnedCount,0
C100:
mov
edx, results
mov
eax, [edx].IEnumWbemClassObject.lpVtbl ;call eax,[eax]
invoke [eax].IEnumWbemClassObjectVtbl.Next,edx,-1, 1,offset result,offset
returnedCount
;-------------------------------------------------36
Продолжение Приложения Б
;*****************************************************************************
*********
.if
eax==0
mov edx, result
mov eax, [edx].IWbemClassObject.lpVtbl
invoke [eax].IWbemClassObjectVtbl.Get,edx,offset nameQuery, 0,offset _name, 0, 0
;---------------------------------------------------mov esi,offset _name
;<==Note the _name!
mov eax,[esi].VARIANT.bstrVal
;///Key!!VARIANT
invoke WideCharToMultiByte,CP_ACP,WC_COMPOSITECHECK,eax,-1,offset
videoNameResult, videoNameSizeResult,0,0
mov edx, result
mov eax, [edx].IWbemClassObject.lpVtbl
invoke [eax].IWbemClassObjectVtbl.Get,edx,offset videoProcessorQuery, 0,offset
_name, 0, 0
;---------------------------------------------------mov esi,offset _name
;<==Note the _name!
mov eax,[esi].VARIANT.bstrVal
;///Key!!VARIANT
invoke WideCharToMultiByte,CP_ACP,WC_COMPOSITECHECK,eax,-1,offset
videoProcessorResult, videoProcessorSizeResult,0,0
mov edx, result
mov eax, [edx].IWbemClassObject.lpVtbl
invoke [eax].IWbemClassObjectVtbl.Get,edx,offset videoRAMQuery, 0, offset
videoMemSizeResult, 0, 0
;---------------------------------------------------mov
esi,offset videoMemSizeResult
;<==Note the speed!
mov
eax,[esi].VARIANT.ulVal ;///Key!!VARIANT
,eax=MaxprocessorClockSpeedResult
mov
edx, 0
mov
ebx, 1048576
37
Продолжение Приложения Б
div
ebx
invoke
;///
wsprintf,offset videoMemSizeResult,offset fmt,eax
result->lpVtbl->Release(result);
mov edx, DWORD PTR result
mov eax, [edx].IWbemClassObject.lpVtbl
invoke [eax].IWbemClassObjectVtbl.Unknown.Release,edx
;---------------------------------------------------jmp
C100
.endif
;*****************************************************************************
***********
.endif
mov
edx, results
mov
eax, [edx].IEnumWbemClassObject.lpVtbl
invoke [eax].IEnumWbemClassObjectVtbl.Unknown.Release,edx
ret
getVideoInfo endp
getMotherboardInfo proc
invoke SysAllocString,offset motherboardQuery
mov
query,eax
;Into BSTR
mov
edx, services
mov
eax, [edx].IWbemServices.lpVtbl
invoke [eax].IWbemServicesVtbl.ExecQuery, edx, _language, query, 0, NULL,offset results
;--------------------------------------------------
.if
results!=0
mov
result,0
mov
returnedCount,0
C100:
mov
edx, results
38
Продолжение Приложения Б
mov
eax, [edx].IEnumWbemClassObject.lpVtbl ;call eax,[eax]
invoke [eax].IEnumWbemClassObjectVtbl.Next,edx,-1, 1,offset result,offset
returnedCount
;--------------------------------------------------
;*****************************************************************************
*********
.if
eax==0
mov edx, result
mov eax, [edx].IWbemClassObject.lpVtbl
invoke [eax].IWbemClassObjectVtbl.Get,edx,offset nameQuery, 0,offset _name, 0, 0
;---------------------------------------------------mov esi,offset _name
;<==Note the _name!
mov eax,[esi].VARIANT.bstrVal
;///Key!!VARIANT
invoke WideCharToMultiByte,CP_ACP,WC_COMPOSITECHECK,eax,-1,offset
motherboardNameResult, motherboardNameSizeResult,0,0
;///
result->lpVtbl->Release(result);
mov edx, DWORD PTR result
mov eax, [edx].IWbemClassObject.lpVtbl
invoke [eax].IWbemClassObjectVtbl.Unknown.Release,edx
;---------------------------------------------------jmp
C100
.endif
;*****************************************************************************
***********
.endif
mov
edx, results
mov
eax, [edx].IEnumWbemClassObject.lpVtbl
invoke [eax].IEnumWbemClassObjectVtbl.Unknown.Release,edx
ret
39
Продолжение Приложения Б
getMotherboardInfo endp
getPhysicalMemoryInfo proc
invoke SysAllocString,offset physicalMemoryQuery
mov
query,eax
;Into BSTR
mov
edx, services
mov
eax, [edx].IWbemServices.lpVtbl
invoke [eax].IWbemServicesVtbl.ExecQuery, edx, _language, query, 0, NULL,offset results
;--------------------------------------------------
.if
results!=0
mov
result,0
mov
returnedCount,0
C100:
mov
edx, results
mov
eax, [edx].IEnumWbemClassObject.lpVtbl ;call eax,[eax]
invoke [eax].IEnumWbemClassObjectVtbl.Next,edx,-1, 1,offset result,offset
returnedCount
;--------------------------------------------------
;*****************************************************************************
*********
.if
eax==0
mov edx, result
mov eax, [edx].IWbemClassObject.lpVtbl
invoke [eax].IWbemClassObjectVtbl.Get,edx,offset nameQuery, 0,offset _name, 0, 0
;---------------------------------------------------mov esi,offset _name
;<==Note the _name!
mov eax,[esi].VARIANT.bstrVal
;///Key!!VARIANT
invoke WideCharToMultiByte,CP_ACP,WC_COMPOSITECHECK,eax,-1,offset
physicalMemoryNameResult, physicalMemoryNameSizeResult,0,0
40
Продолжение Приложения Б
mov edx, result
mov eax, [edx].IWbemClassObject.lpVtbl
invoke [eax].IWbemClassObjectVtbl.Get,edx,offset physicalMemoryModelQuery,
0,offset _name, 0, 0
;---------------------------------------------------mov esi,offset _name
;<==Note the _name!
mov eax,[esi].VARIANT.bstrVal
;///Key!!VARIANT
invoke WideCharToMultiByte,CP_ACP,WC_COMPOSITECHECK,eax,-1,offset
physicalMemoryModelResult, physicalMemoryModelSizeResult,0,0
mov edx, result
mov eax, [edx].IWbemClassObject.lpVtbl
invoke [eax].IWbemClassObjectVtbl.Get,edx,offset
physicalMemoryManufacturerQuery, 0,offset _name, 0, 0
;---------------------------------------------------mov esi,offset _name
;<==Note the _name!
mov eax,[esi].VARIANT.bstrVal
;///Key!!VARIANT
invoke WideCharToMultiByte,CP_ACP,WC_COMPOSITECHECK,eax,-1,offset
physicalMemoryManufacturerResult, physicalMemoryManufacturerSizeResult,0,0
;///
result->lpVtbl->Release(result);
mov edx, DWORD PTR result
mov eax, [edx].IWbemClassObject.lpVtbl
invoke [eax].IWbemClassObjectVtbl.Unknown.Release,edx
;---------------------------------------------------jmp
C100
.endif
;*****************************************************************************
***********
.endif
mov
edx, results
mov
eax, [edx].IEnumWbemClassObject.lpVtbl
41
Продолжение Приложения Б
invoke [eax].IEnumWbemClassObjectVtbl.Unknown.Release,edx
ret
getPhysicalMemoryInfo endp
getDiskDriveInfo proc
invoke SysAllocString,offset diskDriveQuery
mov
query,eax
;Into BSTR
mov
edx, services
mov
eax, [edx].IWbemServices.lpVtbl
invoke [eax].IWbemServicesVtbl.ExecQuery, edx, _language, query, 0, NULL,offset results
;-------------------------------------------------.if results!=0
mov
result,0
mov
returnedCount,0
C100:
mov
edx, results
mov
eax, [edx].IEnumWbemClassObject.lpVtbl ;call eax,[eax]
invoke [eax].IEnumWbemClassObjectVtbl.Next,edx,-1, 1,offset result,offset
returnedCount
;--------------------------------------------------
;*****************************************************************************
*********
.if
eax==0
mov
edx, result
mov
eax, [edx].IWbemClassObject.lpVtbl
invoke [eax].IWbemClassObjectVtbl.Get,edx,offset diskDriveNameQuery, 0,offset
_name, 0, 0
;---------------------------------------------------mov esi,offset _name
;<==Note the _name!
mov eax,[esi].VARIANT.bstrVal
;///Key!!VARIANT
42
Продолжение Приложения Б
invoke WideCharToMultiByte,CP_ACP,WC_COMPOSITECHECK,eax,-1,offset
diskDriveNameResult, diskDriveNameSizeResult,0,0
mov
edx, result
mov
eax, [edx].IWbemClassObject.lpVtbl
invoke [eax].IWbemClassObjectVtbl.Get,edx,offset diskDriveMemSizeQuery, 0,
offset diskDriveMemSizeResult, 0, 0
;---------------------------------------------------mov
esi,offset diskDriveMemSizeResult
mov
eax,[esi].VARIANT.ulVal ;///Key!!VARIANT
,eax=MaxprocessorClockSpeedResult
mov
edx,[esi+2].VARIANT.ulVal
mov
ebx, 1048576
div
ebx
invoke wsprintf,offset diskDriveMemSizeResult,offset fmt,eax
;///
result->lpVtbl->Release(result);
mov
edx, DWORD PTR result
mov
eax, [edx].IWbemClassObject.lpVtbl
invoke [eax].IWbemClassObjectVtbl.Unknown.Release,edx
;---------------------------------------------------;jmp
C100
.endif
;*****************************************************************************
***********
.endif
mov
edx, results
mov
eax, [edx].IEnumWbemClassObject.lpVtbl
invoke [eax].IEnumWbemClassObjectVtbl.Unknown.Release,edx
ret
getDiskDriveInfo endp
43
Продолжение Приложения Б
getNetworkAdapterInfo proc
invoke SysAllocString,offset networkAdapterQuery
mov
query,eax
;Into BSTR
mov
edx, services
mov
eax, [edx].IWbemServices.lpVtbl
invoke [eax].IWbemServicesVtbl.ExecQuery, edx, _language, query, 0, NULL,offset results
;-------------------------------------------------.if results!=0
mov
result,0
mov
returnedCount,0
C100:
mov
edx, results
mov
eax, [edx].IEnumWbemClassObject.lpVtbl ;call eax,[eax]
invoke [eax].IEnumWbemClassObjectVtbl.Next,edx,-1, 1,offset result,offset
returnedCount
;--------------------------------------------------
;*****************************************************************************
*********
.if
eax==0
mov
edx, result
mov
eax, [edx].IWbemClassObject.lpVtbl
invoke [eax].IWbemClassObjectVtbl.Get,edx,offset nameQuery, 0,offset _name, 0,
0
;---------------------------------------------------mov esi,offset _name
;<==Note the _name!
mov eax,[esi].VARIANT.bstrVal
;///Key!!VARIANT
invoke WideCharToMultiByte,CP_ACP,WC_COMPOSITECHECK,eax,-1,offset
networkAdapterNameResult, networkAdapterNameSizeResult,0,0
mov
edx, DWORD PTR result
mov
eax, [edx].IWbemClassObject.lpVtbl
invoke [eax].IWbemClassObjectVtbl.Unknown.Release,edx
44
Продолжение Приложения Б
;---------------------------------------------------;jmp
C100
.endif
;*****************************************************************************
***********
.endif
mov
edx, results
mov
eax, [edx].IEnumWbemClassObject.lpVtbl
invoke [eax].IEnumWbemClassObjectVtbl.Unknown.Release,edx
ret
getNetworkAdapterInfo endp
getCDROMInfo proc
invoke SysAllocString,offset cdROMQuery
mov
query,eax
;Into BSTR
mov
edx, services
mov
eax, [edx].IWbemServices.lpVtbl
invoke [eax].IWbemServicesVtbl.ExecQuery, edx, _language, query, 0, NULL,offset results
;-------------------------------------------------.if results!=0
mov
result,0
mov
returnedCount,0
C100:
mov
edx, results
mov
eax, [edx].IEnumWbemClassObject.lpVtbl ;call eax,[eax]
invoke [eax].IEnumWbemClassObjectVtbl.Next,edx,-1, 1,offset result,offset
returnedCount
;--------------------------------------------------
;*****************************************************************************
*********
45
Продолжение Приложения Б
.if
eax==0
mov
edx, result
mov
eax, [edx].IWbemClassObject.lpVtbl
invoke [eax].IWbemClassObjectVtbl.Get,edx,offset nameQuery, 0,offset _name, 0,
0
;---------------------------------------------------mov esi,offset _name
;<==Note the _name!
mov eax,[esi].VARIANT.bstrVal
;///Key!!VARIANT
invoke WideCharToMultiByte,CP_ACP,WC_COMPOSITECHECK,eax,-1,offset
cdROMNameResult, cdROMNameSizeResult,0,0
mov
edx, DWORD PTR result
mov
eax, [edx].IWbemClassObject.lpVtbl
invoke [eax].IWbemClassObjectVtbl.Unknown.Release,edx
;---------------------------------------------------;jmp
C100
.endif
;*****************************************************************************
***********
.endif
mov
edx, results
mov
eax, [edx].IEnumWbemClassObject.lpVtbl
invoke [eax].IEnumWbemClassObjectVtbl.Unknown.Release,edx
ret
getCDROMInfo endp
WMIProc proc
invoke SysAllocString,offset stresource
mov
resource,eax
;Into BSTR
invoke SysAllocString,offset stlanguage
mov
_language,eax
;Into BSTR
46
Продолжение Приложения Б
;/// initialize COM
invoke CoInitialize,0
invoke CoInitializeSecurity,NULL, -1, NULL, NULL, 0, 3, NULL, 0, NULL
;/// connect to WMI
invoke CoCreateInstance,offset CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER,
offset IID_IWbemLocator,offset locator
;------------------------------------------------;/// locator->lpVtbl->ConnectServer(locator, resource, NULL, NULL, NULL, 0, NULL,
NULL, &services);
mov
edx, locator
mov
eax, [edx].IWbemLocator.lpVtbl
invoke
[eax].IWbemLocatorVtbl.ConnectServer,edx,resource,NULL,NULL,NULL,0,NULL,NULL,offs
et services
;------------------------------------------------call getProcessorInfo
call getVideoInfo
call getMotherboardInfo
call getPhysicalMemoryInfo
call getDiskDriveInfo
call getNetworkAdapterInfo
call getCDROMInfo
;---------------------------------------------------;///
services->lpVtbl->Release(services);
mov
edx, services
mov
eax, [edx].IWbemServices.lpVtbl
invoke [eax].IWbemServicesVtbl.Unknown.Release,edx
;---------------------------------------------------;///
locator->lpVtbl->Release(locator);
mov
edx, DWORD PTR locator
mov
eax, [edx].IWbemLocator.lpVtbl
invoke [eax].IWbemLocatorVtbl.Unknown.Release,edx
47
Окончание Приложения Б
;----------------------------------------------------
;///
CoUninitialize();
invoke CoUninitialize
;///
SysFreeString(query);
;///
SysFreeString(language);
;///
SysFreeString(resource);
invoke SysFreeString, query
invoke SysFreeString, _language
invoke SysFreeString, resource
ret
WMIProc endp
48
Download