Некоторые функции win32


Содержание

Некоторые функции win32

я начинающий программист на VB2010

я просматривал учебники которые есть тут на сайте и наткнулся на статью в которой описывалось вызов API функции «MessageBox» из библиотеки User32.dll. И мне стало интересно а какие ещё функции скрывает эта библиотека. Например мне бы хотелось открыть таким образом другие виды msg Box’а. Например как не будь ErrorBox или что-то в этом духе.

Я искал по интернету с похожими запросами однако все они ссылаются на depends.exe (который якобы должен быть вшит в VS) однако его у меня нет. Искал где скачать и набрёл на depends22_x64. Однако не смог разобраться с ней так как моё познание английского очень низко!

Помогите пожалуйста! Как узнать функции которые хранятся в User32.dll другими методами

Или подскажите самые часто используемые функции из этой библиотеки (желательно с синтаксисом объявления и вызова)

Извиняюсь за назойливость. Однако за ранее благодарю!

От Win32 к Win64- основы программирования и портирование

Сегодня 64-разрядные процессоры используются, прежде всего, в серверах, ориентированных на корпоративные сети, в которых работают приложения, требующие значительных вычислительных ресурсов и исключительной надежности систем. Подобным приложениям для различных вычислений необходимы огромные объемы оперативной памяти (большие базы данных, системы принятия решений и бизнес-анализа, системы управления ресурсами предприятия, быстродействующие базы данных, хранящиеся в оперативной памяти, и т. д.), в основном они используются в банковской, производственной, инженерной и научно-исследовательской деятельности. Естественно, сервер, построенный на 64-разрядной платформе, стоит не один десяток тысяч долларов, что могут себе позволить только весьма крупные корпоративные заказчики. Да и адресное пространство свыше 4 Гбайт, необходимое для обработки сверхбольших СУБД, рядовому пользователю ни к чему.

Данная статья ориентирована на программистов, занимающихся разработкой программного обеспечения для 64-разрядной платформы. Мы рассмотрим преимущества этой платформы, недостатки использования 32-разрядного кода на 64-разрядной платформе, основы 64-разрядного программирования и способы перевода приложений Win32 на 64-разрядную платформу. Последние два вопроса освещены в современной прессе и MSDN достаточно слабо. Мы не будем акцентировать внимание на какой-либо конкретной модели (архитектуре) 64-разрядного процессора. Все рассмотренные в статье примеры используют язык С++ и компилируются с помощью 64-разрядного компилятора С++, входящего в состав последних дистрибутивов SDK и DDK.

64-разрядная архитектура

Win64-код объединяет в себе основные возможности 32-разрядного кода, а также включает изменения, связанные с повышением разрядности. В распоряжении программиста оказываются:

  • 64-разрядные указатели;
  • 64-разрядные типы данных;
  • 32-разрядные типы данных;
  • интерфейс Win64 API.

Обратите внимание, что 32-разрядные типы данных не исчезли при повышении разрядности платформы (как было с 16-разрядными типами данных при переходе к Win32). Это связано с тем, что даже в 64-разрядных приложениях в большинстве случаев переменные не требуют объема памяти в 8 байт, поэтому использование 64-разрядных типов в таких случаях оказалось бы крайне неэффективным. Операционной системе пришлось бы дописывать нули в старшие разряды, чтобы увеличить размер данных до 8 байт (такие данные к тому же очень неудобно считывать). Это привело бы к снижению производительности.

Иная участь постигла 32-разрядные указатели: они полностью исчезли. Дело в том, что использование 32-разрядных указателей накладывает ограничение на объем адресуемой памяти. Например, одним из главных преимуществ плоской модели памяти (она является основной для программирования 32-разрядных приложений для платформы NT), использующей 32-разрядные указатели, является возможность создания сегментов объемом до 4 Гбайт. Новые 64-разрядные указатели обеспечивают возможность адресации до 16 Тбайт памяти (1 Тбайт = 1012 Мбайт). Современными бизнес-приложениями этот объем вполне востребован.

Функции в Win64 API претерпели незначительные изменения. Только названия некоторых из них были изменены так, чтобы отразить принадлежность к 64-разрядной платформе. В большинстве случаев изменениям подверглись лишь типы параметров, являющихся аргументами вызова функций. Все остальные преимущества (возможность отказаться от использования файлов подкачки и т. д.) связаны либо с увеличившимся объемом адресации, либо с новыми типами данных.

32-разрядное приложение в 64-разрядной среде

Если бы 32-разрядные приложения работали в 64-разрядной среде так же эффективно, как в «родной», не было бы никакого смысла не только писать эту статью, но и создавать 64-разрядный компилятор. Действительно, производительность 32-разрядных приложений при работе на 64-разрядной платформе существенно снижается. Это связано с тем, что для запуска 32-разрядного приложения операционной системе приходится выполнять ряд подготовительных действий: увеличивать все 32-разрядные указатели до размера в 8 байт, преобразовывать вызовы API-функций, заменять типы 32-разрядных данных на 64-разрядные.

Здесь следует остановиться и подробнее рассмотреть вопрос о преобразовании данных. Win64 допускает использование и 32-, и 64-разрядных данных. Поэтому когда операционная система встречает 32-разрядные данные в 32-разрядном приложении, она должна ответить на вопрос: «Преобразовать ли эти данные в 64-разрядные или оставить, как есть?» Делается это для того, чтобы оптимизировать работу приложения. Если операционная система встретит 32-разрядные данные в 64-разрядном приложении, то не обратит на них внимания, так как платформа Win64 допускает использование 32-разрядных типов данных. Преобразование 32-разрядных данных в 64-разрядные осуществляется точно так же, как и преобразование 32-разрядных указателей, — дописыванием нулей в старшие разряды. Очевидно, что на выполнение всех этих операций тратится масса системных ресурсов, и, как результат, производительность снижается. Это особенно заметно при работе 32-разрядных драйверов на 64-разрядной платформе. В связи с тем, что драйверы являются связующим звеном между оборудованием и операционной системой, именно они используются наиболее интенсивно.

Азбука 64-разрядного программирования

Для работы с 64-разрядным кодом понадобятся компилятор, линкер и несколько подключаемых библиотек. Все это есть в последних дистрибутивах SDK и DDK. Прежде всего, необходимо рассмотреть макросы и директивы компилятора, предназначенные для 64-разрядного кода:

  • _WIN64 — 64-разрядная платформа;
  • _WIN32 — 32-разрядная платформа (для совместимости с 32-разрядной платформой);
  • _WIN16 — 16-разрядная платформа.

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

  • _M_IA64 — 64-разрядная архитектура Intel;
  • _M_IX86 — 32-разрядная архитектура Intel;
  • _M_ALPHA_64 — 64-разрядная архитектура Alpha;
  • _M_ALPHA32 — 32-разрядная архитектура Alpha;
  • _M_ALPHA — архитектура Alpha, либо 32-разрядная, либо 64-разрядная.

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

Теперь есть возможность создавать приложения, работающие и на 32-, и на 64-разрядной платформах. Здесь есть, однако, немало подводных камней. Следует быть очень внимательным — например, следующий код был вполне пригоден для «старых» приложений, но не для 64-разрядной платформы:

Чтобы исправить этот код, нужно после #else добавить макросы _WIN32 или _WIN64. Просто придется привыкнуть к тому, что теперь код бывает трех (а не двух, как раньше) «видов», поэтому использование директивы #else в привычных конструкциях приведет к неоднозначности (хотя 16-разрядных приложений становится все меньше и меньше, поддержка этой платформы в современных компиляторах остается).

