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)) { ... }