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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: лаги с IoGetDeviceObjectPointer  (Прочитано 13698 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
maaaaaad
Гость
« : 02-11-2003 11:40 » 

IoGetDeviceObjectPointer вызывает BugCheck с KMODE_EXCEPTION_NOT_HANDLED
когда нижний драйвер ("\\Device\\SomeDrv") загружен
и не успех, если нижний драйвер не загружен

NTSTATUS InitDevice(PXWDM_DEVICE_EXT pdx) {  // указатель на девайс экстеншн
   NTSTATUS  code = STATUS_SUCCESS;
   UNICODE_STRING   LowerDeviceObjectName;

   RtlInitUnicodeString(&LowerDeviceObjectName,
                  L"\\Device\\SomeDrv");
   __try {
      code = IoGetDeviceObjectPointer(&LowerDeviceObjectName,
               FILE_ALL_ACCESS,
               &pdx->LowerDeviceFileObject,
               &pdx->LowerDeviceObject);
   } __except(EXCEPTION_EXECUTE_HANDLER) {
      DbgPrint("Exc!\n");
   }
   
   if (!NT_SUCCESS(code)) {
      DbgPrint("IoGetDeviceObjectPointer() fail (0x%x)!\n",code);
      return code;
   }

   return code;
}




В экстеншн...

{
..
  PDEVICE_OBJECT      LowerDeviceObject;
  PFILE_OBJECT   LowerDeviceFileObject;
..
}


Посмотрел я тостер и на оср (driver 2 driver comunication) - точно так же и делают......что я делаю не правильно?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #1 : 03-11-2003 07:14 » 

Цитата

IoGetDeviceObjectPointer вызывает BugCheck с KMODE_EXCEPTION_NOT_HANDLED
когда нижний драйвер ("\\Device\\SomeDrv") загружен
и не успех, если нижний драйвер не загружен


А может это нижний драйвер выбрасывает исключение, IoGetDeviceObjectPointer вызывает ZwOpenFile на переданное имя, соответственно пойдет IRP_MJ_CREATE на драйвер, а потом вызывает IoGetRelatedDeviceObject, который пройдется по всему стеку и поместит указатель на самый верхний девайс в стеке в pdx->LowerDeviceObject.

Попробуй ZwOpenFile на это имя с FILE_ALL_ACCESS, потом вызови ObReferenceObjectByHandl с указателем на тип IoFileObjectType, а потом для полученного DEVICE_OBJECT вызови IoGetRelatedDeviceObject, и узнай где вылетает исключение.
Записан
maaaaaad
Гость
« Ответ #2 : 03-11-2003 09:25 » 

Цитата

А может это нижний драйвер выбрасывает исключение


А может и нижний - у меня все эксепшены обработаны. Только не совсем понятно как....как нижний драйвер узнает, что кто то пытается получить указатель на его девайс обжект......IRP_MJ_CREATE? хм....там ноль. Как написал шрайбер так и есть.


ладно, это все короче только с шрайбером глюки. С моим драйвером ничего такого нет....
Вот встречу я этого шрайбера....=)

 :?: Интересно, а буферизированные внутренние цтл запросы тоже работают через "системный буфер"=))))......хехе это наверно как "для поддержки старых программ старые баги исправляться не будут" (c) "Путь Microsoft"
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #3 : 03-11-2003 10:40 » 

Цитата

А может и нижний - у меня все эксепшены обработаны. Только не совсем понятно как....как нижний драйвер узнает, что кто то пытается получить указатель на его девайс обжект......IRP_MJ_CREATE? хм....там ноль. Как написал шрайбер так и есть.


Я же тебе сказал- IoGetDeviceObjectPointer вызывает ZwCreateFile.  И еще- я же тебе сказал, что в  pdx->LowerDeviceObject записывают указаетль не на тот девайс к которому возвращенный FileObject относится, а на самый верхний в стеке.