Теперь рассмотрим новые типы данных. Их можно условно разделить на три группы (см. Таблицу 1):

  • целочисленные типы явного представления (fixed-precision integer types);
  • целочисленные типы, представленные указателями (pointer-precision integer types);
  • типы специальных указателей (specific-precision pointer types).

Описания этих типов находятся в файле basetsd.h (входящем в состав DDK/SDK) и приведены в Таблице 1.

Теперь рассмотрим особенности новых типов данных. Каждый целочисленный тип явного представления имеет размер, соответствующий его определению. Это означает, что переменная типа int32 всегда будет занимать 32 разряда, вне зависимости от платформы, на которой запускается и исполняется код. Обратите внимание, что при следующем макросе

под 32-разрядным кодом подразумевается использование 32-разрядных типов данных. Именно для переменных этой платформы служит тип int32. То же касается и других целочисленных типов явного представления, имеющих размер 32 разряда.

Второй вид (целочисленные типы, представленные указателями) имеет свою особенность: размер данных каждого такого типа зависит от платформы, на которой исполняется приложение. Именно поэтому многие из этих типов названы интегральными. Они сочетают в себе свойства 32- и 64-разрядных типов. Эти типы можно сравнить с виртуальными функциями и поздним связыванием из объектно-ориентированного программирования, так как в обоих случаях среда исполнения определяет конкретные свойства элементов только во время исполнения приложения, а не компиляции (в этом и заключается позднее связывание). Эти типы данных позволяют создавать приложения, одинаково хорошо работающие на 32- и 64-разрядной платформах.

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

Следующие функции Win64 (Helper Functions) отвечают за преобразование одного типа в другой (эти inline-функции определены в Basetsd.h). Смысл многих из них понятен из определения прототипов, к остальным требуются объяснения:

  • unsigned long HandleToUlong( const void *h );
  • long HandleToLong( const void *h );
  • void *LongToHandle( const long h );
  • unsigned long PtrToUlong( const void *p );
  • unsigned int PtrToUint( const void *p );
  • unsigned short PtrToUshort( const void *p );
  • long PtrToLong( const void *p );
  • int PtrToInt( const void *p );
  • short PtrToShort( const void *p );
  • void * IntToPtr( const int i ) расширяет знаком (sign-extends) значение типа int;
  • void * UIntToPtr( const unsigned int ui) расширяет нулем (zero-extends) значение типа unsigned int;
  • void * LongToPtr( const long l ) расширяет знаком (sign-extends) значение типа long;
  • void * ULongToPtr( const unsigned long ul) расширяет нулем (zero-extends) значение типа unsigned long.

Теперь рассмотрим изменения в Win64 API. Как уже отмечалось, лишь некоторые функции Win64 API были изменены. Для того чтобы перевести 32-разрядный код в 64-разрядный, следует использовать новые функции оконного класса (Window class). Если в private-данных окна или класса есть указатели, необходимо задействовать следующие новые функции: GetClassLongPtr, GetWindowLongPtr, SetClassLongPtr, SetWindowLongPtr. Эти функции могут работать и на 32- и на 64-разрядной платформе, но для компиляции требуют 64-разрядного компилятора.

Также необходимо, чтобы указатели и дескрипторы (handles), входящие в private-данные класса, могли использовать новые 64-разрядные функции. Нужно иметь в виду, что следующие элементы в Winuser.h во время 64-разрядной компиляции не определены:

Вместо них в Winuser.h определены следующие новые элементы:

Например, следующий код вызовет ошибку компиляции:

Его нужно изменить так:

Обращаю внимание читателей на следующий момент. Прежде чем делать cbWndExtra членом структуры WNDCLASS, необходимо убедиться, что для указателя имеется достаточно памяти. Например, если зарезервировано sizeof(DWORD) байт для адресуемой переменной, следует зарезервировать sizeof(DWORD_PTR) байт.

Теперь вернемся к новым 64-разрядным API-функциям. Все они объявлены в Winuser.h, включены в Windows.h и используют User32.lib.

1. GetClassLongPtr. GetClassLongPtr возвращает значение из структуры WNDCLASSEX, которое связано с определенным окном. Если вы возвращаете указатель или дескриптор окна (handle), эта функция в точности повторяет GetClassLong. Но чтобы написать код, работающий под двумя платформами (32- и 64-разрядной), нужно использовать только GetClassLongPtr. Вот ее определение:

Было бы нецелесообразно описывать все аргументы, так как они в точности повторяют параметры 32-разрядной функции GetClassLong (и, следовательно, доступны в любой справке по Win32 API).

2. GetWindowLongPtr. Здесь та же картина, что и в предыдущем случае. Эта функция является заменой «старой» функции GetWindowLong и служит лишь для совместимости двух платформ (а значит, и для создания кросс-платформенных приложений). Функция GetWindowLongPtr возвращает дескриптор окна и значение из экстрапамяти окна по указанному смещению. Вот ее определение:

3. SetClassLongPtr. Функция SetClassLong заменяет определенные значения по заданным смещениям в экстрапамяти класса или WNDCLASSEX-структуры на значения того класса, к которому принадлежит данное окно. Во многом эта функция похожа на SetClassLong, но она является межплатформенной.

4. SetWindowLongPtr. Функция SetWindowLongPtr меняет атрибуты окон. Она также записывает определенные значения (по определенным смещениям) в экстрапамять окна. Эта функция является интегральным (в смысле объединения двух платформ) аналогом SetWindowLong.

Перевод 32 в 64

Итак, я рассказал обо всех программных средствах, предоставляемых Win64. Пора разобраться, как применить эти знания. В общем виде алгоритм перевода кода Win32 на 64-разрядную платформу выглядит так:

  • замена «старых» типов новыми в тех случаях, когда это необходимо;
  • замена всех 32-разрядных указателей на 64-разрядные;
  • замена всех API-функций Win32 их 64-разрядными эквивалентами.

Для создания кросс-платформенных приложений (это предпочтительней первого варианта) необходимо:

  • воспользоваться макросами, определяющими платформу;
  • заменить все 32-разрядные типы данных их интегральными эквивалентами;
  • заменить все указатели на 64-разрядные;
  • заменить API-функции Win32 их интегральными эквивалентами.
Илон Маск рекомендует:  Блокировка встроенного динамика

К сожалению, пока не существует программ, которые могли бы помочь это сделать. Поэтому все изменения нужно делать самим. Единственным помощником в данном случае является 64-разрядный компилятор: в частности, его режим предупреждений (warnings), касающийся 64-разрядного кода. Для того чтобы включить эти предупреждения, нужно воспользоваться параметром компилятора-Wp64-W3. Он сделает активными следующие предупреждения:

  • C4305 — предупреждение о преобразовании типов. Например, «return»: truncation from «unsigned int64» to «long»;
  • C4311 — предупреждение о преобразовании типов. Например, «type cast»: pointer truncation from «int*_ptr64» to «int»;
  • C4312 — преобразование до большего размера (bigger-size). Например, «type cast»: conversion from «int» to «int*_ptr64» of greater size;
  • C4318 — использование нулевой длины (Passing zero length). Например, passing constant zero as the length to the memset function;
  • C4319 — нет оператора (Not operator). Например, «

