Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Глюк с ObReferenceObjectByHandle  (Прочитано 12093 раз)
0 Пользователей и 1 Гость смотрят эту тему.
dimedrol
Помогающий

ru
Offline Offline

« : 24-06-2007 18:03 » 

День добрый.Замучила такая вот проблемка. Есть кусок кода вызываемый из DriverEntry:
Код:
OBJECT_ATTRIBUTES oa;
  InitializeObjectAttributes(&oa, NULL, OBJ_KERNEL_HANDLE,
    NULL, NULL);
HANDLE hThread = NULL;
st = PsCreateSystemThread(&hThread,
THREAD_ALL_ACCESS,
&oa,
(HANDLE)-1,
NULL,
ThreadRoutine,
(PVOID)pex);
DbgPrint("System thread created: %x!",hThread);
if(st==STATUS_SUCCESS)
{
DbgPrint("Referense thread object returns: %d",
ObReferenceObjectByHandle(hThread, THREAD_ALL_ACCESS, NULL,
KernelMode, (PVOID*) &pex->Thread, NULL));
ZwClose(hThread);
}
Тут я создаю системную нить и пытаюсь по хендлу получить указатель на объет нити, но ObReferenceObjectByHandle возвращает STATUS_SUCCESS, а pex->Thread устанавливает в 0. Перерыл по этому поводу кучу статей и прочей инфы, но ничего подобного нигде не видел. Помогоите разобраться пожалуйста, а то запарился в конец уже.. Я зол!

ЗЫ. Винда WinXp SP2, стоит касперский и файервол - мож они гадят?
Записан

Как говориться, cемь бед - один Reset Улыбаюсь
sss
Специалист

ru
Offline Offline

« Ответ #1 : 25-06-2007 03:44 » 

Вызов PsCreateSystemThread(...), аргумент ProcessHandle = (HANDLE) -1


Цитата: DDK

ProcessHandle

Specifies an open handle for the process in whose address space the thread is to be run. The caller’s thread must have PROCESS_CREATE_THREAD access to this process. If this parameter is not supplied, the thread will be created in the initial system process. This value should be NULL for a driver-created thread. Use the NtCurrentProcess macro to specify the current process
« Последнее редактирование: 25-06-2007 03:49 от sss » Записан

while (8==8)
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 25-06-2007 12:10 » 

во-во) как вижу в параметрах вызова строчки (HANDLE)-1 или NULL сразу а документацию лезу)))
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
dimedrol
Помогающий

ru
Offline Offline

« Ответ #3 : 25-06-2007 13:40 » 

Эх.. если бы все так просто..документацию я уже до дыр зачитал. NtCurrentProcess это и есть вроде (HANDLE)-1, т.е текущий процесс он же системный. С NULL - это мой первоначальный вариант, но ничего не помогает.
Записан

Как говориться, cемь бед - один Reset Улыбаюсь
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 25-06-2007 14:44 » 

C:\DDK\DDK3790.1830\src\storage\fdc\flpydisk\floppy.c
Код:
       OBJECT_ATTRIBUTES ObjAttributes;

        //
        //  Create the thread.
        //
        ASSERT(DisketteExtension->FloppyThread == NULL);
        InitializeObjectAttributes(&ObjAttributes, NULL,
                                   OBJ_KERNEL_HANDLE,
                                   NULL,
                                   NULL);

        status = PsCreateSystemThread(&threadHandle,
                                      (ACCESS_MASK) 0L,
                                      &ObjAttributes,
                                      (HANDLE) 0L,
                                      NULL,
                                      FloppyThread,
                                      DisketteExtension);

        if (!NT_SUCCESS(status)) {
            DisketteExtension->ThreadReferenceCount = -1;

            FloppyPageEntireDriver();

            ExReleaseFastMutex(&DisketteExtension->ThreadReferenceMutex);
            return status;
        }

        status = ObReferenceObjectByHandle( threadHandle,
                                            SYNCHRONIZE,
                                            NULL,
                                            KernelMode,
                                            &DisketteExtension->FloppyThread,
                                            NULL );

        ZwClose(threadHandle);
найдите десять отличий...
внимательней надо быть)
хм... подчти тоже самое, но...
и все таки.
If the input ProcessHandle is NULL, the created thread is associated with the system process.
« Последнее редактирование: 25-06-2007 15:15 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
dimedrol
Помогающий

ru
Offline Offline

« Ответ #5 : 25-06-2007 15:07 » 

только что попробовал - результат тот же - вызов удачный, а возвращает 0. Странно это,тк в доках ясно сказано:
Цитата
If the call succeeds, a pointer to the object body is returned to the caller
Записан

Как говориться, cемь бед - один Reset Улыбаюсь
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 25-06-2007 16:18 » 

хм.
а может у тебя нить делает из себя PsTerminateSystemThread(или return) быстрее, чем ты до ObReferenceObjectByHandle доходишь?)))
в приведенном коде ты вроде статус не проверяешь? ты часом не из под софтайса смотришь? с ним поосторожнее надо... пошагово многопотоковую да еще и на многопроцессорной плохо отслеживать) планировщик винды глючить начинает)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
dimedrol
Помогающий

ru
Offline Offline

« Ответ #7 : 25-06-2007 16:26 » 

Нет, я айсом тут не пользовался и нить точно не уничтожается - его работа видна стопроцентно. А за работой драйвера слежу по отладочным сообщениям в DbgView.
Записан

Как говориться, cемь бед - один Reset Улыбаюсь
sss
Специалист

ru
Offline Offline

« Ответ #8 : 26-06-2007 01:21 » 

Но вот же отличие SYNCHRONIZE и THREAD_ALL_ACCESS. В приведенном тобой примере вызов ObReferenceObjectByHandle вообще не проверяется. Посмотри, может он равен STATUS_ACCESS_DENIED.
« Последнее редактирование: 26-06-2007 01:24 от sss » Записан

while (8==8)
dimedrol
Помогающий

ru
Offline Offline

« Ответ #9 : 26-06-2007 10:18 » 

Сегодня поднял упавший айс и потрейсил драйвер - все сразу стало на свои места. На самом деле  переменная pex->Thread не 0, а я проверял ее значение по отладочному сообщению сразу после вызова  obReferenceObjectByHandle:
Код:
DbgPrint("Event: %x   Thread object: %x",pex->Ev, pex->Thread);
При этом pex->Ev типа KEVENT, т.е. структура а не указатель на объект, как я по запарке посчитал. DWORD по смещению 4 в ней как раз содержал 0, что и выводилось. Самое интересное, что pex->Thread   потом уже портилось в другом месте и становилось 0.
Выводы - 1. надо проспаться Улыбаюсь 2.Впредь надо быть аккуратнее с функциями с переменным числом  параметров.
PS
Спасибо всем кто принимал участие.
Записан

Как говориться, cемь бед - один Reset Улыбаюсь
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines