Я например не могу найти, где сказанно, что в файл обжект передается файл обжект самого верхнего драйвера из стека. У меня, кстати, стека то нет.
Вот ты возмущаешься, а сначала надо внимательно прочитать. Не 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
а это как раз и есть получение указателя на самый верхний девайс в стеке. Его же и возвращают. По моему я не ошибся. Если что не так- поправь меня.