Файловый дескриптор (file descriptor) — это уникальный числовой идентификатор, который операционная система назначает каждому открытому файлу или ресурсу (сокету, каналу, устройству). Файловые дескрипторы в Linux и других UNIX-подобных операционных системах (ОС) очень важны, хотя используются и в Windows. Они помогают управлять вводом-выводом данных, позволяя программам обращаться к файлам и другим объектам через системные вызовы.
- Для чего нужен файловый дескриптор?
- 1. Обеспечивают взаимодействие между программами и ОС
- 2. Управляют открытыми файлами и ресурсами
- 3. Унифицируют работу с разными типами данных
- 4. Перенаправляют стандартных потоков (stdin, stdout, stderr)
- 5. Работают с многопоточной обработкой данных
- 6. Контролируют утечки файловых дескрипторов
- Файловый дескриптор в программировании: работа с разными ОС
- Заключение
Для чего нужен файловый дескриптор?
Файловый дескриптор можно сравнить с номерком в гардеробе: вместо сданного пальто посетитель получает номер, по которому забирает одежду. Аналогично операционная система дает программе дескриптор, который используется для работы с конкретным файлом. Файловые дескрипторы в Linux и других ОС решают несколько задач.
1. Обеспечивают взаимодействие между программами и ОС
Когда программа открывает файл, она запрашивает у операционной системы доступ к нему. В ответ ОС выделяет файловый дескриптор, который программа использует для выполнения операций с этим файлом.
int fd = open("example.txt", O_RDONLY); // Открытие файла только для чтения
if (fd == -1) {
perror("Ошибка открытия файла");
return 1;
}
Это код на C/C++ для открытия файла, типичный в UNIX-подобных системах.
Важно: файловый дескриптор может быть только положительным числом. Если число отрицательное, как в примере, появится сообщение об ошибке.
2. Управляют открытыми файлами и ресурсами
В операционной системе количество одновременно открытых файлов ограничено. Файловые дескрипторы позволяют системе отслеживать, какие из них открыты и какие операции с ними выполняются. Приведем классический пример: какой-то из файлов занимает слишком много места и мешает работе других программ. Через таблицу файловых дескрипторов можно увидеть, какой именно это файл, и изменить его состояние, чтобы продолжить работу.
3. Унифицируют работу с разными типами данных
В Linux все является файлом, включая сетевые соединения, устройства и каналы межпроцессного взаимодействия. Файловые дескрипторы позволяют использовать единый интерфейс для работы с разными типами ресурсов.
int sockfd = socket(AF_INET, SOCK_STREAM, 0); // Создание TCP-сокета
if (sockfd == -1) {
perror("Ошибка создания сокета");
return 1;
}
Это код на C/C++ для создания сетевого TCP-сокета:
- socket() — системный вызов для создания нового сокета.
- AF_INET указывает на использование IPv4.
- SOCK_STREAM означает TCP-протокол (надежная потоковая передача данных).
- Результат сохраняется в sockfd (файловый дескриптор сокета).
Читайте также:
Компьютерная сеть: что это такое, основные принципы
4. Перенаправляют стандартных потоков (stdin, stdout, stderr)
В UNIX-подобных системах три стандартных потока ввода-вывода:
- stdin (файловый дескриптор 0) для ввода данных.
- stdout (дескриптор 1) для вывода обычных данных.
- stderr (дескриптор 2) для вывода сообщений об ошибках.
Файловые дескрипторы позволяют изменять стандартные потоки ввода и вывода. Например, можно перенаправить вывод программы в файл:
ls > output.txt 2> errors.txt
Здесь stdout (1) перенаправляется в output.txt, а stderr (2) — в errors.txt.
5. Работают с многопоточной обработкой данных
Серверные приложения, например веб-серверы, часто работают с сотнями соединений одновременно. Файловые дескрипторы позволяют обрабатывать множество подключений, отслеживать их состояние и закрывать неиспользуемые соединения.
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(sockfd, &readfds);
select(sockfd + 1, &readfds, NULL, NULL, NULL); // Ожидание активности на сокете
Это код для мониторинга активности на сокете через select(), где fd_set readfds — это набор файловых дескрипторов для отслеживания. Это классический способ ожидания данных на сокете без постоянного опроса (polling).
6. Контролируют утечки файловых дескрипторов
В системе можно установить ограничение на количество файловых дескрипторов. Это ограничение проверяется командой:
ulimit -n
Если программа открывает файлы, но не закрывает их, возникает утечка дескрипторов, что может привести к нехватке ресурсов. Отладить утечки можно с помощью следующих команд:
- lsof — показывает список открытых файлов.
- strace — отслеживает системные вызовы программы.
Также интересно:
Что такое DFS и для чего он используется?
Файловый дескриптор в программировании: работа с разными ОС
Файловые дескрипторы используются в UNIX-подобных системах и в OS Windows по-разному. Многие современные языки программирования, такие как Python, Java и другие, абстрагируют эти различия, предоставляя единый кросс-платформенный интерфейс для работы с файлами. Работа с дескрипторами часто скрыта за высокоуровневыми абстракциями.
Python:
with open('file.txt') as f: # Объект файла скрывает дескриптор
data = f.read()
Java:
try (FileInputStream fis = new FileInputStream("file.txt")) {
// Класс FileInputStream управляет дескриптором
}
Node.js:
const fs = require('fs');
fs.readFile('file.txt', (err, data) => {
// Асинхронное API скрывает работу с дескрипторами
});
Go:
file, err := os.Open("file.txt")
defer file.Close()
// os.File инкапсулирует дескриптор
Во всех примерах можно получить доступ к нативному дескриптору, если нужно работать с низкоуровневой операцией или системным вызовом. Вот как это сделать:
- Python: f.fileno().
- Java: getFD().getFD().
- Node.js: fd свойство в некоторых объектах.
- Go: file.Fd().
Заключение
Файловые дескрипторы лежат в основе взаимодействия программ с файлами и устройствами ввода-вывода. Хотя современные языки программирования скрывают работу с дескрипторами за удобными абстракциями, разработчикам стоит разобраться в их работе, особенно при создании системных программ, сетевых приложений или при оптимизации производительности. Детальнее узнать о том, как используются файловые дескрипторы в программировании, можно на курсе Хекслет «Python: основы текстового ввода-вывода». Студенты учатся взаимодействовать с файлами и файловой системой, используя разные режимы и менеджеры контекста. Этот материал также пригодится тем, кто изучает Python.
Если вы столкнулись с ситуацией, когда Windows не находит указанный файл, хотя теоретически он должен существовать, или файл не открывается – не беспокойтесь: есть несколько способов решения проблемы, будь то файл с текстом статьи для сайта, видеоролик, логотип и так далее.
1. Проверьте правильность пути к файлу
Убедитесь, что название файла и путь к нему указаны правильно. Кроме того, некоторые программы при использовании файлов требуют, чтобы файл находился на том же диске, что и программа (как правило, это старые программы или программы, запускаемые с помощью командной строки, например, TAR – архивирование данных). Если файл находится на другом диске, может потребоваться изменить диск или указать полный путь к файлу.
Если после этого вы все еще не можете найти файл, попробуйте использовать поиск по имени файла или по расширению файла. Также необходимо проверить, что файл не защищен от записи и не используется в данный момент другим приложением (смотрим на панели задач, какие приложения запущены у вас на компьютере и не открыт ли в данный момент этот файл в другом приложении.
Если файл на флешке или на SD-карте, проверьте, нет ли на корпусе флеш-накопителя специального небольшого переключателя, блокирующего запись на накопитель, – он всегда присутствует на карточках формата SD, несколько реже встречается на типичных USB-накопителях. Нередки случайные переключения, когда флешка носится в кармане.
2. Проверьте наличие файла в «Корзине»
Удаленный файл, если он вдруг обнаружился в «Корзине», можно легко восстановить. Для этого перетащите его из «Корзины» на Рабочий стол.
Также можно кликнуть на файл в «Корзине» правой кнопкой мышки и выбрать команду «Восстановить». Тогда файл вернется в ту папку, из которой был удален.
3. Проверьте, не заблокирован ли файл антивирусом или другим пользователем
Если файл заблокирован антивирусом, то отключите защиту и попробуйте открыть его еще раз. Проверьте в антивирусной программе раздел «Карантин» – не находится ли файл там.
В случае, если файл все еще не открывается, перенесите его на другой компьютер и откройте его там.
Также файл может быть заблокирован другим пользователем (при общем доступе к папке на сервере), и стоит попросить его закрыть файл на своем компьютере. Система Windows позволяет одновременно запускать на компьютере сеансы от разных пользователей, при этом может оказаться, что разные пользователи работают с одним и тем же файлом. Чтобы посмотреть активные сеансы пользователей, нужно открыть диспетчер задач на вкладке «Пользователи», там же можно посмотреть, с какими программами работает тот или иной пользователь.
4. Проблема с компьютером
Если после перезагрузки, с которой стоит начинать решение любой проблемы, файл не находится, то, возможно, причина кроется в неправильной конфигурации системы. Необходимо проверить настройки и при необходимости скорректировать их.
Часто бывает, что в системе могут быть не настроены пути среды PATH. Когда операционная система запускает ту или иную программу, она стартует новый процесс и передает ему информацию о настройках среды и окружения. PATH переводится как «тропа» или «путь», что прекрасно объясняет, почему вообще ОС может не видеть тот или иной файл. «Тропы» должны быть проложены, так сказать. Для проверки и настройки путей нужно сделать следующие шаги.
- Нажмите клавиши Win+R на клавиатуре (в Windows 11 и Windows 10 можно нажать правой кнопкой мыши по кнопке Пуск и выбрать пункт «Выполнить»), введите sysdm.cpl в окно «Выполнить» и нажмите Enter.
- Перейдите на вкладку «Дополнительно» и нажмите кнопку «Переменные среды».
- Вы увидите список переменных среды пользователя (вверху) и системных переменных (внизу). PATH присутствует в обоих расположениях.
- Если вы хотите добавить свой путь в PATH только для текущего пользователя, выберите «Path» в верхней части и нажмите «Изменить» (или дважды нажмите по переменной PATH в списке). Если путь актуален для всех пользователей — то выполните те же действия в нижней части.
- Для добавления нового пути нажмите «Создать», а затем впишите новый путь, который требуется добавить в переменную PATH в новой строке. Вместо нажатия «Создать» можно дважды кликнуть по новой строке для ввода нового пути.
- После ввода всех необходимых путей нажмите «Ок» — ваша папка или папки добавлены в переменную PATH.
Если это не помогло, то необходимо проверить компьютер на наличие вирусов и других проблемных программ – некоторые вредоносные программы могут прятать или маскировать файлы пользователя. Для этого всегда можно воспользоваться следующими программами:
- ESET Online Scanner,
- F-Secure Online Scanner,
- Kaspersky Security Scan.
Не забудьте проверить наличие обновлений для операционной системы, которые могут улучшить ее работу и исправить ошибки. Для этого:
- нажимаем кнопку «Пуск» в Windows,
- набираем текст «проверить наличие обновлений»,
- в списке выбираем «Проверить наличие обновлений»,
- откроется новое окно в котором будет представлена подробная информация о доступных обновлениях системы, нажимаем кнопку «Проверить наличие обновлений».
Далее остается только согласиться на установку обновлений.
5. Проверьте, не поврежден ли файл
Если вы заметили какие-либо повреждения (файл не открывается, вы получили сообщение об ошибке, содержимое представлено в неестественном виде и т.д.), воспользуйтесь специальными программами для восстановления поврежденных файлов (такими как: Recuva, EaseUS Data Recovery Wizard, Wise Data Recovery, MiniTool Power Data Recovery и подобных). Также убедитесь в том, что вы используете последнюю версию программы для открытия данного типа файлов (как правило, нужно посмотреть пункт «Обновления» в меню «О программе»).
Если вы проделали все вышеперечисленные действия, но проблема не была решена, то имеет смысл попробовать восстановить файл из резервной копии. Для этого нужно:
- исследовать прежние версии в проводнике Windows,
- поискать файл и его версии на Яндекс Диске или Google Диске,
- поискать файл и его версии на OneDrive.
В этом случае необходимо убедиться (смотрим дату изменения файла и содержание), что резервная копия была создана перед тем, как произошла потеря данных, иначе толку от восстановления не будет.
Заключение
Эксперты в области компьютерной техники и программного обеспечения давно знакомы с проблемой пропажи и нечитаемости файлов в Windows. Их чек-лист и приведен в статье.
Но если после всех этих действий вы так и не решили проблему, обратитесь все же к специалисту по информационным технологиям – случаи бывают разные и «на месте» разобраться с ними бывает проще.
Читайте также:
Как зайти в Инстаграм* через браузер в 2023 году: 5 способов
Умные таблицы в Excel: что это, как сделать и как все вернуть
Озон Селлер — полная инструкция для продавцов на 2023 год
Вопрос читателя сайта:
Привет, админ! Вопрос. 30 июля обновил свою Windows 8.1 до Windows 10. Получается, прошло уже три месяца её активного использования. Система с самого начала работала нормально, но заглючила, когда установил в неё много различного софта и игр (люблю забивать хламом компьютер). Короче, основные проблемы такие. Иногда Windows 10 может загрузиться с ошибкой, приходится выключать ноутбук и опять включать. Вдобавок не работает восстановление системы, при выключении компьютера происходит долгое завершение работы, не запускается браузер Internet Explorer и не открывается оснастка «Управление дисками». Как вы думаете, может сразу переустановить Windows 10 или попытаться как-то восстановить систему?
Проверка целостности системных файлов Windows 10
Привет всем. Переустановить Windows мы всегда успеем, сначала нужно попробовать одно хорошее средство и если уж оно не вернёт нашей операционной системе прежнюю надёжность, то переустановим её заново. В Windows 10, как и в других предыдущих операционках от Майкрософт, есть прекрасное средство проверки целостности компонентов, способное выполнять поиск поврежденных системных файлов и заменять их рабочими версиями в случае необходимости.
Примечание: Многие читатели часто интересуются, а где система берёт оригинальные версии файлов? Ответ. Файлы хранилища компонентов Windows 10 располагаются в папке C:\Windows\WinSxS, именно здесь винда берёт нормальный системный файл и заменяет им повреждённый.
Запустить средство проверки системных файлов очень легко. Открываем командную строку от имени администратора и вводим команду sfc /scannow, жмём Enter на клавиатуре.
Обычно проверка продолжается не больше 15 минут. В нашем случае всё хорошо и мы видим сообщение: Защита ресурсов Windows не обнаружила нарушений целостности. Это значит, что наша Windows 10 в идеальном состоянии.
Если же нарушения в компонентах Windows будут выявлены, то система выдаст такое предупреждение: Защита ресурсов Windows обнаружила поврежденные файлы и успешно их восстановила.
Что делать, если средство проверки целостности системных файлов не может восстановить повреждённые компоненты Windows
Друзья, в некоторых случаях мы получим такое сообщение: Программа защиты ресурсов Windows обнаружила повреждённые файлы, но не может восстановить некоторые из них.
Это значит, что хранилище оригинальных компонентов Windows 10 повреждено и оно препятствует восстановлению системных файлов при помощи утилиты sfc.exe. В этом случае нужно сначала восстановить само хранилище компонентов Windows 10, а затем запускать средство проверки системных файлов sfc.exe.
Восстанавливать хранилище компонентов будем с помощью средства Deployment Image & Servicing Management (Dism). Dism — это система обслуживания образов Windows.
Сначала проверим целостность хранилища оригинальных компонентов Windows 10 командой
Dism /Online /Cleanup-Image /ScanHealth
Как видим, хранилище компонентов подлежит восстановлению,
значит вводим следующую команду:
Dism /Online /Cleanup-Image /RestoreHealth
При выполнении данной команды произойдёт восстановление хранилища компонентов с помощью средства Dism, использующего для получения отсутствующих файлов — Центр обновления Windows.
Восстановление выполнено успешно. Повреждения хранилища компонентов было устранено.
Хранилище компонентов мы восстановили, теперь во второй раз запускаем проверку целостности системных файлов Windows 10 командой sfc /scannow.
В этот раз программа защиты ресурсов Windows успешно восстановила повреждённые системные файлы.
Друзья, если при проверке целостности системных файлов Windows 10 командой sfc /scannow вас будут преследовать различные ошибки, то примените для восстановления систему Dism или расширяемое средство автоматизации PowerShell, всё написано в нашей статье «Восстановление повреждённого хранилища компонентов Windows 10 с помощью PowerShell». И ещё для восстановления повреждённого хранилища системных компонентов вы можете воспользоваться программой Dism++, детали смотрите в статье «Восстановление повреждённого хранилища компонентов Windows с помощью программы Dism++«.
Примечание: друзья, если у вас не получается с помощью Dism восстановить целостность системных файлов, пробуйте это сделать путём обновления Windows 10 с сохранением установленных программ и личных файлов.
Всё рассмотренное выше мы проделали в работающей Windows 10, но бывают случаи, когда система не загружается именно из-за некорректных системных файлов, тогда запускать утилиту sfc.exe нужно в среде восстановления Win 10, как это сделать, читайте в следующей статье.
Статья по этой теме: Что делать, если при запуске sfc/scannow выдается ошибка «Защита ресурсов Windows не может выполнить запрошенную операцию»
Уязвимость BDU:2025-03926 (CVE-2025-29824) связана с ошибкой в драйвере Common Log File System (CLFS), который отвечает за управление структурированными лог-файлами в Windows. Уязвимость возникает из-за некорректной обработки объектов памяти при создании или модификации лог-файлов. Атакующий может создать специально сформированный лог-файл, который при обработке драйвером приводит к переполнению буфера или использованию неинициализированной памяти, что позволяет выполнить произвольный код в контексте системных привилегий (SYSTEM).
CVSS 3.0: AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Технические детали уязвимости
-
Условия эксплуатации:
-
Локальный доступ к системе (атакующий должен иметь возможность выполнить код с правами стандартного пользователя).
-
Отсутствие обновления безопасности.
-
Активный драйвер CLFS (по умолчанию включен в Windows 10/11 и серверных редакциях).
Пример сценария: злоумышленник загружает вредоносный скрипт через фишинговое вложение, получает доступ к системе через RDP или физически, а затем запускает эксплойт.
-
-
Механизм атаки:
Эксплойт использует уязвимый методClfsCreateLogFile
илиClfsWriteLog
для манипуляции метаданными лог-файла. Например, при создании лог-файла атакующий подменяет структуруCLFS_LOG_BLOCK_HEADER
, что приводит к повреждению памяти ядра.Пример псевдокода:
// Создание malicious лог-файла HANDLE hLog = CreateFile("malicious.blf", ...); CLFS_LOG_BLOCK_HEADER* block = MapViewOfFile(hLog, ...); // Подмена размера блока для переполнения block->cbOffset = 0x1000; // Некорректное значение block->eBlockType = 0xBAD; // Невалидный тип // Вызов уязвимой функции DeviceIoControl(hDriver, IOCTL_CLFS_WRITE, block, ...);
-
Эскалация привилегий:
После переполнения драйвер CLFS обращается к поврежденным структурам, что позволяет атакующему перезаписать указатели в памяти ядра. Это может быть использовано для подмены токена процесса, например, замены токена пользователя на SYSTEM-токен в структуре_EPROCESS
.
Где используется CLFS?
Драйвер CLFS интегрирован в компоненты Windows:
-
Система журналирования Event Viewer.
-
Службы Active Directory.
-
Приложения, использующие API
WriteLog()
илиCreateLogFile()
, например, базы данных или enterprise-решения для логирования.
Способы защиты
-
Установка обновлений.
-
Временная митигация:
-
Отключение драйвера CLFS через PowerShell.
-
Ограничение прав доступа к службе через групповые политики.
-
-
Мониторинг:
-
Аудит вызовов
clfs.sys
в Sysmon. -
Блокировка создания файлов с расширением
.blf
в ненадежных каталогах.
-
При разработке приложений на C++ для Windows разработчики неизбежно и довольно часто встречаются с такой неэкзотической сущностью как дескриптор. Их в Windows великое множество, при этом каждый обязательно после завершения работы с ним обязательно должен быть закрыт соответствующей функцией. Конечно, система после завершения процесса сама подчищает за ним, но с правильностью такого подхода лично я не согласен. Тем, кто пишет исключительно на C, позавидовать в этом случае непросто. Зато для разработчиков C++ есть масса облегчающих жизнь механизмов.
В данной статье я хочу рассмотреть универсальный класс, написанный мной, и рассчитаный на оборачивание практически любого Windows-дескриптора (возможно, я чего-то не знаю?).
Что представляют собой дескрипторы? С точки зрения Windows их можно разделить на дескрипторы объектов ядра и не-ядра, нас же интересует работа с ними на уровне C++, и, чтобы написать универсальный класс-обёртку, нам понадобится выявить их общие свойства. Далее я буду использовать словосочетание «освободить дескриптор», которое на самом деле должно звучать так: «освободить объект Windows через его дескриптор». Это чтобы избежать путаницы в терминологии — под объектом буду подразумевать объект языка C++.
Расммотрим жизненный цикл дескриптора:
1. Создание (инициализация). Все функции (или большинство), возвращающие дескриптор, в случае ошибки присваивают ему значение 0 (NULL) или -1 (0xFFFFFFFF, INVALID_HANDLE_VALUE). Значения больше ноля — успех.
2. Использование.
3. Освобождение, когда дескриптор более не нужен.
Последний пункт интересует больше всего — как освобождать дескриптор, когда сущесвует такое множество функций для этого? Могу перечислить несколько по памяти (которая в голове): CloseHandle, FindClose, closesocket, InternetCloseHandle и другие.
Ниже перечислены сигнатуры этих функций:
BOOL __stdcall CloseHandle( HANDLE );
BOOL __stdcall FindClose( HANDLE );
int __stdcall closesocket( SOCKET );
BOOL __stdcall InternetCloseHandle( HINTERNET );
Каждая из них принимает тип дескриптора и возвращает некое целое. Осталось только разобраться с тем, как научить наш класс правильно освобождать дескриптор — для этого идеально подойдёт всеядный reinterpret_cast.
Собственно, сам класс.
template class AutoHandle
{
NON_COPYABLE( AutoHandle );
public:
typedef BOOL ( WINAPI * CloseProc )( THandle );
AutoHandle( THandle handle_, CloseProc close_proc_ )
: m_handle( handle_ ),
m_close_proc( close_proc_ )
{
}
~AutoHandle() throw()
{
close();
}
int close()
{
if ( !valid() )
return false;
int ret = 0;
if ( m_close_proc )
ret = static_cast( m_close_proc( m_handle ) );
m_handle = 0;
return ret;
}
THandle handle() const
{
return m_handle;
}
bool valid() const
{
return !!m_handle && ( reinterpret_cast( INVALID_HANDLE_VALUE ) != m_handle );
}
AutoHandle& operator = ( THandle rhs_ )
{
close();
m_handle = rhs_;
return *this;
}
operator bool () const
{
return valid();
}
DWORD wait( DWORD milliseconds_ = 0 )
{
return ::WaitForSingleObject( m_handle, milliseconds_ );
}
protected:
THandle m_handle;
private:
CloseProc m_close_proc;
};
Описание класса
Это шаблонный класс, принимающий в качестве параметра шаблона тип дескриптора. NON_COPYABLE - это макрос, запрещающий копирование объекта, так как он не предполагает подсчёта ссылок.
#define NON_COPYABLE( clsname ) \
private: \
clsname( const clsname& ); \
clsname& operator = ( const clsname& );
Далее идёт объявление прототипа функции, используемой для освобождения дескриптора. С его помощью можно в конструкторе указать адрес на функцию, сделав приведение в стиле reinterpret_cast. Класс снабжён функциями для передачи типа дескриптора Win32API-функциям, проверки на валидность, а также использования WaitForSingleObject. Шаблоны хороши ещё и тем, что те методы класса, сгенерированного из шаблона, которые не вызываются в клиентском коде, не компилируются. Поэтому при работе, скажем, с сокетом, если не будете делать вызова wait (а он и не рассчитан для сокетов), ошибок не будет.
Член m_handle класса объявлен защищённым, а не закрытым, неспроста - класс расширяемый. Но при этом нет смысла в виртуальном деструкторе, так как дескриптор - не та сущность, для которой актуален полиморфизм (сравните с ЦДельфин: public ЦРыба - да-да, дельфин - это рыба!). Зато мы сэкономим память за счёт того, что у нас не будет лишних указателей на виртуальные таблицы.
Небольшой пример
AutoHandle my_event( ::OpenEvent( READ_CONTROL | SYNCHRONIZE | EVENT_MODIFY_STATE,
FALSE, _T( "COOL_EVENT_SHA_LA_LA" ) ), ::CloseHandle );
if ( my_event.valid() )
return;
else
my_event = ::CreateEvent( 0, FALSE, FALSE, _T( "COOL_EVENT_SHA_LA_LA" ) );
//.......................
if ( WAIT_OBJECT_0 == my_event.wait( INFINITE ) )
{
// Дождались
}
my_event.close(); // Не обязательно
Если сигнатура функции не совпадает с CloseProc, используйте reinterpret_cast.
Вот и всё. Спасибо, что дочитали до конца :)