Разбираюсь вот с таким кодом: Код (Text): DWORD NTAPI FilenameFromHandle(HTT *htt) { BYTE buff[1024]; for (int i = 0; i < 1024; i++) buff[i] = 0; DWORD retval; IO_STATUS_BLOCK iob; retval = NtQueryInformationFile(htt->handle, &iob, buff, 1024, FileNameInformation); if (!retval) { WCHAR *ustring = (WCHAR*)&buff[4]; WideCharToMultiByte(CP_ACP, 0, ustring, -1, htt->txt, 1024, NULL, NULL); } return retval; } DWORD QueryObjectName(HANDLE handle, char *txt) { PDWORD buff = (PDWORD)LocalAlloc(LPTR, 0x1000); DWORD retval = 0; DWORD num_bytes = 0; txt[0] = (char)0; NtQueryObject(handle, ObjectNameInformation, buff, 0, &num_bytes); if (num_bytes && !IsServer2k03) { retval = NtQueryObject(handle, ObjectNameInformation, buff, num_bytes, NULL); if (!retval && buff[1]) WideCharToMultiByte(CP_ACP, 0, (WCHAR*)buff[1], -1, txt, 1024, NULL, NULL); } else { DWORD tid; HANDLE hthread; HTT htt = {handle, txt}; hthread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)FilenameFromHandle, &htt, 0, &tid); if (WaitForSingleObjectEx(hthread, 500, FALSE) == WAIT_TIMEOUT) { TerminateThread(hthread, 0); strcpyA(txt, "THREAD BLOCKED... ACCESS DENIED!"); retval = 1; } else { LPSTR tmp = (LPSTR)LocalAlloc(LPTR, 1024); retval = NtQueryObject(handle, ObjectNameInformation, buff, 0x1000, NULL); if (!retval && buff[1]) { WideCharToMultiByte(CP_ACP, 0, (WCHAR*)buff[1], -1, txt, 1024, NULL, NULL); if (strlenA(tmp) > strlenA(txt)) strcpyA(txt, tmp); } LocalFree(tmp); } CloseHandle (hthread); } LocalFree(buff); return retval; } Собственно, не понятно, в проблема с W2K3 - зачем такой наворот?
Одни и те же грабли каждый раз, тут на форуме. Надо попросить Клерка статью на эту тему и про EventPair, как и про ошибки, написать..доходчиво и понятно.
Спасибо за ссылку. Я что-то краем уха слышал о проблеме, но с интересом прочд тот топик. Непонятно только, почему именно в2к3 выделается в отдельный случай, а для других запуск потока не используется?