Handle от драйвера процессу
От: Ifrin  
Дата: 01.05.10 19:37
Оценка:
Правильно ли я уловил методику передачи хэндла какого-нибудь объекта от драйвера приложению?
1)Передаем хэндл объекта из драйвера в приложение
2)Получаем id драйвера PsGetCurrentProcessId и пересылаем его в приложение
3)В приложении делаем OpenProcess, по полученному айдишнику
4)Делаем DuplicateHandle(хэндл полученный из шага 3,хэндл полученный из шага 1,GetCurrentProcess(), новый хэндл.....)
5)Оперируем "новым хэндлом"
Re: Handle от драйвера процессу
От: x64 Россия  
Дата: 01.05.10 20:45
Оценка: 4 (2)
I>Правильно ли я уловил методику передачи хэндла какого-нибудь объекта от драйвера приложению?

В контексте какого процесса выполняется код драйвера в тот момент, когда у него на руках появляется хендл, который необходимо передать в приложение?

Если выполняется уже в контексте этого приложения, то ничего особо делать и не нужно, просто передать значение HANDLE приложению, которое затем закроет его по необходимости. Единственное, что тут, возможно, следует подумать о синхронизации, потому что хендл, я так понимаю, может быть не наш. Если выполняется в произвольном контексте, то гораздо лучше будет использовать универсальный вариант и поступить по-другому: вызвать драйвер (через Ioctl, например), в обработчике запроса открыть процесс приложения через ObOpenObjectByPointer* — получим хендл процесса, это нужно сделать один только раз где-нибудь при инициализации приложения. Далее уже когда на руках будем иметь хендл, скопируем его в процесс приложения через ZwDuplicateObject** и передадим непосредственно коду приложения любым удобным способом.

*Открывать процесс приложения примерно так:

Status = ObOpenObjectByPointer (
  PsGetCurrentProcess (),
  OBJ_KERNEL_HANDLE,
  NULL,
  PROCESS_DUP_HANDLE,
  *PsProcessType,
  KernelMode,
  &hAppProcess);

if (! NT_SUCCESS (Status)) { ... }


**Копировать хендл примерно так:

//
// Здесь предполагается, что требуемый
// хендл (hSomeHandle) принадлежит текущему процессу.
//

Status = ZwDuplicateObject (
  ZwCurrentProcess (),
  hSomeHandle,
  hAppProcess,
  &hSomeHandleInAppProcess,
  0,
  0,
  DUPLICATE_SAME_ACCESS);

if (! NT_SUCCESS (Status)) { ... }
Re[2]: Handle от драйвера процессу
От: Ifrin  
Дата: 02.05.10 08:38
Оценка:
Здравствуйте, x64, Вы писали:

Пожалуйста, уважайте коллег и не допускайте излишнего цитирования. Для неуважающих напомню, что есть правила форума и ресурса + санкции за несоблюдение оных. Модератор

x64>Status = ZwDuplicateObject (

x64> ZwCurrentProcess (),
x64> hSomeHandle,
x64> hAppProcess,
x64> &hSomeHandleInAppProcess,
x64> 0,
x64> 0,
x64> DUPLICATE_SAME_ACCESS);

Спасибо, так и вправду удобнее.
Кстати, в мсдн написано следующее: The ZwDuplicateObject routine is reserved for system use. Не будет ли каких-нибудь "последствий" после ее использования?)
Re[3]: Handle от драйвера процессу
От: x64 Россия  
Дата: 02.05.10 09:03
Оценка:
I>Не будет ли каких-нибудь "последствий" после ее использования?

Нет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.