Цитата

 Интересно, а буферизированные внутренние цтл запросы тоже работают через "системный буфер"=))))......хехе это наверно как "для поддержки старых программ старые баги исправляться не будут" (c) "Путь Microsoft"


Чего-то я не понял. Тут не знакомая мне терминология. ЦТЛ- это IOCTL или Центральная Тестовая Лаборатория или Цветовой Тест Люшера ? Если буферизованный IOCTL то данные копируются в буфер, выделенный в неподкачиваемом пуле ядра.
Записан
maaaaaad
Гость
« Ответ #4 : 05-11-2003 11:52 » 

Чем повторять одно и тоже, лучше бы сказал, где можно прочитать подробней...На твои постинги возникает очень много вопросов.

Я например не могу найти, где сказанно, что в файл обжект передается файл обжект самого верхнего драйвера из стека. У меня, кстати, стека то нет.

==================DDK?Не понял
FileObject
Points to the file object that represents the corresponding device object to user-mode code if the call is successful.
DeviceObject
Points to the device object that represents the named logical, virtual, or physical device if the call is successful.
==================DDK?Не понял

ЗЫЫЫ:   Цветоножка Табачного Листа
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #5 : 05-11-2003 12:26 » 

Цитата

Я например не могу найти, где сказанно, что в файл обжект передается файл обжект самого верхнего драйвера из стека. У меня, кстати, стека то нет.


Вот ты возмущаешься, а сначала надо внимательно прочитать. Не FILE_OBJECT, а DEVICE_OBJECT. FILE_OBJECT как раз тот что нужен.

Вот я тоже не мог найти этого до того как мне вместо DEVICE_OBJECT  для CD ROM'a вернули объект устройство приатаченного к нему фильтра. Тут я и задумался- а что это так странно. У меня всегда были подозрения на то, почему эта ф-ция возвращает два указателя, ведь достаточно одного- FILE_OBJECT, через который можно получить DEVICE_OBJECT вот так DeviceObj=FileObject->DeviceObject или так if(FileObject->Vpb) DeviceObj = FileObject->Vpb->DeviceObject; или так if(FileObject->DeviceObject->Vpb) DeviceObj=FileObject->DeviceObject->Vpb->DeviceObject, в зависимости от того, что надо получить. Все это сподвигло меня на просмотр кода этой чудной ф-ции и вот что мы там видим
PAGE:00490B50 _IoGetDeviceObjectPointer@16 proc near  
PAGE:00490B50 ObjectAttributes= OBJECT_ATTRIBUTES ptr -20h
PAGE:00490B50 IoStatusBlock   = _IO_STATUS_BLOCK ptr -8
PAGE:00490B50 Handle          = dword ptr  8
PAGE:00490B50 Object          = dword ptr  0Ch
PAGE:00490B50 FileObject      = dword ptr  10h
PAGE:00490B50 DeviceObject    = dword ptr  14h
PAGE:00490B50
PAGE:00490B50                 push    ebp
PAGE:00490B51                 mov     ebp, esp
PAGE:00490B53                 sub     esp, 20h
PAGE:00490B56                 mov     eax, [ebp+Handle]
PAGE:00490B59                 push    esi
PAGE:00490B5A                 push    edi
PAGE:00490B5B                 push    40h             ; OpenOptions
PAGE:00490B5D                 xor     esi, esi
PAGE:00490B5F                 mov     [ebp+ObjectAttributes.ObjectName], eax
PAGE:00490B62                 push    esi             ; ShareAccess
PAGE:00490B63                 lea     eax, [ebp+IoStatusBlock]
PAGE:00490B66                 push    eax             ; IoStatusBlock
PAGE:00490B67                 lea     eax, [ebp+ObjectAttributes]
PAGE:00490B6A                 push    eax             ; ObjectAttributes
PAGE:00490B6B                 push    [ebp+Object]    ; DesiredAccess
PAGE:00490B6E                 lea     eax, [ebp+Handle]
PAGE:00490B71                 push    eax             ; FileHandle
PAGE:00490B72                 mov     [ebp+ObjectAttributes.Length], 18h
PAGE:00490B79                 mov     [ebp+ObjectAttributes.RootDirectory], esi
PAGE:00490B7C                 mov     [ebp+ObjectAttributes.Attributes], 200h
PAGE:00490B83                 mov     [ebp+ObjectAttributes.SecurityDescriptor], esi
PAGE:00490B86                 mov     [ebp+ObjectAttributes.SecurityQualityOfService], esi
PAGE:00490B89                 call    _ZwOpenFile@24  ; ZwOpenFile(x,x,x,x,x,x)
PAGE:00490B8E                 mov     edi, eax
PAGE:00490B90                 cmp     edi, esi
PAGE:00490B92                 jl      short loc_490BCA
PAGE:00490B94                 push    esi             ; HandleInformation
PAGE:00490B95                 lea     eax, [ebp+Object]
PAGE:00490B98                 push    eax             ; Object
PAGE:00490B99                 push    esi             ; AccessMode
PAGE:00490B9A                 push    _IoFileObjectType ; ObjectType
PAGE:00490BA0                 push    esi             ; DesiredAccess
PAGE:00490BA1                 push    [ebp+Handle]    ; Handle
PAGE:00490BA4                 call    _ObReferenceObjectByHandle@24 ; ObReferenceObjectByHandle(x,x,x,x,x,x)
PAGE:00490BA9                 mov     edi, eax
PAGE:00490BAB                 cmp     edi, esi
PAGE:00490BAD                 jl      short loc_490BC2
PAGE:00490BAF                 mov     eax, [ebp+Object]
PAGE:00490BB2                 mov     ecx, [ebp+FileObject]
PAGE:00490BB5                 push    eax             ; FileObject
PAGE:00490BB6                 mov     [ecx], eax
PAGE:00490BB8                 call    _IoGetRelatedDeviceObject@4 ; IoGetRelatedDeviceObject(x)
PAGE:00490BBD                 mov     ecx, [ebp+DeviceObject]
PAGE:00490BC0                 mov     [ecx], eax
PAGE:00490BC2
PAGE:00490BC2 loc_490BC2:                             ; CODE XREF: IoGetDeviceObjectPointer(x,x,x,x)+5Dj
PAGE:00490BC2                 push    [ebp+Handle]    ; Handle
PAGE:00490BC5                 call    _ZwClose@4      ; ZwClose(x)
PAGE:00490BCA
PAGE:00490BCA loc_490BCA:                             ; CODE XREF: IoGetDeviceObjectPointer(x,x,x,x)+42j
PAGE:00490BCA                 mov     eax, edi
PAGE:00490BCC                 pop     edi
PAGE:00490BCD                 pop     esi
PAGE:00490BCE                 leave
PAGE:00490BCF                 retn    10h
PAGE:00490BCF _IoGetDeviceObjectPointer@16 endp

наиболее интересны вот эти строчки-

PAGE:00490BB8                 call    _IoGetRelatedDeviceObject@4 ; IoGetRelatedDeviceObject(x)
PAGE:00490BBD                 mov     ecx, [ebp+DeviceObject]
PAGE:00490BC0                 mov     [ecx], eax

а это как раз и есть получение указателя на самый верхний девайс в стеке. Его же и возвращают. По моему я не ошибся. Если что не так- поправь меня.
Записан
maaaaaad
Гость
« Ответ #6 : 05-11-2003 15:50 » 

ну, насчет IoGetRelatedDeviceObject, она вызывает IoGetAttachedDeviceReference, которая, (не обманывает ддк) бегает по стеку утройств и возвращает самый верхний device_object, так что я согласен и поправить ничего не могу

