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)) { ... }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.