ObQueryNameString

Тема в разделе "WASM.WIN32", создана пользователем LuckyDevil, 12 май 2005.

  1. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    > IB_NAME_STRING = record



    Везде описывай структуры как packed record.

    И вообще, проверь правильность описания всех структур, может косяк именно в этом.
     
  2. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Ms Rem, ))) никак не могу понять разницу между record и packed record, что-то там я читал, но если не сложно для особо тормозящих, в чем различие данных записях?
     
  3. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    record - структура вырвавнивается компилятором по некоторой границе (по умолчанию - 8 байт)

    packed record - сктруктура идет побайтно без выравнивания
     
  4. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Кстати вот на чем происходи зависание:


    Код (Text):
    1.  
    2.   0268: Thread          SERVICES.EXE(000000E8):(00000168)
    3.   026C: Event          
    4.   0270: Event          
    5.   0274: File            \Device\NamedPipe\svcctl
    6.   <font color="red]0278: File            \Device\NamedPipe\net\NtControlPipe1</font><!--color-->
    7.  


     
  5. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Ну вот драйвер на половину заработал, т.е. данные я получаю пока не дохожу до <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):
    1.  
    2. var
    3. astring:ANSI_STRING;
    4. buffer: array[0..1024-1] of char;
    5. ...
    6. RtlUnicodeStringToAnsiString(@astring,@buffer,FALSE)));
    7. PDOB_NAME_STRING(out_buffer)^.name := astring;
    8.  


    результат вот такой:
    Код (Text):
    1. 0234: Event           jects\E_ScepSamFilterAndPolicyPropExclusion
    2. 0238: Event           jects\E_ScepNotificationQEnqueue
    3. 023C: Event           jects\E_ScepPolicyPropagation
    4. 0240: Thread          SERVICES.EXE(000000E8):(00000164)
    5. 0244: Timer
    6. 0248: Thread          SERVICES.EXE(000000E8):(00000168)
    7. 024C: Event
    8. 0250: Thread          SERVICES.EXE(000000E8):(00000164)
    9. 0254: Key             CHINE\SYSTEM\ControlSet001\Control\ServiceCurrent
    10. 0258: Event
    11. 025C: Event
    12. 0260: IoCompletion
    13. 0264: Event
    14. 0268: File            dPipe\net\NtControlPipe1
    15. 026C: Event
    16. 0270: Event
    17. 0274: Thread          SERVICES.EXE(000000E8):(00000170)
    18. 0278: Event
    19. 027C: Event
    20. 0280: File            dPipe\ntsvcs
    21.  


    как видно из резултата, отрезается вот эта часть "\Device\Named"

    а вот результат оригенальной версии:
    Код (Text):
    1.  
    2.   020C: Event           \BaseNamedObjects\E_ScepSamFilterAndPolicyPropExclusion
    3.   0210: Event           \BaseNamedObjects\E_ScepNotificationQEnqueue
    4.   0214: Event           \BaseNamedObjects\E_ScepPolicyPropagation
    5.   0218: Thread          SERVICES.EXE(000000E8):(00000158)
    6.   021C: Timer          
    7.   0220: Thread          SERVICES.EXE(000000E8):(0000015C)
    8.   0224: Event          
    9.   0228: File            \Device\NamedPipe\ntsvcs
    10.   0230: Event          
    11. <font color="red]  0234: Thread          SERVICES.EXE(000000E8):(00000160)
    12.   0238: File            \Device\NamedPipe\ntsvcs</font><!--color-->
    13.   023C: Event          
    14.   0240: File            \Device\KsecDD
    15.   0244: Thread          SERVICES.EXE(000000E8):(00000158)
    16.  


    ну и конечно же нет зависания, я если честно не понял как с этим бороться, но то что драйвер работает и выдает уже полную информацию на пользовательский уровень, это факт.

    Ребята, может у кого есть какие идеи, я буду очень признателен за помощь.
     
  6. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Вот еще косяк (((

    в инете нашел следующее:
    Код (Text):
    1.  
    2. Mark van Velsen wrote:
    3. >
    4. > one of the undocumented ones... Looking into ntoskrnl.exe I noticed
    5. > that this function has 4 parameters, probably looking sometime like:
    6. >
    7. > NTSTATUS ObQueryNameString(
    8. >         IN PVOID Object,
    9. >         <font color="red]IN PUNICODE_STRING Name</font><!--color-->,
    10. >         IN POBJECT_TYPE ObjectType,
    11. >         ?? );
    12. >
    13. > Anyone an idea?
    14. >
    15.  
    16. I have a slightly different interpretation of
    17. ObQueryNameString:
    18.  
    19. NTSTATUS
    20. ObQueryNameString(
    21.     PVOID  Object,
    22.     <font color="red]POBJECT_NAME_INFORMATION Info</font><!--color-->,
    23.     ULONG  Length,
    24.     PULONG ReturnLength);
    25.  
    26. OBJECT_NAME_INFORMATION is (accidentally?) defined in NTDDK.H
    27. and is actually a UNICODE_STRING:
    28.  
    29. typedef struct _OBJECT_NAME_INFORMATION {
    30.     UNICODE_STRING Name;
    31. } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
    32.  
    33. Given a device object, this function seems to return its
    34. original device name (even though the device may be opened
    35. through a symbolic link). At least I was able to translate
    36. a COM port device object into \Device\SerialX name. The code
    37. looked like this:
    38.  
    39. char Buffer[256];
    40. NTSTATUS ObStatus;
    41. ULONG ReturnLength = 0;
    42. OBJECT_NAME_INFORMATION * Info = (OBJECT_NAME_INFORMATION *)Buffer;
    43. RtlZeroMemory(Info, sizeof(OBJECT_NAME_INFORMATION));
    44. ObStatus = ObQueryNameString( Port->FileObject->DeviceObject,
    45.                               Info, sizeof(Buffer),
    46.                               &ReturnLength);
    47. if ( NT_SUCCESS(ObStatus) && ReturnLength )
    48.     if ( Info->Name.Length && Info->Name.Buffer )
    49.     {
    50.         TRACE1("Device: %wZ\n",&Info->Name);
    51.         ..........
    52.     }
    53.  
    54. Regards,
    55. -Slava
    56.  


    это что????
     
  7. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Код (Text):
    1. if (*(USHORT *)handle_object == 5  &&  *((USHORT *)handle_object+1) == 0x70) {
    2.  
    3.     if ( return_length = <font color="red]handle_fobject((PFILE_OBJECT)handle_object, out_buffer)</font><!--color--> ) {
    4.         ...
    5.     }
    6.  
    7. } else {
    8.  
    9.     if ( NT_SUCCESS(ObQueryNameString( ... ) ) ) {
    10.  
    11.         ....
    12.     }
    13. }
    14.  
    15. 5    - это IO_TYPE_FILE
    16. 0x70 - это sizeof(FILE_OBJECT)
    17.  
    18. typedef struct _FILE_OBJECT {
    19.     CSHORT Type;                   //  = IO_TYPE_FILE
    20.     CSHORT Size;                   //  = sizeof(FILE_OBJECT)
    21.     ...
    22. } FILE_OBJECT;
    Таким образом, если handle_object является указателем на объект "файл", то зовём handle_fobject, в противном случае ObQueryNameString. А у тебя, похоже, эта проверка не работает т.к...


    Код (Text):
    1. if(NT_SUCCESS(KrObQueryNameString(  //<- тут происходит зависание, всегда на services.exe
    Ты всё время зовёшь ObQueryNameString.





    <font color="gray][ LuckyDevil</font><!--color--><font color="gray]: Вот еще косяк ]</font><!--color-->



    А чём косяк то?
     
  8. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    А понял. Это не косяк. ObQueryNameString документирована только в IFSKIT, в DDK её нет. Поэтому те у кого есть IFSKIT, знают, что второй параметр - это указатель на OBJECT_NAME_INFORMATION. Те же у кого DDK, думают, что указатель на UNICODE_STRING ;) Хотя как видно из определения структуры OBJECT_NAME_INFORMATION, как обладатели IFSKIT, так и обладатели DDK, по-своему правы ;)


    Код (Text):
    1. NTSTATUS
    2.   ObQueryNameString(
    3.     IN PVOID  Object,
    4.     OUT POBJECT_NAME_INFORMATION  ObjectNameInfo,
    5.     IN ULONG  Length,
    6.     OUT PULONG  ReturnLength
    7.     );
    8.  
    9. typedef struct _OBJECT_NAME_INFORMATION {
    10.     UNICODE_STRING Name;
    11. } OBJECT_NAME_INFORMATION, *POBJECT
     
  9. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Four-F, большой фэнкс, потому как вот этот участок кода
    Код (Text):
    1. if (*(USHORT *)handle_object == 5  &&  *((USHORT *)handle_object+1) == 0x70) {
    2.  
    3.     if ( return_length = handle_fobject((PFILE_OBJECT)handle_object, out_buffer) ) {
    4.         ...
    5.     }
    6.  


    для меня вообще не понятен был.

    <font color="red]Ты всё время зовёшь ObQueryNameString.</font><!--color--> и тут ты прав, данный участок кода у меня вовсе не срабатывает, интересно почему?????
     
  10. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    а можно было бы так написать?
    Код (Text):
    1.  
    2. if ((FILE_OBJECT *)handle_object->Type == 5  &&  (FILE_OBJECT *)handle_object->Size == 0x70) {
    3.  
    4.     if ( return_length = handle_fobject((PFILE_OBJECT)handle_object, out_buffer) ) {
    5.         ...
    6.     }
    7. }
    8.  


    извините, может не правильно с типами, но я думаю вы поймете , что я имел ввиду.



    и еще
    Код (Text):
    1.  
    2.         if(NT_SUCCESS(ObReferenceObjectByHandle(handle,0x80000000,0,0,
    3.                                                 <font color="red][b](void *)&handle_object[/b]</font><!--color-->,0)))
    4.  


    (void *)&handle_object это трактуется как указатель на объект?

    как я это понимаю это что-то вроде этого:
    Код (Text):
    1.  
    2. handle_object: Pvoid;//ULONG;
    3. ...
    4. ObReferenceObjectByHandle(hHandle,$80000000,nil,
    5.                  CCHAR(0),
    6.                  [b]Pointer(handle_object),//Pointer(@handle_object)[/b]
    7.                  nil )


    так ли это?
     
  11. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    ...

    ObReferenceObjectByHandle(hHandle,$80000000,nil,

    CCHAR(0),

    Pointer(handle_object),//Pointer(@handle_object)

    nil )



    Правильно будет так:


    Код (Text):
    1. ObReferenceObjectByHandle(hHandle,$80000000,nil,
    2.                  CCHAR(0),
    3.                  @handle_object,
    4.                  nil )
     
  12. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    ))) но наконец то сработал этот участок )))
    Код (Text):
    1. if (*(USHORT *)handle_object == 5  &&  *((USHORT *)handle_object+1) == 0x70) {
    2.  
    3.     if ( return_length = handle_fobject((PFILE_OBJECT)handle_object, out_buffer) ) {
    4.         ...
    5.     }
    6.  
    7. }


    и случилось это после этого:
    Код (Text):
    1.                  if(PFILE_OBJECT(handle_object)^._Type = 5)and(PFILE_OBJECT(handle_object)^._Size = $70)then
    2.                  begin ...
    3. end;
    4.  


    все-таки это не китайская грамота ))), так код более читабилен
     
  13. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Ms Rem, ты уверен????????
     
  14. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ LuckyDevil</font><!--color--><font color="gray]: а можно было бы так написать? ]</font><!--color-->



    Почти правильно (скобочек не хватает). И лучше уж тогда циферки не хардкодить.


    Код (Text):
    1. if ( ((FILE_OBJECT *)handle_object)->Type == IO_TYPE_FILE
    2.         &&
    3.      ((FILE_OBJECT *)handle_object)->Size == sizeof(FILE_OBJECT) ) {
    4.  
    5.     ...
    6. }


    <font color="gray][ LuckyDevil</font><!--color--><font color="gray]: (void *)&handle_object это трактуется как указатель на объект? ]</font><!--color-->



    Точнее - это указатель на переменную, в которую ObReferenceObjectByHandle запишет указатель на объект, если не обломится.





    ЗЫ: 0x80000000 = GENERIC_READ
     
  15. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    LuckyDevil

    Pointer(handle_object) - приведение handle_object к типу pointer



    @handle_object - указатель на переменную handle_object
     
  16. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Ms Rem, да конечно же так, при handle_object: Pointer;

    Four-F
    , ))) согласись, что так код выглядит понятней, потому как из всех просматривающих эту тему, никто не обратил на это внимание, и фик его мама знает сколько бы я сидел и ломал голову над этим.
     
  17. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Зараза....

    Просто слов нет, кто знает почему дам-файл перестал отображать отладочную информацию, причем прикол заключается в том что, теперь там все время устаревшая отадочная информация весит, удаление дампа, не дало никакого эффекта
     
  18. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    LuckyDevil

    в данном случае Pointer(handle_object) = handle_object, а @handle_object = адресу этой переменной в памяти, а это совсем разные вещи.
     
  19. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ LuckyDevil</font><!--color--><font color="gray]: ...согласись, что так код выглядит понятней... ]</font><!--color-->



    Дык, я всегда за это ;)
     
  20. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Four-F, как правильно открыть файл в режиме ядра и скинуть туда буфер?

    Я вроде как встречал эту информацию на форуме, но сейчас найти ее не могу (((

    ZwCreateFile...

    нужен маленький примерчик.