Еще раз про NtQueryObject

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

  1. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    http://www.wasm.ru/forum/viewtopic.php?id=12561
    http://www.wasm.ru/forum/viewtopic.php?id=7728

    Везде говорят, что ее вызов на синхронных хэндлах, например, именованных каналах, может приводить к зависанию. Попробовал сейчас для проверки (обработка ошибок опущена):

    Код (Text):
    1.     HANDLE hReadPipe;
    2.     TCHAR sss[1000];
    3.     NTSTATUS nts;
    4.  
    5.     ZeroMemory(sss, sizeof(sss));
    6.  
    7.     hReadPipe= CreateNamedPipe(L"\\\\.\\pipe\\pipename", PIPE_ACCESS_INBOUND,
    8.         PIPE_TYPE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES,
    9.         0x1000, 0x1000, 1000000, NULL);
    10.  
    11.     nts= NtQueryObject(hReadPipe, ObjectNameInformation, sss, sizeof(sss), &u);
    12.  
    13.     _tprintf(L"%s\n", ((PUNICODE_STRING)sss)->Buffer);
    так и пишет в выводе:
    Код (Text):
    1. \Device\NamedPipe\pipename
    тестил на XP SP1 (ntdll.dll 5.1.2600.1106, ntoskrnl.exe 5.1.2600.1634)

    Вопрос: что я делаю не так, и стоит ли рассчитывать, что это будет работать везде?
     
  2. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    что вроде так в юзермоде (просто пример)
    Код (Text):
    1. ULONG size = 0x2000;
    2. DWORD ret=0;
    3. NtQueryObject (Handle,ObjectNameInformation,NULL,0,&size );
    4. if(size==0) size = 0x2000;
    5. PUNICODE_STRING lpBuffer=(PUNICODE_STRING)LocalAlloc(LMEM_ZEROINIT,size);
    6. NtQueryObject(Handle,ObjectNameInformation,(PVOID)lpBuffer, size, &ret );
    7. MessageBoxW(NULL,lpBuffer->Buffer,0,0);
    8. LocalFree(lpBuffer);
     
  3. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    RET
    в общем, месседж вылазиет без вопросов со все той же строкой - "\Device\NamedPipe\pipename"
    вопрос не в том, почему не работает, а в том, почему не зависает )
     
  4. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
     
  5. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    RET
    да, действительно (я до этого пытался заставить его "что-то делать" в другом потоке, но с тем же результатом - как оказалось, неправильно пытался)
    все, получилось, функция замечательно виснет, благодарю за ответы, тема закрыта )