> IB_NAME_STRING = record Везде описывай структуры как packed record. И вообще, проверь правильность описания всех структур, может косяк именно в этом.
Ms Rem, ))) никак не могу понять разницу между record и packed record, что-то там я читал, но если не сложно для особо тормозящих, в чем различие данных записях?
record - структура вырвавнивается компилятором по некоторой границе (по умолчанию - 8 байт) packed record - сктруктура идет побайтно без выравнивания
Кстати вот на чем происходи зависание: Код (Text): 0268: Thread SERVICES.EXE(000000E8):(00000168) 026C: Event 0270: Event 0274: File \Device\NamedPipe\svcctl <font color="red]0278: File \Device\NamedPipe\net\NtControlPipe1</font><!--color-->
Ну вот драйвер на половину заработал, т.е. данные я получаю пока не дохожу до <font color="red]\Device\NamedPipe\ntsvcs</font><!--color-->, т.е. эта проблема уже обсуждалась Four-F, следовательно это не проблема моего кода, а все-такие что-то иное. Еще, конструкция типа KrRtlUnicodeStringToAnsiString(<font color="red]@(PDOB_NAME_STRING(out_buffer)^.name)</font><!--color-->,P UNICODE_STRING(buffer),FALSE), не проходит, это уже скорей всего ограничения самого дельфийского компилятора, хотя код он формирует, но при его запуске возникает BSOD. Проблему пришлось решить следующим образом Код (Text): var astring:ANSI_STRING; buffer: array[0..1024-1] of char; ... RtlUnicodeStringToAnsiString(@astring,@buffer,FALSE))); PDOB_NAME_STRING(out_buffer)^.name := astring; результат вот такой: Код (Text): 0234: Event jects\E_ScepSamFilterAndPolicyPropExclusion 0238: Event jects\E_ScepNotificationQEnqueue 023C: Event jects\E_ScepPolicyPropagation 0240: Thread SERVICES.EXE(000000E8):(00000164) 0244: Timer 0248: Thread SERVICES.EXE(000000E8):(00000168) 024C: Event 0250: Thread SERVICES.EXE(000000E8):(00000164) 0254: Key CHINE\SYSTEM\ControlSet001\Control\ServiceCurrent 0258: Event 025C: Event 0260: IoCompletion 0264: Event 0268: File dPipe\net\NtControlPipe1 026C: Event 0270: Event 0274: Thread SERVICES.EXE(000000E8):(00000170) 0278: Event 027C: Event 0280: File dPipe\ntsvcs как видно из резултата, отрезается вот эта часть "\Device\Named" а вот результат оригенальной версии: Код (Text): 020C: Event \BaseNamedObjects\E_ScepSamFilterAndPolicyPropExclusion 0210: Event \BaseNamedObjects\E_ScepNotificationQEnqueue 0214: Event \BaseNamedObjects\E_ScepPolicyPropagation 0218: Thread SERVICES.EXE(000000E8):(00000158) 021C: Timer 0220: Thread SERVICES.EXE(000000E8):(0000015C) 0224: Event 0228: File \Device\NamedPipe\ntsvcs 0230: Event <font color="red] 0234: Thread SERVICES.EXE(000000E8):(00000160) 0238: File \Device\NamedPipe\ntsvcs</font><!--color--> 023C: Event 0240: File \Device\KsecDD 0244: Thread SERVICES.EXE(000000E8):(00000158) ну и конечно же нет зависания, я если честно не понял как с этим бороться, но то что драйвер работает и выдает уже полную информацию на пользовательский уровень, это факт. Ребята, может у кого есть какие идеи, я буду очень признателен за помощь.
Вот еще косяк ((( в инете нашел следующее: Код (Text): Mark van Velsen wrote: > > one of the undocumented ones... Looking into ntoskrnl.exe I noticed > that this function has 4 parameters, probably looking sometime like: > > NTSTATUS ObQueryNameString( > IN PVOID Object, > <font color="red]IN PUNICODE_STRING Name</font><!--color-->, > IN POBJECT_TYPE ObjectType, > ?? ); > > Anyone an idea? > I have a slightly different interpretation of ObQueryNameString: NTSTATUS ObQueryNameString( PVOID Object, <font color="red]POBJECT_NAME_INFORMATION Info</font><!--color-->, ULONG Length, PULONG ReturnLength); OBJECT_NAME_INFORMATION is (accidentally?) defined in NTDDK.H and is actually a UNICODE_STRING: typedef struct _OBJECT_NAME_INFORMATION { UNICODE_STRING Name; } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION; Given a device object, this function seems to return its original device name (even though the device may be opened through a symbolic link). At least I was able to translate a COM port device object into \Device\SerialX name. The code looked like this: char Buffer[256]; NTSTATUS ObStatus; ULONG ReturnLength = 0; OBJECT_NAME_INFORMATION * Info = (OBJECT_NAME_INFORMATION *)Buffer; RtlZeroMemory(Info, sizeof(OBJECT_NAME_INFORMATION)); ObStatus = ObQueryNameString( Port->FileObject->DeviceObject, Info, sizeof(Buffer), &ReturnLength); if ( NT_SUCCESS(ObStatus) && ReturnLength ) if ( Info->Name.Length && Info->Name.Buffer ) { TRACE1("Device: %wZ\n",&Info->Name); .......... } Regards, -Slava это что????
Код (Text): if (*(USHORT *)handle_object == 5 && *((USHORT *)handle_object+1) == 0x70) { if ( return_length = <font color="red]handle_fobject((PFILE_OBJECT)handle_object, out_buffer)</font><!--color--> ) { ... } } else { if ( NT_SUCCESS(ObQueryNameString( ... ) ) ) { .... } } 5 - это IO_TYPE_FILE 0x70 - это sizeof(FILE_OBJECT) typedef struct _FILE_OBJECT { CSHORT Type; // = IO_TYPE_FILE CSHORT Size; // = sizeof(FILE_OBJECT) ... } FILE_OBJECT; Таким образом, если handle_object является указателем на объект "файл", то зовём handle_fobject, в противном случае ObQueryNameString. А у тебя, похоже, эта проверка не работает т.к... Код (Text): if(NT_SUCCESS(KrObQueryNameString( //<- тут происходит зависание, всегда на services.exe Ты всё время зовёшь ObQueryNameString. <font color="gray][ LuckyDevil</font><!--color--><font color="gray]: Вот еще косяк ]</font><!--color--> А чём косяк то?
А понял. Это не косяк. ObQueryNameString документирована только в IFSKIT, в DDK её нет. Поэтому те у кого есть IFSKIT, знают, что второй параметр - это указатель на OBJECT_NAME_INFORMATION. Те же у кого DDK, думают, что указатель на UNICODE_STRING Хотя как видно из определения структуры OBJECT_NAME_INFORMATION, как обладатели IFSKIT, так и обладатели DDK, по-своему правы Код (Text): NTSTATUS ObQueryNameString( IN PVOID Object, OUT POBJECT_NAME_INFORMATION ObjectNameInfo, IN ULONG Length, OUT PULONG ReturnLength ); typedef struct _OBJECT_NAME_INFORMATION { UNICODE_STRING Name; } OBJECT_NAME_INFORMATION, *POBJECT
Four-F, большой фэнкс, потому как вот этот участок кода Код (Text): if (*(USHORT *)handle_object == 5 && *((USHORT *)handle_object+1) == 0x70) { if ( return_length = handle_fobject((PFILE_OBJECT)handle_object, out_buffer) ) { ... } для меня вообще не понятен был. <font color="red]Ты всё время зовёшь ObQueryNameString.</font><!--color--> и тут ты прав, данный участок кода у меня вовсе не срабатывает, интересно почему?????
а можно было бы так написать? Код (Text): if ((FILE_OBJECT *)handle_object->Type == 5 && (FILE_OBJECT *)handle_object->Size == 0x70) { if ( return_length = handle_fobject((PFILE_OBJECT)handle_object, out_buffer) ) { ... } } извините, может не правильно с типами, но я думаю вы поймете , что я имел ввиду. и еще Код (Text): if(NT_SUCCESS(ObReferenceObjectByHandle(handle,0x80000000,0,0, <font color="red][b](void *)&handle_object[/b]</font><!--color-->,0))) (void *)&handle_object это трактуется как указатель на объект? как я это понимаю это что-то вроде этого: Код (Text): handle_object: Pvoid;//ULONG; ... ObReferenceObjectByHandle(hHandle,$80000000,nil, CCHAR(0), [b]Pointer(handle_object),//Pointer(@handle_object)[/b] nil ) так ли это?
... ObReferenceObjectByHandle(hHandle,$80000000,nil, CCHAR(0), Pointer(handle_object),//Pointer(@handle_object) nil ) Правильно будет так: Код (Text): ObReferenceObjectByHandle(hHandle,$80000000,nil, CCHAR(0), @handle_object, nil )
))) но наконец то сработал этот участок ))) Код (Text): if (*(USHORT *)handle_object == 5 && *((USHORT *)handle_object+1) == 0x70) { if ( return_length = handle_fobject((PFILE_OBJECT)handle_object, out_buffer) ) { ... } } и случилось это после этого: Код (Text): if(PFILE_OBJECT(handle_object)^._Type = 5)and(PFILE_OBJECT(handle_object)^._Size = $70)then begin ... end; все-таки это не китайская грамота ))), так код более читабилен
<font color="gray][ LuckyDevil</font><!--color--><font color="gray]: а можно было бы так написать? ]</font><!--color--> Почти правильно (скобочек не хватает). И лучше уж тогда циферки не хардкодить. Код (Text): if ( ((FILE_OBJECT *)handle_object)->Type == IO_TYPE_FILE && ((FILE_OBJECT *)handle_object)->Size == sizeof(FILE_OBJECT) ) { ... } <font color="gray][ LuckyDevil</font><!--color--><font color="gray]: (void *)&handle_object это трактуется как указатель на объект? ]</font><!--color--> Точнее - это указатель на переменную, в которую ObReferenceObjectByHandle запишет указатель на объект, если не обломится. ЗЫ: 0x80000000 = GENERIC_READ
LuckyDevil Pointer(handle_object) - приведение handle_object к типу pointer @handle_object - указатель на переменную handle_object
Ms Rem, да конечно же так, при handle_object: Pointer; Four-F, ))) согласись, что так код выглядит понятней, потому как из всех просматривающих эту тему, никто не обратил на это внимание, и фик его мама знает сколько бы я сидел и ломал голову над этим.
Зараза.... Просто слов нет, кто знает почему дам-файл перестал отображать отладочную информацию, причем прикол заключается в том что, теперь там все время устаревшая отадочная информация весит, удаление дампа, не дало никакого эффекта
LuckyDevil в данном случае Pointer(handle_object) = handle_object, а @handle_object = адресу этой переменной в памяти, а это совсем разные вещи.
<font color="gray][ LuckyDevil</font><!--color--><font color="gray]: ...согласись, что так код выглядит понятней... ]</font><!--color--> Дык, я всегда за это
Four-F, как правильно открыть файл в режиме ядра и скинуть туда буфер? Я вроде как встречал эту информацию на форуме, но сейчас найти ее не могу ((( ZwCreateFile... нужен маленький примерчик.