.text:004204F0                 public IoGetAttachedDevice
.text:004204F0 IoGetAttachedDevice proc near           ; CODE XREF: IoAttachDeviceToDeviceStack+24p
.text:004204F0                                         ; IoGetAttachedDeviceReference+7p ...
.text:004204F0
.text:004204F0 arg_0           = dword ptr  4   ;
.text:004204F0
.text:004204F0                 mov     eax, [esp+arg_0]
.text:004204F4   ;;;; пока (DEVICE_OBJECT) *AttachedDevice != NULL
.text:004204F4 loc_0_4204F4:                           ; CODE XREF: IoGetAttachedDevice+Dj
.text:004204F4                 mov     ecx, [eax+10h]  ; <- смотрим на приатаченные девайсы
.text:004204F7                 test    ecx, ecx
.text:004204F9                 jz      short locret_0_4204FF  ; устройство не приатаченно
.text:004204FB                 mov     eax, ecx
.text:004204FD                 jmp     short loc_0_4204F4
.text:004204FF ; ---------------------------------------------------------------------------
.text:004204FF
.text:004204FF locret_0_4204FF:                        ; CODE XREF: IoGetAttachedDevice+9j
.text:004204FF                 retn    4    ; в ecx *AttachedDevice
.text:004204FF IoGetAttachedDevice endp


и вобще, с тобой лучше не спорить=) Как там гронзи поживает - не знаешь %)
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #7 : 10-11-2003 06:22 » 

Цитата

 Как там гронзи поживает - не знаешь %)


Нет не знаю. Между нами несколько тысяч километров.
Записан
Kife
Помогающий

by
Offline Offline

« Ответ #8 : 12-11-2003 21:13 » 

А у меня другая беда -- первый раз загр. сначала drv2 потом drv1. Они не в стеке.  далее drv1 делает GetDeviceObjectPointer(drv2)... все работает нормально... Затем я выгружаю самым обычным образом drv2 а затем drv1... После этого повторяю схему сначала, но при загрузке drv2 не проходит StartService()... (return false Жаль ) ...И соответственно drv1 не может сделать GetDeviceObjectPointer(drv2), далее IRP ужодит от Drv1 не к drv2, а в никуда, ... и синий экран ... После перезагрузки оба нормально стартуют... в чем прикол может быть?
Записан

_______
Да поможет нам F1,  и да сохранит нас F2 ...
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #9 : 12-11-2003 22:12 » new

Цитата

Как там гронзи поживает - не знаешь

А ты ему напиши в ЛС... он тебе ответит  Ага

А причина в чем, вернее проблема, в том, как проверить есть ли сервис drv2 или почему старт не проходит???

Тут уже было про динамическую загрузку - выгрузку - поищи в форуме или на сайте ЧАВО скачай...
Грузить динамически это не тоже самое, что первый раз, совершенно, Слав - скажи...
Записан

А птичку нашу прошу не обижать!!!
maaaaaad
Гость
« Ответ #10 : 13-11-2003 10:57 » 

возможно drv2 не выгружается, а помечается для выгрузки.
см GetLastError() - вроде в таких случаях возвращает или service_already_exist или service_error_disable. И повторно он с тем же DislpayName уже не может загружаться. Или может после перезагрузки.

причина - счетчик использования обьекта device_object не нулевой.
InitializeObjectAttributes, GetDeviceObjectPointer ... и тд вроде делают ObReferenceObject (инкремент счетчика и хз что еще...) внутри своего кода (непомню точно - код смотреть нада).

выход - делать ObDereferenceObject. Загружать с другим DisplayName.

Еще прикол - драйвера созданные в DosDevices открываются в ?? а из DosDevises не видны....
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #11 : 13-11-2003 11:02 » 

Цитата

вроде делают  ObDereferenceObject.


Вот это должно спасти. Ты же получаешь указатель на DEVICE_OBJECT, управляемый этим драйвером, а это увеличивает счетчик ссылок в заголовке объекта. Система не может уничтожить этот объект а он держит драйвер.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #12 : 13-11-2003 11:07 » 

CrashMaker,  что у тебя нарисовано на картинке?
Записан
maaaaaad
Гость
« Ответ #13 : 13-11-2003 16:53 » 

Не что, а кто...Я. =)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines