Что такое код localsize


Содержание

LocalSize

Important:
This is retired content. This content is outdated and is no longer being maintained. It is provided as a courtesy for individuals who are still using these technologies. This content may contain URLs that were valid when originally published, but now link to sites or pages that no longer exist.

This function returns the current size, in bytes, of the specified local memory object.

Parameters hMem [in] Handle to the local memory object. This handle is returned by the LocalAllocor LocalReAllocfunction.

The size, in bytes, of the specified local memory object indicates success. Zero indicates that the specified handle is not valid or if the object has been discarded. To get extended error information, call GetLastError.

The size of a memory block may be larger than the size requested when the memory was allocated.

Runs on Versions Defined in Include Link to
Windows CE OS 1.0 and later Winbase.h Lmem.lib

Note This API is part of the complete Windows CE OS package as provided by Microsoft. The functionality of a particular platform is determined by the original equipment manufacturer (OEM) and some devices may not support this API.

Что такое аргумент displs в MPI_Scatterv?

displs аргумент от MPI_Scatterv() Функция называется «целочисленным массивом (с размером группы длины). я указывает смещение (относительно sendbuf, из которого можно взять исходящие данные для обработки i «.
Скажем тогда, что у меня есть sendcounts аргумент

Я рассуждаю так: displs массив всегда должен начинаться со значения 0, поскольку смещение первой записи равно 0 относительно sendbuf так что в моем примере выше, displs должен выглядеть так:

Это верно? Я знаю, что это тривиальный вопрос, но по какой-то причине Интернет вообще не помогает. Там нет хороших примеров, поэтому мой вопрос.

Решение

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

Но так не должно быть; единственное ограничение заключается в том, что отправляемые вами данные не могут перекрываться. Вы можете посчитать со спины так же хорошо:

или любой произвольный порядок будет работать также.

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

В качестве примера простых случаев, ниже приведены прямые и обратные случаи:

Другие решения

Да, ваши рассуждения верны — для смежный данные. Суть displacements параметр в MPI_Scatterv это также позволяет strided данные, означающие, что в sendbuf между кусками.

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

WinAPI по-русски — БОЛЬШОЙ справочник

Перейти на: Главную | Индексную | Предыдущую | Следующую страницу

Всегда готовы помочь — виза в словакию — распродажа уже началась.

Функция LoadString

Описание:
function LoadString(Instance: THandle; ID: Word; Buffer: PChar; BufferMax: Integer): Integer;
Загpужает поименованный pесуpс стpоки и копиpует ее в Buffer, пpисоединяя в конец пустой символ.
Паpаметpы:
Instance: Экземпляp модуля, исполнимый файл котоpого содеpжит стpоку.
ID: Целочисленный идентификатоp стpоки.
Buffer: Пpинимающий буфеp.
BufferMax: Размеp буфеpа.
Возвpащаемое значение:
Фактическое число скопиpованных байт; 0 — если не существует.
функция находится в файле user32.dll
Функция LocalAlloc

Описание:
function LocalAlloc(Flags, Bytes: Word): THandle;
Выделяет из локальной кучи память под блок локальной памяти. Фактический pазмеp может быть больше, чем указанный.
Паpаметpы:
Flags: Одна или несколько из следующих констант: lmem_Discardable, lmem_Fixed, lmem_Modify, lmem_Moveable, lmem_NoCompact, lmem_NoDiscard и lmem_ZeroInit. См. pаздел «Флаги локальной
памяти, lmem_» в главе 1.
Bytes: Размеp выделяемого блока в байтах.
Возвpащаемое значение:
Идентификатоp выделенного блока локальной памяти; 0 — если ошибка.
функция находится в файле kernel32.dll
Функция LocalCompact

Описание:
function LocalCompact(MinFree: Word): Word;
Генеpиpует свободный блок pазмеpом не менее MinFree. Если нужно, функция будет пеpемещать и/или уничтожать pазблокиpованные блоки.
Паpаметpы:
MinFree: Нужное число свободных байт или нуль, чтобы возвpащался наибольший непpеpывный блок.
Возвpащаемое значение:
Размеp наибольшего блока в байтах.
функция находится в файле kernel32.dll
Функция LocalFlags

Описание:
function LocalFlags(Mem: THandle): Word;
Считывает инфоpмацию о блоке памяти Mem.
Паpаметpы:
Mem: Идентификатоp блока локальной памяти.
Возвpащаемое значение:
lmem_Discardable или lmem_Discarded в стаpшем байте и счетчик захватов в младшем байте. См. pаздел «Флаги локальной памяти, lmem_» в главе 1.
функция находится в файле kernel32.dll
Функция LocalFree

Описание:
function LocalFree(Mem: THandle): THandle;
Освобождает блок локальной памяти и делает недействительным его описатель.
Паpаметpы:
Mem: Идентификатоp блока локальной памяти.
Возвpащаемое значение:
В случае успешного завеpшения — нуль; если нет, то Mem.
функция находится в файле kernel32.dll
Функция LocalHandle

Описание:
function LocalHandle(Mem: Word): THandle;
Считывает описатель объекта локальной памяти по указанному адpесу.
Паpаметpы:
Mem: Адpес объекта локальной памяти.
Возвpащаемое значение:
Идентификатоp объекта локальной памяти.
Функция LocalInit

Описание:
function LocalInit(Segment, Start, End: Word): Bool;
Инициализиpует локальную кучу и вызывает LocalLock для захвата сегмента.
Паpаметpы:
Segment: Адpес сегмента локальной кучи.
Start: Адpес смещения для начала локальной кучи.
End: Адpес смещения для конца локальной кучи.
Возвpащаемое значение:
Не нуль, если инициализиpована, 0 — если нет.
Функция LocalLock

Описание:
function LocalLock(Mem: THandle): Pointer;
Блокиpует Mem и увеличивает его счетчик захватов. Блок не может быть пеpемещен или уничтожен.
Паpаметpы:
Mem: Идентификатоp блока локальной памяти.
Возвpащаемое значение:
В случае успешного завеpшения — указатель на блок, nil — в пpотивном случае.
функция находится в файле kernel32.dll
Функция LocalReAlloc

Описание:
function LocalReAlloc(Mem: THandle; Bytes, Flags: Word): THandle;
Изменяет pазмеp и атpибуты, указанные паpаметpом Flags, блока локальной памяти.
Паpаметpы:
Mem: Идентификатоp блока локальной памяти.
Bytes: Новый pазмеp блока Mem в байтах.
Flags: Одна или несколько из следующих констант: lmem_Discardable, lmem_Moveable, lmem_NoCompact, lmem_NoDiscard, lmem_Notify, lmem_ZeroInit. См. pаздел «Флаги локальной памяти,
lmem_» в главе 1.
Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp блока локальной памяти; 0 — если ошибка.
функция находится в файле kernel32.dll
Функция LocalSize

Описание:
function LocalSize(Mem: THandle): Longint;
Считывает текущий pазмеp блока локальной памяти.
Паpаметpы:
Mem: Идентификатоp блока локальной памяти.
Возвpащаемое значение:
Фактический pазмеp (в байтах); 0 — если Mem невеpный или уничтожен.
функция находится в файле kernel32.dll
Функция LocalShrink

Описание:
function LocalShrink(Seg: THandle, Size: Word): Word;
Уменьшает локальную кучу до указанного pазмеpа, котоpый не может быть меньше минимального pазмеpа, указанного в файле опpеделения модуля пpикладной задачи.
Паpаметpы:
Seg: Сегмент, содеpжащий локальную кучу или нуль для текущего сегмента данных.
Size: Нужный pазмеp в байтах.
Возвpащаемое значение:
Размеp после уменьшения.
См. также: GlobalSize
функция находится в файле kernel32.dll
Функция LocalSize

Описание:
function LocalSize(Mem: THandle): Word;
Считывает текущий pазмеp блока локальной памяти.
Паpаметpы:
Mem: Идентификатоp блока локальной памяти.
Возвpащаемое значение:
Размеp блока (в байтах); 0 — если Mem невеpный.
функция находится в файле kernel32.dll
Функция LocalUnlock

Описание:
function LocalUnlock(Mem: THandle): Bool;
Разблокиpует блок локальной памяти, уменьшая его счетчик захватов.
Паpаметpы:
Mem: Идентификатоp блока локальной памяти.
Возвpащаемое значение:
Нуль, если счетчик захватов блока уменьшился до нуля (что делает возможным пеpемещение или уничтожение блока); не нуль, если нет.
функция находится в файле kernel32.dll
Функция LockData

Описание:
function LockData(Dummy: Integer): THandle;
Блокиpует текущий пеpемещаемый сегмент данных в памяти.
Паpаметpы:
Dummy: Не используется. Установлен в 0.
Возвpащаемое значение:
Идентификатоp для блокиpованного сегмента; 0 — в случае неудачи.
Функция LockResource

Описание:
function LockResource(RezData: THandle): Pointer;
Считывает адpес загpуженного pесуpса и увеличивает его счетчик ссылок. После этого pесуpс не может быть ни пеpемещен, ни уничтожен.
Паpаметpы:
RezData: Идентификатоp pесуpса, возвpащенный LoadResource.
Возвpащаемое значение:
Указатель на загpуженный pесуpс; nil, если нет.
функция находится в файле kernel32.dll
Функция LockSegment

Описание:
function LockSegment(Segment: Word): THandle;
Блокиpует сегмент (исключая неуничтожаемые сегменты защищенного pежим) и увеличивает его счетчик ссылок.
Паpаметpы:
Segment: Адpес сегмента или -1 для текущего сегмента.
Возвpащаемое значение:
Указатель на сегмент; nil, если ошибка или сегмент уничтожен.

Описание:
function LoWord(AnInteger: Longint): Word;
Выделяет из 32-битового целочисленного значения младшее слово.
Паpаметpы:
AnInteger: 32-битовое целое.
Возвpащаемое значение:
Младшее слово.
Функция LPtoDP

Описание:
function LPtoDP(DC: HDC; var Points; Count: Integer): Bool;
Пpеобpазует логические точки в Points, в текущем pежиме отобpажения, в точки устpойства.
Паpаметpы:
DC: Идентификатоp контекста устpойства.
Points: Массив стpуктуp TPoints.
Count: Размеp Points.
Возвpащаемое значение:
Не нуль, если пpеобpазованы все точки; нуль — если нет.

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

Описание:
function lstrcat(Str1, Str2: PChar): PChar;
Сцепляет Str1 с Str2.
Паpаметpы:
Str1: Пеpвая стpока (заканчивающаяся пустым символом).
Str2: Втоpая стpока (заканчивающаяся пустым символом).
Возвpащаемое значение:
В случае успешного завеpшения — Str1; 0 — в пpотивном случае.
функция находится в файле kernel32.dll
Функция lstrcmp

Описание:
function lstrcmp(Str1, Str2: PChar): PChar;
Выполянет лексикогpафическое сpавнение двух стpок с учетом их pегистpа, базиpующееся на текущем выбpанном языке. Символы веpхнего pегистpа сpавниваются медленнее, чем
символы нижнего pегистpа.
Паpаметpы:
Str1: Пеpвая стpока (заканчивающаяся пустым символом).
Str2: Втоpая стpока (заканчивающаяся пустым символом).
Возвpащаемое значение:
Меньше нуля, если Str1 Str2.
функция находится в файле kernel32.dll

Что такое код localsize

Каков правильный порядок их вызова? Т.е. (как я понимаю):
1. LocalAlloc
2. LocalLock
3. LocalUnlock
4. LocalFree

Делаю LocalAlloc, потом еще раз LocalAlloc (другой размер памяти) — и все работает. Так и должно быть? Или вроде как ф-ция должна возвращать nil, если память по этому указателю уже выделена? Зачем тогда LocalReAlloc?
И вот еще, LocalFree не освобождает указатель, пока не напишешь прямо — hMem:=nil

Знаю, щас пошлют в Яндекс или Гугл. Был уже.


> Или вроде как ф-ция должна возвращать nil, если память по
> этому указателю уже выделена?

По какому такому «этому указателю» ?
Среди параметров LocalAlloc() нет никаких указателей ..


> Зачем тогда LocalReAlloc?

Вот как раз LocalReAlloc() и принимает параметром тот самый указатель, который был возвращен одним из предшествующих вызовов LocalAlloc().


> LocalFree не освобождает указатель, пока не напишешь прямо
> — hMem:=nil

Ну это очевидная ерунда.


> Среди параметров LocalAlloc() нет никаких указателей ..

Она возвращает the return value is the handle of the newly allocated memory object. Это указатель на выделеную память, так?

> Это указатель на выделеную память, так?

Ну так, и?


> Это указатель на выделеную память, так?

Нет, не так. Handle — это не указатель. Кроме того, заметь, возвращает, а не получает.

Указатель же на блок выделенной памяти возвращает ф-ция LocalLock(), получающая параметром тот самый хэндл, возвращенный ф-цией LocalAlloc().

пишу такое:

// указатель
var
Str: LPTSTR;

// выделяем память
Str:=LPTSTR(LocalAlloc(LPTR, 3));

// Записываем туда че-нибудь
Str:=»123″;

// Проверяем
if (Str<>nil) then . — оно не равно nil, почему?

Если без LocalFree написать Str:=nil, а потом снова Str:=LPTSTR(LocalAlloc(LPTR, 22)); — все работает, выделяет 22 символа

Илон Маск рекомендует:  Оформление, визуальные эффекты, работа с графикой

> [3] evvcom © (16.06.06 11:48)
Оп-с. Конечно же, Handle не указатель.


> Оп-с. Конечно же, Handle не указатель.

Ну да Бог с ним, с указателем. Просто очень хочеться понять как должно это все работать ПРАВИЛЬНО, у меня работает так как мне нужно, даже больше :) но подозреваю что могут быть проблемы вроде утечки памяти и т.п.

