• p © (03.02.13 00:56) [0]
    Если я открываю процесс в драйвере и передаю handle в юзермод я должен буду закрыть handle в драйвере или можно его закрыть в юзермоде используя CloseHandle()?
  • bems © (03.02.13 02:23) [1]
    если это не OBJ_KERNEL_HANDLE то можно в юзермоде, если мне не изменяет склероз
  • brother © (04.02.13 04:17) [2]
    по логике - где открыл, там и прибрался...
  • brother © (04.02.13 04:21) [3]
    и вообще:
    http://msdn.microsoft.com/en-us/library/windows/hardware/ff567022%28v=vs.85%29.aspx

    Note  If the call to this function occurs in user mode, you should use the name "NtOpenProcess" instead of "ZwOpenProcess".

  • Rouse_ © (04.02.13 10:35) [4]
    Если просто вернуть хэндл в юзермод, то ничего не получится, точнее данный хэндл для процесса будет не валиден.

    Сделать можно примерно следующим образом: нужно из драйвера приаттачится к требуемому процессу и прописать описатель в EPROCESS, после чего уже вернуть валидный для процесса хэндл (который по сути является оффсетом в EPROCESS на описатель объекта)
  • bems © (04.02.13 17:38) [5]

    > Если просто вернуть хэндл в юзермод, то ничего не получится,
    >  точнее данный хэндл для процесса будет не валиден.

    аа, ну в общем случае да.
    когда я говорил что должно работать, то подразумевал что хендл получен хоть и в драйвере, но в контексте того же процесса в котором потом предполагается его использовать в юзермоде
  • Rouse_ © (04.02.13 19:07) [6]

    > bems ©   (04.02.13 17:38) [5]
    > аа, ну в общем случае да.

    Тоже спорно, мы тут небольшой консилиум устроили и есть вариант один. Что будет если получить хэндл после того как драйвер будет работать в контексте из-за вызова KeStackAttachProcess(). Будет ли дублироваться описатель в EPROCESS? Это нужно проверить по логике. Но в общем случае, объект открытый в драйвере закрывать нужно в нем-же. Даже если будет дубляж на уровень процесса, то это только RefCount-ы.
  • Rouse_ © (04.02.13 19:14) [7]
    ЗЫ: забыл. Ибо при открытии из драйвера описатель объекта по любому будет принадлежать процессу SYSTEM вне зависимости от контекста.
  • p © (04.02.13 22:06) [8]
    Если я вызываю CloseHandle из юзермод дальше идет по цепочке NtClose->ZwClose

    А где ZwClose вызывается?
  • Rouse_ © (04.02.13 22:19) [9]

    > А где ZwClose вызывается?

    через шлюз вызов в ядро идет. Но роли не играет, данный вызов туда в любом случае проходит.
  • p © (04.02.13 22:20) [10]
    Короче надо пользовать ObCloseHandle для этого дела http://msdn.microsoft.com/en-us/library/windows/hardware/ff961905(v=vs.85).aspx
  • p © (04.02.13 22:24) [11]
    A user handle is a handle that is opened by a user-mode application, or by a kernel-mode driver that runs in the context of a user-mode thread but that does not open the handle with the OBJ_KERNEL_HANDLE attribute. If a driver creates a user handle to be used by a user-mode application, but an error occurs that requires the driver to close the handle on behalf of the application, the driver can call ObCloseHandle to close the handle.

    ObCloseHandle(hObject, UserMode).

    Как то так
  • p © (04.02.13 22:34) [12]

    > bems ©   (03.02.13 02:23) [1]


    Да точняк можно закрывать в юзере, а если нужно в драйвере то (on behalf of the application - от имени приложения) the driver can call ObCloseHandle to close the handle
  • Rouse_ © (04.02.13 22:38) [13]
    Дык эта...

    > If a driver creates a user handle to be used by a user-mode
    > application, but an error occurs that requires the driver
    > to close the handle on behalf of the application, the driver
    > can call
    ObCloseHandle to close the handle.
  • p © (04.02.13 22:43) [14]

    > Rouse_ ©   (04.02.13 22:38) [13]


    can call - может вызвать и чего?
  • Rouse_ © (04.02.13 22:50) [15]
    Может вызвать "драйвер", про приложение ничего не сказано. Но ты поэксперементируй с приложением, я просто не уверен что из третьего кольца данный вызов приведет к желаемому результату...
    Да и если есть возможность тестовые исходники выложи, тоже поэксперементирую, лениво писать рыбу
  • bems © (05.02.13 05:29) [16]

    > забыл. Ибо при открытии из драйвера описатель объекта по
    > любому будет принадлежать процессу SYSTEM вне зависимости
    > от контекста.

    у меня внутри DispatchDeviceControl c запросом IRP_MJ_DEVICE_CONTROL создаётся событие, хендл которого потом успешно используется в юзермоде, процессом вызвавшим DeviceIoControl
    В деталях мог напутать, потому что код не смотрел а писал по памяти, но суть в том что хендл живет не в таблице System
  • Riply © (05.02.13 06:15) [17]
    Ну вроде да, мы это использовали в двух драйерах - мышином и клавином.
  • p © (05.02.13 14:20) [18]

    > Rouse_ ©   (04.02.13 22:50) [15]


    Ну вроде всё работает, сорцы драйвера и gui http://yadi.sk/d/mo8Jtu5a2Ncnc

    Проект для DXE2, тестировал в x64
Есть новые Нет новых   [134430   +4][b:0][p:0.001]