Сегодня 06 ноября 2026
18+
MWC 2018 2018 Computex IFA 2018
реклама
Программное обеспечение

Как получить список открытых файлов на Win9x

Автор: Ашот Оганесян

Как известно, Win32 API не содержит функцию, которая может помочь извлечь из системы список всех файлов, открытых в данный момент на локальной машине. К сожалению, документация (MSDN) содержит очень туманную и расплывчатую информацию, но одно ясно - такой список хранится в системе и мы можем его получить из User Mode, т.е. не прибегая к написанию драйвера!

Хитрость в том, что нам надо вызвать старое доброе прерывание INT21h, для этого воспользуемся законной (документированной) API-шной ф-цией DeviceIoControl. Ф-ция DeviceIoControl посылает управляющие команды напрямую указанному драйверу, тем-самым заставляя драйвер выполнять соответствующие действия. Вот прототип DeviceIoControl:

BOOL DeviceIoControl(
HANDLE hDevice,
DWORD dwIoControlCode,
LPVOID lpInBuffer,
DWORD nInBufferSize,
LPVOID lpOutBuffer,
DWORD nOutBufferSize,
LPDWORD lpBytesReturned,
LPOVERLAPPED lpOverlapped
);

Первый параметр это описатель (hDevice) устройства, файла или директории, так что получим этот описатель. Система Windows9x содержит специальный драйвер - VWIN32.VXD, он предоставляет доступ к управляющим ф-циям, за которые в MS-DOS отвечало прерывание 21h. Теперь нам надо как-то получить описатель этого драйвера что бы передать его в DeviceIoControl:

HANDLE WINAPI OpenVWin32 (void)
{

return CreateFile (TEXT("\.vwin32"), 0, 0, NULL, 0,
FILE_FLAG_DELETE_ON_CLOSE, NULL);
}

Второй параметр это управляющий код операции, которую необходимо выполнить (dwIoControlCode). Мы передадим константу VWIN32_DIOC_DOS_IOCTL, равняющуюся 1: #define VWIN32_DIOC_DOS_IOCTL 0x01

Третий параметр - указатель на буфер для входных данных (lpInBuffer). Для системы Windows 95/98 надо определить следующую структуру:

typedef struct _DIOC_REGISTERS {
DWORD reg_EBX;
DWORD reg_EDX;
DWORD reg_ECX;
DWORD reg_EAX;
DWORD reg_EDI;
DWORD reg_ESI;
DWORD reg_Flags;
}
DIOC_REGISTERS, *PDIOC_REGISTERS;

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

regs.reg_EBX = 0;// Устройство на котором перечисляются файлы (0-Текущее,A-1,B-2,C-3,...)
regs.reg_EDX = (DWORD)buf;// Адрес буффера, куда записывается имя файла
regs.reg_ECX = 0x486D;// Перечислять открытые файлы
regs.reg_EAX = 0x440D;// Управляющий код для блочных устройств
regs.reg_EDI = 0;// Тип файлов для перечисления (0-все,1-не перемещаемые)
regs.reg_ESI = i++;// Индекс (начиная с 0) файла для перечисления

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

#define CARRY_FLAG 0x01

DWORD cb;
DIOC_REGISTERS regs;
char buf[MAX_PATH];
int i = 0;
while (1)
{
ZeroMemory(®s,sizeof(regs));
regs.reg_EBX = 0;
regs.reg_EDX = (DWORD)buf;
regs.reg_ECX = 0x486D;
regs.reg_EAX = 0x440D;
regs.reg_EDI = 0;
regs.reg_ESI = i++;

DeviceIoControl (hVWin32, VWIN32_DIOC_DOS_IOCTL,
®s, sizeof(regs), ®s, sizeof(regs),
&cb, 0);
if (regs.reg_Flags & CARRY_FLAG)
break;

// Ух ты, получилось!
}

Ну что же, теперь мы все можем и все умеем, осталось только написать маленький работающий пример: openfiles.zip (15Kb)

Оригинал этой статьи на английском языке лежит здесь: Trick 1

Не документированные ф-ции WindowsNT и Windows95/98 и описания на английском языке: www.codepile.com

Было интересно? Скажите об этом Google, чтобы чаще получать ссылки на наши новости про другое
 
 
Если Вы заметили ошибку — выделите ее мышью и нажмите CTRL+ENTER.

window-new
Soft
Hard
Тренды 🔥
Nvidia отметила 20-летие легендарной GeForce 8800 GTX выпуском игры про распаковку GeForce 8800 GTX — с RTX 4070 в «минималках» 7 ч.
ИИ-агенты OpenAI выявили почти 1000 уязвимостей в ядре Linux 8 ч.
OpenAI представила GPT-6 Cyber — свою лучшую ИИ-модель для защиты от киберугроз 8 ч.
Всё-таки «Тарков» в космосе: Никита Буянов подтвердил связь Fragmentary Order и Escape from Tarkov 9 ч.
Приложение Xbox для ПК стало запускаться на 60 % быстрее, а сервис Xbox Cloud Gaming получил новый интерфейс 9 ч.
Герои, бандиты и красоты Вайс-Сити: Rockstar показала 39 новых скриншотов GTA VI 10 ч.
Геймплея нет, купи футболку: Bethesda выпустила фирменную одежду по The Elder Scrolls VI: Sentinel, чтобы фанаты могли «показать свой ажиотаж» 11 ч.
Anthropic смягчила запрет на клонирование популярных игр через Claude Code 12 ч.
Исследование показало, как большие компании последние 26 лет убивали игровые студии 13 ч.
Хакеры взламывали Android-смартфоны через дыры в Chrome и графике Snapdragon 15 ч.
В Гонконге застряли 600 тыс. ускорителей Nvidia H200 — Китай не хочет пускать к себе чипы конкурентов 6 ч.
Aina представила массивный умный перстень с экраном, джойстиком и микрофоном для ИИ 7 ч.
Дефицит памяти раздул мировой рынок DRAM почти в пять раз — Samsung захватила 38 % 7 ч.
Sony сообщила, что разработка PlayStation 6 идёт по графику — а продажи PS5 достигли 97,9 млн консолей 7 ч.
Apple удвоит поставки MacBook Neo в 2027 году — бюджетный ноутбук оказался хитом 8 ч.
Blue Origin отложила запуск New Glenn на январь — ремонт стартовой площадки после взрыва затягивается 9 ч.
SanDisk сделала ставку на HBF, но выпускать её пока негде, поскольку Kioxia выбрала иной путь развития памяти 9 ч.
Motorola представила флагман Signature 27 с батареей на 7000 мА·ч и EVS-сенсором за $1599 10 ч.
Роботы на GPT-6 умеют творить без предварительного обучения, но пока не могут нормально работать руками — в Unitree объяснили почему 10 ч.
Эксплуатация ностальгии: Sony представила MDR-3R — проводные наушники, как от кассетного плеера Walkman 10 ч.