Здравствуйте, Olegator, Вы писали:
O>Существуют ли способы получить доступ к файлу (на чтение, а лучше ещё и на запись), который уже открыт другим процессом без атрибута SHARE?
DuplicateHandle can duplicate handles to the following types of objects:
..
File or communications device The handle is returned by the CreateFile function.
Только, чем на запись лучше
--
С уважением, LVT
Re[2]: Открытие файла, уже открытого другим процессом
Здравствуйте, Leonid Troyanovsky, Вы писали:
LT>Здравствуйте, Olegator, Вы писали:
O>>Существуют ли способы получить доступ к файлу (на чтение, а лучше ещё и на запись), который уже открыт другим процессом без атрибута SHARE?
LT>DuplicateHandle can duplicate handles to the following types of objects: LT>.. LT>File or communications device The handle is returned by the CreateFile function.
Что-бы дублировать ручку надо сначала ее получить.
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re[3]: Открытие файла, уже открытого другим процессом
Здравствуйте, Злость, Вы писали:
O>>>Существуют ли способы получить доступ к файлу (на чтение, а лучше ещё и на запись), который уже открыт другим процессом без атрибута SHARE?
LT>>DuplicateHandle can duplicate handles to the following types of objects: LT>>File or communications device The handle is returned by the CreateFile function.
З>Что-бы дублировать ручку надо сначала ее получить.
Это уже второй вопрос
--
С уважением, LVT
Re[2]: Открытие файла, уже открытого другим процессом
Здравствуйте, Leonid Troyanovsky, Вы писали:
LT>Здравствуйте, Olegator, Вы писали:
O>>Существуют ли способы получить доступ к файлу (на чтение, а лучше ещё и на запись), который уже открыт другим процессом без атрибута SHARE?
LT>DuplicateHandle can duplicate handles to the following types of objects: LT>.. LT>File or communications device The handle is returned by the CreateFile function.
только не все так просто
1) Windows NT/2000/XP: The handle must have PROCESS_DUP_HANDLE access
2) надо знать начальный хендл, а откуда его взять?
... << RSDN@Home 1.1.3 stable >>
Re[3]: Открытие файла, уже открытого другим процессом
Здравствуйте, Аноним, Вы писали:
А>Делается очень просто, загружаешь в hiew и делаешь CreateFile с флагом SHARED
А если без членовредительства?
Опишу задачу, для который я это делаю: необходимо очистить файл с напечатанными URL'ами — index.dat. Но он заблокирован Explorer'ом. Вот собственно почему мне нужно получить доступ к заблокированному файлу.
Знаю, что решение есть, ведь некоторые шаровары это делают.
С уважением,
Olegator
Re[4]: Открытие файла, уже открытого другим процессом
От:
Аноним
Дата:
14.10.04 14:19
Оценка:
Здравствуйте, Olegator, Вы писали:
O>А если без членовредительства?
O>Опишу задачу, для который я это делаю: необходимо очистить файл с напечатанными URL'ами — index.dat. Но он заблокирован Explorer'ом. Вот собственно почему мне нужно получить доступ к заблокированному файлу.
O>Знаю, что решение есть, ведь некоторые шаровары это делают.
O>С уважением, O>Olegator
Без членовредительства — ставь хук на открытие файла.
Или посмотри как шаровары это делают — поставь программу APIS (дай Бог долгой жизни тов. Евсеенко)
Re[2]: Открытие файла, уже открытого другим процессом
Здравствуйте, Olegator, Вы писали:
O>Ну неужели никто не знает? Ведь как-то это же делается...
O>С уважением, O>Olegator
Вот например тов. Руссинович получает handle на pagefile.sys.
Делается это просто:
— Получаем все процессы в системе
— Среди них находим "system"
— Среди всех handle открытых этим процессом находим handle на файл с именем pagefile.sys
Ну а дальше DuplicateHandle
Вот собственно и все.
Можешь попробовать примерно также
Re[3]: Открытие файла, уже открытого другим процессом
Здравствуйте, Olegator, Вы писали:
O>Здравствуйте, MShura, Вы писали:
MS>>- Среди всех handle открытых этим процессом находим handle на файл с именем pagefile.sys
O>А как получить список всех хэндлов процесса?
O>С уважением, O>Olegator
Система вернет тебе ВСЕ handle, а ты из них выбираешь нужные, например по
ProcessId.
Смотреть нужно
функцию NtQuerySystemInformation
и запрашивать её на предмет SystemHandleInformation.
Запрашивать имя handle из user-mode в общем случае непросто, поскольку можно зависнуть.
Для этих целей нужен драйвер.
Смотри как это сделано в первоисточнике.
typedef struct _SYSTEM_HANDLE_INFORMATION { // Information Class 16
ULONG ProcessId;
UCHAR ObjectTypeNumber;
UCHAR Flags; // 0x01 = PROTECT_FROM_CLOSE, 0x02 = INHERIT
USHORT Handle;
PVOID Object;
ACCESS_MASK GrantedAccess;
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
///////////////////////////////////////////////////////////
// GetHandles
//
// Returns an allocated array of handles in the system
// The caller should free the returned memory
// p[0] contains the number of SYSTEM_HANDLE_INFORMATION structures
// SYSTEM_HANDLE_INFORMATION begins from (p+1)
///////////////////////////////////////////////////////////
ULONG*
GetHandles()
{
ULONG n = 0x1000;
PULONG p = malloc( sizeof(ULONG)*n );
while ( STATUS_INFO_LENGTH_MISMATCH ==
NtQuerySystemInformation( 16, //SystemHandleInformation,
p, n * sizeof *p, 0 ) )
{
free( p );
n *= 2;
p = malloc( sizeof(ULONG)*n );
}
return p;
}