Содержание Введение ................................................................................................................... 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