«: zero extending «unsigned long» to «unsigned _int64» of greater size;

  • C4313 — вызов функций, входящих в printf-семейство, с конфликтным преобразованием типов в спецификаторах и аргументах. Например, «printf»: «%p» in format string conflicts with argument 2 of type «_int64.» Или, например, вызов функции printf(«%x», pointer_value) потребует преобразования верхних 32 разрядов. Правильный вызов: printf(«%p», pointer_value);
  • C4244 — то же, что и C4242. Например, «return»: conversion from «_int64» to «unsigned int,» possible loss of data.
  • Для преобразования кода в 64-разрядный нужно исправить все строки кода, на которые укажет компилятор. Некоторые советы приведены во врезке «Портируем 32-разрядный код»

    В заключение

    Мы постарались по возможности рассмотреть все значимые аспекты перевода 32-разрядного кода на 64-разрядную платформу. Следует заметить, что портирование драйверов происходит точно по такому же принципу. Хотя при этом обнаруживается достаточно много подводных камней, каждый из которых проявляется в своем конкретном случае. Составить общее представление об этом вопросе позволяет MSDN.

    Как сообщают представители Microsoft, средства для работы с 64-разрядным кодом (новые типы данных, указатели, компилятор, библиотеки. ) будут включены в новую версию MS Visual C++. Пока что в нашем распоряжении есть DDK/SDK, и это уже немало. С их помощью уже сейчас можно создавать кросс-платформенные приложения и портировать 32-разрядный код.

    АЛЕКСЕЙ ДОЛЯ — технический писатель. С ним можно связаться по адресу: TanaT@hotmail.ru.

    Портируем 32-разрядный код

    При портировании 32-разрядного кода на 64-разрядную платформу следует учитывать следующие моменты:

    • следите за разрядностью указателей и адресуемых ими данных. Если разрядности не совпадут, то либо приложение потеряет в производительности (операционная система сама будет расширять указатели), либо будет утрачена часть данных (они могут быть просто затерты);
    • используйте интегральные типы данных и функции Win64. Это позволит избежать множества конфликтных ситуаций;
    • делайте приложения кросс-платформенными. Это залог стабильности и высокой производительности приложения (гарантия корректной работы);
    • старайтесь исправлять код так, чтобы он не вызывал ни одного предупреждения 64-разрядного компилятора. Это позволит оптимизировать код и устранить риск, связанный со скрытыми в нем ошибками.

    Поделитесь материалом с коллегами и друзьями

    3.1.5. Модель вызова функций в Win32

    В системах Win32 при вызове всех системных функций используется модель вызова stdcall. Согласно этой модели параметры функций передаются через стек в обратном порядке, при этом за очистку стека от параметров ответственна вызываемая функция. Например, если у функции есть три параметра, то вызов согласно модели stdcall будет выглядеть так:

    Результат выполнения функции будет содержаться в регистре ЕЛХ.

    Также при использовании API-функций следует помнить, что они сохраняют значение не всех регистров общего назначения. Соглашение stdcall предусматривает сохранение содержимое регистров ЕВХ, ESI, EDI и EBP. Также при написании функций обратного вызова (подробнее о них пойдет речь в разделе 3.2) надо обязательно сохранять содержимое этих регистров, поскольку код системных функций не ожидает их изменения.

    Пример создания функций, отвечающих соглашению вызова stdcall, будет приведён в параграфе 3.1.7.2.

    3.1.6. Выполнение программ в Win32: общая картина

    Итак, как же выглядит общая картина? Обрисуем её последовательно.

    Когда загрузчик Windows загружает наш исполняемый файл, то сначала создаёт для него виртуальное адресное пространство размером 4 Гб, причём нижние 2 Гб из них доступны приложению. Потом он загружает системные библиотеки ntdll.dll и kernel32.dll; если в таблице импорта нашего файла указаны ещё какие- нибудь библиотеки, то они загружаются тоже. После того как библиотеки загружены, создаётся первичный поток процесса, который начинает своё выполнение с точки входа программы.

    Во время выполнения процесса, вернее его потоков, ему запрещены какие- либо обращения к портам ввода/вывода и вызов каких-либо прерываний. Также запрещены работа с привилегированными регистрами и выполнение привилегированных команд. Из-за вышеуказанных ограничений работа программы лишена всякого смысла — невозможно даже вывести на экран сообщение. Чтобы программы могли работать с внешними устройствами «приносить пользу», Windows предоставляет им API-функции, позволяющие программам работать с внешними устройствами, взаимодействовать с системой, а также друг с другом. API-функции находятся в системных библиотеках; каждая функция, которая работает с ресурсом, охраняемым системой (файлы, процессы, устройства и т. д.), вызывает соответствующую функцию ядра системы.

    Вызов подавляющего большинства функций, экспортируемых системными библиотеками функций, происходит по соглашению stdcall.

    Резюмируем всё вышесказанное: операционная система помещает программу в некоторое изолированное адресное пространство, разрешая ей взаимодействовать с «внешним миром» посредством функций (системных сервисов), которые сама же и предоставляет. Операционная система Windows избавляет программиста, который пишет программы на ассемблере, от множества забот, которые вообще-то не должны его касаться, например: от работы с системными регистрами и структурами, взаимодействия с внешними устройствами, реализации работы с файловой системой и т. д. В связи с этим программирование на ассемблере под Win32 намного легче, чем многие думают. При работе с файлами программисту не нужно заботиться о том, какая же модель жёсткого диска установлена на компьютере: достаточно просто вызывать функции, которые предоставляет операционная система, а она уже сама разберётся со всеми проблемами.

    Характеристика Win32

    Последние 10 лет Windows – самая популярная (91,02% [1] ) операционная система на рынке персональных компьютеров. Операционные системы Windows работают на платформах x86, AMD64, IA-64. Существовали также версии для DEC Alpha, MIPSи PowerPC.

    Семейство Windows NT:

    Операционные системы этого семейства работали на процессорах с архитектурой IA-32 и некоторых RISC-процессорах: Alpha, MIPS, Power PC (до версии 2000, которая вышла только в версии для IA-32). Windows NT являются полностью 32-битными операционными системами, и, в отличие от версий 1.0–3.x и 9x, не нуждаются в поддержке со стороны MS-DOS.

    Windows NT 3.1 (1993)

    Windows NT 3.5 (1994)

    Windows NT 3.51 (1995)

    Windows NT 4.0 (1996)

    Windows 2000 (2000) – Windows NT 5.0

    Windows XP (2001) – Windows NT 5.1

    Windows XP 64-bit Edition (2006) – Windows NT 5.2

    Windows Server 2003 (2003) – Windows NT 5.2

    Windows Vista (2006) – Windows NT 6.0

    Windows Home Server (2007)

    Windows Server 2008

    Windows 7 (2009) – Windows NT 7.0 (Актуальная версия – 6.1)

    В основу семейства Windows NT положено разделение адресных пространств между процессами. Каждый процесс имеет возможность работать с выделенной ему памятью. Однако он не имеет прав для записи в память других процессов, драйверов и системного кода.

    Семейство Windows NT относится к операционным системам с вытесняющей многозадачностью, а не к операционным системам реального времени. Разделение процессорного времени между потоками происходит по принципу «карусели». Ядро операционной системы выделяет квант времени (в Windows 2000 квант равен примерно 20 мс) каждому из потоков по очереди при условии, что все потоки имеют одинаковый приоритет. Поток может отказаться от выделенного ему кванта времени. В этом случае, система перехватывает у него управление (даже если выделенный квант времени не закончен) и передаёт управление другому потоку. При передаче управления другому потоку система сохраняет состояние всех регистров процессора в особой структуре в оперативной памяти. Эта структура называется контекстом потока. Сохранение контекста потока достаточно для последующего возобновления его работы.

    API (Application Programming Interface – интерфейс прикладных программ) – это множество функций, организованных, обычно, в виде DLL. Функции API позволяют организовать интерфейс между прикладной программой и средой, в которой работает эта программа. Вызов функций API позволяет программе получать доступ к ресурсам среды и управлять ее работой. Как правило, API задает стандарт взаимодействия среды и прикладной программы.

    Win32 – это название интерфейса, ориентированного на 32-х разрядные приложения и реализованного на таких известных платформах как Windows 95, Windows 98, Windows NT, Windows CE. Функции, составляющие этот интерфейс, позволяют прикладной программе получать доступ к ресурсам операционной системы и управлять ее работой. Более ранние версии Windows используют интерфейс, известный как Win16. Конечно, не все функции, составляющие интерфейс Win32, реализованы в полной мере на всех платформах, так что вызов одной и той же функции под NT приведет к определенному результату, а под Windows 95 работает как вызов заглушки. Любое из приложений, работающее в среде Windows, прямо или косвенно вызывает функции, входящие в Win32 API.

    Функции, составляющие Win32 интерфейс, организованы в виде нескольких динамически подключаемых библиотек (DLL) и исполняемых файлов.

    API функции не обязательно входят в состав Win32 интерфейса. Например, MAPI интерфейс (Messaging Application Programming Interface) составляют функции, предназначенные для обработки сообщений электронной почты, TAPI (Telephone API) – функции работы с телефонными сообщениями. MAPI, TAPI, также как и Win32 это некоторый набор функций, задающий определенный стандарт взаимодействия

    Функции, образующие API, обычно, организованы в виде DLL – динамически подключаемых библиотеках. Одно из достоинств DLL состоит в том, что, сколько бы приложений (процессов) не работало с функциями одной и той же DLL, код DLLсуществует в единственном экземпляре.

    1. Теоретическая часть

    1.1 Возможности Win 32 для нахождения списка запущенных процессов

    программа алгоритм библиотека пользователь

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

    1. Рассмотрим следующие методы:

    2. Спомощьюбиблиотеки Process Status Helper (PSAPI)

    3. С помощью ToolHelp32 API


    4. С помощью недокументированной функции ZwQuerySystemInformation

    5. Через счетчики производительности

    6. Сиспользованиеминтерфейсов Windows Management Instrumentation

    7. Функции интерфейса сокетов

    1.2 Использование библиотеки Process Status Helper

    Библиотека Process Status Helper, известная также под названием PSAPI, предоставляет набор функций, позволяющих получить информацию о процессах и драйверах устройств. Библиотека поставляется в составе Windows 2000/XP и доступна в качестве устанавливаемой компоненты для Windows NT 4.0.

    Для перечисления процессов библиотека предоставляет функцию EnumProcesses, которая возвращает массив идентификаторов запущенных процессов. Ниже приведен текст функции EnumProcesses_PsApi, реализующей перечисление процессов с помощью PSAPI.

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

    Поскольку мы хотим помимо идентификаторов процессов получить и имена процессов, мы должны проделать дополнительную работу. Для каждого процесса мы сначала получаем его описатель (handle) c помощью функции OpenProcess и затем используем функцию ЕnumProcessModules, которая возвращает список модулей, загруженных в адресное пространство процесса. Первым модулем в списке всегда является модуль, соответсвующий EXE-файлу программы. Наконец, мы вызываем функцию GetModuleFileNameEx (которая также является частью PSAPI), чтобы получить путь к EXE-файлу по описателю модуля. Мы используем имя EXE-файла без пути в качестве имени процесса.

    Нужно обратить внимание на специальную обработку для двух процессов. Мы вынуждены обрабатывать отдельно процесс бездействия системы (Idle) с идентификатором 0, и системный процесс (System), который имеет идентификатор 2 на Windows NT 4 и 8 – на Windows 2000/XP, потому что OpenProcess не позволяет открыть описатель для этих процессов, возвращая код ошибки ERROR_ACCESS_DENIED.

    1.3 Использование ToolHelp32 API

    Корпорация Microsoft добавила набор функций под названием ToolHelp API в Windows 3.1, чтобы позволить сторонним разработчикам получить доступ к системной информации, которая ранее была доступна только программистам Microsoft. При создании Windows 95, эти функции перекочевали в новую систему под названием ToolHelp32 API. Операционная система Windows NT c cамого создания содержала средства для получения подобной информации под названием «данные производительности». Интерфейс для доступа к данным производительности был крайне запутанным и неудобным (справедливости ради надо отметить, что начиная с Windows NT 4.0, Microsoft предоставляет библиотеку Performance Data Helper, значительно облегчающую получение данных производительности; мы воспользуемся этой библиотекой при реализации соответствующего метода перечисления процессов). Говорят, команда Windows NT долгое время сопротивлялась включению ToolHelp32 API в систему, тем не менее, начиная с Windows 2000, ToolHelp32 API присутствует и в этой операционной системе.

    Используя ToolHelp32 API, мы сначала создаем моментальный снимок (snapshot) списка процессов с помощью функции CreateToolhelp32Snapshot, а затем проходим по списку используя функции Process32First и Process32Next. Структура PROCESSENTRY32, заполняемая этими функциями, содержит всю необходимую информацию. Ниже приведен код функции EnumProcesses_ToolHelp, реализующей перечисление процессов с помощью ToolHelp32.

    1.4 Использование функции ZwQuerySystemInformation

    В данной курсовой использовался этот метод.

    Несмотря на наличие документированного способа получения списка процессов в Windows NT с помощью данных производительности, Windows NT Task Manager никогда не использовал этот интерфейс. Вместо этого он использовал недокументированную функцию ZwQuerySystemInformation, экспортируемую из NTDLL.DLL, которая позволяет получить доступ к самой разнообразной системной информации и списку процессов в том числе.

    Функция ZwQuerySystemInformation имеет следующий прототип [2]:

    IN SYSTEM_INFORMATION_CLASS SystemInformationClass,

    IN OUT PVOID SystemInformation,

    IN ULONG SystemInformationLength,

    OUT PULONG ReturnLength

    SystemInformationClass – задает тип получаемой информации, нас интересует SystemProcessesAndThreadsInformation;

    SystemInformation – указатель на буфер, принимающий запрошенную информацию;

    SystemInformationLength – задает длину приемного буфера в байтах;

    ReturnLength – указатель на переменную, в которую заносится количество байтов, записанных в выходной буфер

    Формат информации о процессах и потоках описывается структурой SYSTEM_PROCESSES, которая содержит почти всю информацию, отображаемую Task Manager. Ниже привeден код функции EnumProcesses_NtApi, реализующей перечисление процессов с использованием функции ZwQuerySystemInformation.

    При вызове ZwQuerySystemInformation трудно заранее определить, какой размер выходного буфера будет достаточным, поэтому мы начинам с буфера размером 32K и увеличиваем его по необходимости.

    1.5 Использование cчетчиков производительности

    Как уже отмечалось, операционная система Windows NT с самого создания содержала интерфейс для получения разнообразной информации о системе в виде счетчиков производительности. Этот интерфейс является, скажем, далеко не интуитивным. Для получения той или иной информации нужно прочитать из ключа реестра HKEY_PERFORMANCE_DATA значение со специально сформированным именем. В результате возвращается набор глубоко вложенных структур, многие из которых переменного размера, и разбор этих данных требует определенной усидчивости.

    Ситуация изменилась в лучшую сторону с появлением в Windows NT 4.0 библиотеки Performance Data Helper (PDH), которая предоставляет более удобный интерфейс к данным производительности. Эта библиотека, однако, не входила в комплект поставки Windows NT 4.0, она распространялась в составе Microsoft Platform SDK. В Windows 2000 PDH.DLL присутствует по умолчанию.

    Подробное рассмотрение данных производительности выходит за рамки данной статьи, отметим лишь, что система подсчета производительности в Windows NT определяет понятие объекта , для которого осуществляется подсчет производительности. Примерами объектов являются процессор и жесткий диск. Каждый объект может иметь один или более экземпляров , и для каждого объекта существует свой набор счетчиков производительности . Наша задача состоит в перечислении всех экземпляров объекта с именем «Process» и получении для каждого из них значения счетчика с именем «ID Process».

    1.6 Использование Windows Management Instrumentation

    Windows Management Instrumentation (WMI) являетсяреализацией Mircrosoft длятакназываемойтехнологии Web-Based Enterprise Management (WBEM). WBEM определяет унифицированную архитектуру, которая позволяет получать данные от различных источников, построенных с помощью различных технологий и платформ, и единообразно представлять эти данные. WBEM основана на схеме общей информационной модели (Common Information Model, CIM), которая является индустриальным стандартом, управляемым Distributed Management Task Force (DMTF). WMI поставляется в составе Windows 2000, но также может быть установлен на Windows 95/98/Me и Windows NT 4.0

    Поскольку WMI основана на технологии COM, это избавляет от необходимости явно загружать требуемые библиотеки, как это делалось в предыдущих примерах. Этот же факт требует инициализации библиотеки COM прежде чем будет вызвана функция перечисления процессов. В приложении, созданном с использованием MFC, это можно сделать с помощью функции AfxOleInit, в остальных случаях следует пользоваться функциями CoInitialize или CoInitializeEx.

    Кроме того, использование WMI требует инициализации безопасности COM с помощью функции CoInitializeSecurity

    Заметим, что как и метод с использованием счетчиков производительности, этот метод позволяет перечислить процессы на другом компьютере, для чего нужно указать имя компьютера в вызове IWbemLocator: ConnectServer.

    2. Описание программы

    2.1 Описание алгоритма

    Программа была написана на MicrosoftVisualStudio 2005, на языке С++, с использованием библиотек классов MFC, и функций Win32API.

    При запуске программы открывается окно:

    Рисунок 2.1 – Окно программы

    Сразу отображается список запущенных процес сов, построенный с помощью функциии EnumProcesses_NtApi, реализующей перечисление процессов с использованием функции ZwQuerySystemInformation.

    Определение времени запуска процесса осуществляется с помощью функции CreateTime_str.

    При нажатии левой кнопкой мыши на поля «ID» или «Name» осуществляется сортировка при помощи функции CMainFrame: OnList_ColumnClick, и функции сортировки CMainFrame: SortCallback.

    Рисунок 2.2 – Пример сортировки по названию

    С помощью кнопки Exit программа закрывается.

    3. Инструкция пользователя

    3.1 Назначение продукта

    Эта программа предназначена для частного пользования, для определения процессов, запущенных на компьютере, и времени их запуска.

    3.2 Системные требования

    Рекомендованные системные требования для компьютера:

    Процессор: IntelPentiumIII 0.8Ггц или выше;

    Видео адаптер: Поддерживающий Directx 6.0 и выше;

    ОС: WindowsXPи выше

    3.3 Запуск программы

    Клиентское приложение состоит из файла «pview.exe». При запуске этого файла открывается окно. Автоматически загружается список запущенных приложений. При нажатии левой кнопкой мыши на «ID», список процессов, сортируется по коду. При нажатии левой кнопкой мыши на «Name», список сортируется по названию. Сортировать можно как по возрастанию, так и по убыванию.

    В строке меню находится кнопка «Exit», при нажатии на которую, программа закроется.

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

    Систематизированы и закреплены практические навыки использования ПК, программного обеспечения, существующих средств обслуживания системных программистов, а также теоретические знания по основным разделам курса «Операционные системы». Основное внимание уделено изучению современных операционных систем.

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

    Получены практические навыки работы в среде MicrosoftVisualStudio.

    1. Дейтел Х. Дейтел П. Как программировать на С++. «Бином» – Моква, 2004. – 1018 с.

    2. Бондарев М.Ф. Липанов А.В. Путятин Е.П. Синельникова Т.Ф. Системное программирование в современных операционных системах «Компания СМИТ» – Харьков, 2005. – 432 с.

    3. Холзнер С. Visual С++. «Питер» – Санкт Петербург, 2006. – 580 с.

    4. Павловская Т.А. С/С++. Программирование на языке высокого уровня – СПб: Издательство «Питер», 2001. –464 с.

    5. Саймон Р. Microsoft Windows API. Справочник системного программиста. «DiaSoft» – Киев, 2004. – 1216 с.

    Некоторые функции win32

    В этом уpоке мы создадим Windows пpогpаммы, котоpая отобpажает полнофункциональное окно на pабочем столе.

    Скачайте файл пpимеpа здесь.

    Windows пpогpаммы для создания гpафического интеpфейса пользуются функциями API. Этот подход выгоден как пользователям, так и пpогpаммистам. Пользователям это дает то, что они не должны изучать интеpфейс каждой новой пpогpаммы, так как Windows пpогpаммы похожи дpуг на дpуга. Пpогpаммистам это выгодно тем, что GUI-функции уже оттестиpованы и готовы для использования. Обpатная стоpона — это возpосшая сложность пpогpаммиpования. Чтобы создать какой-нибудь гpафический объект, такой как окно, меню или иконка, пpогpаммист должен следовать должны следовать стpогим пpавилам. Hо пpоцесс пpогpаммиpования можно облегчить, используя модульное пpогpаммиpование или OOП-философию. Я вкpатце изложу шаги, тpебуемые для создания окна:

    1. Взять хэндл вашей пpогpаммы (обязательно)
    2. Взять командную стpоку (не нужно до тех поp, пока пpогpамме не потpебуется ее пpоанализиpовать)
    3. Заpегистpиpовать класс окна (необходимо, если вы не используете один из пpедопpеделенных класов окна, таких как MessageBox или диалоговое окно)
    4. Создайте окно (необходимо)
    5. Отобpазите его на экpане
    6. Обновить содеpжимое экpана на окне
    7. Запустите бесконечный цикл, в котоpом будут пpовеpятся сообщения от опеpационной системы.
    8. Пpибывающие сообщения пеpедаются специальной функции, отвечающая за обpаботку окна
    9. Выйти из пpогpаммы, если пользователь закpывает окно.

    Как вы можете видеть, стpуктуpа Windows пpогpаммы довольно сложна по сpавнению с досовской пpогpаммой. Hо миp Windows pазительно отличается от миpа DOS’а. Windows пpогpаммы должны быть способными миpно сосуществовать дpуг с дpугом. Они должны следовать более стpогим пpавилам. Вы, как пpогpаммист, должны быть более внимательными к вашим стилю пpогpаммиpованию и пpивычкам.

    Hиже пpиведен исходник нашей пpогpаммы пpостого окна. Пеpед тем как углубиться в описание деталей пpогpаммиpования на ассемблеpе под Win32, я покажу вам несколько тpюков, могущие облегчить пpогpаммиpование.

    Вам следует поместить все константы, стpуктуpы и функции, относящиеся к Windows в начале вашего .asm файла. Это съэкономит вам много сил и вpемени. В настоящее вpемя, самый полный include файл для MASM — это hutch’евский windows.inc, котоpый вы можете скачать с его или моей стpаницы. Вы также можете опpеделить ваши собственные константы и стpуктуpы, но лучше поместить их в отдельный файл.

    Используйте диpективу includelib, чтобы указать библиотеку импоpта, использованную в вашей пpогpамме. Hапpимеp, если ваша пpогpамма вызывает MessageBox, вам следует поместить стpоку «includelib user32.lib» в начале кода. Это укажет компилятоpу на то, что пpогpамма будет использовать функции из этой библиотеки импоpта. Если ваша пpогpамма вызывает функции из более, чем одной библиотеки, пpосто добавьте соответствующую диpективу includelib для каждой из используемых библиотек. Используя эту диpективу, вы не должны беспокоиться о библиотеках импоpта во вpемя линковки. Вы можете использовать ключ линкеpа /LIBPATH, чтобы указать, где находятся эти библиотеки.

    Объявляя пpототипы API функций, стpуктуp или констант в вашем подключаемом файле, постаpайтесь использовать те же имена, что и в windows include файлах, пpичем pегистp важен. Это избавит вас от головной боли в будущем.

    Используйте makefile, чтобы автоматизиpовать пpоцесс компиляции и линковки. Это избавит вас лишних усилий. (Лично я использую wmake из пакета Watcom C/C++ — пеpеводчик.)

    Некоторые функции win32

    Windows API был изначально спроектирован для использования в программах, написанных на языке C (или C++). Работа через Windows API — это наиболее близкий к системе способ взаимодействия с ней из прикладных программ. Более низкий уровень доступа, необходимый только для драйверов устройств, в текущих версиях Windows предоставляется через Windows Driver Model.

    Версии

    • Win16 — первая версия Windows API для 16-разрядных версий Windows. Изначально назывался просто Windows API, затем стал называться Win16 для отличия от Win32.
    • Win32s — подмножество Win32, устанавливаемое на семейство 16-разрядных систем Windows 3.x и реализующее ограниченный набор функций Win32 API для этих систем.
    • Win32 — 32-разрядный API для современных версий Windows. Самая популярная ныне версия. Базовые функции этого API реализованы в kernel32.dll и advapi32.dll; базовые модули GUI — в user32.dll и gdi32.dll. Win32 появился вместе с Windows NT и затем был перенесён (в несколько ограниченном виде) в системы серии Windows 9x. В современных версиях Windows, происходящих от Windows NT, работу Win32 GUI обеспечивают два модуля: csrss.exe (Client/Server Runtime Subsystem), работающий в пользовательском режиме, и win32k.sys в режиме ядра. Работу же системных Win32 API обеспечивает ядро — ntoskrnl.exe
    • Win64 — 64-разрядная версия Win32, содержащая дополнительные функции для использования на 64-разрядных компьютерах. Win64 API можно найти только в 64-разрядных версиях Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008 и Windows 7.

    Полный алфавитный список технологий, доступных через Windows API

    • Access Control
    • Active Accessibility
    • Active Directory
    • Active Directory Services Interface (ASP)
    • ActiveX Data Objects (
    • Automation
    • Background Intelligent Transfer Service (BITS)
    • Certificate Services
    • Collaboration Data Objects
    • Cryptography
    • Debugging and Error Handling
    • Device I/O
    • Distributed File System (Dfs)
    • Threads
    • Domain Name System (DHCP)
    • Extensible Authentication Protocol (XML) и парсер
    • Group Policy
    • ICS и ICF
    • Image Color Management (ICM)
    • Indexing Service
    • Infrared Data Association (IrDa)
    • Internet Authentication Service (IAS)
    • Internet Connection Sharing and Firewall (ICSF)
    • Internet Explorer
    • Internet Information Services (IIS)
    • Internet Protocol Helper (IP Helper)

    • Interprocess Communications
    • Lightweight Directory Access Protocol (LSA Authentication
    • LSA Policy
    • Memory Management
    • Message Queuing (MSMQ)
    • Messaging Application Programming Interface (
    • Microsoft Agent
    • Microsoft Data Access Components (MIDL)
    • Microsoft Management Console (MTS)
    • Multicast Address Dynamic Client Allocation Protocol (MADCAP)
    • Multicast Group Manager
    • National Language Support
    • NetMeeting
    • NetShell
    • Network Load Balancing Provider
    • Network Management
    • Network Monitor
    • Network Provider API
    • OLE DB
    • OLE DB Provider for Internet Publishing
    • OnNow
    • Open Database Connectivity (OpenGL
    • Password Filters
    • PC Health
    • Performance Monitoring
    • Plug and Play и Universal Plug and Play
    • Power Management
    • Quality of Service (
    • Remote Access Service (RAS)
    • Remote Procedure Call (имеется в виду служба RPC Service)
    • Removable Storage Manager (RSM)
    • Routing and Remote Access Service (RRAS)
    • Routing Table Manager Version 1 (RTMV1)
    • Routing Table Manager Version 2 (RTMV2)
    • Security Support Provider Interface (SSPI)
    • Server Cluster API
    • Server Data Objects (SDO)
    • Service Security Attachments
    • Setup API
    • Shell (имеется в виду Explorer Shell)
    • Side-by-side Assemblies
    • Simple Network Management Protocol (
    • Still Image
    • Storage и Structured Storage
    • Synchronization Manager
    • System.DirectoryServices
    • System Event Notification Service (SENS)
    • System Restore
    • Tablet PC
    • Task Scheduler
    • Telephony Application Programming Interface (TAPI) 2.2
    • Telephony Application Programming Interface (TAPI) 3
    • Telephony Service Provider Interface (TSPI и MSPI)
    • Terminal Services
    • Text Services Framework
    • Unicode (и MSLU)
    • Universal Description, Discovery, and Integration (
    • Windows Clustering
    • Windows File Protection
    • Windows
    • Windows Image Acquisition (WIA)
    • Windows Installer
    • Windows Management Instrumentation (
    • Windows Sockets
    • Windows System Information
    • Windows User Interface
    • Winlogon и Gina
    • WinSNMP

    См. также

    • Microsoft .NET
    • Window class
    • WinMain

    Ссылки

    • WinAPI @ dmoz.org
    • windows api programming — Форум клуба программистов
    • Platform SDK: Windows API — раздел Windows API в библиотеке MSDN
    • Открытая документация по WinAPI

    Литература

    • Гэри Неббет Справочник по базовым функциям API Windows NT/2000 = Windows NT/2000 Native API Reference. — М.: «Вильямс», 2002. — С. 528. — ISBN 1-57870-199-6
    Программные интерфейсы и Microsoft Windows
    Графика Проводник Windows • Direct3D • Windows Presentation Foundation • Windows Color System • Windows Image Acquisition • Windows Imaging Component
    Звук MME
    Мультимедиа DirectShow • Windows Media • Media Foundation
    Веб MSHTML • JScript • ActiveX •
    Доступ к данным Компоненты Microsoft Data Access • Extensible Storage Engine •
    Сети Winsock (LSP) • Filtering Platform •
    Коммуникации TAPI
    Администрирование Консоль Win32 • Windows Script Host • Инструментарий управления Windows • PowerShell • Планировщик задач • Offline Files • Теневое копирование • Windows Installer • Диспетчер ошибок Windows • Журнал событий Windows
    Модель компонентов COM • COM+ • DCOM • .NET Framework
    Библиотеки Microsoft Foundation Classes (MFC) • Active Template Library (ATL) • Windows Template Library (WTL) • Framework Class Library (FCL)
    Разработка драйверов Модель драйверов Windows • Windows Driver Foundation (KMDF • UMDF)
    Безопасность Windows CardSpace • Data protection API • Security Support Provider Interface
    .NET .NET Framework • ADO.NET • .NET Remoting • Windows Presentation Foundation • Windows Workflow Foundation • Windows Communication Foundation • Windows CardSpace • XNA •
    Межпроцессное
    взаимодействие
    MSRPC • Именованные каналы
    Текст и
    поддержка языков
    Framework Текстовых сервисов • Объектная модель текстов • • Языковые пакеты • Многоязычный интерфейс
    Игры XNA •
    Widget toolkit
    Low-level Macintosh Toolbox/Carbon · Windows API · Intrinsics · Intuition · High-level
    Amiga OS BOOPSI · Magic User Interface · Zune · ReAction GUI
    Mac OS и Mac OS X · MacApp · MacZoop · PowerPlant
    Microsoft Windows Microsoft Foundation > · Windows Template Library · SmartWin++ · Object Windows Library · Visual Component Library · Windows Forms · Windows Presentation Foundation
    Unix, under the X Xaw · · · InterViews
    Cross-platform Based on Flash: Adobe Flex · · SWF2EXE Software

    Wikimedia Foundation . 2010 .

    Смотреть что такое «Win32» в других словарях:

    Win32 — Win32, der Nachfolger von Win16, also die API von 32 bit Windows Versionen (9x/Me) … Universal-Lexikon

    Win32 — Das Windows Application Programming Interface (kurz: WinAPI; zu dt. etwa: Windows Anwendungs Programmierungs Schnittstelle) ist eine Programmierschnittstelle und Laufzeitumgebung, welche Programmierern bereitsteht, um Anwendungsprogramme für… … Deutsch Wikipedia

    Win32 — Windows API Windows API ou WinAPI est le nom donné par Microsoft à l Interface de programmation (API) sur les systèmes d exploitation Microsoft Windows. Elle est conçue pour les langages de programmation C et C++ et est la manière la plus directe … Wikipédia en Français

    Win32 — Kurzform für 32 Bit Windows Versionen (meist synonym zu Windows95 und Windows NT) … Acronyms

    Win32 — Kurzform für 32 Bit Windows Versionen (meist synonym zu Windows95 und Windows NT) … Acronyms von A bis Z

    Win32 console — is a plain text window for console applications within the system of Windows API. A Win32 console has a screen buffer and an input buffer.Win32 consoles are typically used for applications that do not need to display images. Examples include… … Wikipedia

    Win32-loader (Debian) — win32 loader win32 loader Debian Installer для Windows Vista Тип Debian Installer loader Разработчик Robert Millan … Википедия

    Win32-loader — Entwickler: Robert Millan Aktuelle Version: 0.6.7 (22. Juni 2008) Betriebssystem: Windows 95 / 98 / 2000 / XP / Vista Kategorie: Debian Installer loader … Deutsch Wikipedia

    Win32-loader (Debian) — win32 loader Entwickler: Robert Millan Aktuelle Version: 0.6.7 (22. Juni 2008) Betriebssystem: Windows 95 / 98 / 2000 / XP / Vista Kategorie: Debian Installer loader … Deutsch Wikipedia

    win32-loader — Debian Installer для Windows Vista Тип Debian Installer loader Разработчик Robert Millan Операционная система … Википедия

    Пример использования недокументированной функции Windows

    Большая часть программ от Sysinternals использует недокументированные функции. Мне хватило этого факта, чтобы заинтересоваться этой темой. Интересно, как крутые дядьки используют неописанные функции в своих не менее крутых программах.

    Предполагаем, что мы в нужной степени ленивые программисты, знаем С, в ладах с WinAPI и с архитектурой современной ОС Windows и у нас есть Ida Pro, хе-хе. Хотим красиво, быстро и эффективно выполнить задачу, не изобретая велосипед (и чтоб ещё сильно не перенапрячь руки и голову).

    Поищем подопытную функцию. Много вкусного можно найти в ntdll.dll. Сам я пишу из-под Win7 64, но взял 32-битную версию чудесной библиотеки. На всякий случай: %SystemDisk%\Windows\System32\ntdll.dll.

    Чтобы было просто, откроем ntdll в Ida и посмотрим, какие функции экспортируются. Если нет Ida, то можно взять любую программу работающую с PE-файлами (например, PETools). Нас интересуют функции с приставкой Rtl (Run Time Library). То есть во время выполнения нашего кода мы можем попросить эту системную функцию об услуге.

    После небольшого поиска простенькой функции, таковая нашлась — RtlComputeCrc32.

    Двойным щелчком по имени функции получаем её дизассемблированный код. Изучать функцию можно и любым другим дизассемблером вроде HDasm или W32Dasm. Чтобы не тратить место, приведу псевдокод RtlComputeCrc32, любезно предоставленный декомпилятором Ida (в теле функции нажать F5, если Hex-Rays Decompiler имеется в плагинах Edit->Plugins).

    Сразу получаем много информации! Надо подумать, что мы, собственно, ищем. Нам нужно:
    1) имя функции, чтобы получить её адрес в ntdll;
    2) прототип функции, чтобы создать правильный указатель на неё;
    3) примерный принцип работы, чтобы передать ей корректные аргументы и правильно обработать результат;

    Пункты 1-2 у нас уже есть из псевдокода. Задача наша теперь разобраться в функции и на её основе написать программу, высчитывающую CRC32 от чего-то.

    По псевдокоду легко понять, что функция перебирает байты массива a2, размер которого a3, а а1 — инициализирующее значение алгоритма. Проделав вычисления с байтами, получает индекс из таблицы RtlCrc32Table (двойной щелчок покажет монструозную таблицу). Гуглим CRC32 и примеры реализации и понимаем, что всё верно.

    Дело за малым — воспользоваться добычей. Я сделал пустое консольное приложение в Visual Studio, но делать, естественно, можно и в любой другой среде.

    GetModuleHandle() возвращает хэндл ntdll, GetProcAddress() — адрес функции. Используем указатель на функцию типа UndocFoo для вызова RtlComputeCRC32().

    Успех. Проверить можно с помощью любого онлайн-вычислителя.
    Наши байты 016107 дали CRC32 = 0x1c017c60.

    То же самое выдал онлайн-вычислитель:

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

    что такое win32?как его удалить? блин нечего не загружает ваабще.

    Некоторые очень старые программы, расчитанные на работу как с Windows 95/NT, так и с Windows 3.0/3.1/3.11, используют Win32s — интерфейс, который позволял использовать некоторые (не все! ) функции 32-разрядного Win32 на 16-разрядых версиях Windows. Windows NT/2k/XP — полностью 32-разрядные, 95/98/ME — наполовину 32-разрядные, наполовину 16-разрядые, но для программ это в большинстве случав несущественно, с точки зрения программиста это 32-разрядные системы, а вот Windows 3.0/3.1/3.11 — полностью 16-разрядные.

    Delphi

    Наши проекты

    Автор: Акулов Николай

    Откpывает и позициониpует файл pесуpсов на начало pесуpса. После чтения pесуpса файл должен быть закpыт.

    Instance: Модуль экземляpа, исполнимый файл котоpого содеpжит pесуpс.

    ResInfo: Нужный pесуpс, созданный путем вызова функции FindResource.

    Описатель файла DOS; -1, если pесуpс не найден.

    Добавляет Str в таблицу атомов. Для каждого уникального стpокового экземпляpа ведется счетчик ссылок.

    Str: Символьная стpока, заканчивающаяся пустым символом.

    В случае успешного завеpшения — уникальный идентификатоp атома; в пpотивном случае, -1.

    Функция находится в файле kernel32.dll

    Добавляет к таблице системных шpифтов pесуpс шpифта из файла pесуpса шpифтов с именем FileName.

    FileName: Описатель загpуженного модуля или стpока, заканчивающаяся пустым символом.

    Количество добавленных шpифтов; нуль, если шpифты не добавлялись.

    Функция находится в файле gdi32.dll

    Вычисляет тpебуемый pазмеp оконного пpямоугольника на основании pазмеpа Rect. Пpедполагается одностpочное меню.

    Rect: TRect, содеpжащий пpеобpазуемые кооpдинаты пpямоугольника пользователя.

    Style: Стили окна, пpямоугольник пользователя котоpого пpеобpазуется.

    Menu: Не нуль, если окно имеет меню.

    Функция находится в файле user32.dll

    Вычисляет тpебуемый pазмеp оконного пpямоугольника с pасшиpенным стилем на основании pазмеpа Rect. Пpедполагается одностpочное меню.

    Rect: TRect, содеpжащий пpеобpазуемые кооpдинаты пpямоугольника пользователя.

    Style: Стили окна, пpямоугольник пользователя котоpого пpеобpазуется.

    Menu: Не нуль, если окно имеет меню.

    ExStyle: Расшиpенный стиль создаваемого окна.

    Функция находится в файле user32.dll

    Отобpажает Selector в селектоp сегмента кода.

    Selector: Селектоp сегмента данных.

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

    Выделяет неинициализиpованную память для ResInfo.

    Instance: Модуль экземляpа, исполнимый файл котоpого содеpжит pесуpс.

    ResInfo: Нужный pесуpс.

    Size: Размеp в байтах, выделяемый для pесуpса; игноpиpуется, если нуль.

    Выделенный глобальный блок памяти.

    Распpеделяет новый селектоp, котоpый является точной копией Selector. Если Selector имеет значение nil, то выделяет память под новый, неинициализиpованный селектоp.

    Selector: Копиpуемый селектоp.

    В случае успешного завеpшения — селектоp; в пpотивном случае, нуль.

    hdc: Дескриптор контекста устройства.

    x: Координата x центра круга.

    y: Координата y центра круга.

    dwRadius: Радиус круга.

    eStartAngle: Угол для идентификации отправной точки дуги.

    eSweepAngle: Угол для идентификации конечной точки дуги

    В случае успешного завеpшения — true; в пpотивном случае, false.

    Заменяет элементы в Palette между StartIndex и NumEntries на PaletteColors.

    Palette: Логическая палитpа.

    StartIndex: Пеpвый элемент в оживляемой палитpе.

    NumEntries: Число элементов в оживляемой палитpе.

    PaletteColors: Массив стpуктуp TPaletteEntry.

    Функция находится в файле gdi32.dll

    Использует дpайвеp языка для пpеобpазования Str в нижний pегистp.

    Str: Стpока, заканчивающаяся пустым символом, или одиночный символ (в младшем байте).

    Пpеобpазованная стpока или символ.

    Функция находится в файле user32.dll

    Использует дpайвеp языка для пpеобpазования Str в нижний pегистp.

    Str: Буфеp символов.

    Length: Длина символов в буфеpе; если нуль, то длина составляет 64К (65 536 байт).

    Длина пpеобpазованной стpоки.

    Функция находится в файле user32.dll

    Используется для итеpации по стpокам, символы котоpых имеют длину два или более байт.

    CurrentChar: Стpока, заканчивающаяся пустым символом.

    Указатель на следующий символ в стpоке.

    Функция находится в файле user32.dll

    Используется для итеpации в обpатном напpавлении по стpокам, символы котоpых имеют длину два или более байт.

    Start: Начало стpоки (заканчивающейся пустым символом).

    CurrentChar: Стpока, заканчивающаяся пустым символом.

    Указатель на пpедыдущий символ в стpоке.

    Функция находится в файле user32.dll

    Тpанслиpует AnsiStr в символьный набоp, опpеделенный OEM. Длина может быть больше 64К.

    AnsiStr: Cтpока (заканчивающаяся пустым символом) символов ANSI.

    OEMStr: Место, куда копиpуется отpанслиpованная стpока, может совпадать с AnsiStr.

    Функция находится в файле user32.dll

    Тpанслиpует AnsiStr в символьный набоp, опpеделенный OEM.

    AnsiStr: Буфеp символов ANSI.

    OEMStr: Место, куда копиpуется отpанслиpованная стpока, может совпадать с AnsiStr.

    Length: Размеp AnsiStr; если нуль, длина pавна 64К.

    Функция находится в файле user32.dll

    Использует дpайвеp языка для пpеобpазования Str в веpхний pегистp.

    Str: Стpока, заканчивающаяся пустым символом или один символ (в младшем байте).

    Пpеобpазованная стpока или символ.

    Функция находится в файле user32.dll

    Использует дpайвеp языка для пpеобpазования Str в веpхний pегистp.

    Str: Буфеp символов.

    Length: Размеp Str; если нуль, то длина pавна 64К.

    Длина пpеобpазованной стpоки.

    Функция находится в файле user32.dll

    Опpеделяет, существует ли на экpане всплывающее окно.

    Не нуль, если всплывающее окно существует; нуль — если нет.

    Функция находится в файле user32.dll

    Пpисоединяет в конец меню новый элемент, состояние котоpого опpеделяется Flags.

    Menu: Изменяемое меню.

    Flags: Одна или комбинация следующих констант MF: mf_Bitmap, mf_Checked, mf_Disabled, mf_Enabled, mf_Grayed, mf_MenuBarBreak mf_MenuBreak, mf_OwnerDraw, mf_Popup, mf_Separator, mf_String, mf_UnChecked.

    IDNewItem: Идентификатоp команды или описатель меню в случае всплывающего меню.

    Не нуль в случае успешного завеpшения; нуль — в пpотивном случае.

    Функция находится в файле user32.dll

    Рисует эллиптическую дугу, центpиpованную в огpаничивающем пpямоугольнике.

    DC: Контекст устpойства.

    X1, Y1: Веpхний левый угол огpаничивающего пpямоугольника.

    X2, Y2: Пpавый нижний угол огpаничивающего пpямоугольника.

    X3, Y3: Начальная точка дуги.

    X4, Y4: Конечная точка дуги.

    Не нуль, если дуга наpисована; нуль — в пpотивном случае.

    Пpимечание: Огpаничивающий пpямоугольник должен быть не длиннее или не шиpе 32 767 единиц.

    Функция находится в файле gdi32.dll

    Располагает пиктогpаммы в окне пользователя MDI или пиктогpаммы в окне pабочей области.

    Wnd: Идентификатоp pодительского окна.

    Высота одной стpоки пиктогpамм; нуль, если пиктогpамм нет.

    Написать программу для получения сведений о системе, используя функции Win32 API

    22.04.2015, 18:49

    Написать программу для получения сведений о системе, используя функции Win32 API
    В институте такая вот задача далась, помогите её решить пожалуйста: Написать программу для.

    Написать программу для получения сведений о системе, используя WinAPI функции
    Всем доброго времени суток, в институте такая вот задача далась, помогите её решить пожалуйста: .

    Метод получения события о закрытии окна Win32 API
    Подскажите метод (Win32 API) получения события о закрытии некоторого окна (естественно не моего.

    Функции Win32 API для работы с процессами
    Дайте плиз какую нить инфу по функциям Win32 API для работы с процессами,желательно с примерами;)

    Илон Маск рекомендует:  Предопределённые константы mcrypt
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL