Открытие файла, уже открытого другим процессом
От: Olegator  
Дата: 12.10.04 16:12
Оценка:
Существуют ли способы получить доступ к файлу (на чтение, а лучше ещё и на запись), который уже открыт другим процессом без атрибута SHARE?

С уважением,
Olegator
Re: Открытие файла, уже открытого другим процессом
От: Leonid Troyanovsky  
Дата: 12.10.04 16:36
Оценка: -1
Здравствуйте, 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]: Открытие файла, уже открытого другим процессом
От: Злость Россия  
Дата: 12.10.04 16:54
Оценка: 1 (1)
Здравствуйте, 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]: Открытие файла, уже открытого другим процессом
От: Leonid Troyanovsky  
Дата: 12.10.04 16:58
Оценка:
Здравствуйте, Злость, Вы писали:

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]: Открытие файла, уже открытого другим процессом
От: s0rc  
Дата: 12.10.04 17:11
Оценка:
Здравствуйте, 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]: Открытие файла, уже открытого другим процессом
От: Olegator  
Дата: 13.10.04 12:11
Оценка:
Здравствуйте, Злость, Вы писали:

З>Что-бы дублировать ручку надо сначала ее получить.


"Воть именно!" (C) Хрюн Моржов

Вопрос только как получить?

С уважением,
Olegator
Re: Открытие файла, уже открытого другим процессом
От: Olegator  
Дата: 14.10.04 11:36
Оценка:
Ну неужели никто не знает? Ведь как-то это же делается...

С уважением,
Olegator
Re[2]: Открытие файла, уже открытого другим процессом
От: Аноним  
Дата: 14.10.04 12:22
Оценка:
Здравствуйте, Olegator, Вы писали:

O>Ну неужели никто не знает? Ведь как-то это же делается...


O>С уважением,

O>Olegator

Делается очень просто, загружаешь в hiew и делаешь CreateFile с флагом SHARED
Re[3]: Открытие файла, уже открытого другим процессом
От: Olegator  
Дата: 14.10.04 14:16
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Делается очень просто, загружаешь в 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]: Открытие файла, уже открытого другим процессом
От: MShura  
Дата: 14.10.04 14:32
Оценка:
Здравствуйте, Olegator, Вы писали:

O>Ну неужели никто не знает? Ведь как-то это же делается...


O>С уважением,

O>Olegator

Вот например тов. Руссинович получает handle на pagefile.sys.

Делается это просто:
— Получаем все процессы в системе
— Среди них находим "system"
— Среди всех handle открытых этим процессом находим handle на файл с именем pagefile.sys

Ну а дальше DuplicateHandle
Вот собственно и все.

Можешь попробовать примерно также
Re[3]: Открытие файла, уже открытого другим процессом
От: Olegator  
Дата: 18.10.04 13:08
Оценка:
Здравствуйте, MShura, Вы писали:

MS>- Среди всех handle открытых этим процессом находим handle на файл с именем pagefile.sys


А как получить список всех хэндлов процесса?

С уважением,
Olegator
Re[5]: Открытие файла, уже открытого другим процессом
От: Olegator  
Дата: 18.10.04 13:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Или посмотри как шаровары это делают — поставь программу APIS (дай Бог долгой жизни тов. Евсеенко)


А где взять эту программу?

С уважением,
Olegator
Re[4]: Открытие файла, уже открытого другим процессом
От: MShura  
Дата: 18.10.04 17:51
Оценка:
Здравствуйте, 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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.