Альтернативные потоки данных в ntfs или создание секретных файлов

Расшифровываем термин "очищать альтернативные потоки данных": понимаем, зачем это нужно

Работа с потоками

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

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

Когда вы пытаетесь открыть поток файлов с помощью start filename:streamname , и программа говорит что-то вроде «незаконного имени файла» или «файл не найден», и вы уверены, что имя потока верное, то, скорее всего, программа не поддерживают потоки. Я заметил, что Notepad, Wordpad и Word/Excel работают правильно с потоками, хотя Word и Excel считают файлы опасными. Ниже приведены некоторые эксперименты .

ПРИМЕЧАНИЕ: вам кажется, что альтернативные потоки данных нечетны. Они странные, потому что они настолько скрыты, но многие основные файловые системы (HFS, NSS) имеют это, и концепция восходит к началу 80-х годов. Фактически, изначально потоки были добавлены в NTFS для взаимодействия с другими файловыми системами.

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

Для начала немного теории
.
Поддержка альтернативных потоков данных была добавлена в NTFS
для совместимости с файловой системой HFS от Macintosh, которая использовала поток ресурсов для хранения иконок и другой информации о файле. Они присутствуют в NTFS
еще с самых ранних версий Windows NT
. Суть технологии в том, что у файла на NTFS
может быть несколько потоков, содержащих данные. Проводник
и большинство популярных файловых менеджеров ограничены работой лишь сглавным потоком
(не имеющим имени), представляющим собой основное содержимое файла. Потоки могут использоваться для хранения метаданных файла, таким образом они использовались в Windows 2000
, насколько мне известно.

В Windows 7
альтернативные потоки NTFS
, наличествующие у файла, штатными средствами не увидеть. И напрасно: адски хитрые вирусы, например, могут писать себя в потоки какого-нибудь вполне безобидного файла. Удалив файл с потоками, содержащими объёмные данные можно обнаружить, что места освободилось значительно больше, чем занимал файл по мнению Проводника
.
Для просмотра имеющихся потоков мы будем пользоваться консольной утилитой , созданной небезызвестным Марком Руссиновичем.

Файловые записи

Структурно файловая запись состоит из заголовка (header) и одного или нескольких атрибутов (attributes) произвольной длины, завершаемых маркером конца (end marker) — четырехбайтным шестнадцатеричным значениемFFFFFFFFh. Несмотря на то что количество атрибутов и их длина меняются от одной файловой записи к другой, размер самой структурыFILE Record строго фиксирован. В большинстве случаев он равен 1 Кбайт (это значение хранится в файле$boot, причем первый байт файловой записи всегда совпадает с началом сектора).

Если реальная длина атрибутов меньше размеров файловой записи, то ее «хвост» просто не используется. Если же атрибуты не умещаются в отведенное им пространство, создается дополнительная файловая запись (extra FILE Record), ссылающаяся на свою предшественницу. Так выглядит структура файловой записи:

FILE Record

Header;Заголовок

Attribute1;Атрибут1

Attribute2;Атрибут2

…;…

AttributeN;АтрибутN

EndMarker(FFFFFFFFh);Маркерконца

Первые четыре байта заголовка заняты «магической последовательностью»FILE, сигнализирующей о том, что мы имеем дело с файловой записью типаFILE Record. При восстановлении сильно фрагментированного файла$MFT это обстоятельство играет решающую роль, поскольку позволяет отличить сектора, принадлежащие MFT, от всех остальных секторов.

Следом за сигнатурой идет 16-разрядный указатель, содержащий смещение последовательности обновления (update sequence). Под «указателем» здесь и до конца раздела подразумевается смещение от начала сектора, отсчитываемое от нуля и выраженное в байтах. Последовательность обновления хранится по смещению002Dh, и поэтому сигнатура приобретает следующий вид:FILE—x00.

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

Смещения последующих атрибутов (если они есть) определяются путем сложения размеров всех предыдущих атрибутов (размер каждого из атрибутов содержится в его заголовке) со смещением первого атрибута. За концом последнего атрибута находится маркер конца — значениеFFFFFFFFh.

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

16-разрядное поле флагов, находящееся по смещению16h байт от начала сектора, в подавляющем большинстве случаев принимает одно из следующих трех значений:00h — данная файловая запись не используется или ассоциированный с ней файл или каталог удален,01h — файловая запись используется и описывает файл,02h — файловая запись используется и описывает каталог.

64-разрядное поле, находящееся по смещению20h байт от начала сектора, содержит индекс базовой файловой записи. Для первой файловой записи это поле всегда равно нулю, а для всех последующих, расширенных записей — индексу первой файловой записи. Расширенные файловые записи могут находиться в любых областях MFT, не обязательно расположенных рядом с основной записью. Следовательно, необходим какой-то механизм, обеспечивающий быстрый поиск расширенных файловых записей, принадлежащих данному файлу (просматривать всю MFT было бы слишком нерационально). Этот механизм существует, и основан он на ведении списков атрибутов ($ATTRIBUTE_LIST). Список атрибутов представляет собой специальный атрибут, добавляемый к первой файловой записи и содержащий индексы расширенных записей.

Другие примеры практического применения ADS

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

OneDrive

OneDrive использует ADS с именем ms-properties для хранения каких-то своих метаданных. В папке с черновиками и опубликованными статьями блога я выполнил команду, которая находит все файлы с ADS, исключая файлы только с безымянным потоком:

gci -recurse | % { gi $_.FullName -stream * } | where stream -ne ':$Data'

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

Вредоносные программы

Скрытые от глаз пользователя ADS очень удобны для маскировки вирусов. Поискав alternate data stream в энциклопедии Microsoft по вредоносным программам, вы упретесь в лимит выдачи результатов. И там полно вирусов с нашумевшими именами!

Что такое «альтернативные данные»

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

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

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

S&P Global также поставляет аналитические услуги для товарных бирж, и ИТ-директору приходится постоянно думать, как с помощью альтернативных источников данных предложить заказчикам дополнительные сведения, как объединять различные сведения, чтобы дать клиентам информацию, которую бы они больше нигде получить не смогли.

Скажем, у S&P Global есть сведения о том, что нефтеперерабатывающий завод в Роттердаме может производить 100 тыс. баррелей нефтепродуктов в день. Но из-за дефицита поставок перерабатывает примерно 70 тыс. баррелей, то есть доступны свободные мощности еще на 30 тыс. Что произойдет после того, как в порт вошел нефтяной танкер с 30 тыс. баррелей? «Если отчет о доступной мощности завода – недельной давности, то мы не будем знать, что только что произошла разгрузка нефти, – поясняет Натан. – То есть традиционные данные устарели. И здесь пригодится такой источник альтернативных данных, как спутниковая съемка. Если проанализируем снимки со спутника наряду с другими источниками, то получим более точную картину запасов и производства почти в реальном времени».

Альтернативные потоки данных

Несмотря на то, что об этом довольно регулярно говорят в сообществе криминалистов, альтернативные потоки данных (ADS) не являются широко известной особенностью файловой системы NTFS и официально хорошо не документированы. ADS впервые была внедрена в Windows NT 3.1 для обеспечения совместимости с Иерархической файловой системой (HFS), разработанной в то время для систем Macintosh. Причина этого была связана с тем, как HFS хранит данные, используя два основных компонента; fork и форк. В HFS разветвление данных включало фактические данные, а разветвление ресурсов использовалось операционной системой хоста для интерпретации данных. Эта функциональность аналогична расширениям файлов в системах Windows.

Альтернативный поток данных в файловой системе Windows NTFS был разработан, чтобы играть роль разветвителя ресурсов для HFS; предоставляя Windows способ интерпретации данных на томах HFS. Имейте в виду, что все файлы в NTFS состоят по крайней мере из одного видимого потока данных, обычно называемого атрибутом MFT или «неназванным потоком данных».

ADS — это просто еще один поток данных, прикрепленный к данному файлу, который скрыт от пользователя и даже от таких программ, как Windows Explorer. Некоторые файлы в системах Windows обычно включают в себя несколько потоков данных, например, для хранения метаданных. Например, документ Microsoft Word часто содержит метаданные (автор, количество слов, номер страницы и т.д.), Которые прикрепляются к документу через ADS. При понимании рекламы проще думать о ней как о скрытых файлах, которые «прикреплены» к видимым файлам.

Злоупотребление альтернативными потоками данных

Возможность добавления другого потока данных в любой файл в NTFS, который не только скрыт от пользователя, но и трудноуловим для программ безопасности, несет в себе высокий потенциал злоупотреблений. Тестировщики на проникновение иногда используют рекламу, чтобы обойти ожидаемое поведение в приложениях, которые не учитывают входные данные, включая альтернативный поток данных. Историческая уязвимость, связанная со злоупотреблением рекламой, была обнаружена в CVE-1999-0278, когда злоумышленники, использующие Internet Information Services (IIS), могли получить исходный код для файлов ASP, просто добавив строку к URL.

Альтернативные потоки данных в NTFS также обладают уникальными качествами, которые делают их желанной мишенью для злоумышленников, желающих злоупотребить ими:

  • Нет атрибутов
  • Неучтенный размер
  • Ограничений по размеру нет
  • Несколько потоков на файл
  • Может повлиять на каталоги и диски
  • К ним трудно получить непреднамеренный доступ
  • Часто остается незамеченным программами безопасности