Есть ли необходимость использовать именно эти функции?
Почему бы не применять более удобные дельфийские?
(если не идет работа с API-функциями, требующими именно указанные методы работы с памятью)

> Просто очень хочеться понять как должно это все работать
> ПРАВИЛЬНО

Посмотри LocalLock. Она принимает HLOCAL и возвращает нужный тебе указатель


> max999 (16.06.06 11:51) [5]


> // Освобождаем
> LocalFree(LocalHandle(Str));
>
> // Проверяем
> if (Str<>nil) then . — оно не равно nil, почему?

Кто-то где-то обещал, что функции освобождения памяти обниляют указатели?

> Если без LocalFree написать Str:=nil, а потом снова Str:
> =LPTSTR(LocalAlloc(LPTR, 22)); — все работает, выделяет
> 22 символа

Код пионэра, приводящий к утечкам памяти.
PS. Может попросишь воспитательницу книжку-какую по основам прочитать для вас.

var
hMem: THandle;
Str: PChar;
..

hMem := LocalAlloc(LPTR, 3);
Win32Check(hMem <> 0);

Str := LocalLock(hMem);
Win32Check(Assigned(Str));
try
..
finally
LocalUnlock(hMem);
end;

hMem := LocalReAlloc(hMem, LPTR, 22);
Win32Check(hMem <> 0);

Str := LocalLock(hMem);
Win32Check(Assigned(Str));
try
..
finally
LocalUnlock(hMem);
end;


> Код пионэра, приводящий к утечкам памяти.

От их то и не хочеться :)


> От их то и не хочеться

Так правило-то одно — «Взял, попользовал, верни на место».

Подскажите еще, как имея
hMem: THandle;
Str: PChar;
Проверить что это в данный момент используеться? hMem<>nil ?


> max999 (16.06.06 12:14) [14]
> Подскажите еще, как имея
> hMem: THandle;
> Str: PChar;
> Проверить что это в данный момент используеться? hMem<>nil?

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

Если уж приспичило, то

try
Win32Check(LocalSize(hMem) <> 0);
ShowMessage(«Используется»);
except
ShowMessage(«Не используется»);
end;

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

———-offtopic
MBo © (16.06.06 11:59) [8]
Борис, традиция пятничных задачек канула в небытиё? есть желание 2-3 часа напрячь извилины

После Unlock и Free LocalSize(hMem) не равно 0
:»-(
Знаю что я уже надоел, но программа показывает что оно не равно нулю! Может у меня Дельфя неправильная?

И еще, я выделил памяти на 3 символа, попробовал записать туда 22 — получилось :) И прочиталось на ура! Разве так должно быть??

> max999

var
str: PChat;
begin
str := nil;
try
GetMem(str, iSize);
.
finally
if str <> nil then
FreeMem(str);
end;
end;
не удивлюсь что это будет работать быстрее, чем прямое использование API.
и зачем себе лишних проблем создавать.

> [19] max999 (16.06.06 12:37)


> И еще, я выделил памяти на 3 символа, попробовал записать
> туда 22 — получилось

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

Не работает. LocalUnlock возвращает 0.
Дайте хоть ссылку на работающий пример. Можна на С++.

>default © (16.06.06 12:21) [17]
ОК, через полчасика сделаю, только контролировать ветку особо не смогу.


> max999 (16.06.06 12:37) [19]
> И еще, я выделил памяти на 3 символа, попробовал записать
> туда 22 — получилось :) И прочиталось на ура! Разве так
> должно быть??

Выдели памяти на твои 3 символа и сразу выдели ещё памяти, после записи 22 символов в первую область, прочитай данные из второй.

Что такое код localsize

Code page — is another term for character encoding. It consists of a table of values that describes the character set for a particular language. The term code page originated from IBM s EBCDIC based mainframe systems,[1] but many vendors use this term… … Wikipedia

code installation — Refrigeration or air conditioning installation which conforms to the local code and/or the national code for safe and efficient installations … Dictionary of automotive terms

Code Co-op — Developer(s) Reliable Software Initial release 1996; 14 years ago (1996) Stable rele … Wikipedia

Code: Breaker — Code:Breaker Cover of the first volume コード: ブレイカー (Kōdo:Bureikā) Genre Action, School Life, Supernatural, Comedy … Wikipedia

Code for America — Established September 2009 Executive Director Jennifer Pahlka[1] … Wikipedia

Local access and transport area — (LATA) is a term used in U.S. telecommunications regulation. It represents a geographical area of the United States under the terms of the Modification of Final Judgment (MFJ) that precipitated the breakup of the original AT T into the Baby Bells … Wikipedia

Code De L’urbanisme (France) — Le Code de l’urbanisme et de l habitation, créé en 1954, est le code regroupant en droit français les dispositions législatives et réglementaires relatives au droit de l urbanisme. Sommaire 1 Suites du Grenelle de l environnement 2 Voir aussi 2.1 … Wikipédia en Français

Code de l’urbanisme (france) — Le Code de l’urbanisme et de l habitation, créé en 1954, est le code regroupant en droit français les dispositions législatives et réglementaires relatives au droit de l urbanisme. Sommaire 1 Suites du Grenelle de l environnement 2 Voir aussi 2.1 … Wikipédia en Français

Code de l’urbanisme français — Code de l urbanisme (France) Le Code de l’urbanisme et de l habitation, créé en 1954, est le code regroupant en droit français les dispositions législatives et réglementaires relatives au droit de l urbanisme. Sommaire 1 Suites du Grenelle de l… … Wikipédia en Français

Code de l’urbanisme et de l’habitation — Code de l urbanisme (France) Le Code de l’urbanisme et de l habitation, créé en 1954, est le code regroupant en droit français les dispositions législatives et réglementaires relatives au droit de l urbanisme. Sommaire 1 Suites du Grenelle de l… … Wikipédia en Français

Local search (Internet) — Local search is the use of specialized Internet search engines that allow users to submit geographically constrained searches against a structured database of local business listings. Typical local search queries include not only information… … Wikipedia

Самый маленький шелл-код. Создаем 44-байтовый Linux x86 bind shellcode

Содержание статьи

Shell-код представляет собой набор машинных команд, позволяющий получить доступ к командному интерпретатору (cmd.exe в Windows и shell в Linux, от чего, собственно, и происходит его название). В более широком смысле shell-код — это любой код, который используется как payload (полезная нагрузка для эксплоита) и представляет собой последовательность машинных команд, которую выполняет уязвимое приложение (этим кодом может быть также простая системная команда, вроде chmod 777 /etc/shadow) :

Немного теории

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

Системные вызовы

Системные вызовы обеспечивают связь между пространством пользователя (user mode) и пространством ядра (kernel mode) и используются для множества задач, таких, например, как запуск файлов, операции ввода-вывода, чтения и записи файлов.

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

Регистры

Регистры — специальные ячейки памяти в процессоре, доступ к которым осуществляется по именам (в отличие от основной памяти). Используются для хранения данных и адресов. Нас будут интересовать регистры общего назначения: EAX, EBX, ECX, EDX, ESI, EDI, EBP и ESP.

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

Проблема нулевого байта

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

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

Необходимые нам инструменты

  • Linux Debian x86/x86_64 (хотя мы и будем писать код под x86, сборка на машине x86_64 проблем вызвать не должна);
  • NASM — свободный (LGPL и лицензия BSD) ассемблер для архитектуры Intel x86;
  • LD — компоновщик;
  • objdump — утилита для работы с файлами, которая понадобится нам для извлечения байт-кода из бинарного файла;
  • GCC — компилятор;
  • strace — утилита для трассировки системных вызовов.

Если бы мы создавали bind shell классическим способом, то для этого нам пришлось бы несколько раз дергать сетевой системный вызов socketcall() :

  • net.h/SYS_SOCKET — чтобы создать структуру сокета;
  • net.h/SYS_BIND — привязать дескриптор сокета к IP и порту;
  • net.h/SYS_LISTEN — начать слушать сеть;
  • net.h/SYS_ACCEPT — начать принимать соединения.

И в конечном итоге наш shell-код получился бы достаточно большим. В зависимости от реализации в среднем выходит 70 байт, что относительно немного. Но не будем забывать нашу цель — написать максимально компактный shell-код, что мы и сделаем, прибегнув к помощи netcat!

Почему размер так важен для shell-кода?

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

Shell-код мы будем писать на чистом ассемблере, тестировать — в программе на С. Наша заготовка bind_shell_1.nasm , разбитая для удобства на блоки, выглядит следующим образом:

Сохраним ее как super_small_bind_shell_1.nasm и далее скомпилируем:

а затем слинкуем наш код:

и запустим получившуюся программу через трассировщик (strace), чтобы посмотреть, что она делает:

Запуск bind shell через трассировщик

Xakep #246. Учиться, учиться, учиться!

Как видишь, никакой магии. Через системный вызов execve() запускается netcat , который начинает слушать на порте 12345, открывая удаленный шелл на машине. В нашем случае мы использовали системный вызов execve() для запуска бинарного файла /bin/nc с нужными параметрами ( -le/bin/sh -vp12345 ).

execve() имеет следующий прототип:

  • filename обычно указывает путь к исполняемому бинарному файлу — /bin/nc ;
  • argv[] служит указателем на массив с аргументами, включая имя исполняемого файла, — [«/bin//nc», «-le//bin//sh», «-vp12345»] ;
  • envp[] указывает на массив, описывающий окружение. В нашем случае это NULL, так как мы не используем его.

Синтаксис нашего системного вызова (функции) выглядит следующим образом:

Описываем системные вызовы через ассемблер

Как было сказано в начале статьи, для указания системного вызова используется соответствующий номер (номера системных вызовов для x86 можно посмотреть здесь: /usr/include/x86_64-linux-gnu/asm/unistd_32.h ), который необходимо поместить в регистр EAX (в нашем случае в регистр EAX, а точнее в его младшую часть AL было занесено значение 11, что соответствует системному вызову execve() ).

Аргументы функции должны быть помещены в регистры EBX, ECX, EDX:

  • EBX — должен содержать адрес строки с filename — /bin//nc ;
  • ECX — должен содержать адрес строки с argv[] — «/bin//nc» «-le//bin//sh» «-vp12345» ;
  • EDX — должен содержать null-байт для envp[] .

Регистры ESI и EDI мы использовали как временное хранилище для сохранения аргументов execve() в нужной последовательности в стек, чтобы в блоке 5 (см. код выше) перенести в регистр ECX указатель (указатель указателя, если быть более точным) на массив argv[] .

Ныряем в код

Разберем код по блокам.

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

Блок 2

Обнуляем регистр EDX, значение которого (NULL) будет использоваться для envp[] , а также как символ конца строки для вносимых в стек строк. Обнуляем регистр через XOR, так как инструкция mov edx, 0 привела бы к появлению null-байтов в shell-коде, что недопустимо.

Важно!

Аргументы для execve() мы отправляем в стек, предварительно перевернув их справа налево, так как стек растет от старших адресов к младшим, а данные из него извлекаются наоборот — от младших адресов к старшим.

Илон Маск рекомендует:  StrToInt64Def - Функция Delphi

Для того чтобы перевернуть строку и перевести ее в hex, можно воспользоваться следующей Linux-командой:

Блок 3

Ты, наверное, заметил странноватый путь к бинарнику с двойными слешами. Это делается специально, чтобы число вносимых байтов было кратным четырем, что позволит не использовать нулевой байт (Linux игнорирует слеши, так что /bin/nc и /bin//nc — это одно и то же).

Блок 4

Блок 5

Почему в AL, а не в EAX? Регистр EAX имеет разрядность 32 бита. К его младшим 16 битам можно обратиться через регистр AX. AX, в свою очередь, можно разделить на две части: младший байт (AL) и старший байт (AH). Отправляя значение в AL, мы избегаем появления нулевых байтов, которые бы автоматически появились при добавлении 11 в EAX.

Извлекаем shell-код

Чтобы наконец получить заветный shell-код из файла, воспользуемся следующей командой Linux:

и получаем на выходе вот такой вот симпатичный shell-код:

Тестируем

Для теста будем использовать следующую программу на С:

Компилируем. NB! Если у тебя x86_64 система, то может понадобиться установка g++-multilib :

Проверяем bind shell

Хех, видим, что наш shell-код работает: его размер — 58 байт, netcat открывает шелл на порте 12345.

Оптимизируем размер

58 байт — это довольно неплохо, но если посмотреть в shellcode-раздел exploit-db.com, то можно найти и поменьше, например вот этот размером в 56 байт.

Можно ли сделать наш код существенно компактнее?

Можно. Убрав блок, описывающий номер порта. При таком раскладе netcat все равно будет исправно слушать сеть и даст нам шелл. Правда, номер порта нам теперь придется найти с помощью nmap . Наш новый код будет выглядеть следующим образом:

А теперь попробуем подключиться и получить удаленный шелл-доступ. С помощью Nmap узнаем, на каком порте висит наш шелл, после чего успешно подключаемся к нему все тем же netcat :

И снова проверяем bind shell

Bingo! Цель достигнута: мы написали один из самых компактных Linux x86 bind shellcode. Как видишь, ничего сложного ;).

Что такое low-code/no-code платформа и CRM, CRM+, ERP

Суть low-code/no-code (далее просто low-code) в том, чтобы снизить порог создания/изменения информационной системы до уровня бизнес аналитика или даже продвинутого пользователя. Это когда вендор не просто создаёт платформу со встроенным языком и его сотрудники заявляют о том, что сделают для клиента «всё или почти всё» — low-code платформа, это когда бизнес-аналитики или выделенные ответственные на стороне клиента (его сотрудники) могут это «почти всё» сделать сами.

Что входит в понятие на платформе можно «почти всё»?

  1. Формат данных, пользовательские данные
  2. Вычисления
  3. Интерфейсы десктоп/web
  4. Отчеты, дашборды, аналитика
  5. Шаблоны документов, рассылок, нотификаций
  6. Управление процессами
  7. Управление доступом и логированием
  8. Управление личным кабинетом клиентов и данными на сайте

Возможности low-code существенно сокращают путь к результату с цепочки «Задача пользователя – бюджет разработки – бизнес-аналитик – ТЗ – исполнитель – согласование результата – внесение изменений – приёмка» до «Задача пользователя –Бизнес-аналитик – приёмка».

Ключевые сотрудники – это «носители/владельцы знаний о процессах компании». Именно предоставление в их руки инструмента, позволяющего! полностью! создавать/изменять информационную систему предприятия, приводит к:

  • бОльшей гибкости и прозрачности бизнеса
  • снижению затрат на ИТ
  • увеличению скорости разработки корпоративной информационной системы
  • снижению рисков и сроков ожидания реализации внутренних задач в корпоративной системе

и более «приземлённо»:

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

Ниже взгляд на то, как может быть построена система low-code. Один из вариантов. С объяснением ключевых моментов.

1. Формат данных, пользовательские данные

Платформа должна иметь средства конфигурирования данных. Причем без программирования. И конфигурированию должны быть доступны не только «пользовательские данные», но и справочники и реестры, представляющие основу конфигурации + системные – к примеру, контрагенты, физ. лица и пр. Или наоборот: есть вендоры, которые дают возможность конфигурирования ограниченного количества видов данных + создавать свои справочники – это неправильно. Ограничения — это компромисс за деньги клиента.

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

В текущий момент развития рынка ИТ в РФ много компаний – поставщиков CRM научились добавлять свои справочники. Просто добавления с компромиссом недостаточно, чтобы называться полноценной платформой.

Основные моменты

a) Визуализация данных перед конечным пользователем.

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

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

2. Вычисления

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

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

a) Составление алгоритмов вычислений

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

b) При этом, здесь же допускается код на T-SQL.

Код на T-SQL снимает ограничения по сложности вычислений, делая платформу более широкой, чем «для бизнес-аналитика». По сути это снова «отсутствие ограничений». Low-code платформа не должна быть средством только для бизнес-аналитиков – она должна закрывать потребности разработки на платформе готового решения, включая код на встренном языке и, к примеру, T-SQL. Но бизнес-аналитик на low-code платформе должен иметь возможность закрыть бОльшую часть типовых задач.

c) «Учет – это итоги»

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

По сути «представления» – это некий «табличный конструктор». Его доступность бизнес-аналитикам или продвинутым пользователям позволяет собирать таблицы из нескольких таблиц, т.е. создавать представления, которые не хранятся в БД. Представления и их разработка очень важны в анализе и сопоставлении данных, в т.ч. маркетологами. В концепции low-code это означает, что сложные конструкции, которые обычно длительный срок собираются программистами, теперь бизнес-аналитиками могут создаваться «мышкой» в короткие сроки, к тому же и быстро меняться.

e) Агрегаты (регистры)

Существует большое количество вычислений по расписанию (ночью), а также подготовка итогов и расчетов для сложных отчетных форм, также требующих большой нагрузки сервера и которые имеет смысл также проводить ночью. Отчеты этого типа не требуют on-line актуализации данных. С точки зрения пользователя агрегирование – это подготовка готовых отчетов с уже готовыми результатами, чтобы запрос такого отчета не приводил к вычислениям, а выдавал уже готовую форму с результатами в течение 1 – 2 сек.

Промежуточный вывод: low-code проектирование готовой конфигурации с точки зрения данных – это закрытие без программирования силами бизнес-аналитика всех вопросов формата БД для бизнеса любого размера и сложности + обязательная при этом скорость разработки, которая получается очень высокой.

3. Интерфейсы десктоп/web

a) Доступность для дизайна

Одним из главных в дизайне интерфейса является принципиальная доступность этой функции бизнес-аналитику, причем, конечно, без программирования. Это значит, что есть компонентный состав (о нём ниже) и есть «мышка», которой можно расставить на форме всё, как требуется, а свойства, функции и пр. задать, к примеру, в инспекторе объектов или в карточках объектов. Сложность форм в low-code платформе не должна быть ничем ограничена.

Применительно к современным CRM и ERP системам дизайнер интерфейсов должен быть, как для десктопа (если система поставляется в десктопном варианте), так и для web.

b) Нарисовал и оно работает

Работа того, что только что было отрисовано – очень важный аспект. Зачастую, в платформах для того, чтобы отрисованный интерфейс работал, код необходим. Пусть и не большой. Это не low-code платформы, даже, если вендор так пытается её представить.

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

c) Компонентный состав

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

  • Пивот
  • Органайзер
  • Индикаторы
  • Итоги
  • Геовизуализация
  • другое

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

d) Карточки записей

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

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

e) Выход на встроенный язык

При всём сказанном, встроенный язык лишним не будет. Но это дополнение к возможностям low-code:

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

4. Отчеты, дашборды, аналитика

5. Шаблоны документов, рассылок, нотификаций

Собственно, как и в дизайнере отчетов, так и в подготовке шаблонов документов на основе MS Word и MS Excel необходима доступная всем и пользователям в т.ч. визуализация данных, описанная выше. Пользователь в платформе low-code не должен знать названия таблиц в БД, полей и пр. Ему должен быть доступен исчерпывающий визуальный инструментарий доступа ко всем данным, без знания SQL.

Здесь же следует отметить, что правильным является предоставление бизнес-аналитику возможности оперировать, как прямыми ссылками на таблицы, так и обратными. Это позволяет вставлять в шаблоны MS Word – к примеру, в договора таблицы спецификации.

6. Управление процессами

На рынке много систем, заявляющих о наличии инструментов управления процессами. Часто под этим понимают, к примеру, последовательную раздачу задач, или ветвление только одного типа (да/нет, что по сути условный переход).

Платформы low-code должны обладать мощными, доступными без программирования графическими редакторами карт процессов, где бизнес-аналитик должен иметь возможности моделирования:

1. Событий в БД и от этого:

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

2. Планировщик

  • o обработка времени «до» и «после» контрольных и/или ключевых значений атрибутов записей
  • o создание действий, описанных выше на регулярной (расписание) основе
Илон Маск рекомендует:  Инсталляция borland kylix

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

7. Управление доступом и логированием

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

Аналогично доступ и его ограничения.

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

Отдельно для каждой группы пользователей

8. Управление личным кабинетом клиентов и данными на сайте

Аналогично и управление журналом аудита (логирование)

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

Речь НЕ идёт о том, что произойдёт отказ от программирования. Как показано выше – везде может и должен быть шлюз/доступ/другой уровень для того, чтобы определенные вопросы реализовывались на встроенных языках и SQL.

Речь о том, что компаниям платформы low-code выгодны по объективным причинам и тренд на, собственно, говоря более простым языком: автоматизацию работы внедренцев/бизнес-аналитиков – на упрощение и ускорение их работы, очевиден.

Имея средства управления форматом данных, вычислениями без программирования, распределения нагрузки на сервер через планирование вычислениями; имея возможности визуализации данных, как с точки зрения рабочего места той или иной группы пользователей + визуализации и аналитичности данных для лиц, принимающих решения; имея возможность настраивать процессы в графическом движке с элементами документообота и раздачей задач – бизнес-аналитик может закрыть собой очень большой объём внедрения информационной системы высокого уровня сложности.

Параллельное восстановление с использованием локальной памяти в OpenCL

Я реализовал reduce ядра в OpenCL, чтобы суммировать все записи во input векторе размера N Для более легкого тестирования я инициализирую input вектор с 1.0f . Таким образом, результат должен быть N Но это не так!

Вот мое reduce -kernel:

И вот настройка OpenCL:

Результат зависит от размера рабочей группы. Что я делаю не так? Является ли это самим ядром или это настройки для OpenCL?

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

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

Затем вам нужно суммировать значения из вывода на хосте. Обратите внимание, что «b» в главном коде не нужно содержать N элементов. Будет использоваться только один элемент для каждой рабочей группы.

Теперь b [0] — ваша общая сумма.

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

Вы переставляете еще один бит, чем вы должны при инициализации s.

После этого фиксируйте, давайте посмотрим, что делает ваше ядро. Хост-код выполняет его с помощью globalSize 8192 и localSize из 512, что приводит к 16 рабочим группам. Внутри ядра вы сначала суммируете данные из двух последовательных мест памяти по индексу 2 * global_ >

Чтобы исправить это, вы можете сделать следующее:

Или укажите глобальный размер, равный половине номера текущего.

Как узнать координаты базовой станции GSM по MCC, MNC, LAC и CellID (CID).

Published 22.04.2015 by Johhny

Cellidfinder — это простой и удобный сервис по поиску местоположения базовых станций мобильной связи стандарта GSM и построению их на карте. В статье приведена подробная инструкция по поиску местоположения базовых станций GSM с помощью данного сервиса.

Какие данные необходимы для локализации БС?

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

  • MCC (Mobile Country Code) — код, определяющий страну, в которой находится оператор мобильной связи. Например, для России он равен 250, США — 310, Венгрия — 216, Китай — 460, Украина — 255, Белоруссия — 257.
  • MNC (Mobile Network Code) — код, присваиваемый оператору мобильной связи. Уникален для каждого оператора в конкретной стране. Подробная таблица кодов MCC и MNC для операторов по всему миру доступна здесь.
  • LAC (Location Area Code) — код локальной зоны. В двух словах LAC — это объединение некоторого количества базовых станций, которые обслуживаются одним контроллером базовых станций (BSC). Этот параметр может быть представлен как в десятичном, так и в шестнадцатеричном виде.
  • CellID (CID) — «идентификатор соты». Тот самый сектор базовой станции. Этот параметр также может быть представлен в десятичном, и шестнадцатеричном виде.

Где взять эти данные?

Данные берутся с нетмонитора. Нетмонитор — это специальное приложение для мобильных телефонов или других устрйств, которое позволяет узнать инженерные параметры мобильной сети. В сети существует огромное количество нетмониторов для различных устройств. Найти подходящий — не проблема. Кроме того многие современные GPS трекеры в условиях плохого приема спутников могут отсылать хозяину не координаты, а параметры базовой станции (МСС, MNC, LAC, Cellid) за которую они цепляются. Cellidfinder поможет быстро перевести эти параметры в приблизительное местоположение БС.

Откуда берутся координаты базовой станции?

Поиск координат базовых станций проводится в базах данных Google и Yandex, которые предоставили такую возможность. Следует отметить, что в результате поиска мы получаем не точное местоположения вышки, а приблизительное. Это то местоположение, в котором регистрировалось наибольшее количество абонентов, передавших информацию о своем местоположении на серверы Google и Yandex. Наиболее точно местоположение по LAC и CID определяется при использовании функции усреднения, при которой вычисляются координаты всех секторов (CellID) одной базовой станции, а затем вычисляется усредненное значение.

Как работать с CellIDfinder?

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

В данном случае в окне нетмонитора мы увидели:
MCC = 257 (Белоруссия)
MNC = 02 (МТС)
LAC = 16
C >

Вводим эти параметры в форму поиска на главной странице. Т.к. LAC и CID могут выдаваться нетмонитором как в десятичном, так и в шестнадцатеричном виде, то форма поиска имеет автозаполнение для LAC и CID во втором виде. Выбираем «Данные Google», «Данные Yandex» и, если необходима высокая точность, «Усреднение». Нажимаем кнопку «Найти БС».

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

Что такое код localsize

Каков правильный порядок их вызова? Т.е. (как я понимаю):
1. LocalAlloc
2. LocalLock
3. LocalUnlock
4. LocalFree

Делаю LocalAlloc, потом еще раз LocalAlloc (другой размер памяти) — и все работает. Так и должно быть? Или вроде как ф-ция должна возвращать nil, если память по этому указателю уже выделена? Зачем тогда LocalReAlloc?
И вот еще, LocalFree не освобождает указатель, пока не напишешь прямо — hMem:=nil

Знаю, щас пошлют в Яндекс или Гугл. Был уже.


> Или вроде как ф-ция должна возвращать nil, если память по
> этому указателю уже выделена?

По какому такому «этому указателю» ?
Среди параметров LocalAlloc() нет никаких указателей ..


> Зачем тогда LocalReAlloc?

Вот как раз LocalReAlloc() и принимает параметром тот самый указатель, который был возвращен одним из предшествующих вызовов LocalAlloc().


> LocalFree не освобождает указатель, пока не напишешь прямо
> — hMem:=nil

Ну это очевидная ерунда.


> Среди параметров LocalAlloc() нет никаких указателей ..

Она возвращает the return value is the handle of the newly allocated memory object. Это указатель на выделеную память, так?

> Это указатель на выделеную память, так?

Ну так, и?


> Это указатель на выделеную память, так?

Нет, не так. Handle — это не указатель. Кроме того, заметь, возвращает, а не получает.

Указатель же на блок выделенной памяти возвращает ф-ция LocalLock(), получающая параметром тот самый хэндл, возвращенный ф-цией LocalAlloc().

пишу такое:

// указатель
var
Str: LPTSTR;

// выделяем память
Str:=LPTSTR(LocalAlloc(LPTR, 3));

// Записываем туда че-нибудь
Str:=»123″;

// Проверяем
if (Str<>nil) then . — оно не равно nil, почему?

Если без LocalFree написать Str:=nil, а потом снова Str:=LPTSTR(LocalAlloc(LPTR, 22)); — все работает, выделяет 22 символа

> [3] evvcom © (16.06.06 11:48)
Оп-с. Конечно же, Handle не указатель.


> Оп-с. Конечно же, Handle не указатель.

Ну да Бог с ним, с указателем. Просто очень хочеться понять как должно это все работать ПРАВИЛЬНО, у меня работает так как мне нужно, даже больше :) но подозреваю что могут быть проблемы вроде утечки памяти и т.п.

Есть ли необходимость использовать именно эти функции?
Почему бы не применять более удобные дельфийские?
(если не идет работа с API-функциями, требующими именно указанные методы работы с памятью)

> Просто очень хочеться понять как должно это все работать
> ПРАВИЛЬНО

Посмотри LocalLock. Она принимает HLOCAL и возвращает нужный тебе указатель


> max999 (16.06.06 11:51) [5]


> // Освобождаем
> LocalFree(LocalHandle(Str));
>
> // Проверяем
> if (Str<>nil) then . — оно не равно nil, почему?

Кто-то где-то обещал, что функции освобождения памяти обниляют указатели?

> Если без LocalFree написать Str:=nil, а потом снова Str:
> =LPTSTR(LocalAlloc(LPTR, 22)); — все работает, выделяет
> 22 символа

Код пионэра, приводящий к утечкам памяти.
PS. Может попросишь воспитательницу книжку-какую по основам прочитать для вас.

var
hMem: THandle;
Str: PChar;
..

hMem := LocalAlloc(LPTR, 3);
Win32Check(hMem <> 0);

Str := LocalLock(hMem);
Win32Check(Assigned(Str));
try
..
finally
LocalUnlock(hMem);
end;

hMem := LocalReAlloc(hMem, LPTR, 22);
Win32Check(hMem <> 0);

Str := LocalLock(hMem);
Win32Check(Assigned(Str));
try
..
finally
LocalUnlock(hMem);
end;


> Код пионэра, приводящий к утечкам памяти.

От их то и не хочеться :)


> От их то и не хочеться

Так правило-то одно — «Взял, попользовал, верни на место».

Подскажите еще, как имея
hMem: THandle;
Str: PChar;
Проверить что это в данный момент используеться? hMem<>nil ?


> max999 (16.06.06 12:14) [14]
> Подскажите еще, как имея
> hMem: THandle;
> Str: PChar;
> Проверить что это в данный момент используеться? hMem<>nil?

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

Если уж приспичило, то

try
Win32Check(LocalSize(hMem) <> 0);
ShowMessage(«Используется»);
except
ShowMessage(«Не используется»);
end;

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

———-offtopic
MBo © (16.06.06 11:59) [8]
Борис, традиция пятничных задачек канула в небытиё? есть желание 2-3 часа напрячь извилины

После Unlock и Free LocalSize(hMem) не равно 0
:»-(
Знаю что я уже надоел, но программа показывает что оно не равно нулю! Может у меня Дельфя неправильная?

И еще, я выделил памяти на 3 символа, попробовал записать туда 22 — получилось :) И прочиталось на ура! Разве так должно быть??

> max999

var
str: PChat;
begin
str := nil;
try
GetMem(str, iSize);
.
finally
if str <> nil then
FreeMem(str);
end;
end;
не удивлюсь что это будет работать быстрее, чем прямое использование API.
и зачем себе лишних проблем создавать.

> [19] max999 (16.06.06 12:37)


> И еще, я выделил памяти на 3 символа, попробовал записать
> туда 22 — получилось

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

Не работает. LocalUnlock возвращает 0.
Дайте хоть ссылку на работающий пример. Можна на С++.

>default © (16.06.06 12:21) [17]
ОК, через полчасика сделаю, только контролировать ветку особо не смогу.


> max999 (16.06.06 12:37) [19]
> И еще, я выделил памяти на 3 символа, попробовал записать
> туда 22 — получилось :) И прочиталось на ура! Разве так
> должно быть??

Выдели памяти на твои 3 символа и сразу выдели ещё памяти, после записи 22 символов в первую область, прочитай данные из второй.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL