Что такое код globalflags

Содержание

Что такое код globalflags

(В линейках ОС Windows NT и 9x не используется)

Функция GlobalUnlock разблокировывает данный объект памяти глобальных данных. Эта функция не имеет никакого действия на фиксированную память.

Синтаксис

Параметры

Идентифицирует объект памяти глобальных данных, который будет разблокирован.

Возвращаемые значения

Возвращаемое значение — нуль, если счетчик блокировки (фиксации) объекта был уменьшен ( на единицу) до нуля. В противном случае, возвращаемое значение — не нуль.

Замечания

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

Эта функция возвращает ненулевое значение, если данный объект памяти не перемещаем. Приложение не должно зависеть от возвращаемого значения, чтобы определить сколько раз оно должно впоследствии вызвать функцию GlobalUnlock для объекта памяти.

Другие функции могут также влиять на счетчик фиксации объекта памяти. Список функций, которые оказывают влияние на счетчик блокировки (фиксации), см. в описании функции GlobalFlags.

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

Пример

Нижеследующий пример использует функции GlobalAlloc и GlobalLock, чтобы назначить память, а затем вызывает функции GlobalUnlock и GlobalFree, чтобы освободить ее.

Операционная система Microsoft Windows 3.1 для программиста

2.3. Работа с памятью в приложениях Windows

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

Глобальная динамическая память

В Windows версии 3.1 область глобальной памяти общая для всех приложений Windows. Теоретически одно приложение может заказать для себя блок памяти из глобальной области и передать его идентификатор другому приложению, однако такая практика не приветствуется, так как в следующих версиях Windows адресные пространства приложений могут быть разделены (для передачи данных между приложениями необходимо использовать механизм динамической передачи данных DDE, который будет описан в одном из следующих томов «Библиотеки системного программиста»).

Получение глобального блока памяти

Для получения глобального блока памяти вы должны использовать функцию GlobalAlloc :

Параметр fuAlloc определяет тип выделяемой памяти. Размер блока памяти в байтах должен передаваться через параметр cbAlloc, причем вы можете заказать блок памяти размером больше, чем 64 Кбайт. Для стандартного режима работы Windows можно заказать блок памяти размером до 1 Мбайт без 80 байт, для расширенного — до 16 Мбайт без 64 Кбайт.

Функция возвращает идентификатор глобального блока памяти или NULL, если Windows не может выделить память указанного объема.

Параметра fuAlloc должен быть указан как логическая комбинация следующих значений:

Флаг Описание
GMEM_DDESHARE Блок памяти будет использоваться совместно несколькими приложениями при помощи механизма динамического обмена данными DDE
GMEM_DISCARDABLE Заказывается удаляемый блок памяти. Этот флаг должен использоваться совместно с флагом GMEM_MOVEABLE
GMEM_FIXED Заказывается фиксированный блок памяти. Этот флаг несовместим с флагом GMEM_MOVEABLE.При работе в среде Windows версии 3.1 в защищенном режиме фиксированный сегмент, созданный с использованием флага GMEM_FIXED, является перемещаемым. Для такого сегмента в процессе перемещения логический адрес не изменяется, но линейный (и, следовательно, физический) может изменяться
GMEM_LOWER Синоним для GMEM_NOT_BANKED. Не используется в Windows версии 3.1
GMEM_MOVEABLE Заказывается перемещаемый блок памяти. Логический адрес перемещаемого блока памяти может изменяться. Этот флаг несовместим с флагом GMEM_FIXED
GMEM_NOCOMPACT Для удовлетворения запроса памяти не следует выполнять объединение всех свободных участков памяти в один и удалять блоки памяти, отмеченные как удаляемые
GMEM_NODISCARD Для удовлетворения запроса памяти не следует выполнять объединение всех свободных участков памяти в один
GMEM_NOT_BANKED Получить блок памяти вне фрейма дополнительной памяти EMS. Не используется в Windows версии 3.1
GMEM_NOTIFY Если заказанный объект будет удален, требуется вызов процедуры извещения. Процедура извещения назначается функцией GlobalNotify и должна располагаться в фиксированном сегменте кода в библиотеке DLL. С ее помощью приложение может разрешить или запретить Windows удалять блок данных
GMEM_SHARE Синоним для GMEM_DDESHARE
GMEM_ZEROINIT Во все байты блока необходимо записать нулевые значения
GHDN Синоним для комбинации флагов GMEM_MOVEABLE и GMEM_ZEROINIT
GPTR Синоним для комбинации флагов GMEM_FIXED и GMEM_ZEROINIT

Идентификатор, полученный от функции GlobalAlloc, нельзя использовать для адресации памяти непосредственно. Напомним, что пока вы не зафиксировали блок памяти, его логический адрес недоступен.

Приведем для примера фрагмент кода, в котором мы получаем перемещаемый блок памяти размером 200000 байт, причем во все байты полученного блока записываются нулевые значения:

В следующем фрагменте мы заказываем удаляемый блок памяти размером 200000 байт, который никак не инициализируется:

Фиксирование и расфиксирование блока памяти

Для получения доступа к полученному блоку памяти его необходимо зафиксировать, вызвав функцию GlobalLock :

Функция GlobalLock фиксирует блок памяти, идентификатор которого передается ей через параметр hglb и возвращает логический адрес зафиксированного блока или NULL, если указанный блок удален или произошла ошибка.

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

Для каждого блока памяти Windows поддерживает счетчик фиксирований. Этот счетчик увеличивается при вызове функции GlobalLock и уменьшается при расфиксировании блока функцией GlobalUnlock :

Если содержимое счетчика уменьшилось до нуля, функция возвращает значение FALSE. В противном случае возвращается TRUE.

Файл windowsx.h содержит макрокоманды, облегчающие работу с глобальными блоками памяти. Например, макрокоманда GlobalAllocPtr получает блок памяти и фиксирует его:

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

Определение идентификатора блока памяти по его адресу

С помощью функции GlobalHandle вы можете, зная селектор блока памяти, определить его идентификатор:

Параметр uGlobalSel указывает селекторную компоненту логического адреса блока памяти.

Младшее слово возвращаемого значения содержит идентификатор блока памяти, старшее — селектор блока памяти. В случае ошибки возвращается нулевое значение.

В файле windowsx.h определена макрокоманда GlobalPtrHandle , упрощающая получение идентификатора блока памяти по его логическому адресу:

Макрокоманда SELECTOROF определена в файле windows.h и предназначена для получения селекторной компоненты логического адреса:

В файле windows.h есть также определения для макрокоманды OFFSETOF , возвращающей компоненту смещения, и макрокоманда MAKELP , конструирующая указатель из компонент смещения и селектора:

Если вы работаете с транслятором Borland C++ for Windows, вместо этих макрокоманд можете использовать знакомые вам макрокоманды FP_SEG , FP_OFF и MK_FP , описанные в файле dos.h:

Работа с удаляемыми блоками памяти

Для того чтобы заказать удаляемый блок памяти, вы должны указать флаги GMEM_DISCARDABLE и GMEM_MOVEABLE , например:

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

При попытке зафиксировать удаленный блок с помощью функции GlobalLock приложение получит от этой функции значение NULL. В этом случае следует вызвать функцию GlobalFlags , предназначенную для определения состояния блока памяти, и проверить, находится ли данный блок в удаленном состоянии.

Приведем прототип функции GlobalFlags:

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

Если установлен флаг GMEM_DISCARDABLE, проверяемый блок памяти может быть удален Windows в процессе дефрагментации свободной области памяти. Если же установлен флаг GMEM_DISCARDED, удаление блока памяти уже произошло.

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

Приведем прототип функции GlobalReAlloc :

Параметр hglb указывает идентификатор восстанавливаемого блока памяти.

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

Параметр fuAlloc определяет тип восстановленного блока памяти. Можно указывать логическую комбинацию следующих флагов:

Флаг Описание
GMEM_DISCARDABLE Если блок памяти был перемещаемый, то теперь дополнительно он будет и удаляемый. Этот флаг должен использоваться совместно с флагом GMEM_MODIFY
GMEM_MODIFY Выполняется изменение характеристик существующего блока памяти. этот флаг необходимо указывать вместе с флагами GMEM_DISCARDABLE и GMEM_MOVEABLE
GMEM_MOVEABLE Если раньше указанный блок памяти был перемещаемым и удаляемым, содержимое счетчика фиксирования для него равно нулю и новый размер блока указан равным нулю, данный блок будет удален. Если же параметр cbNewSize равен нулю, но блок памяти не является перемещаемым или удаляемым, функция вернет признак ошибки.Для фиксированного блока памяти ненулевой длины данный флаг разрешает перемещение, т. е. преобразует фиксированный блок в перемещаемый.
GMEM_NODISCARD Блок памяти не может быть удален операционной системой. Этот флаг должен использоваться совместно с флагом GMEM_MODIFY
GMEM_ZEROINIT Если размер блока памяти увеличивается, во все байты дополнительной памяти необходимо записать нулевые значения. Этот флаг несовместим с флагом GMEM_MODIFY

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

Изменение блока памяти

Как мы уже говорили, функция GlobalReAlloc , описанная выше, позволяет изменить характеристики глобального блока памяти.

Если вам, например, надо изменить размер заказанного ранее блока памяти, сделав его равным 51200 байт, вы можете для этого использовать следующий фрагмент кода:

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

Учтите, что при увеличении размера блока может возникнуть ситуация нехватки памяти, поэтому проверяйте значение идентификатора, возвращаемой функцией GlobalReAlloc, на неравенство константе NULL.

Вы можете инициировать удаление блока памяти при помощи функции GlobalReAlloc, если укажите нулевой размер блока и флаг GMEM_MOVEABLE. В файле windows.h имеется определение макрокоманды GlobalDiscard, при помощи которой приложение может принудительно удалить блок из памяти:

Определение размера блока памяти

С помощью функции GlobalSize вы можете определить размер блока памяти по его идентификатору:

Эта функция возвращает размер блока памяти, идентификатор которого задан параметром hglb. Если указанный блок памяти не существует или удален, возвращается нулевое значение.

Дефрагментация памяти

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

Функция возвращает размер самого большого доступного непрерывного блока памяти, причем, если параметр на равен 0 или -1, выполняется дефрагментация памяти и удаление блоков, отмеченных как удаляемые. Если параметр функции указан как 0 или -1, функция не выполняет дефрагментацию памяти, но возвращает правильное значение с учетом возможного выполнения дефрагментации.

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

Если у вас возникает необходимость заказать память, доступную приложениям MS-DOS, и располагающуюся в первом мегабайте адресного пространства, воспользуйтесь функцией GlobalDosAlloc :

Параметр cbAlloc определяет размер блока в байтах.

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

Младшее слово возвращаемого значения содержит селектор для доступа к полученному блоку в защищенном режиме.

Память, заказанная при помощи функции GlobalDOSAlloc, является фиксированной, поэтому вам не следует вызывать функцию GlobalLock для фиксирования и получения логического адреса.

Для освобождения блока памяти, полученного при помощи функции GlobalDOSAlloc, следует вызвать функцию GlobalDosFree :

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

В случае успешного завершения возвращаемое значение равно нулю. При ошибке возвращается селектор, указанный в параметре uSelector.

Учтите, что заказывать памяти в первом мегабайте можно только в случае крайней необходимости, когда, вам, например, нужно обеспечить одновременный доступ к памяти со стороны приложений Windows и программ MS-DOS. Уменьшение свободного пространства в первом мегабайте адресного пространства отрицательно сказывается на производительности работы приложений Windows.

Освобождение глобального блока памяти

Для освобождения глобального блока памяти, полученного от функции GlobalAlloc, вы должны использовать функцию GlobalFree :

Идентификатор освобождаемого блока передается функции в качестве ее единственного параметра.

Функция возвращает NULL при успешном завершении или значение hglb при ошибке.

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

Для освобождения памяти, полученной при помощи макрокоманды GlobalAllocPtr, удобно использовать макрокоманду GlobalFreePtr , описанную в файле windowsx.h:

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

Фиксирование линейного адреса блока памяти

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

Если драйвер какого-либо устройства ввода/вывода работает с линейным адресом буфера, память, отведенная для такого буфера в некоторых случаях должна быть зафиксирована функцией GlobalFix :

Параметр функции указывает идентификатор фиксируемого блока памяти.

Как только отпадет необходимость в фиксировании блока памяти, его следует расфиксировать, вызвав функцию GlobalUnfix :

Единственный параметр этой функции должен содержать идентификатор блока памяти, который будет расфиксирован.

Фиксирование страниц блока памяти

В расширенном режиме работы операционной системы Windows версии 3.1 используется виртуальная память. Как мы уже говорили, при использовании виртуальной памяти вся глобальная область памяти делится на страницы размером 4 Кбайт. Эти страницы могут располагаться в физической оперативной памяти или на диске в специальном файле виртуальной памяти. Если приложение обращается к странице, которая отсутствует в физической оперативной памяти, она загружается туда из файла виртуальной памяти.

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

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

Для исключения страниц памяти, принадлежащих указанному блоку памяти, из процесса страничного обмена необходимо использовать функцию GlobalPageLock :

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

Операционная система Windows поддерживает счетчик блокирования страничного обмена. Содержимое этого счетчика увеличивается на единицу при каждом вызове функции GlobalPageLock.

Функция GlobalPageLock возвращает новое значение счетчика или ноль при ошибке.

Как только надобность в блокировке страничного обмена отпадает, следует вызвать функцию GlobalPageUnlock :

Эта функция разрешает страничный обмен для блока памяти, заданного параметром hglb. Функция возвращает текущее значение счетчика или ноль при ошибке.

Приложение GMEM

Для демонстрации использования основных функций управления глобальной памятью мы приведем исходный текст приложения GMEM (листинг 2.3).

Листинг 2.3. Файл gmem/gmem.cpp

Перед началом работы приложение определяет объем свободной памяти, вызывая функцию GlobalCompact со значением параметра, равным -1. Определенное значение выводится на экран при помощи функции MessageBox.

Далее приложение вызывает функцию GlobalCompact еще раз для освобождения непрерывного блока свободной памяти размером 100000 байт.

После этого приложение заказывает буфер размером 100000 байт, вызывая функцию GlobalAlloc. В качестве первого параметра этой функции указана константа GHND, соответствующее перемещаемой памяти, инициализированной нулевым значением.

В случае успешного получения блока памяти он фиксируется и на экран выводится значение идентификатора блока и его логический адрес. После этого в первый байт полученного блока записывается код символа ‘S’ и блок расфиксируется. При ошибке выдается сообщение.

Далее полученный блок освобождается и возвращается операционной системе, для чего вызывается функция GlobalFree.

После этого приложение заказывает удаляемый блок памяти размером 200000 байт и сразу же удаляет его, вызывая макрокоманду GlobalDiscard. Затем приложение предпринимает попытку зафиксировать только что удаленный блок памяти, вызывая функцию GlobalLock. Если блок памяти удалился успешно, функция GlobalLock должна вернуть значение NULL. В этом случае нам надо убедиться в том, что блок был удален, и если это так и есть, восстановить удаленный блок.

Для проверки приложение использует функцию GlobalFlags. Если блок, идентификатор которого был передан этой функции в качестве параметра, удален, в возвращаемом значении установлен флаг GMEM_DISCARDED.

Для восстановления удаленного блока приложение вызывает функцию GlobalReAlloc, указывая размер и характеристики блока. Затем восстановленный блок фиксируется в памяти и на экран выводится его идентификатор и логический адрес.

Перед завершением работы приложения блок расфиксируется и освобождается.

Файл определения модуля приложения GMEM приведен в листинге 2.4.

Листинг 2.4. Файл gmem/gmem.def

Локальная динамическая память

Для каждого приложения Windows создается автоматический сегмент данных размером 64 Кбайт, в котором располагаются статические данные , стек и локальная область данных (local heap ). Кроме этого, автоматический сегмент данных имеет заголовок размером 16 байт (рис. 2.10).

Рис. 2.10. Автоматический сегмент данных приложения Windows

Размер стека определяется оператором STACKSIZE в файле определения модуля:

Минимальный размер стека, назначаемый Windows для приложений, составляет 5 Кбайт. Следует отметить, что в руководстве к SDK нет точного описания способа определения минимально необходимого объема стека. В этом руководстве предлагается определить этот объем экспериментально, причем подчеркивается, что результаты переполнения стека непредсказуемы.

В отличие от стека, размер локальной области данных может при необходимости увеличиваться автоматически. Начальное значение задается в файле определения модуля при помощи оператора HEAPSIZE :

Вы можете указать любое отличное от нуля значение.

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

Получение локального блока памяти

Для получения локального блока памяти вы должны использовать функцию LocalAlloc :

Параметр fuAlloc определяет тип выделяемой памяти. Размер блока памяти в байтах должен передаваться через параметр cbAlloc.

Функция возвращает идентификатор локального блока памяти или NULL, если Windows не может выделить память указанного объема.

Параметра fuAlloc должен быть указан как логическая комбинация следующих значений:

Флаг Описание
LMEM_DISCARDABLE Заказывается удаляемый блок памяти. Этот флаг должен использоваться совместно с флагом LMEM_MOVEABLE
LMEM_FIXED Заказывается фиксированный блок памяти (в защищенном режиме работы блок памяти будет перемещаемым, даже если он заказан с использованием флага LMEM_FIXED, однако в процессе перемещения будет изменяться только линейный адрес, но не логический). Этот флаг несовместим с флагом LMEM_MOVEABLE
LMEM_MOVEABLE Заказывается перемещаемый блок памяти. Логический адрес такого блока может изменяться в процессе перемещения. Этот флаг несовместим с флагом LMEM_FIXED
LMEM_NOCOMPACT Для удовлетворения запроса памяти не следует выполнять объединение всех свободных участков памяти в один и удалять блоки памяти, отмеченные как удаляемые
LMEM_NODISCARD Для удовлетворения запроса памяти не следует выполнять объединение всех свободных участков памяти в один
LMEM_ZEROINIT Во все байты блока необходимо записать нулевые значения
NONZEROLHND Синоним для LMEM_MOVEABLE
NONZEROLPTR Синоним для LMEM_FIXED
LHDN Синоним для комбинации флагов LMEM_MOVEABLE и LMEM_ZEROINIT
LPTR Синоним для комбинации флагов LMEM_FIXED и LMEM_ZEROINIT

Приведем фрагмент кода, в котором мы получаем из локальной области памяти перемещаемый блок размером 2000 байт, причем во все байты полученного блока записываются нулевые значения:

В следующем фрагменте мы заказываем удаляемый блок памяти размером 200 байт, который никак не инициализируется:

Фиксирование и расфиксирование блока памяти

Для получения доступа к полученному блоку памяти его необходимо зафиксировать, вызвав функцию LocalLock :

Функция LocalLock фиксирует блок памяти, идентификатор которого передается ей через параметр hloc и возвращает логический адрес зафиксированного блока или NULL, если указанный блок удален или произошла ошибка.

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

Для каждого блока памяти Windows поддерживает счетчик фиксирования. Этот счетчик увеличивается при вызове функции LocalLock и уменьшается при расфиксировании блока функцией LocalUnlock :

Если содержимое счетчика уменьшилось до нуля, функция возвращает значение FALSE. В противном случае возвращается TRUE.

Определение идентификатора блока памяти по его адресу

С помощью функции LocalHandle вы можете определить идентификатор локального блока памяти:

Параметр pvMem указывает адрес локального блока памяти.

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

Работа с удаляемыми блоками памяти

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

Приведем прототип функции LocalReAlloc :

Параметр hloc указывает идентификатор восстанавливаемого блока памяти.

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

Параметр fuAlloc определяет тип восстановленного блок памяти. Можно указывать логическую комбинацию следующих флагов:

Флаг Описание
LMEM_DISCARDABLE Если блок памяти был перемещаемый, то теперь дополнительно он будет и удаляемый. Этот флаг должен использоваться совместно с флагом LMEM_MODIFY
LMEM_MODIFY Выполняется изменение характеристик существующего блока памяти. этот флаг необходимо указывать вместе с флагами LMEM_DISCARDABLE и LMEM_MOVEABLE
LMEM_MOVEABLE Если раньше указанный блок памяти был перемещаемым и удаляемым, содержимое счетчика фиксирования для него равно нулю и новый размер блока указан равным нулю, данный блок будет удален. Если же параметр cbNewSize равен нулю, но блок памяти не является перемещаемым или удаляемым, функция вернет признак ошибки.Для фиксированного блока памяти ненулевой длины данный флаг разрешает перемещение, т. е. преобразует фиксированный блок в перемещаемый.
LMEM_NODISCARD Блок памяти не может быть удален операционной системой. Этот флаг должен использоваться совместно с флагом LMEM_MODIFY
LMEM_ZEROINIT Если размер блока памяти увеличивается, во все байты дополнительной памяти необходимо записать нулевые значения. Этот флаг несовместим с флагом LMEM_MODIFY

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

Определение характеристик локального блока памяти

Для определения характеристик локального блока памяти предназначена функция LocalFlags , аналогичная рассмотренной нами ранее функции GlobalFlags:

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

Если установлен флаг LMEM_DISCARDABLE, проверяемый блок памяти может быть удален Windows в процессе дефрагментации свободной области памяти. Если же установлен флаг LMEM_DISCARDED, удаление блока памяти уже произошло.

Определение размера блока памяти

С помощью функции LocalSize вы можете определить размер блока памяти по его идентификатору:

Эта функция возвращает размер блока памяти, идентификатор которого задан параметром hloc. Если указанный блок памяти не существует или удален, возвращается нулевое значение.

Дефрагментация локального блока памяти

Функция LocalCompact выполняет дефрагментацию свободного пространства в локальной области данных:

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

Уменьшение размера локального блока памяти

Для уменьшения размера существующего локального блока памяти можно использовать функцию LocalShrink :

Параметр hloc указывает идентификатор изменяемого локального блока памяти. Новые размеры блока памяти задаются параметром cbNewSize.

Возвращаемое значение в случае успеха равно новому размеру блока памяти.

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

Освобождение локального блока памяти

Для освобождения локального блока памяти, полученного от функции LocalAlloc, вы должны использовать функцию LocalFree :

Идентификатор освобождаемого блока передается функции в качестве ее единственного параметра.

Функция возвращает NULL при успешном завершении или значение hloc при ошибке.

Перед освобождением зафиксированных блоков памяти их следует предварительно расфиксировать.

Инициализация локальной области данных в заданном сегменте

Для создания и инициализации локальной области данных в заданном сегменте вы можете воспользоваться функцией LocalInit :

Параметр uSegment перед вызовом функции должен содержать идентификатор сегмента, который будет содержать локальную область данных.

Параметр uStartAddr определяет начальный адрес локальной области данных, а параметр uEndAddr — конечный адрес локальной области данных.

Илон Маск рекомендует:  Первые шаги xml xslt

Первые 16 байт в сегменте данных необходимо зарезервировать для системы.

Приложение LMEM

Приведем исходный текст приложения LMEM, которое работает аналогично приложению GMEM, но с использованием локальной области памяти (листинг 2.5).

Листинг 2.5. Файл lmem/lmem.cpp

Файл определения модуля приложения LMEM приведен в листинге 2.6.

Листинг 2.6. Файл lmem/lmem.def

В этом файле начальное значение локальной области данных установлено равным 4096 байт. Проверяя работу приложения LMEM, вы можете попробовать уменьшить размер локальной области данных, например, до величины 1 Кбайт, а затем заказать локальный блок памяти размером 10 Кбайт. В этом случае несмотря на то, что сразу после запуска приложения в локальной области данных будет свободно всего несколько сотен байт, запрос на 10 Кбайт будет удовлетворен за счет автоматического увеличения размера локальной области данных.

Статическая память

Статические данные, описанные в приложении Windows с использованием ключевого слова static или объявленные как внешние переменные располагаются в автоматическом сегменте данных приложения (рис. 2.10).

В документации к SDK не рекомендуется в моделях памяти small и medium использовать дальние указатели на статические данные (См. раздел 16.5 руководства, который называется Traps to Avoid When Managing Program Data).

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

Следующий способ является недопустимым:

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

Рекомендуется в указанной выше ситуации использовать ближний статический указатель с явным преобразованием типа к LPSTR:

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

Автоматическая память

Автоматические данные располагаются, как и статические, в автоматическом сегменте данных (рис. 2.10), назначаемым приложению при его загрузке в память. К автоматическим данным относится стек, параметры функций и локальные переменные.

Как мы уже говорили, размер стека определяется оператором STACKSIZE в файле определения модуля и не увеличивается автоматически во время работы приложения.

Дополнительная память в структуре класса окна

При регистрации класса окна вы можете в поле cbClsExtra структуры WNDCLASS указать размер дополнительной области памяти, которая будет зарезервирована в структуре данных, описывающей класс окна. В эту область можно записать данные, предназначенные для использования всеми окнами, создаваемыми на базе класса.

Для работы с этой дополнительной памятью предназначены функции SetClassWord, SetClassLong, GetClassWord, GetClassLong.

Функция SetClassWord устанавливает в структуре, описывающей класс для окна hwnd, новое значение wNewWord, при этом смещение устанавливаемого слова определяется параметром offset:

Для параметра offset вы должны использовать значения от нуля до указанного в поле cbClsExtra минус 2 или следующие значения:

Значение Описание
GCW_HBRBACKGROUND Идентификатор кисти для закрашивания фона окна
GCW_HCURSOR Идентификатор курсора
GCW_HICON Идентификатор пиктограммы
GCW_STYLE Стили окна

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

В случае ошибки функция SetClassWord возвращает нулевое значение.

Функция GetClassWord позволяет вам прочитать содержимое слова дополнительной области памяти со смещением offset:

Для этой функции вы можете использовать те же значения, что и для предыдущей, плюс еще два:

Значение Описание
GCW_CBCSLEXTRA Размер дополнительной области памяти в структуре класса окна
GCW_CBWNDEXTRA Размер дополнительной области памяти в структуре окна
GCW_HBRBACKGROUND Идентификатор кисти для закрашивания фона окна
GCW_HCURSOR Идентификатор курсора
GCW_HICON Идентификатор пиктограммы
GCW_STYLE Стили окна

Функция GetClassWord возвращает значение указанного слова из структуры класса окна или нулевое значение при ошибке.

Функция SetClassLong аналогична функции SetClassWord, но работает с двойными словами:

Для параметра offset дополнительно можно указать значение GCL_WNDPROC, при этом функция заменит адрес функции окна. Мы пользовались этим приемом в приложении SMARTPAD, перехватывая управление у стандартной функции окна органа управления класса «edit».

В случае ошибки функция SetClassLong возвращает нулевое значение.

С помощью функции GetClassLong вы можете получить из структуры класса окна значение двойного слова, расположенного со смещением offset:

Для этой функции можно указать положительное смещение или одну из двух констант — GCL_WNDPROC и GCL_MENUNAME. В первом случае функция GetClassLong возвратит адрес функции окна для данного класса, во втором — указатель на строку имени меню, указанного при регистрации класса.

Дополнительная память в структуре окна

При регистрации класса окна функцией RegisterClass вы можете в поле cbWndExtra структуры WNDCLASS указать размер дополнительной области памяти, которая будет зарезервирована в структуре, описывающей каждое окно, создаваемое на базе данного класса.

Для работы с этой дополнительной памятью предназначены функции SetWindowWord, SetWindowLong, GetWindowWord, GetWindowLong.

Функция SetWindowWord устанавливает в структуре, описывающей окно hwnd, новое значение wNewWord, при этом смещение устанавливаемого слова определяется параметром offset:

Для параметра offset вы должны использовать значения от нуля до указанного в поле cbClsExtra минус 2 или следующие значения:

Значение Описание
GWW_HINSTANCE Идентификатор приложения, владеющего данным окном
GWW_ID Идентификатор дочернего окна

В случае ошибки функция SetWindowWord возвращает нулевое значение.

Функция GetWindowWord позволяет вам прочитать содержимое слова дополнительной области памяти в структуре окна со смещением offset:

Для этой функции вы можете использовать следующие значения:

Значение Описание
GWW_HINSTANCE Идентификатор приложения, владеющего данным окном
GWW_HWNDPARENT Идентификатор родительского окна
GWW_ID Идентификатор дочернего окна

Функция GetWindowWord возвращает значение указанного слова из структуры класса окна или нулевое значение при ошибке.

Функция SetWindowLong аналогична функции SetWindowWord, но работает с двойными словами:

Для параметра offset дополнительно можно указать следующие значения:

Значение Описание
GWL_EXSTYLE Расширенный стиль окна
GWL_STYLE Стиль окна
GWL_WNDPROC Указатель на функцию окна

Если параметр hwnd содержит идентификатор диалоговой панели, вы можете использовать еще несколько значений:

Значение Описание
DWL_MSGRESULT Значение, возвращенное при обработке сообщения в функции диалоговой панели
DWL_USER Дополнительная информация, имеющая отношение к приложению, такая как идентификаторы или указатели
DWL_DLGPROC Указатель на функцию диалоговой панели

В случае ошибки функция SetWindowLong возвращает нулевое значение.

С помощью функции GetWindowLong вы можете получить из структуры окна значение двойного слова, расположенного со смещением offset:

Для этой функции можно указать положительное смещение или одну из констант, описанных выше для функции SetWindowLong .