Распространенный метод, который злоумышленники используют для злоупотребления альтернативными потоками данных, заключается в добавлении исполняемой полезной нагрузки к любому файлу в файловой системе NTFS, которая затем может быть выполнена с помощью специальных команд без ведома пользователей. Удалить вредоносную РЕКЛАМУ так же просто, как удалить файл, к которому она прикреплена

Однако, если РЕКЛАМА прикреплена к важному системному файлу, такому как корневой каталог файловой системы, это будет намного сложнее надежно удалить

Актуальность для судебной экспертизы

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

  • РЕБЯТА
  • LNS
  • PowerShell
  • Стримы

Эти инструменты в основном основаны на Windows, и некоторые из них должны выполняться в оперативной файловой системе, что может считаться ненадежным с точки зрения судебной экспертизы, особенно если они используются в реальном сценарии судебной экспертизы. После изучения роли потоков данных в NTFS мне, естественно, стало любопытно, смогу ли я обнаружить и криминалистически извлечь альтернативные потоки данных с помощью Linux. Это наблюдение и последующее исследование рекламы легли в основу гипотезы, исходя из которой я провел эксперимент, проверяя, способны ли инструменты Linux обнаруживать РЕКЛАМУ в файле изображения NTFS.

Дискуссия и опрос

Мы с долго не могли выйти на связь друг с другом, потому что оба пытались сделать это через… Skype :) Может, дело в том, что Артём ест догфуд своей компании, а у меня клиент на конкурирующей платформе. Но опыт мне подсказывает, что проблема в скатившемся ниже плинтуса качестве Skype, начиная от невыносимых тормозов на Windows Phone и заканчивая непредсказуемостью доставки уведомлений о пришедших сообщениях на любых платформах.

Я давно бы ушел со Skype, если б не ряд контактов и родители. С друзьями мы успешно общаемся в WhatsApp, но у него нет нормального «десктопного» клиента. Telegram выглядит здорово, но там пусто (что поправимо) и нет голосовых звонков (что не годится). Viber, вроде удовлетворяющий всем требованиям, как-то не закрепился.

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

Результаты голосования утеряны в связи с прекращением работы веб-сервиса опросов.

  1. Начиная с Windows 8, в официальной русской терминологии наряду с переводом «альтернативный» также фигурирует «дополнительный».

Какие действия предпринять

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

Что вы можете сделать, так это всегда проявлять осторожность в Интернете

Вот некоторые меры предосторожности, которые вы можете предпринять:

1. Используйте сложные пароли

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

2. Установите антивирусное программное обеспечение

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

3. Очистите свой компьютер

Полезно регулярно чистить компьютер, чтобы удалить любые подозрительные элементы, такие как вредоносные Zone.Identifiers, скрывающиеся в ваших файлах и папках. И лучший способ сделать это — использовать инструмент восстановления ПК, например Ремонт ПК Outbyte. Этот инструмент может эффективно удалять ненужные файлы, такие как временные файлы пользователя, поврежденные файлы Центра обновления Windows, кэш веб-браузера и многое другое, которые мешают работе вашего компьютера.

4. Будьте начеку

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

5. Будьте умнее

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

Альтернативные данные и ИТ-директор

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

Для быстрого запуска проекта в области альтернативных данных можно воспользоваться уже готовым решением. Так поступили в S&P Global, когда Platts, дочернее предприятие компании, приобрело cFlow – инструментарий для интерпретации спутниковой съемки. CFlow предлагает средства наглядного представления данных, позволяющие следить за изменениями торговых потоков по маршрутам следования судов, предоставляет сведения об объеме и характере груза танкеров.

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

– Martha Heller. What is ‘alternative data’ and how can you use it? CIO. JAN 3, 2017

Выбор 

Анализ данных

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

Первоначально, до того, как я обнаружил, что расширенные атрибуты смонтированного раздела NTFS могут быть прочитаны с помощью , я собирался использовать команды PowerShell. В 2016 году PowerShell был выпущен Microsoft с открытым исходным кодом и с тех пор доступен в их репозитории на GitHub. Интересно, что этот репозиторий также содержит версии PS, подходящие для дистрибутивов Linux, таких как; Arch, Debian, Ubuntu, CentOS, RHEL и Fedora.

Установка пакета RPM в моем дистрибутиве Fedora была простой, и я мог вызвать приглашение PowerShell с помощью команды . Однако команды PS, которые я запускал во время эксперимента, работали не так, как предполагалось, поскольку соответствующим командам ( и ) не хватало возможности взаимодействовать с потоками данных. Я все еще не уверен, почему именно это происходит, но я предполагаю, что версия PowerShell, доступная для Linux, вероятно, старше версии 3, которая требуется для взаимодействия с ADS.

Я хорошо знаю, что обычное монтирование раздела NTFS с помощью команды Linux будет работать так же хорошо, как прямое указание драйвера NTFS для Linux. Использование обычной команды не повредит, поскольку расширенные атрибуты, показывающие РЕКЛАМУ, все равно будут присутствовать, независимо от того, используется драйвер или нет. Однако я решил явно использовать драйвер Linux NTFS по следующим причинам; Я мог бы указать нужный мне атрибут в выходных потоках, а большие файлы ADS сообщают об ошибке, если вы пытаетесь прочитать их содержимое без драйвера NTFS. В целом, я использовал драйвер NTFS, чтобы упростить управление выводом рекламы и повысить его надежность.

Использование PowerShell для поиска потоков

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

Откройте командную строку PowerShell и при желании запустите следующую команду (это подавляет, возможно, раздражающий доступ к файлу доступа к сообщениям об ошибках):

Далее запустите следующие команды:

Для текущего тома это возвращает список всех файлов, содержащих один или несколько потоков.Этот трубопровод PowerShell объясняется следующим образом:

  • Get -childitem -path \ -recurseНачиная с корневого каталога (папка), получает все файлы в томе.
  • Get -item -stream *Получает все потоки данных, связанные с файлом.Файлы (неназванные потоки данных) возвращаются »: $ Data» в качестве значения свойства потока.Streams (названные потоки данных) вернет имя потока в качестве значения свойства потока (и «: $ data не будет возвращено).
  • Где -объект поток -ne ‘: $ data’Удаляет все файлы, свойство потока,: $ Data », тем самым оставляя только файлы, содержащие один или несколько именованных потоков.
  • Конверт-патВыходы красиво отформатированные пути файлов.

Разделяемые данные

Задача, которую нужно решить при совместном использовании данных заключается в обеспечении атомарности (неделимости) изменения данных, что иногда обозначается термином «транзакция». Иными словами, необходим взаимно-исключающий доступ к данным — недопустимо, чтобы один поток читал данные, в то время как другой поток их изменял. Наиболее простое и эффективное средство — это использование критической секции. Delphi определяет оболочку для критической секции — класс TCriticalSection в модуле SyncObjs. Модуль GsvThread имеет идентичный класс TGsvLatch, отличающийся от TCriticalSection только именами методов (вместо имени Enter используется Lock, а вместо Leave — Unlock).

Использовать критическую секцию (защелку) очень просто:

Latch.Lock;
try
  
  ....
finally
  Latch.Unlock;
end;

Блок try-finally позволяет разблокировать критическую секцию даже при возникновении исключительной ситуации. Опускать try-finally допустимо только при очень простом коде, в котором ошибка исключена

У критической секции есть одно очень важное достоинство — высокая эффективность, поскольку критическая секция — это не объект ядра операционной системы, а запись (record) в адресном пространстве приложения, именно поэтому критическая секция решает задачу синхронизации потоков только в рамках одного приложения. Альтернативное и более универсальное средство — мьютекс, более чем на порядок уступает критической секции по эффективности

В качестве недостатков критической секции можно отметить следующие:

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

Последний недостаток можно исправить, если применить более сложную технику, основанную не на критических секциях, а на событиях — это делает стандартный Delphi-класс TMultiReadExclusiveWriteSynchronizer.

Задача реализации взаимоисключающего доступа всегда сталкивается с принципиальной проблемой взаимной блокировки при одновременном захвате более чем одного ресурса. Предположим, что существуют два потока A и B, а также два совместно используемых ресурса R1 и R2. Далее предположим такой сценарий: поток A захватывает ресурс R1, а затем ресурс R2 (не освобождая при этом ресурса R1). Поток B захватывает ресурc R2, а затем ресурс R1. Если после того как поток A захватил R1, поток B захватит ресурс R2, то оба потока попадут в состояние дедлока (взаимоблокировки) из которого никогда не выйдут. Обнаружение и предотвращение дедлока в общем случае весьма сложная задача, поэтому требуется очень аккуратно программировать ситуацию захвата нескольких ресурсов: либо отказаться от множественного захвата, введя поток-посредник, либо захватывать ресурсы всегда только в одном и том же порядке.

Несколько уменьшить трудности, связанные с критическими секциями, можно, если инкапсулировать разделяемые данные в специально разработанных классах. Например, можно представить себе такую реализацию разделяемого списка — отдельно список TList и отдельно критическая секция для его защиты. Поскольку каждую операцию со списком требуется выполнять внутри критической секции, то программировать такие разделяемые данные очень неудобно и опасно — легко пропустить ограничение операции критической секцией. Если же объединить TList и критическую секцию в одном классе и защитить каждую операцию критической секцией, то подобных ошибок можно избежать. Именно такая цель была поставлена при реализации потокозащищенного списка в стандартном Delphi-классе TThreadList. К сожалению, таких потокозащищенных классов в Delphi совсем немного и в большинстве случаев их приходится кодировать самостоятельно.

Понравилась статья? Поделиться с друзьями:
Jsk-oren
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: