Правильно ли я уловил методику передачи хэндла какого-нибудь объекта от драйвера приложению?
1)Передаем хэндл объекта из драйвера в приложение
2)Получаем id драйвера PsGetCurrentProcessId и пересылаем его в приложение
3)В приложении делаем OpenProcess, по полученному айдишнику
4)Делаем DuplicateHandle(хэндл полученный из шага 3,хэндл полученный из шага 1,GetCurrentProcess(), новый хэндл.....)
5)Оперируем "новым хэндлом"
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)) { ... }
Здравствуйте, 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. Не будет ли каких-нибудь "последствий" после ее использования?)