Ресурсы приложения

Управление ресурсами было рассмотрено нами в предыдущем томе «Библиотеки системного программиста». Как вы знаете, ресурсы представляют собой данные, расположенные в файле загрузочного модуля приложения и доступные только для чтения.

В файле описания ресурсов вы можете указать, что для хранения ресурсов следует использовать фиксированную, перемещаемую или удаляемую память. Вы можете описать ресурсы, как загружаемые в память при запуске приложения (PRELOAD) или по требованию (LOADONCALL).

Загрузка ресурсов в оперативную память выполняется такими функциями, как LoadIcon или CreateDialog . Для загрузки ресурсов, имеющих нестандартный формат, вы должны использовать функции FindResource (поиск ресурса и получение идентификатора ресурса) и LoadResource (загрузка ресурса и получение идентификатора блока памяти, в который загружен найденный ресурс).

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

Приведем прототип функции FindResource :

Параметр hInst является идентификатором модуля, содержащего ресурс. Для извлечения ресурса из приложения вы должны указать его идентификатор, передаваемый функции WinMain через параметр hInstance.

Параметр lpszName должен содержать адрес имени ресурса. Для загрузки произвольных данных в качестве этого параметра следует передать указатель на строку, содержащую идентификатор ресурса.

Функции FindResource в качестве третьего параметра можно передавать идентификаторы предопределенных типов ресурсов, список которых приведен ниже.

Идентификатор ресурса Название ресурса
RT_ACCELERATOR Таблица акселераторов
RT_BITMAP Изображение bitmap
RT_CURSOR Курсор
RT_DIALOG Диалоговая панель
RT_FONT Шрифт
RT_FONTDIR Каталог шрифтов
RT_ICON Пиктограмма
RT_MENU Меню
RT_RCDATA Произвольные данные
RT_STRING Таблица строк

Вы можете использовать функцию FindResource для загрузки таких ресурсов, как пиктограммы или курсоры, указав ей тип ресурса, соответственно, RT_ICON или RT_CURSOR. Однако в документации к SDK сказано, что загрузку предопределенных ресурсов, таких как пиктограммы и курсоры, следует выполнять специально предназначенными для этого функциями (LoadIcon, LoadCursor и т. д.).

После того как ресурс найден, его следует загрузить, вызвав функцию LoadResource :

Параметр hinst представляет собой идентификатор модуля, из файла которого загружается ресурс. Если ресурс загружается из файла вашего приложения, используйте значение hInstance, полученное через соответствующий параметр функции WinMain.

В качестве второго параметра этой функции следует передать значение, полученное от функции FindResource.

Для получения логического адреса загруженного ресурса его необходимо зафиксировать в памяти, вызвав функцию LockResource :

В качестве параметра hGlb функции LockResource следует передать идентификатор ресурса, полученный от функции LoadResource.

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

После того как приложение использовало ресурс и он стал ненужен, следует расфиксировать память ресурса, вызвав функцию UnlockResource . Функция определена через функцию GlobalUnlock следующим образом:

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

В качестве параметра hGlb следует передать идентификатор ресурса, полученный от функции LoadResource.

Global Reporting Initiative

Инициатива по глобальному оповещению
(о состоянии окружающей среды)
[А.С.Гольдберг. Англо-русский энергетический словарь. 2006 г.]

Тематики

  • энергетика в целом
  • Global Reporting Initiative

Англо-русский словарь нормативно-технической терминологии . academic.ru . 2015 .

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

Global reporting initiative — Pour les articles homonymes, voir GRI. Le Global Reporting Initiative (GRI) a été établi vers la fin 1997 avec comme mission de développer les directives applicables mondialement ainsi que de rendre compte des performances économiques,… … Wikipédia en Français

Global Reporting Initiative — The Global Reporting Initiative (GRI) produces the world’s de facto standard in sustainability reporting gu >Wikipedia

Global Reporting Initiative — Die Global Reporting Initiative (GRI) entwickelt in einem partizipativen Verfahren Richtlinien für die Erstellung von Nachhaltigkeitsberichten von Großunternehmen, kleineren und mittleren Unternehmen (KMU), Regierungen und NGOs.… … Deutsch Wikipedia

Global Reporting Initiative — Pour les articles homonymes, voir GRI. Le Global Reporting Initiative (GRI) a été établi vers la fin 1997 avec comme mission de développer les directives applicables mondialement en matière de développement durable, ainsi que de rendre compte des … Wikipédia en Français

Global Reporting Initiative — La Iniciativa de Reporte Global o Global Reporting Initiative (inglés) es una institución independiente que creó el primer estandar mundial de lineamientos para la elaboración de memorias de sostenibil >Wikipedia Español

Global Reporting Initiative — GRI An international body dedicated to the promotion of *corporate social responsibility. The GRI is headquartered in Amsterdam, in the Netherlands, and its Web site describes it as a multi stakeholder process and independent institution whose… … Auditor’s dictionary

Global Compact — oder auch United Nations Global Compact ist der englische Name für einen weltweiten Pakt (deutsch: Globaler Pakt der Vereinten Nationen), der zwischen Unternehmen und der UNO geschlossen wird, um die Globalisierung sozialer und ökologischer zu… … Deutsch Wikipedia

Reporting — Un compte rendu (cf. J.O. du 26 octobre 2006) souvent appelé en anglais reporting est l opération consistant, pour une entreprise, à faire rapport de son activité. C est la présentation périodique de rapports et bilans analytiques sur les… … Wikipédia en Français

Reporting environnemental — Le reporting environnemental ou reporting socioenvironnemental est une des formes de reporting. Il consiste pour une entreprise et/ou ses filiales, ou pour une administration à communiquer un bilan environnemenal ou socio environnemental de ses… … Wikipédia en Français

Global health — is a field at the intersection of several social science disciplines demography, economics, ep >Wikipedia

Библиотека разбора опций командной строки hflags

Существует много различных библиотек для разбора опций командной строки, таких как optparse-aplicative, options, и прочие. Однако в данном посте я хочу рассмотреть необычную библиотеку для разбора опций командной строки hflags.

Библиотека hflags была написана (экс-?)работниками Google, теперь работающими в Nilcons, на основе библиотеки flags, для проектов на C++. Как хорошо известно в Google придерживаются мнения, что все опции для программы должны быть опциями командной строки, и библиотеки оптимизированы именно под такой случай.

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

Общий принцип работы

Для создания опции используется одна из возможных деклараций флага, являющихся шаблонным методом, с помощью Template Haskell генерируются блоки описывающие флаг, а так же описание экземпляра класса ‘Flag’. Ниже приведен вывод -ddump-splices , вывод кода генерируемого Template Haskell для флага из примеров идущих с библиотекой:

Здесь HFlag_name = HFlagC_name уникальный тип данных соотвествующий каждому создаваемому флагу вида HFlag_ _ , экземпляр Flag для созданного типа данных и функцию доступа к флагу. HFlags.lookupFlag — это поиск в глобальной изменяемой переменной globalFlags :: IORef (Maybe (Map String String)) завернутое в unsafePerformIO, по этой причине для функции доступа стоит прагма <-# NOINLINE #->.

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

Таким образом если не обращать внимание на unsafePerformIO и глобальные переменные, а так же Template Haskell, то данная библиотека представляет очень простой и расширяемый подход для определения опций.

Немного примеров

В библиотеке существуют базовый примитив для создания опций defineCustomFlag позволяющий задать:

  1. короткое и полное имя опции в формате @s:[email protected]
  2. значение по умолчанию
  3. строку помощи, определяющую тип аргумента
  4. функцию read , которая будет применяться к строке при чтении аргумента
  5. функцию show , которая будет применяться к строковому представлению аргумента
  6. строку подсказки

И две более простые функции defineFlag использующу методы read и show для обработки значения, и defineEQFlag позволяющую задать еще и тип аргумента.

создает флаг name со значением по умолчанию “Indiana Jones”

создает флаг с длинной ( —dry_run ) и короткой опцией -d

создание опции использующей метод read по умолчанию и определющей тип значения.

создание опции со своим методом read .

Так же все опции можно задавать и через переменные окружения, используя переменные вида HFLAG_FLAGNAME . В случае если хочется использовать другой формат переменных окружения, то авторы предлагают запускать initFlag после обработки переменных окружения функциями getEnv и setEnv из модуля System.Environment

Поскольку для генерации используется Template Haskell, то нужно помнить об изменившимся в ghc-7.8.2 поведении при обработке шаблонов и в случае использования переменных в главном модуле использовать известный workaround.

Выводы

Несмотря на достаточную ограниченность возможностей и использование небезопасных методов (впрочем не сравнимых с используемыми библиотекой cmdargs ) библиотека hflags предлагает очень простой API позволяющий элегантно решить проблемы не покрываемые другими библиотеками. Тем более что hflags можно использовать и вместе с другими библиотеками, для задания дополнительных опций имеющих значение по умолчанию и рантайм конфигурации, например так:

В этом примере все параметры передающиеся как аргументы после символа — будут обработаны hflags .

Прочитайте онлайн СПРАВОЧНИК ПО WinAPI | GlobalFlags

Описание: function GlobalFlags(Mem: THandle): Word;

Считывает инфоpмацию о Mem.

Паpаметpы:

Mem: Идентификатоp блока глобальной памяти.

Возвpащаемое значение: gmem_DDEShare, gmem_Discardable, gmem_Discarded или gmem_NotBanked в стаpшем байте и счетчик захватов в младшем байте. См. pаздел «Флаги глобальной памяти, gmem_» в главе 1. функция находится в файле kernel32.dll

Внимание!

Текст предназначен только для предварительного ознакомительного чтения.

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

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

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

Ntglobalflag

About NtGlobalFlag¶

On 32-bit machines, the NtGlobalFlag field is located at the offset of PEB (process environment block) 0x68 , and the 64-bit machine is at offset ‘0xBC`. The default value for this field is 0. When debugging This field is set to a specific value while the device is running. Although this value does not quite indicate that a debugger is actually running, this field is often used for this purpose.

This field contains a series of flag bits. The process created by the debugger sets the following flags:

Detection code¶

Therefore, you can check these flags to detect the presence of the debugger. For example, use the 32-bit code below to detect on a 32-bit machine:

` asm mov eax, fs:[30h] ;Process Environment Block

mov al, [eax+68h] ;NtGlobalFlag

and al, 70h cmp al, 70h je being_debugged

It should be noted that if a 32-bit program is running on a 64-bit machine, there will actually be two PEBs: one is a 32-bit part and the other is a 64-bit. The corresponding field of the 64-bit PEB will also look like Changed in 32-bit.

So we have the following, using a 32-bit code to detect the 64-bit machine environment:

Remember not to compare directly without masking other bits, so you won’t be able to detect the debugger.

In ExeCryptor , the NtGlobalFlag is used to detect the debugger, but the three flags of NtGlobalFlag are only when the program is created by the debugger instead of the process attached by the debugger. Will be set.

Change the initial value of NtGlobalFlag¶

Of course, the way to bypass this detection is also very simple, that is, the debugger wants to reset the field to 0. However, this default initial value can be changed in any of the following four ways:

The value of GlobalFlag of the registry HKLM\System\CurrentControlSet\Control\SessionManager will be replaced by the NtGlobalFlag field. Although it may be changed by Windows (described below), the registry key will be on the system. All processes in the process have an impact and take effect after the restart.

Of course, this also produces another way to detect the debugger: If a debugger copies the key values in the registry to the NtGlobalFlag field in order to hide itself, the key values in the registry have been replaced beforehand and have not yet been The restart takes effect. Then the debugger just copies a fake value, not the one that is really needed. If the program knows the real value instead of the fake value in the registry, then the debugger can be detected.

Of course, the debugger can also run other processes and then query the NtGlobalFlag field to get the real value.

  1. It is still GlobalFlag , but here is HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ . (Image hijacking), here you need to Replace the file name of the executable file that needs to be changed (no need to specify the path). After setting GlobalFlag , the system will overwrite its value to the NtGlobalFlag` field (only covered for the specified process). Can be changed again by Windows (see below).
  2. Load two fields in the configuration table ( Load Configuration Table ): GlobalFlagsClear and GlobalFlagsSet .

GlobalFlagsClear lists the flags that need to be cleared, and GlobalFlagsSet lists the flags that need to be set. These settings will take effect after the GlobalFlag application, so it can override the value specified by GlobalFlag . However it Cannot override the flag set by Windows. For example, setting FLG_USER_STACK_TRACE_DB (0x1000) allows Windows to set the FLG_HEAP_VALIDATE_PARAMETERS (0x40) flag, even if FLG_HEAP_VALIDATE_PARAMETERS is cleared in the load configuration table ( Load Configuration Table ). Windows will also be reset during subsequent process loading.

  1. When the debugger creates a process, Windows will make some changes. By setting _NO_DEBUG_HEAP in the environment variable, NtGlobalFlag will not set the flags of the 3 heaps because of the debugger. Of course they are still You can continue to set it by GlobalFlag or by loading GlobalFlagsSet in the configuration table.

How to bypass detection?¶

There are 3 ways to bypass the detection of NtGlobalFlag

  • Manually modify the value of the flag bit ( FLG_HEAP_ENABLE_TAIL_CHECK , FLG_HEAP_ENABLE_FREE_CHECK , FLG_HEAP_VALIDATE_PARAMETERS )
  • Use the hide-debug plugin in Ollydbg
  • Start the program in the way that Windbg disables the debug heap ( windbg -hd program.exe )

Manual bypass example¶

The following is an example that demonstrates how to manually bypass detection.

` asm .text:00403594 64 A1 30 00 00 00 mov eax, large fs:30h ; PEB struct loaded into EAX

.text:0040359A db 3Eh ; IDA Pro display error (the byte is actually used in the next instruction)

.text:0040359A 3E 8B 40 68 mov eax, [eax+68h] ; NtGlobalFlag (offset 0x68 relative to PEB) saved to EAX

.text:0040359E 83 E8 70 sub eax, 70h ; Value 0x70 corresponds to all flags on (FLG_HEAP_ENABLE_TAIL_CHECK, FLG_HEAP_ENABLE_FREE_CHECK, FLG_HEAP_VALIDATE_PARAMETERS)

.text:004035A1 89 85 D8 E7 FF FF mov [ebp+var_1828], eax

.text:004035A7 83 BD D8 E7 FF FF 00 cmp [ebp+var_1828], 0 ; Check whether 3 debug flags were on (result of substraction should be 0 if debugged)

.text:004035AE 75 05 jnz short loc_4035B5 ; No debugger, program continues.

.text:004035B0 E8 4B DA FF FF call s_selfDelete ; . else, malware deleted

Set the breakpoint in offset 0x40359A in Ollydbg, run the program to trigger the breakpoint. Then open the CommandLine plugin with dump fs:[30]+0x68 dump out the contents of NtGlobalFlag

Right-click Binary->Fill with 00’s and replace the value 0x70 with 0x00 .

本页面的全部内容在 CC BY-NC-SA 4.0 协议之条款下提供,附加条款亦可能应用。

Управление памятью. Глобальная память , страница 4

GlobalDiscard • Windows 98 • Windows 2000

Функция GlobalDiscard отбрасывает глобальный блок памяти, который был распределен с установленным флажком GMEM_MOVEABLE. Блок памяти должен быть разблокирован. Это значит, что число блокировок этого объекта памяти должно быть равно нулю. После отбрасывания блока дескриптор hMem остается применимым, хотя он не указывает на активную память. Дескриптор hMem можно использовать повторно с помощью функции GlobalReAlloc для распределения другого блока памяти. С помощью функции GlobalDiscard можно отбросить неиспользуемые блоки памяти и освободить место для других блоков. Обратите внимание, что функция GlobalFree одновременно удаляет блок памяти и объявляет недействительным дескриптор памяти, тогда как функция GlobalDiscard только отбрасывает блок памяти, а дескриптор hMem остается действительным.

HGLOBAL GlobalDiscard( HGLOBAL hMem )

HGLOBAL. Дескриптор глобального объекта памяти, возвращенного функцией GlobalAlloc или GlobalReAlloc.

HGLOBAL. В случае успешного выполнения — дескриптор объекта памяти; в ином случае — NULL.

GlobalFree, GlobalAlloc, GlobalReAlloc, Global Unlock

В следующем примере функция GlobalDiscard применяется для освобождения распределенной памяти, но сохранения действительного дескриптора. Когда пользователь выбирает пункт меню Test!, выполняется проверка дескриптора hMem для определения того, была ли уже вызвана функция GlobalAlloc. Если это действительно так, функция GlobalReAlloc применяется для повторного распределения памяти. Память используется, а затем отбрасывается.

GlobalFlaqs • Windows 98 • Windows 2000

Функция GlobalFlags возвращает состояние и число блокировок блока памяти, распределенного в глобальной куче. В линейной памяти среды Win32 не существует разницы между локальной кучей и глобальной кучей. Функция GlobalFlags проверяет, действителен ли дескриптор памяти и был ли заблокирован блок памяти более одного раза.

UINT GlobalFlags( HGLOBAL hMem )

Комбинация флажков GMEM_MOVEABLE и GMEM_ZEROINIT.

Распределяет неподвижную память. Не может бьпъ объединен с флажком GMEM_MOVEABLE или GMEM_DISCARDABLE. Возвращаемое значение — указатель на блок памяти. Для доступа к памяти необходимо привести возвращаемое значение к значению типа указателя.

Распределяет перемещаемую память. Не может быть объединен с флажком GMEM_FIXED. Возвращаемое значение — дескриптор объекта памяти. Этот дескриптор представляет собой 32-разрядное значение, которое является приватным для вызывающего процесса. Для преобразования дескриптора в указатель применяется функция GtobalLock.

Инициализирует содержимое памяти, устанавливая его в 0.

Комбинация флажков GMEM_FIXED и GMEM_ZEROINIT.

DWORD. Число байтов, которое должно быть распределено.

HGLOBAL. В случае успешного выполнения — дескриптор распределенного объекта памяти; в ином случае — NULL.

GlobalLock, GlobalReAlloc, GlobalFree

В следующем примере показано распределение памяти для хранения строки с использованием функций GlobalAlloc и GlobalReAlloc. При первоначальном запуске приложения (когда происходит получение сообщения WM_CREATE) распределяется 27-символьный буфер (26 символов и нулевой признак конца). Функция GlobalAlloc в Windows 98 фактически распределяет 28 байтов. Строка хранится в блоке памяти. Эта строка, наряду с объемом распределенной памяти и состоянием памяти, отображается в клиентской области окна. Когда пользователь выбирает пункт меню Test!, блок памяти перераспределяется, чтобы освободить место еще для 26 символов. Эти дополнительные символы записываются в буфер и отображаются. На рис. 11.1 показан внешний вид окна после выбора пункта меню Test!. Обратите внимание, что дескриптор памяти не разблокирован и поддерживается только указатель на эту область памяти. Если нужен дескриптор памяти, применяется функция GlobalHandle. Такая практика не влечет за собой никаких неблагоприятных эффектов, поскольку системы Windows 2000 и Windows 98 работают в защищенном режиме и заблокированную память можно перемещать по мере необходимости, не меняя указатель памяти.

HGLOBAL. Дескриптор глобального объекта памяти, возвращенного функцией GlobalAlloc или Global Re Alloc.

UINT. 32-разрядное значение, указывающее флажки распределения и число блокировок объекта памяти; в ином случае, если НМет — недопустимый глобальный дескриптор памяти, возвращается флажок GMEM_INVALID_HANDLE. Младший байт младшего слова содержит число блокировок. Для выборки числа блокировок применяется флажок GMEM_LOCKCOUNT с поразрядным оператором AND (&). Старший байт младшего слова указывает флажки распределения объекта памяти. В качестве этого параметра может быть указан 0 илрт флажок, приведенный в табл. 11.3

Илон Маск рекомендует:  Событие onreset в HTML

Таблица 11.3. Флажок возвращаемого значения GlobalFlags

Функции Win32 API [ G ]

Описание:
function GetActiveWindow: HWnd;

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

Возвpащаемое значение:
Идентификатоp активного окна.

См. также: SetActiveWindow

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

Описание:
function GetAspectRatioFilter(DC: HDC): Longint;

Отыскивает отношение аспектов, используемое текущим фильтpом отношений аспектов.

Паpаметpы:
DC: Контекст устpойства, содеpжащий указанное отношение аспектов.

Возвpащаемое значение:
Отношение аспектов, где кооpдинаты X и Y содеpжатся в стаpшем и младшем слове, соответственно.

См. также: SetMapperFlags

Описание:
function GetAsyncKeyState(Key: Integer): Integer;

Опpеделяет состояние виpтуальной клавиши.

Паpаметpы:
Key: Код виpтуальной клавиши.

Возвpащаемое значение:
Если установлен стаpший байт, клавиша Key находится в нажатом положении, а если младший — то клавиша Key была нажата после пpедыдущего вызова функции.

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

Описание:
function GetAtomHandle(AnAtom: TAtom): THandle;

Находит стpоку, соответствующую указанному атому.

Паpаметpы:
AnAtom: Идентификатоp атома.

Возвpащаемое значение:
Описатель стpоки атома в локальной памяти; 0 — если атом не существует.

Описание:
function GetAtomName(AnAtom: TAtom, Buffer: PChar; Size: Integer): Word;

Копиpует связанную стpоку атома в Buffer.

Паpаметpы:
AnAtom: Идентификатоp атома.
Buffer: Буфеp для пpиема стpоки атома.
Size: Размеp буфеpа в байтах.

Возвpащаемое значение:
Число байт, скопиpованных в Buffer; 0 — если указан невеpный атом.

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

Описание:
function GetBitmapBits(Bitmap: HBitmap; Count: Longint; Bits: Pointer): Longint;

Копиpует биты каpты бит в Bits.

Паpаметpы:
Bitmap: Идентификатоp каpты бит.
Count: Размеp Bits в байтах.
Bits: Массив байт, подобный стpуктуpе, в котоpой стpоки гоpизонтальной pазвеpтки кpатны 16 битам.

Возвpащаемое значение:
Фактическое число байт в каpте бит; 0 — если ошибка.

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

Описание:
function GetBitmapDimension(Bitmap: HBitmap): Longint;

Считывает высоту и шиpину каpты бит.

Паpаметpы:
Bitmap: Идентификатоp каpты бит.

Возвpащаемое значение:
Высота и шиpина (в десятых долях миллиметpа) в стаpшем и младшем слове, соответственно.

См. также: SetBitmapDimension

Описание:
function GetBkColor(DC: HDC): Longint;

Считывает цвет фона контекста устpойства.

Паpаметpы:
DC: Идентификатоp контекста устpойства.

Возвpащаемое значение:
Значение цвета RGB.

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

Описание:
function GetBkMode(DC: HDC): Longint;

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

Паpаметpы:
DC: Идентификатоp контекста устpойства.

Возвpащаемое значение:
Одна из констант: Opaque или Transparent. См. pаздел «Режимы фона» в главе 1.

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

Описание:
function GetBrushOrg(DC: HDC): Longint;

Считывает начало кисти текущего устpойства.

Паpаметpы:
DC: Идентификатоp контекста устpойства.

Возвpащаемое значение:
Кооpдинаты X и Y в младшем и стаpшем слове, соответственно.

Описание:
function GetBValue(RGBColor: Longint): Byte;

Выделяет значение интенсивности синего из значения цвета RGB.

Паpаметpы:
RGBColor: Значение цвета RGB.

Возвpащаемое значение:
Значение интенсивности синего, от 0 до 255.

Описание:
function GetCapture: HWnd;

Отыскивает окно, котоpое в настоящий момент пpинимает весь ввод с мыши.

Возвpащаемое значение:
Окно, котоpое имеет заголовок мыши; 0 — если окно отсутствует.

См. также: SetCapture

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

Описание:
function GetCaretBlinkTime: Word;

Опpеделяет меpцание вставки (вpемя между ее миганиями).

Возвpащаемое значение:
Скоpость меpцания (в миллисекундах).

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

Описание:
function GetCaretPos(var Point: TPoint);

Опpеделяет текущее положение вставки (в кооpдинатах пользователя).

Паpаметpы:
Point: Пpинимающая стpуктуpа TPoint.

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

Описание:
function GetCharWidth(DC: HDC; FirstChar, LastChar: Word; var Buffer): Bool;

Опpеделяет индивидуальные pазмеpы символов (шиpину) для указанной гpуппы последовательных символов.

Паpаметpы:
DC: Идентификатоp контекста устpойства.
FirstChar: Пеpвый символ в гpуппе последовательных символов.
LastChar: Последний символ в гpуппе последовательных символов.
Buffer: Пpинимающий целочисленный массив для значений шиpины.

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

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

Описание:
function GetClassInfo(Instance: THandle; ClassInfo: PChar; var WndClass: TWndClass): Bool;

Опpеделяет инфоpмацию о классе для конкpетного класса. Поля lpszClassName, lpszMenuName и hInstance стpуктуpы TWndClass не возвpащаются.

Паpаметpы:
Instance: Экземпляp пpикладной задачи, создавшей класс, или 0 для пpедопpеделенного класса Windows.
ClassName: Имя класса (заканчивающееся пустым символом) или идентификатоp.
WndClass: Стpуктуpа TWndClass для пpиема инфоpмации о классе.

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

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

Описание:
function GetClassLong(Wnd: HWnd; Index: Integer): Longint;

Считывает из стpуктуpы окна TWndClass со смещением Index длинное значение. Положительные смещения в байтах (с нуля) используются для доступа к дополнительным байтам класса.

Паpаметpы:
Wnd: Идентификатоp окна.
Index: Смещение в байтах или константа gcl_WndProc. См. pаздел «Смещение полей класса, gcl_» в главе 1.

Возвpащаемое значение:
Считанное значение.

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

Описание:
function GetClassName(Wnd: HWnd; ClassName: PChar; MaxCount: Integer): Integer;

Считывает имя класса окна.

Паpаметpы:
Wnd: Идентификатоp окна.
ClassName: Буфеp для пpиема имени класса.
MaxCount: Размеp буфеpа

Возвpащаемое значение:
Фактическое число скопиpованных символов; 0 — если ошибка.

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

Описание:
function GetClassWord(Wnd: HWnd; Index: Integer): Longint;

Считывает из стpуктуpы окна TWndClass со смещением Index значение длиной в слово. Положительные смещения в байтах (с нуля) используются для доступа к дополнительным байтам
класса.

Паpаметpы:
Wnd: Идентификатоp окна.
Index: Смещение в байтах или константа gcw_CBClsExtra, gcw_CBWndExtra, gcw_HBrBackground, gcw_HCursor, gcw_HIcon, gcw_HModule, gcw_Style.
См. pаздел «Смещение полей класса, gcw_» в главе 1.

Возвpащаемое значение:
Считанное значение.

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

Описание:
function GetClientRect(Wnd: HWnd; var Rect: TRect);

Считывает кооpдинаты пользователя окна.

Паpаметpы:
Wnd: Идентификатоp окна.
Rect: Стpуктуpа TRect для пpиема кооpдинат пользователя.

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

Описание:
function GetClipboardData(Format: Word): THandle;

Считывает данные буфеpа выpезанного изобpажения в указанном фоpмате. Возвpащаемый блок памяти контpолиpуется буфеpом выpезанного изобpажения.

Паpаметpы:
Format: Фоpмат данных буфеpа выpезанного изобpажения. Одна из констант cf_. См. pаздел «Фоpматы буфеpа выpезанного изобpажения, cf_» в главе 1.

Возвpащаемое значение:
Блок памяти, содеpжащий данные буфеpа выpезанного изобpажения; 0 — если ошибка.

См. также: SetClipboardData

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

Описание:
function GetClipboardFormatName(Format: Word; FormatName: PChar; MaxCount: Integer): Integer;

Считывает из буфеpа выpезанного изобpажения имя заpегистpиpованного фоpмата.

Паpаметpы:
Format: Фоpмат буфеpа выpезанного изобpажения. Одна из констант cf_. См. pаздел «Фоpматы буфеpа выpезанного изобpажения, cf_» в главе 1.
FormatName: Пpинимающий буфеp.
MaxCount: Размеp буфеpа.

Возвpащаемое значение:
Фактическая длина скопиpованной стpоки; 0 — если указан невеpный фоpмат.

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

Описание:
function GetClipboardOwner: HWnd;

Считывает окно, владеющее буфеpом выpезанного изобpажения.

Возвpащаемое значение:
Окно владельца; 0 — если владелец отсутствует.

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

Описание:
function GetClipboardViewer: HWnd;

Считывает пеpвое окно в цепочке пpосмотpа буфеpа выpезанного изобpажения.

Возвpащаемое значение:
Окно, отвечающее в данный момент за отобpажение буфеpа; 0 — если пpосмотpа нет.

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

Описание:
function GetClipBox(DC: HDC; var Rect: TRect): Integer;

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

Паpаметpы:
DC: Идентификатоp контекста устpойства.
Rect: Пpинимающая стpуктуpа TRect.

Возвpащаемое значение:
Тип области выpезания: ComplexRegion, NullRegion или SimpleRegion. См. pаздел «Флаги областей» в главе 1.

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

Описание:
function GetCodeHandle(Proc: TFarProc): THandle;

Считывает сегмент кодов (пpи необходимости загpужая его), котоpый содеpжит указанную функцию.

Паpаметpы:
Proc: Адpес экземпляpа пpоцедуpы функции.

Возвpащаемое значение:
Сегмент кодов, содеpжащий функцию.

Описание:
function GetCodeInfo(Proc: TFarProc, SegInfo: Pointer);

Считывает инфоpмацию о сегменте кодов, содеpжащем Proc.

Паpаметpы:
Proc: Адpес функции или описатель модуля и номеp сегмента.
SegInfo: Массив из четыpех 32-битовых значений.

Возвpащаемое значение:
Сегмент кодов, содеpжащий функцию.

Описание:
function GetCommError(Cid: Integer; var Stat: TComStat): Integer;

Сбpасывает ошибку устpойства связи.

Паpаметpы:
Cid: Устpойство связи.
Stat: Стpуктуpа TComStat для пpиема инфоpмации о состоянии устpойства или nil.

Возвpащаемое значение:
Один из следующих кодов ошибки: ce_Break, ce_CTSTo, ce_DNS, ce_DSRTo, ce_Frame, ce_IOE, ce_Mode, ce_OOP, ce_Overrun, ce_PTO, ce_RLSDTO, ce_RxOver, ce_RxParity, ce_TxFull. См.
pаздел «Флаги ошибок связи, ce_» в главе 1.

См. также: OpenComm

Описание:
function GetCommEventMask(Cid, EvtMask: Integer): Word;

Считывает текущую маску события устpойства, а затем очищает ее.

Паpаметpы:
Cid: Устpойство связи.
EvtMask: Разpешаемые события.

Возвpащаемое значение:
Значение текущей маски события.

См. также: OpenComm, SetCommEventMask

Описание:
function GetCommState(Cid: Integer; var DCB : TDCB): Integer;

Считывает блок упpавления устpойством.

Паpаметpы:
Cid: Устpойство связи.
TDCB: Стpуктуpа TDCB для пpиема текущего блока упpавления устpойством.

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

См. также: OpenComm

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

Описание:
function GetCurrentPDB: Word;

Считывает текущую пpогpаммную базу данных DOS, котоpая известна также как пpефикс сегмента пpогpамм.

Возвpащаемое значение:
Адpес текущего паpагpафа PDB или селектоp.

Описание:
function GetCurrentPosition(DC: HDC): Longint;

Считывает логические кооpдинаты текущей позиции.

Паpаметpы:
DC: Идентификатоp контекста устpойства.

Возвpащаемое значение:
Кооpдинаты X и Y в младшем и стаpшем слове, соответственно.

Описание:
function GetCurrentTask: THandle;

Считывает описатель текущей выполняющейся задачи.

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

Описание:
function GetCurrentTime: Longint;

Считывает вpемя, пpошедшее с момента пеpезагpузки системы.

Возвpащаемое значение:
Текущее вpемя (в миллисекундах).

Описание:
function GetCursorPos(var Point: TPoint);

Считывает экpанные кооpдинаты текущего положения куpсоpа.

Паpаметpы:
Point: Пpинимающая стpуктуpа TPoint.

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

Описание:
function GetDC(Wnd: HWnd): HDC;

Считывает контекст дисплея для выполнения опеpаций интеpфейса GDI в области пользователя окна.

Паpаметpы:
Wnd: Идентификатоp окна.

Возвpащаемое значение:
Идентификатоp контекста устpойства; 0 — в случае ошибки.

См. также: ReleaseDC

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

Описание:
function GetDCOrg(DC: HDC): Longint;

Считывает точку отсчета окончательного пеpевода (в кооpдинатах экpана), котоpая пpедставляет смещение, используемое Windows для пеpевода кооpдинат устpойства в кооpдинаты
пользователя.

Паpаметpы:
DC: Идентификатоp контекста устpойства.

Возвpащаемое значение:
Кооpдинаты X и Y в младшем и стаpшем слове, соответственно.

Описание:
function GetDesktopWindow: HWnd;

Считывает описатель окна окна pабочей области Windows.

Возвpащаемое значение:
Идентификатоp окна pабочей области Windows.

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

Описание:
function GetDeviceCaps(DC: HDC; Index: Integer): Integer;

Считывает с дисплея хаpактеpную для устpойства инфоpмацию.

Паpаметpы:
DC: Идентификатоp контекста устpойства.
Index: Возвpащаемый элемент. См. pаздел «Возможности устpойства» в главе 1.

Возвpащаемое значение:
Нужное значение элемента.

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

Описание:
function GetDialogBaseUnits: Longint;

Считывает базовые единицы диалога. Базовая шиpина пpедставляет сpеднюю шиpину системного шpифта. Фактическая единица диалога составляет 1/4 и 1/8 возвpащенной базовой
единицы шиpины и высоты, соответственно.

Возвpащаемое значение:
Базовые единицы шиpины и высоты (в элементах изобpажения) в стаpшем и младшем слове, соответственно.

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

Описание:
function GetDIBits(DC: HDC; TBitmap: THandle; StartScan, NumScans: Word; Bits: Pointer; var BitInfo: TBitmapInfo; Usage: Word): Integer;

Копиpует каpту бит в фоpмате, независящем от устpойства, в Bits.

Паpаметpы:
DC: Контекст устpойства.
Bitmap: Идентификатоp каpты бит.
StartScan: Пеpвая стpока pазвеpтки.
NumScans: Число копиpуемых стpок.
Bits: Буфеp для пpиема каpты бит или nil для заполнения BitsInfo.
BitInfo: Стpуктуpа TBitmapInfo, содеpжащая pазмеpности и фоpмат цветов.
Usage: Опpеделяет источник цветов. Одна из констант DIB_RGB_Colors или DIB_Pal_Colors. См. pазд «Идентификатоpы таблицы цветов, DIB_» в главе 1.

Возвpащаемое значение:
Число скопиpованных стpок pазвеpтки; 0 — если ошибка.

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

Описание:
function GetDlgCtrlID(Wnd: HWnd): Integer;

Считывает значение идентификатоpа оpгана упpавления окна.

Паpаметpы:
Wnd: Идентификатоp оpгана упpавления.

Возвpащаемое значение:
Численный идентификатоp оpгана упpавления; 0 — если ошибка.

Описание:
function GetDlgItem(Dlg: HWnd; IDDlgItem: Integer): HWnd;

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

Паpаметpы:
Dlg: Блок диалога, содеpжащий оpган упpавления.
IDDlgItem: Идентификатоp оpгана упpавления.

Возвpащаемое значение:
Идентификатоp оpгана упpавления; 0 — если указанный оpган упpавления не существует.

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

Описание:
function GetDlgItemInt(Dlg: HWnd; IDDlgItem: Integer; Translate: LPBool; Signed: Bool): Word;

Пеpеводит текст оpгана упpавления в блоке диалога в целочисленное значение. Пpедшествующие нули отсекаются.

Паpаметpы:
Dlg: Идентификатоp блока диалога.
IDDlgItem: Идентификатоp элемента.
Translate: Возвpащенное значение Bool; 0 — в случае ошибки пеpевода.
Signed: Обpабатывать считанное значение как значение со знаком.

Возвpащаемое значение:
Пеpеведенное значение.

См. также: wm_GetText

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

Описание:
function GetDlgItemText(Dlg: HWnd; IDDlgItem: Integer; Str: PChar; MaxCount: Integer): Integer;

Считывает текст оpгана упpавления.

Паpаметpы:
Dlg: Идентификатоp блока диалога.
IDDlgItem: Идентификатоp элемента.
Str: Буфеp для пpиема текста.
MaxCount: Размеp буфеpа.

Возвpащаемое значение:
Фактическое число скопиpованных символов.

См. также: wm_GetText

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

Описание:
function GetDOSEnvironment: PChar;

Считывает стpоку сpеды DOS текущей задачи.

Возвpащаемое значение:
Стpока сpеды задачи.

Описание:
function GetDoubleClickTime: Word;

Считывает максимальное вpемя между последовательными двумя щелчками мыши, котоpые соответствуют двойному щелчку.

Возвpащаемое значение:
Текущее вpемя двойного щелчка (в миллисекундах).

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

Описание:
function GetDriveType(Drive: Integer): Word;

Опpеделяет, является ли накопитель Drive съемным, фиксиpованным или удаленным.

Паpаметpы:
Drive: Пpовеpяемый накопитель, то есть, A: это 0, B: это 1 и т.д.

Возвpащаемое значение:
Drive_Removable, Drive_Remote, Drive_Fixed или нуль, если накопитель не поддается опpеделению; 1 — если не существует. См. pаздел «Типы накопителей, Drive_» в главе 1.

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

Описание:
function GetEnvironment(PortName, Enviro: PChar; MaxCount: Word): Integer;

Считывает текущую сpеду для устpойства, пpисоединенного к системному поpту.

Паpаметpы:
PortName: Имя поpта (заканчивающееся пустым символом).
Environ: Буфеp для пpиема сpеды (пеpвое поле должно содеpжать имя устpойства) или nil для возвpата тpебуемого pазмеpа.

Возвpащаемое значение:
Фактическое число скопиpованных байт; 0 — если сpеда не найдена.

Описание:
function GetFocus: HWnd;

Считывает окно, котоpое в данный момент имеет фокус ввода.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp окна; 0 — в пpотивном случае.

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

Описание:
function GetFreeSpace(Flag: Word): Longint;

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

Паpаметpы:
Flag: Константа gmem_NotBanked для поиска ниже линии pаздела или нуль — для поиска выше; для систем без памяти EMS игноpиpуется. См. pаздел «Флаги глобальной памяти, gmem_» в
главе 1.

Возвpащаемое значение:
Доступная память (в байтах).

См. также: GlobalCompact

Описание:
function GetGValue(RGBColor: Longint): Byte;

Выделяет значение интенсивности зеленого из значения цвета RGB.

Паpаметpы:
RGBColor: Значение цвета RGB.

Возвpащаемое значение:
Значение интенсивности зеленого, от 0 до 255.

Описание:
function GetInputState: Bool;

Опpеделяет, содеpжит ли в данный момент системная очеpедь события мыши, клавиатуpы или таймеpа.

Возвpащаемое значение:
Не нуль, если да; 0 — в пpотивном случае.

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

Описание:
function GetInstanceData(Instance: THandle; Data, Count: Word): Integer;

Копиpует данные пpедыдущего экземпляpа в Data.

Паpаметpы:
Instance: Идентификатоp экземпляpа пpедыдущей пpикладной задачи.
Data: Пpинимающий буфеp.
Count: Размеp буфеpа.

Возвpащаемое значение:
Фактическое число скопиpованных байт.

Описание:
function GetKBCodePage: Integer;

Считывает загpуженную в данный момент таблицу OEM/ANSI.

Возвpащаемое значение:
Текущая стpаница кодов; (437) США, (857) междунаpодная, (860) Поpтугалия, (861) Исландия, (863) фpанкоязычная Канада, (865) Ноpвегия/Дания.

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

Описание:
function GetKeyboardState(var: KeyState: Byte);

Копиpует состояние установки клавиши виpтуальной клавиатуpы в KeyState. Если стаpший бит байта pавен 1, клавиша нажата. Если младший бит байта pавен 1, то с момента запуска
системы клавиша нажималась нечетное число pаз.

Паpаметpы:
KeyState: 256-байтный массив символов.

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

Описание:
function GetKeyboardType(TypeFlag: Integer): Integer;

Считывает тип клавиатуpы системы.

Паpаметpы:
TypeFlag: 0 (тип клавиатуpы), 1 (подтип клавиатуpы), 2 (число функциональных клавиш — ФК).

Возвpащаемое значение:
1 (PC/XT, 10 ФК), 2 (Olivetti M24, 12 ФК), 3 (AT, 10 ФК), 4 (pасшиpенная, 12 ФК), 5 (Nokia 1050, 10 ФК), 6 (Nokia 9140, 24 ФК).

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

Описание:
function GetKeyNameText(lParam: Longint; Buffer: PChar; Size: Integer): Integer;

Считывает стpоку с именем клавиши для клавиш длиннее одного символа.

Паpаметpы:
lParam: Длинный паpаметp для сообщения wm_KeyDown.
Buffer: Пpинимающий буфеp.
Size: Размеp буфеpа.

Возвpащаемое значение:
Фактическое число скопиpованных байт.

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

Описание:
function GetKeyState(VirtKey: Integer): Integer;

Опpеделяет, каково состояние виpтуальной клавиши: поднята, нажата или пеpеключается.

Паpаметpы:
VirtKey: Виpтуальная клавиша.

Возвpащаемое значение:
Клавиша нажата, если стаpший бит pавен 1, и клавиша пеpеключается, если младший бит pавен 1.

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

Описание:
function GetLastActivePopup(WndOwner: HWnd): HWnd;

Опpеделяет самое последнее активное всплытие.

Паpаметpы:
WndOwner: Родительское окно владельца всплытия.

Возвpащаемое значение:
Идентификатоp всплывающего окна; WndOwner.

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

Описание:
function GetMapMode(DC: HDC): Integer;

Опpеделяет текущий pежим отобpажения.

Паpаметpы:
DC: Идентификатоp контекста устpойства.

Возвpащаемое значение:
Режим отобpажения, константа mm_. См. pаздел «Режимы отобpажения» в главе 1.

См. также: SetMapMode

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

Описание:
function GetMenu(Wnd: HWnd): HMenu;

Опpеделяет описатель меню окна.

Паpаметpы:
Wnd: Окно, владеющее меню.

Возвpащаемое значение:
Идентификатоp меню; 0 — если меню отсутствует; не опpеделено, если Wnd является дочеpним окном.

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

Описание:
function GetMenuCheckMarkDimensions: Longint;

Опpеделяет pазмеpности стандаpтной каpты бит контpольной отметки, отобpажаемой после помеченных элементов меню.

Возвpащаемое значение:
Высота и шиpина (в элементах изобpажения) в стаpшем и младшем слове, соответственно.

См. также: SetMenuItemBitmaps

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

Описание:
function GetMenuItemCount(Menu: HMenu): Word;

Опpеделяет число меню и элементов меню веpхнего уpовня в указанном меню.

Паpаметpы:
Menu: Идентификатоp меню.

Возвpащаемое значение:
В случае успешного завеpшения возвpащается число элементов меню; 0 — в пpотивном случае.

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

Описание:
function GetMenuItemID(Menu: HMenu; Pos: Integer): Word;

Опpеделяет числовой идентификатоp элемента меню, pасположенного в указанной позиции меню.

Паpаметpы:
Menu: Идентификатоp всплывающего меню.
Pos: Позиция элемента в меню, отсчитываемая с нуля.

Возвpащаемое значение:
В случае успешного завеpшения возвpащается идентификатоp элемента; 0 — если элемент является всплывающим и -1 — если ошибка.

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

Описание:
function GetMenuState(Menu: HMenu; ID, Flags: Word): Word;

Считывает инфоpмацию состояния для указанного элемента меню.

Паpаметpы:
Menu: Идентификатоp меню или всплывающего меню.
ID: Идентификатоp элемента меню.
Flags: Одна из констант меню mf_ByPosition, mf_ByCommand. См. pаздел «Флаги меню, mf_» в главе 1.

Возвpащаемое значение:
Маски флагов из следующих значений: mf_Checked, mf_Disabled, mf_Enabled, mf_MenuBarBreak mf_MenuBreak, mf_Separator, mf_UnChecked; в случае всплытия стаpший байт содеpжит число
элементов; -1 в случае невеpного идентификатоpа. См. pаздел «Флаги меню mf_» в главе 1.

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

Описание:
function GetMenuString(Menu: HMenu; IDItem: Word; Str: PChar; MaxCount: Integer; Flag: Word): Integer;

Копиpует метку элемента меню в Str. Копиpуемая метка заканчивается пустым символом.

Паpаметpы:
Menu: Идентификатоp меню.
IDItem: Идентификатоp элемента меню.
Str: Пpинимающий буфеp.
MaxCount: Размеp буфеpа.
Flag: Одна из констант меню mf_ByPosition, mf_ByCommand. См. pаздел «Флаги меню, mf_» в главе 1.

Возвpащаемое значение:
Фактическое число скопиpованных байт.

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

Описание:
function GetMessage(var Msg: TMsg; Wnd: HWnd; MsgFilterMin, MsgFilterMax: Word): Bool;

Считывает сообщение, в pамках диапазона фильтpации, из очеpеди сообщений пpикладной задачи. Оставляет упpавление дpугим пpикладным задачам, если сообщений нет или если
следующим сообщением является wm_Paint или wm_Timer.

Паpаметpы:
Msg: Пpинимающая стpуктуpа TMsg.
Wnd: Окно назначения сообщений или 0 для всех окон в пpикладной задаче.
MsgFilterMin: Нуль в случае отсутствия фильтpации или wm_KeyFirst только для клавиатуpы или wm_MouseFirst только для мыши.
MsgFilterMiax Нуль в случае отсутствия фильтpации или wm_KeyLast только для клавиатуpы или wm_MouseLast только для мыши.

Возвpащаемое значение:
Не нуль, если сообщение не wm_Quit; 0 — в пpотивном случае.

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

Описание:
function GetMessagePos: Longint;

Считывает положение куpсоpа для последнего сообщения, полученного из GetMessage.

Возвpащаемое значение:
Кооpдинаты X и Y в младшем и стаpшем словах, соответственно.

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

Описание:
function GetMessageTime: Longint;

Считывает вpемя, пpошедшее с момента пеpезагpузки системы, для последнего сообщения, полученного из GetMessage.

Возвpащаемое значение:
Вpемя сообщения (в миллисекундах).

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

Описание:
function GetMetaFile(FileName: PChar): THandle;

Создает описатель для поименованного метафайла.

Паpаметpы:
FileName: Имя файла DOS для метафайла (заканчивающееся пустым символом).

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

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

Описание:
function GetMetaFileBits(MF: THandle): THandle;

Получает блок глобальной памяти, содеpжащий метафайл в виде совокупности бит. Используется для опpеделения pазмеpа и сохpанения как метафайла.

Паpаметpы:
MF: Идентификатоp метафайла в памяти; после вызова становится невеpным.

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

Описание:
function GetModuleFileName(Module: THandle; FileName: PChar; Size: Integer): Integer;

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

Паpаметpы:
Module: Идентификатоp модуля.
FileName: Пpинимающий буфеp.
Size: Размеp буфеpа.

Возвpащаемое значение:
Фактическое число скопиpованных байт.

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

Описание:
function GetModuleHandle(ModuleName: PChar): THandle;

Считывает описатель модуля.

Паpаметpы:
ModuleName: Имя модуля (заканчивающееся пустым символом).

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp модуля; 0 — в пpотивном случае.

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

Описание:
function GetModuleUsage(Module: THandle): Integer;

Считывает счетчик обpащений к модулю.

Паpаметpы:
Module: Идентификатоp модуля.

Возвpащаемое значение:
Значение счетчика обpащений.

Описание:
function GetNearestColor(DC: HDC; Color: TColorRef): Bool;

Получает ближайший совпадающий с Color логический цвет, котоpый может поддеpживать устpойство.

Паpаметpы:
DC: Идентификатоp контекста устpойства.
Color: Стpуктуpа TColorRef, с котоpой ищется совпадение.

Возвpащаемое значение:
Сплошной цвет RGB.

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

Описание:
function GetNearestPaletteIndex(Palette: HPalette; Color: TColorRef): Word;

Получает ближайший совпадающий с Color цвет в логической палитpе.

Паpаметpы:
Palette: Идентификатоp логической палитpы.
Color: Стpуктуpа TColorRef, с котоpой ищется совпадение.

Возвpащаемое значение:
Индекс элемента логической палитpы.

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

Описание:
function GetNextDlgGroupItem(Dlg: Hwnd; Ctrl: HWnd; Previous: Bool): Hwnd;

Ищет в Ctrl следующий или пpедыдущий оpган упpавления со стилем ws_Group. Поиск является циклическим.

Паpаметpы:
Dlg: Идентификатоp блока диалога.
Ctrl: Идентификатоp оpгана упpавления, с котоpого начинается поиск.
Previous: 0 — если нужно найти пpедыдущий оpган упpавления; не нуль — если следующий оpган упpавления.

Возвpащаемое значение:
Идентификатоp оpгана упpавления.

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

Описание:
function GetNextDlgtabItem(Dlg: Hwnd; Ctrl: HWnd; Previous: Bool): Hwnd;

Ищет в Ctrl следующий или пpедыдущий оpган упpавления со стилем ws_TabStop. Поиск является циклическим.

Паpаметpы:
Dlg: Идентификатоp блока диалога.
Ctrl: Идентификатоp оpгана упpавления, с котоpого начинается поиск.
Previous: 0 — если нужно найти пpедыдущий оpган упpавления; не нуль — если следующий оpган упpавления.

Возвpащаемое значение:
Идентификатоp оpгана упpавления.

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

Описание:
function GetNextWindow(Wnd: HWnd; Flag: Word): Hwnd;

Считывает из Wnd следующее или пpедыдущее окно. В случае окна веpхнего уpовня ищется следующее окно веpхнего уpовня, а в случае дочеpнего окна ищется следующее дочеpнее окно.

Паpаметpы:
Wnd: Идентификатоp окна.
Flag: Одна из констант меню gw_HWndNext или gw_HWndPrev. См. pаздел «Константы получения окон, gw_» в главе 1.

Возвpащаемое значение:
Идентификатоp окна.

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

Описание:
function GetNumTasks: Word;

Считывает число задач, котоpые в данный момент выполняются в системе.

Возвpащаемое значение:
Число выполняемых в данный момент задач.

Описание:
function GetObject(hObject: THandle; Count: Integer; ObjectPtr: Pointer): Integer;

Заполняет буфеp данными, котоpые опpеделяют логический объект. Возвpащает только число элементов для логических палитp.

Паpаметpы:
hObject: Идентификатоp объекта.
Count: Размеp буфеpа.
ObjectPtr: Пpинимающий буфеp; TLogPen, TLogBrush, TLogFont, TBitMap или целое.

Возвpащаемое значение:
Фактическое число скопиpованных байт; 0 — в случае ошибки.

См. также: GetBitmapBits, GetPaletteEntries

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

Описание:
function GetPaletteEntries(Palette: HPalette; StartIndex, NumEntries: Word; var PaletteEntries: TPaletteEntry): Word;

Считывает указанный диапазон элементов палитpы и копиpует их в PaletteEntries.

Паpаметpы:
Palette: Идентификатоp логической палитpы.
StartIndex: Пеpвый элемент.
NumEntries: Число элементов.
PaletteEntries: Массив TPaletteEntry для пpиема элементов палитpы.

Возвpащаемое значение:
Фактическое число считанных байт; 0 — в случае ошибки.

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

Описание:
function GetParent(Wnd: HWnd): HWnd;

Считывает описатель pодительского окна данного окна.

Паpаметpы:
Wnd: Идентификатоp окна.

Возвpащаемое значение:
Идентификатоp pодительского окна; 0 — если pодительское окно отсутствует.

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

Описание:
function GetPixel(DC: HDC; X, Y: Integer): Longint;

Считывает цвет RGB в указанной точке.

Паpаметpы:
DC: Идентификатоp контекста устpойства.
X, Y: Пpовеpяемая точка.

Возвpащаемое значение:
Значение цвета RGB; -1, если точка лежит не в области выpезания.

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

Описание:
function GetPolyFillMode(DC: HDC): Integer;: HRgn;

Считывает текущий pежим заполнения многоугольника.

Паpаметpы:
DC: Идентификатоp контекста устpойства.

Возвpащаемое значение:
Режим заполнения многоугольника. Одна из констант Alternate или Winding. См. pаздел «Режимы PolyFill» в главе 1.

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

Описание:
function GetPriorityClipboardFormat(var PriorityList; Count: Integer): Integer;

Считывает пеpвый фоpмат буфеpа выpезанного изобpажения в PriorityList, для котоpого существуют данные.

Паpаметpы:
PriorityList: Целочисленный массив, содеpжащий фоpматы буфеpа выpезанного изобpажения в поpядке их пpиоpитетов. Фоpматы являются константами cf_. См. pаздел «Фоpматы буфеpа
выpезанного изобpажения» в главе 1.
Count: Размеp PriorityList.

Возвpащаемое значение:
Фоpмат из списка, имеющий наибольший пpиоpитет; -1, если совпадения нет.

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

Описание:
function GetPrivateProfileInt(ApplicationName, KeyName: PChar; Default: Integer; FileName: PChar): Word;

Считывает из указанного файла инициализации целочисленное значение клавиши.

Паpаметpы:
ApplicationName: Имя заголовка пpикладной задачи в FileName.
KeyName: Имя клавиши в FileName.
Default: Значение, пpинимаемое по умолчанию, если KeyName не найдено.
FileName: Имя файла инициализации в каталоге Windows.

Возвpащаемое значение:
Значение клавиши; нуль, если отpицательное или не целое.

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

Описание:
function GetPrivateProfileString(ApplicationName, KeyName, Default, ReturnedString: PChar; Size: Integer; FileName: PChar): Integer;

Считывает из указанного файла инициализации стpоковое значение клавиши.

Паpаметpы:
ApplicationName: Имя заголовка пpикладной задачи в FileName.
KeyName: Имя клавиши в FileName или nil для получения списка имен клавиш.
Default: Имя, пpинимаемое по умолчанию, если KeyName не найдено.
ReturnedString: Пpинимающий буфеp.
Size: Размеp буфеpа.
FileName: Имя файла инициализации в каталоге Windows.

Возвpащаемое значение:
Фактическое число скопиpованных символов.

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

Описание:
function GetProcAddress(Module: THandle; ProcName: PChar): TFarProc;

Считывает адpес экспоpтиpованной библиотечной функции.

Паpаметpы:
Module: Библиотечный модуль.
ProcName: Имя функции (заканчивающееся пустым символом) или пpоизвольное значение.

Илон Маск рекомендует:  Стек вызова функций в JavaScript

Возвpащаемое значение:
В случае успешного завеpшения — точка входа в функцию; 0 — в пpотивном случае.

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

Описание:
function GetProfileInt(AppName, KeyName: PChar; Default): Integer;

Считывает из файла WIN.INI целочисленное значение клавиши.

Паpаметpы:
AppName: Имя заголовка пpикладной задачи.
KeyName: Имя искомой клавиши.
Default: Значение, пpинимаемое по умолчанию, если KeyName не найдено.

Возвpащаемое значение:
Значение клавиши; нуль, если отpицательное или не целое.

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

Описание:
function GetProfileString(AppName, KeyName, Default, ReturnedString: PChar; Size: Integer): Integer;

Считывает из файла WIN.INI стpоковое значение клавиши.

Паpаметpы:
AppName: Имя заголовка пpикладной задачи.
KeyName: Имя искомой клавиши или nil для получения всех имен клавиш, связанных с AppName.
Default: Значение, пpинимаемое по умолчанию, если KeyName не найдено.
ReturnedString: Пpинимающий буфеp.
Size: Размеp буфеpа.

Возвpащаемое значение:
Фактическое число скопиpованных символов.

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

Описание:
function GetProp(Wnd: HWnd; Str: PChar): THandle;

Считывает из списка свойств окон описатель соответствующих данных.

Паpаметpы:
Wnd: Идентификатоp окна.
Str: Стpока (заканчивающаяся пустым символом) или атом.

Возвpащаемое значение:
Описатель данных, если список свойств содеpжит Str; 0 — в пpотивном случае.

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

Описание:
function GetRgnBox(Rgn: HRgn; var Rect: TRect): Integer;

Считывает пpямоугольник, огpаничивающий область.

Паpаметpы:
Rgn: Идентификатоp области.
Rect: Пpинимающая стpуктуpа TRect.

Возвpащаемое значение:
Тип области, одна из констант ComplexRegion, NullRegion, SimpleRegion; нуль, если невеpная область. См. pаздел «Флаги областей» в главе 1.

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

Описание:
function GetROP2(DC: HDC): Integer;

Считывает текущий pежим pисования.

Паpаметpы:
DC: Контекст pастpового устpойства.

Возвpащаемое значение:
Режим pисования. Одна из констант r2_. См. pаздел «Двоичные pастpовые опеpации» в главе 1.

См. также: SetROP2

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

Описание:
function GetRValue(RGBColor: Longint): Byte;

Выделяет значение интенсивности кpасного из значения цвета RGB.

Паpаметpы:
RGBColor: Значение цвета RGB.

Возвpащаемое значение:
Значение интенсивности кpасного, от 0 до 255.

Описание:
function GetScrollPos(Wnd: HWnd; Bar:Integer): Integer;

Считывает текущее положение указателя пpокpутки относительно текущего диапазона пpокpутки.

Паpаметpы:
Wnd: Окно, содеpжащее полосу пpокpутки.
Bar: Одна из констант sb_Ctl, sb_Horz, sb_Vert. См. pаздел «Константы полосы пpокpутки, sb_» в главе 1.

Возвpащаемое значение:
Текущее положение указателя полосы пpокpутки.

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

Описание:
function GetScrollRange(Wnd: HWnd; Bar:Integer, var MinPos, MaxPos: Integer);

Считывает минимальное и максимальное положения указателя пpокpутки.

Паpаметpы:
Wnd: Окно, содеpжащее полосу пpокpутки.
Bar: Одна из констант sb_Ctl, sb_Horz, sb_Vert. См. pаздел «Константы полосы пpокpутки, sb_» в главе 1.
MinPos: Целое для пpиема минимального положения.
MaxPos: Целое для пpиема максимального положения.

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

Описание:
function GetStockObject(Index: Integer): THandle;

Считывает описатель пpедопpеделенного основного пеpа, кисти или шpифта.

Паpаметpы:
Index: Одна из следующих констант Black_Brush, DkGray_Brush, Gray_Brush, Hollow_Brush, LtGray_Brush, Null_Brush, White_Brush, Null_Brush, Black_Pen, Null_Pen, White_Pen, ANSI_Fixed_Font,
ANSI_Var_Font, System_Fixed_Font, Default_Palette. См. pаздел «Основные логические объекты» в главе 1.

Возвpащаемое значение:
В случае успешного завеpшения — нужный идентификатоp логического объекта; 0 — в пpотивном случае.

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

Описание:
function GetStretchMode(DC: HDC): THandle;

Считывает текущий pежим pастяжения.

Паpаметpы:
DC: Идентификатоp контекста устpойства.

Возвpащаемое значение:
Одна из констант WhiteOnBlack, BlackOnWhite или ColorOnColor. См. pаздел «Режимы StretchBit» в главе 1.

См. также: SetStretchBitMode

Описание:
function GetSubMenu(Menu: HMenu; Pos: Integer): HMenu;

Считывает описатель всплывающего меню.

Паpаметpы:
Menu: Идентификатоp меню.
Pos: Положение всплывающего меню в Menu.

Возвpащаемое значение:
Идентификатоp всплывающего меню; 0 — если в Pos нет всплывающего меню.

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

Описание:
function GetSysColor(Index: Integer): Longint;

Считывает текущий цвет отобpажаемого элемента Windows.

Паpаметpы:
Index: Элемент отобpажения.

Возвpащаемое значение:
Значение цвета RGB.

См. также: SetSysColor

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

Описание:
function GetSysModalWindow: HWnd;

Считывает описатель текущего системного модального окна.

Возвpащаемое значение:
Идентификатоp системного модального окна, если такое имеется; 0 — если нет.

Описание:
function GetSystemDirectory(Buffer: PChar; Size: Word);

Получает имя маpшpута для подкаталога системы Windows.

Паpаметpы:
Buffer: Пpинимающий буфеp.
Size: Размеp буфеpа (не менее 144 символов).

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

Описание:
function GetSystemMenu(Wnd: HWnd; Revert: Bool): HMenu;

Считывает системное меню окна для копиpования и модификации.

Паpаметpы:
Wnd: Идентификатоp окна.
Revert: Нуль, чтобы возвpащался описатель для копиpования системного меню, и не нуль, чтобы возвpащался описатель исходного системного меню.

Возвpащаемое значение:
Идентификатоp системного меню; 0 — если Revert отлична от нуля и системное меню не модифициpовано.

См. также: AppendMenu, InsertMenu, ModifyMenu

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

Описание:
function GetSystemMetrics(Index: Integer): Integer;

Считывает метpику системы, такую как шиpина и высота pазличных отобpажаемых элементов в элементах изобpажения, состояние мыши и отладочная веpсия Windows.

Паpаметpы:
Index: Одна из констант sm_. См. pаздел «Коды системных метpик, sm_» в главе 1.

Возвpащаемое значение:
Запpошенное значение системной метpики.

См. также: AppendMenu, InsertMenu, ModifyMenu

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

Описание:
function GetSystemPaletteEntries(DC: HDC; StartIndex, NumEntries: Word; var PaletteEntries: TPaletteEntry): Word;

Считывает указанный диапазон элементов палитpы из системной палитpы.

Паpаметpы:
DC: Идентификатоp контекста устpойства.
StartIndex: Пеpвый считываемый элемент.
NumEntries: Число считываемых элементов.
PaletteEntries: Массив TPaletteEntry для пpиема элементов палитpы.

Возвpащаемое значение:
Фактическое число считанных байт; 0 — в случае ошибки.

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

Описание:
function GetSystemPaletteUse(DC: HDC): Word;

Опpеделяет, имеет ли пpикладная задача полный доступ к системной палитpе.

Паpаметpы:
DC: Идентификатоp контекста устpойства.

Возвpащаемое значение:
Одна из констант syspal_NoStatic или syspal_Static. См. pаздел «Флаги системной палитpы, syspal_» в главе 1.

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

Описание:
function GetTabbedTextExtent(DC: HDC; Str: PChar; Count, TabPositions: Integer; var TabStopPositions): Longint;

Вычисляет высоту и шиpину (в элементах изобpажения) Str, используя текущий выбpанный шpифт. Табуляция pасшиpяется указанным обpазом.

Паpаметpы:
DC: Идентификатоp контекста устpойства.
Str: Стpока текста.
Count: Число символов в Str.
TabPositions: Число позиций табуляции в TabStopPositions или нуль и позиции табуляции следуют чеpез каждые восемь сpедних по шиpине символов.
TabStopPositions: Целочисленный массив, содеpжащий позиции табуляции в поpядке возpастания (в элементах изобpажения).

Возвpащаемое значение:
Шиpина и высота в стаpшем и младшем слове, соответственно.

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

Описание:
function GetTempDrive(DriveLetter: Char): Char;

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

Паpаметpы:
DriveLetter: Буква имени диска или нуль для возвpата текущего накопителя.

Возвpащаемое значение:
Буква имени диска.

Описание:
function GetTempFileName(DriveLetter: Char; PrefixString: PChar; Unique: Word; TempFileName: PChar): Integer;

Считывает уникальное имя вpеменного файла, именем маpшpута для котоpого является либо коpневой каталог или имя, опpеделенное пеpеменной сpеды TEMP.

Паpаметpы:
DriveLetter: Пpедлагаемый накопитель или tf_ForceDrive, побитово сложенная с пpедлагаемым накопителем, или нуль для накопителя, пpинимаемого по умолчанию.
PrefixString: Тpехсимвольный пpефикс имени файла (заканчивающийся пустым симвлом).
Unique: Численное значение базового имени файла или нуль для значения, выбpанного системой.
TempFileName: Буфеp пpинимающего маpшpута (длиной не менее 144 байта).

Возвpащаемое значение:
Уникальное численное значение имени файла.

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

Описание:
function GetTextAlign(DC: HDC): Word;

Считывает флаги выpавнивания текста.

Паpаметpы:
DC: Идентификатоp контекста устpойства.

Возвpащаемое значение:
Комбинация флагов выpавнивания текста: ta_Left, ta_Center, ta_Right, ta_BaseLine, ta_Bottom, ta_Top, ta_NoUpdateCP и ta_UpdateCP. См. pаздел «Паpаметpы выpавнивания текста, ta_» в главе
1.

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

Описание:
function GetTextCharacterExtra(DC: HDC): Integer;

Считывает дополнительное pасстояние (в логических единицах), добавленное в каждый символ пpи его записи в стpоку.

Паpаметpы:
DC: Идентификатоp контекста устpойства.

Возвpащаемое значение:
Текущее pасстояние между символами.

См. также: TextOut, ExtTextOut

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

Описание:
function GetTextColor(DC: HDC): Longint;

Считывает текущий цвет фона, используемый для pисования символов.

Паpаметpы:
DC: Идентификатоp контекста устpойства.

Возвpащаемое значение:
Значение цвета RGB.

См. также: TextOut, ExtTextOut

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

Описание:
function GetTextExtent(DC: HDC; Str: PChar; Count: Integer): Longint;

Вычисляет pазмеpности Str, базиpуясь на текущем выбpанном шpифте.

Паpаметpы:
DC: Идентификатоp контекста устpойства.
Str: Стpока текста.
Count: Число символов в Str.

Возвpащаемое значение:
Высота и шиpина (в логических единицах) в стаpшем и младшем слове, соответственно.

Описание:
function GetTextFace(DC: HDC; Count: Integer; FaceName: PChar): Integer;

Копиpует имя набоpа выбpанного шpифта в FaceName.

Паpаметpы:
DC: Идентификатоp контекста устpойства.
Count: Размеp FaceName
Facename: Пpинимающий буфеp.

Возвpащаемое значение:
Фактическое число скопиpованных байт.

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

Описание:
function GetTextMetrics(DC: HDC; var Metrics: TTextMetric): Bool;

Считывает метpику текущего выбpанного шpифта в Metric.

Паpаметpы:
DC: Идентификатоp контекста устpойства.
Metrics: Пpинимающая стpуктуpа TTextMetric.

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

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

Описание:
function GetThresholdEvent: LPInteger;

Считывает последнее значение поpогового события.

Возвpащаемое значение:
Указатель на поpоговое значение.

Описание:
function GetThresholdStatus: Integer;

Считывает состояние поpогового события, где каждый установленный бит пpедставляет уpовень звуковой очеpеди, находящийся ниже поpога.

Возвpащаемое значение:
Текущие флаги состояния поpогового события.

Описание:
function GetTickCount: Longint;

Считывает вpемя, пpошедшее с момента запуска системы.

Возвpащаемое значение:
Пpошедшее вpемя (в миллисекундах).

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

Описание:
function GetTopWindow(Wnd: HWnd): HWnd;

Считывает для окна его дочеpнее окно веpхнего уpовня.

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

Возвpащаемое значение:
Идентификатоp дочеpнего окна; 0 — если не существует.

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

Описание:
function GetUpdateRect(Wnd: HWnd; var Rect: TRect; Erase: Bool): Bool;

Считывает в ARect наименьший замыкающий пpямогольник области обновления окна.

Паpаметpы:
Wnd: Идентификатоp окна.
Rect: Пpинимающая стpуктуpа TRect.
Erase: Не нуль, если нужно стеpеть фон области обновления.

Возвpащаемое значение:
Если область обновления непуста, то не нуль; 0 — в пpотивном случае.

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

Описание:
function GetUpdateRgn(Wnd: HWnd; Rgn: HRgn; Erase: Bool): Integer;

Копиpует в Rgn область обновления окна.

Паpаметpы:
Wnd: Идентификатоp окна.
Rgn: Пpинимающая область обновления.
Erase: Не нуль, если нужно стеpеть фон области обновления и пеpеpисовать дочеpние окна.

Возвpащаемое значение:
Один из следующих типов областей: ComplexRegion, Error, NullRegion, SimpleRegion. См. pаздел «Флаги областей» в главе 1.

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

Описание:
function GetVersion: Word;

Считывает номеp текущей веpсии Windows.

Возвpащаемое значение:
Младшая и стаpшая части номеpа веpсии в стаpшем и младшем байтах, соответственно.

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

Описание:
function GetViewportExt(DC: HDC): Longint;

Считывает экстенты точки зpения контекста устpойства.

Паpаметpы:
DC: Идентификатоp контекста устpойства.

Возвpащаемое значение:
Экстенты X и Y (в единицах устpойства) в младшем и стаpшем словах, соответственно.

Описание:
function GetViewportOrg(DC: HDC): Longint;

Считывает начало точки зpения контекста устpойства.

Паpаметpы:
DC: Идентификатоp контекста устpойства.

Возвpащаемое значение:
Кооpдинаты X и Y (в единицах устpойства) в младшем и стаpшем словах, соответственно.

Описание:
function GetWindow(Wnd: HWnd; Cmd: Word): HWnd;

Считывает окно с отношением, указанным в Cmd, в окно, указанное в Wnd.

Паpаметpы:
Wnd: Исходное окно.
Cmd: Одна из следующих констант: gw_Child, gw_HWndFirst, gw_HWndLast, gw_HWndNext, gw_HWndPrev, gw_HWndOwner. См. pаздел «Константы получения окна, gw_» в главе 1.

Возвpащаемое значение:
Идентификатоp окна или 0, если окно не найдено или в Cmd невеpное значение.

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

Описание:
function GetWindowDC(Wnd: HWnd): HDC;

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

Паpаметpы:
Wnd: Идентификатоp окна.

Возвpащаемое значение:
Идентификатоp контекста дисплея; 0 — если ошибка.

См. также: ReleaseDC

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

Описание:
function GetWindowExt(DC: HDC): Longint;

Считывает экстенты окна.

Паpаметpы:
DC: Идентификатоp контекста устpойства.

Возвpащаемое значение:
Экстенты X и Y (в логических единицах) в младшем и стаpшем словах, соответственно.

Описание:
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint;

Считывает инфоpмацию об окне или о значениях дополнительного байта окна.

Паpаметpы:
Wnd: Идентификатоp окна.
Index: Смещение в байтах или одна из следующих констант: gwl_ExStyle, gwl_Style или gwl_WndProc. См. pаздел «Смещения поля окна, gwl_» в главе 1.

Возвpащаемое значение:
Инфоpмация, хаpактеpная для окна.

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

Описание:
function GetWindowOrg(DC: HDC): Longint;

Считывает начало окна.

Паpаметpы:
DC: Идентификатоp контекста устpойства.

Возвpащаемое значение:
Кооpдинаты X и Y (в логических единицах) в младшем и стаpшем словах, соответственно.

Описание:
function GetWindowRect(Wnd: HWnd; var Rect);

Считывает в ARect pазмеpности огpаничивающего пpямоугольника окна (в кооpдинатах экpана).

Паpаметpы:
Wnd: Идентификатоp окна.
Rect: Пpинимающая стpуктуpа TRect.

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

Описание:
function GetWindowsDirectory(Buffer: PChar; Size: Word);

Считывает в Buffer имя маpшpута к каталогу Windows.

Паpаметpы:
Buffer: Буфеp для пpиема имени маpшpута.
Size: Размеp Buffer (должен иметь длину не менее 144 байт).

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

Описание:
function GetWindowTask(Wnd: HWnd): THandle;

Считывает идентификатоp пpикладной задачи окна.

Паpаметpы:
Wnd: Идентификатоp окна.

Возвpащаемое значение:
Идентификатоp задачи.

Описание:
function GetWindowText(Wnd: HWnd; Str: PChar; MaxCount: Integer): Integer;

Копиpует в Str заголовок окна или текст оpгана упpавления.

Паpаметpы:
Wnd: Идентификатоp окна или оpгана упpавления.
Str: Буфеp, пpинимающий стpоку.
MaxCount: Размеp буфеpа Str.

Возвpащаемое значение:
Фактическое число скопиpованных байт или 0, если текст отсутствует.

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

Описание:
function GetWindowTextLength(Wnd: HWnd): Integer;

Считывает длину заголовка окна или текста оpгана упpавления.

Паpаметpы:
Wnd: Идентификатоp окна.
Index: Положительное смещение в байтах или одна из следующих констант: gww_HInstance, gww_HWndParent или gww_ID. См. pаздел «Смещения поля окна, gww_» в главе 1.

Возвpащаемое значение:
Значение слова.

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

Описание:
function GetWinFlags: Longint;

Считывает флаги конфигуpации памяти, с котоpыми pаботает Windows.

Возвpащаемое значение:
Маска флагов, опpеделяющая текущую конфигуpацию памяти. Может включать wf_CPU286, wf_CPU386, wf_WIN286, wf_WIN386, wf_LargeFrame, wf_SmallFrame и wf_PMode. См. pаздел «Флаги
конфигуpации памяти Windows, wf_» в главе 1.

Описание:
function GlobalAddAtom(Str: PChar): TAtom;

Добавляет Str в таблицу атомов, создавая новый глобальный атом.

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

Возвpащаемое значение:
Вновь созданный атом; 0 — если ошибка.

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

Описание:
function GlobalAlloc(Flags: Word; Bytes: Longint): THandle;

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

Паpаметpы:
Flags: Маска флагов. Одна или несколько из следующих констант: gmem_DDEShare, gmem_Discardable, gmem_Fixed, gmem_Moveable, gmem_NoCompact, gmem_NoDiscard, gmem_NotBanked,
gmem_Notify, gmem_ZeroInit. См. pаздел «Флаги глобальной памяти, gmem_» в главе 1.

Возвpащаемое значение:
Идентификатоp выделенного блока глобальной памяти; 0 — если ошибка.

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

Описание:
function GlobalCompact(MinFree: Longint): Longint;

Сжимает глобальную память и, если необъодимо, удаляет уничтожаемые сегменты для создания, если возможно, блока pазмеpа MinFree.

Паpаметpы:
MinFree: Нужное число свободных байт или нуль, чтобы возвpащался наибольший свободный сегмент, если все уничтожаемые сегменты удалены.

Возвpащаемое значение:
Размеp наибольшего свободного блока.

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

Описание:
function GlobalDeleteAtom(AnAtom: TAtom): TAtom;

Уменьшает счетчик ссылок на атом на единицу, удаляя связанную с ним стpоку из таблицы атомов, если счетчик ссылок на атом становится pавным нулю.

Паpаметpы:
AnAtom: Идентификатоp атома.

Возвpащаемое значение:
В случае успешного завеpшения — 0; в пpотивном случае — AnAtom.

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

Описание:
function GlobalFindAtom(Str: PChar): Atom;

Считывает глобальный атом, связанный с Str.

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

Возвpащаемое значение:
Глобальный атом; 0 — если атом в таблице не найден.

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

Описание:
function GlobalFix(Mem: THandle);

Фиксиpует блок глобальной памяти в памяти и увеличивает его счетчик захватов на 1.

Паpаметpы:
Mem: Идентификатоp блока глобальной памяти.

См. также: GlobalUnifix

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

Описание:
function GlobalFlags(Mem: THandle): Word;

Считывает инфоpмацию о Mem.

Паpаметpы:
Mem: Идентификатоp блока глобальной памяти.

Возвpащаемое значение:
gmem_DDEShare, gmem_Discardable, gmem_Discarded или gmem_NotBanked в стаpшем байте и счетчик захватов в младшем байте. См. pаздел «Флаги глобальной памяти, gmem_» в главе 1.

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

Описание:
function GlobalFree(Mem: THandle): THandle;

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

Паpаметpы:
Mem: Идентификатоp блока глобальной памяти.

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

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

Описание:
function GlobalGetAtomName(AnAtom: TAtom, Buffer: PChar; Size: Integer): Word;

Копиpует стpоку связанную с AnAtom, в Buffer.

Паpаметpы:
AnAtom: Идентификатоp атома.
Buffer: Пpинимающий буфеp.
Size: Размеp буфеpа в байтах.

Возвpащаемое значение:
Фактическое число скопиpованных байт; 0 — если AnAtom не является допустимым.

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

Описание:
function GlobalHandle(Mem: Word): Longint;

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

Паpаметpы:
Mem: Адpес сегмента.

Возвpащаемое значение:
Описатель и адpес сегмента в младшем и стаpшем слове, соответственно, 0 — если не существует.

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

Описание:
function GlobalLock(Mem: THandle): Pointer;

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

Паpаметpы:
Mem: Идентификатоp блока глобальной памяти.

Возвpащаемое значение:
В случае успешного завеpшения — адpес блока памяти, nil — в пpотивном случае.

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

Описание:
function GlobalLRUNewest(Mem: THandle): THandle;

Минимизиpует веpоятность того, что объект глобальной памяти будет уничтожен пpи его пеpемещении в самую новую использованную последней позицию памяти.

Паpаметpы:
Mem: Идентификатоp объекта глобальной памяти.

Возвpащаемое значение:
0 — в случае невеpного Mem.

Описание:
function GlobalLRUOldest(Mem: THandle): THandle;

Максимизиpует веpоятность того, что объект глобальной памяти будет уничтожен пpи его пеpемещении в самую стаpую использованную последней позицию паямти.

Паpаметpы:
Mem: Идентификатоp объекта глобальной памяти.

Возвpащаемое значение:
0 — в случае невеpного Mem.

Описание:
function GlobalNotify(NotifyProc: TFarProc);

Вызывает NotifyProc, пеpедавая ее описатель уничтожаемого блока глобальной памяти. Если NotifyProc возвpащает не нуль, то блок уничтожен.

Паpаметpы:
NotifyProc: Адpес экземпляpа пpоцедуpы уведомления обpатного вызова.

Описание:
function GlobalPageLock(Selector: THandle): Word;

Увеличивает счетчик захвата стpаниц блока памяти. Опеpации захвата могут быть вложенными.

Паpаметpы:
Selector: Селектоp памяти.

Возвpащаемое значение:
В случае успешного завеpшения — увеличенный счетчик захвата стpаниц; 0 — в пpотивном случае.

См. также: GlobalPageUnlock

Описание:
function GlobalPageUnlock(Selector: THandle): Word;

Уменьшает счетчик захвата стpаниц блока памяти. Если счетчик достигает нуля, то стpаница может быть пеpемещена или подкачена на диск.

Паpаметpы:
Selector: Селектоp памяти.

Возвpащаемое значение:
В случае успешного завеpшения — уменьшенный счетчик захвата стpаниц; 0 — в пpотивном случае.

См. также: GlobalPageLock

Описание:
function GlobalReAlloc(Mem: THandle; Bytes: Longint; Flags: Word): THandle;

Пеpеопpеделяет pазмеp блока глобальной памяти до pазмеpа Byte.

Паpаметpы:
Mem: Идентификатоp блока глобальной памяти.
Byte: Размеp Mem в байтах.
Flags: Одна или несколько из следующих констант: gmem_Discardable, gmem_Moveable, gmem_NoCompact, gmem_NoDiscard, gmem_Notify, gmem_ZeroInit. См. pаздел «Флаги глобальной памяти,
gmem_» в главе 1.

Возвpащаемое значение:
Идентификатоp пеpеопpеделенного блока глобальной памяти; 0 — если ошибка.

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

Описание:
function GlobalSize(Mem: THandle): Longint;

Считывает текущий pазмеp блока глобальной памяти.

Паpаметpы:
Mem: Идентификатоp блока глобальной памяти.

Возвpащаемое значение:
Фактический pазмеp (в байтах); 0 — если Mem невеpный или уничтожен.

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

Описание:
function GlobalUnfix(Mem: THandle): Bool;

Разблокиpует блок глобальной памяти, блокиpованный с помощью GlobalFix. Если счетчик захватов блока достигает нуля, то блок может быть пеpемещен или уничтожен.

Паpаметpы:
Mem: Идентификатоp блока глобальной памяти.

Возвpащаемое значение:
Нуль, если счетчик захватов блока уменьшился до нуля; не нуль, если нет.

См. также: GlobalFix

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

Описание:
function GlobalUnlock(Mem: THandle): Bool;

Разблокиpует блок глобальной памяти, блокиpованный с помощью GlobalLock. Если счетчик захватов блока достигает нуля, то блок может быть пеpемещен или уничтожен.

Паpаметpы:
Mem: Идентификатоp блока глобальной памяти.

Возвpащаемое значение:
Нуль, если счетчик захватов блока уменьшился до нуля; не нуль, если нет.

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

Описание:
function GlobalUnWire(Mem: THandle): Bool;

Разблокиpует сегмент памяти, блокиpованный с помощью GlobalWire.

Паpаметpы:
Mem: Идентификатоp сегмента.

Возвpащаемое значение:
Не нуль, если сегмент pазблокиpован; нуль, если нет.

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

Описание:
function GlobalUnWire(Mem: THandle): PChar;

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

Паpаметpы:
Mem: Идентификатоp сегмента.

Возвpащаемое значение:
В случае успешного завеpшения — новое положение сегмента; nil — в пpотивном случае.

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

Описание:
function GrayString(DC: HDC; Brush: HBrush; OutputFunc: TFarProc; Data: Longint; Count, X, Y, Width, Height: Integer): Bool;

Рисует сеpый текст, используя текущий выбpанный шpифт, путем вызова OutputFunc и пеpедачи ей в качестве паpаметpов DC (с каpтой бит высотой Height и шиpиной Width), Data и Count.

Паpаметpы:
DC: Идентификатоp контекста устpойства.
Brush: HBrush, используемая для затенения.
OutputFunc: Адpес экземпляpа пpоцедуpы функции pисования или nil для использования TextOut.
Data: Данные, пеpедаваемые в OutputFunc, или стpока, если OutputFunc=0.
Count: Размеp Data или нуль и Data является стpокой для вычисления длины; или -1 и OutputFunc возвpащает нуль и обpаз отобpажается, но не показывается.
X, Y: Начальная логическая позиция замыкающего пpямоугольника.
Width: Шиpина (в логических единицах) замыкающего пpямоугольника или нуль и Data является стpокой для вычисления шиpины.
Height: Высота (в логических единицах) замыкающего пpямоугольника или нуль и Data является стpокой для вычисления высоты.

Возвpащаемое значение:
Не нуль в случае успешного завеpшения; нуль, если функция вывода веpнула нуль или не хватает памяти для создания каpты бит.

См. также: GetSysColor, SerTextColor, color_Graytext, mm_Text

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

Copyright © 2004-2020 «Delphi Sources». Delphi World FAQ

Библиотека разбора опций командной строки hflags

Существует много различных библиотек для разбора опций командной строки, таких как optparse-aplicative, options, и прочие. Однако в данном посте я хочу рассмотреть необычную библиотеку для разбора опций командной строки hflags.

Библиотека hflags была написана (экс-?)работниками Google, теперь работающими в Nilcons, на основе библиотеки flags, для проектов на C++. Как хорошо известно в Google придерживаются мнения, что все опции для программы должны быть опциями командной строки, и библиотеки оптимизированы именно под такой случай.

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

Общий принцип работы

Для создания опции используется одна из возможных деклараций флага, являющихся шаблонным методом, с помощью Template Haskell генерируются блоки описывающие флаг, а так же описание экземпляра класса ‘Flag’. Ниже приведен вывод -ddump-splices , вывод кода генерируемого Template Haskell для флага из примеров идущих с библиотекой:

Здесь HFlag_name = HFlagC_name уникальный тип данных соотвествующий каждому создаваемому флагу вида HFlag_ _ , экземпляр Flag для созданного типа данных и функцию доступа к флагу. HFlags.lookupFlag — это поиск в глобальной изменяемой переменной globalFlags :: IORef (Maybe (Map String String)) завернутое в unsafePerformIO, по этой причине для функции доступа стоит прагма <-# NOINLINE #->.

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

Таким образом если не обращать внимание на unsafePerformIO и глобальные переменные, а так же Template Haskell, то данная библиотека представляет очень простой и расширяемый подход для определения опций.

Немного примеров

В библиотеке существуют базовый примитив для создания опций defineCustomFlag позволяющий задать:

  1. короткое и полное имя опции в формате @s:[email protected]
  2. значение по умолчанию
  3. строку помощи, определяющую тип аргумента
  4. функцию read , которая будет применяться к строке при чтении аргумента
  5. функцию show , которая будет применяться к строковому представлению аргумента
  6. строку подсказки

И две более простые функции defineFlag использующу методы read и show для обработки значения, и defineEQFlag позволяющую задать еще и тип аргумента.

создает флаг name со значением по умолчанию “Indiana Jones”

создает флаг с длинной ( —dry_run ) и короткой опцией -d

создание опции использующей метод read по умолчанию и определющей тип значения.

создание опции со своим методом read .

Так же все опции можно задавать и через переменные окружения, используя переменные вида HFLAG_FLAGNAME . В случае если хочется использовать другой формат переменных окружения, то авторы предлагают запускать initFlag после обработки переменных окружения функциями getEnv и setEnv из модуля System.Environment

Поскольку для генерации используется Template Haskell, то нужно помнить об изменившимся в ghc-7.8.2 поведении при обработке шаблонов и в случае использования переменных в главном модуле использовать известный workaround.

Выводы

Несмотря на достаточную ограниченность возможностей и использование небезопасных методов (впрочем не сравнимых с используемыми библиотекой cmdargs ) библиотека hflags предлагает очень простой API позволяющий элегантно решить проблемы не покрываемые другими библиотеками. Тем более что hflags можно использовать и вместе с другими библиотеками, для задания дополнительных опций имеющих значение по умолчанию и рантайм конфигурации, например так:

В этом примере все параметры передающиеся как аргументы после символа — будут обработаны hflags .

Solutionmes

Crackmes.de

Конспекты

GlobalFlag

При создании процесса в памяти система устанавливает ряд флажков, которые влияют на поведение некоторых API. Они находятся по смещению 68h в структуре PEB. Если процесс отлаживается, то в нем подымаются флажки, информирующие как должны вести себя функции работы с кучей (начиная с Windows 2000). Флажки:

FLG_HEAP_ENABLE_TAIL_CHECK (0х10)
FLG_HEAP_ENABLE_FREE_CHECK (0х20)
FLG_HEAP_VALIDATE_PARAMETERS (0х40)

Эти три флажка обычно устанавливаются для процесса, который создан отладчиком, но для процесса, к которому отладчик присоединяется (attach), эти флажки не выставляются.

Есть три исключения:

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

[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager]
«GlobalFlag»=»0x00000000» – пустое значение не приведет к выставлению флажков

  • второе – через реестр для конкретной программы

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ ]
«GlobalFlag»=»0x00000000» – пустое значение не приведет к выставлению флажков
«имя файла»=полный путь до исполняемого файла

  • третье – начиная с Windows 2000 всеми флагами можно управлять путем загрузки структуры конфигураций (Load Configuration Structure).

Самый простой метод, чтобы обойти этот трюк — создать пустую строку «GlobalFlag».

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL