U_E>Выходит, что хендлы определяются с точностью до второго бита??...
Да. Младший бит используется для управления IOCP:
Even if you have passed the function a file handle associated with a completion port and a valid OVERLAPPED structure, an application can prevent completion port notification. This is done by specifying a valid event handle for the hEvent member of the OVERLAPPED structure, and setting its low-order bit. A valid event handle whose low-order bit is set keeps I/O completion from being queued to the completion port.
Здравствуйте, Unhandled_Exception, Вы писали:
U_E>да, забыл добавить: hEvent1 не равен hEvent
по-моему — два младших бита могут быть не значимы, но уверенности нету — давно я уже читал устройство винды внутрях...
Хендл — всего-лишь толи индекс в таблице указателей, толи прямо адрес... и то и то округляется до 4...
... << RSDN@Home 1.2.0 alpha rev. 790>>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте, TarasCo, Вы писали:
U_E>>Выходит, что хендлы определяются с точностью до второго бита??...
TC>Да. Младший бит используется для управления IOCP:
Если верить определению недокументированной структуры EXHANDLE то оба младних бита...
typedef struct _EXHANDLE {
union {
struct {
//
// Application available tag bits
//
ULONG TagBits : 2;
//
// The handle table entry index
//
ULONG Index : 30;
};
HANDLE GenericHandleOverlay;
};
} EXHANDLE, *PEXHANDLE;
Здравствуйте, Hacker_Delphi, Вы писали:
H_D>Здравствуйте, Unhandled_Exception, Вы писали:
U_E>>да, забыл добавить: hEvent1 не равен hEvent H_D>по-моему — два младших бита могут быть не значимы, но уверенности нету — давно я уже читал устройство винды внутрях... H_D>Хендл — всего-лишь толи индекс в таблице указателей, толи прямо адрес... и то и то округляется до 4...
handle это то что тебе дали, что бы отдать в другие (заранее оговорённые ф-ии). И более ничего. Никакие арифметические или логические операции могут привести к UB. Некоторые заметили что handle mod 4 == 0. Некоторые, зная внутренность Windows могут добавить информации об этом. Но формально взял handle не меняй его отдавай целым, он же нашего флага цвета одного. Шутка.
Здравствуйте, Сергей Мухин, Вы писали:
СМ>handle это то что тебе дали, что бы отдать в другие (заранее оговорённые ф-ии). И более ничего. Никакие арифметические или логические операции могут привести к UB. Некоторые заметили что handle mod 4 == 0. Некоторые, зная внутренность Windows могут добавить информации об этом. Но формально взял handle не меняй его отдавай целым, он же нашего флага цвета одного. Шутка.
а я и не спорил никогда с этим — я про внутреннюю их функцию...
... << RSDN@Home 1.2.0 alpha rev. 790>>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте, Hacker_Delphi, Вы писали:
H_D>Здравствуйте, Сергей Мухин, Вы писали:
СМ>>handle это то что тебе дали, что бы отдать в другие (заранее оговорённые ф-ии). И более ничего. Никакие арифметические или логические операции могут привести к UB. Некоторые заметили что handle mod 4 == 0. Некоторые, зная внутренность Windows могут добавить информации об этом. Но формально взял handle не меняй его отдавай целым, он же нашего флага цвета одного. Шутка. H_D>а я и не спорил никогда с этим — я про внутреннюю их функцию...
тогда озаглавим тему так: не верное значения параметра в некоторые ф-ии WinApi не приводят к возврату ими "неверные параметры"
Здравствуйте, Unhandled_Exception, Вы писали:
U_E>Выходит, что хендлы определяются с точностью до второго бита??...
С хендлами так лучше не шутить. Такая вот описка: CloseHandle( &handle ) (обратите внимание на амперсенд) приводила в моей программе к тому, что ломался ни в чем не повинный socket() в другом потоке. Причем не сразу.
Здравствуйте, Pzz, Вы писали:
Pzz>С хендлами так лучше не шутить.
само собой.
Pzz>Такая вот описка: CloseHandle( &handle ) (обратите внимание на амперсенд) приводила в моей программе к тому, что ломался ни в чем не повинный socket() в другом потоке. Причем не сразу.
неужели при отладке CloseHandle не ругнулся на invalid handle?
Здравствуйте, Unhandled_Exception, Вы писали:
U_E>неужели при отладке CloseHandle не ругнулся на invalid handle?
Не знаю, я не проверял. Но масштаб последствий меня весьма удивил. Я думал, венда как-то более аккуратно свои хендлы проверяет. Спасибо хоть, с ней BSOD не случился
Re[2]: Загадка с хендлами
От:
Аноним
Дата:
20.02.08 19:49
Оценка:
Pzz>С хендлами так лучше не шутить. Такая вот описка: CloseHandle( &handle ) (обратите внимание на амперсенд) приводила в моей программе к тому, что ломался ни в чем не повинный socket() в другом потоке. Причем не сразу.
возможно у вас на системе кривая LSP стоит?
Здравствуйте, Аноним, Вы писали:
Pzz>>С хендлами так лучше не шутить. Такая вот описка: CloseHandle( &handle ) (обратите внимание на амперсенд) приводила в моей программе к тому, что ломался ни в чем не повинный socket() в другом потоке. Причем не сразу. А>возможно у вас на системе кривая LSP стоит?
Нет, самая стандартная. К тому же, непонятно, как CloseHandle() на то, что не является сокетом, может "обидеть" LSP.
Re[4]: Загадка с хендлами
От:
Аноним
Дата:
20.02.08 23:12
Оценка:
Pzz>Нет, самая стандартная. К тому же, непонятно, как CloseHandle() на то, что не является сокетом, может "обидеть" LSP.
ну в таком случае чтото у вас не то, ибо CloseHandle на другие процессы не влияет. А LSP он может обидеть очень просто: если LSP юзает какой нить глобальный IPC для синхронизации своей работы между процессами, то закрыв какой нить ее хэндл в своем процессе вы могли снести крышу всей ее логике.