NtQueryObject и W2K3 - в чем там проблема?

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

  1. marty77

    marty77 New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2009
    Сообщения:
    6
    Разбираюсь вот с таким кодом:
    Код (Text):
    1. DWORD NTAPI FilenameFromHandle(HTT *htt)
    2. {
    3.     BYTE buff[1024];
    4.     for (int i = 0; i < 1024; i++) buff[i] = 0;
    5.     DWORD retval;
    6.     IO_STATUS_BLOCK iob;
    7.    
    8.     retval = NtQueryInformationFile(htt->handle, &iob, buff, 1024, FileNameInformation);
    9.     if (!retval)
    10.     {
    11.         WCHAR *ustring = (WCHAR*)&buff[4];
    12.         WideCharToMultiByte(CP_ACP, 0, ustring, -1, htt->txt,
    13.                 1024, NULL, NULL);
    14.     }
    15.     return retval;
    16. }
    17.  
    18.  
    19. DWORD QueryObjectName(HANDLE handle, char *txt)
    20. {
    21.     PDWORD buff = (PDWORD)LocalAlloc(LPTR, 0x1000);
    22.     DWORD retval = 0;
    23.     DWORD num_bytes = 0;
    24.     txt[0] = (char)0;
    25.     NtQueryObject(handle, ObjectNameInformation, buff, 0, &num_bytes);
    26.     if (num_bytes && !IsServer2k03)
    27.     {
    28.         retval = NtQueryObject(handle, ObjectNameInformation, buff, num_bytes, NULL);  
    29.         if (!retval && buff[1])
    30.             WideCharToMultiByte(CP_ACP, 0, (WCHAR*)buff[1], -1, txt,
    31.                 1024, NULL, NULL);
    32.     }
    33.     else
    34.     {
    35.         DWORD tid;
    36.         HANDLE hthread;
    37.         HTT htt = {handle, txt};
    38.         hthread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)FilenameFromHandle, &htt, 0, &tid);
    39.         if (WaitForSingleObjectEx(hthread, 500, FALSE) == WAIT_TIMEOUT)
    40.         {  
    41.             TerminateThread(hthread, 0);
    42.             strcpyA(txt, "THREAD BLOCKED... ACCESS DENIED!");
    43.             retval = 1;
    44.         }
    45.         else
    46.         {
    47.             LPSTR tmp = (LPSTR)LocalAlloc(LPTR, 1024);
    48.             retval = NtQueryObject(handle, ObjectNameInformation, buff, 0x1000, NULL);
    49.             if (!retval && buff[1])
    50.             {
    51.                 WideCharToMultiByte(CP_ACP, 0, (WCHAR*)buff[1], -1, txt,
    52.                 1024, NULL, NULL);
    53.                 if (strlenA(tmp) > strlenA(txt))
    54.                     strcpyA(txt, tmp);
    55.             }
    56.             LocalFree(tmp);
    57.         }
    58.         CloseHandle (hthread);
    59.     }
    60.     LocalFree(buff);
    61.     return retval;
    62. }
    Собственно, не понятно, в проблема с W2K3 - зачем такой наворот?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А зачем автор так написал?
    Почему тупой код тупой, а трава зеленая, а случайно не знаешь?
     
  3. marty77

    marty77 New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2009
    Сообщения:
    6
    Не раскроете мысль?
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
  5. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Одни и те же грабли каждый раз, тут на форуме.
    Надо попросить Клерка статью на эту тему и про EventPair, как и про ошибки, написать..доходчиво и понятно.
     
  6. JCronos

    JCronos New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2009
    Сообщения:
    98
    Нет, он скажет вы совсем обнаглели ;)
     
  7. marty77

    marty77 New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2009
    Сообщения:
    6
    Спасибо за ссылку. Я что-то краем уха слышал о проблеме, но с интересом прочд тот топик. Непонятно только, почему именно в2к3 выделается в отдельный случай, а для других запуск потока не используется?