|
||
|
||
Как получить список открытых файлов на Win9x |
||
Недокументированные
особенности Win9x/WinNT/Win2000
Как известно, Win32 API не содержит функцию, которая может помочь извлечь из системы список всех файлов, открытых в данный момент на локальной машине. К сожалению, документация (MSDN) содержит очень туманную и расплывчатую информацию, но одно ясно - такой список хранится в системе и мы можем его получить из User Mode, т.е. не прибегая к написанию драйвера! Хитрость в том, что нам надо вызвать старое доброе прерывание INT21h, для этого воспользуемся законной (документированной) API-шной ф-цией DeviceIoControl. Ф-ция DeviceIoControl посылает управляющие команды напрямую указанному драйверу, тем-самым заставляя драйвер выполнять соответствующие действия. Вот прототип DeviceIoControl: BOOL DeviceIoControl( Первый параметр это описатель (hDevice) устройства, файла или директории, так что получим этот описатель. Система Windows9x содержит специальный драйвер - VWIN32.VXD, он предоставляет доступ к управляющим ф-циям, за которые в MS-DOS отвечало прерывание 21h. Теперь нам надо как-то получить описатель этого драйвера что бы передать его в DeviceIoControl: HANDLE WINAPI OpenVWin32 (void) Второй параметр это управляющий код операции, которую необходимо выполнить (dwIoControlCode). Мы передадим константу VWIN32_DIOC_DOS_IOCTL, равняющуюся 1: #define VWIN32_DIOC_DOS_IOCTL 0x01 Третий параметр - указатель на буфер
для входных данных (lpInBuffer). Для системы typedef struct _DIOC_REGISTERS { Указатель на буффер (lpInBuffer) должен указывать на адрес структуры, описаной выше, инициализированной следующими значениями: regs.reg_EBX = 0;// Устройство на котором
перечисляются файлы (0-Текущее,A-1,B-2,C-3,...) Каждый вызов будет возвращать информацию только об одном файле. Что бы перечислить все открытые файлы, необходимо вызывать ф-цию в цикле: #define CARRY_FLAG 0x01 DeviceIoControl(hVWin32, VWIN32_DIOC_DOS_IOCTL, break; // Ух ты, получилось! } Автор: Ашот
Оганесян |
||
|
||
Copyright © 1999-2000гг. "Internet Zone" & Nik Romanov. nikspase@mail.ru, nikspase@hotmail.ru, http://www.izone.com.ua/ | ||
Копирование и использование данных материалов разрешается только в случае указания на журнал "Internet Zone" как на источник получения информации, при этом во всех ссылках обязательно явное указание адреса вэб-сайта http://www.izone.com.ua/. |