Загадка с хендлами
От: Unhandled_Exception Россия  
Дата: 20.02.08 10:27
Оценка:
Всем привет.

Делаем так:

HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
HANDLE hEvent1 = (HANDLE)((DWORD)hEvent | 2);
CloseHandle(hEvent1);

CloseHandle возвращает TRUE.

Делаем так:

HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
HANDLE hEvent1 = (HANDLE)((DWORD)hEvent | 2);
CloseHandle(hEvent1);
CloseHandle(hEvent);

Первый CloseHandle возвращает TRUE. Второй завершается неудачей, код ошибки: невалидный хендл.

Выходит, что хендлы определяются с точностью до второго бита??...
Re: Загадка с хендлами
От: Unhandled_Exception Россия  
Дата: 20.02.08 10:31
Оценка:
Здравствуйте, Unhandled_Exception, Вы писали:

U_E>HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

U_E>HANDLE hEvent1 = (HANDLE)((DWORD)hEvent | 2);
U_E>CloseHandle(hEvent1);
U_E>CloseHandle(hEvent);

да, забыл добавить: hEvent1 не равен hEvent
Re: Загадка с хендлами
От: TarasCo  
Дата: 20.02.08 11:23
Оценка: 5 (2)
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.

Да пребудет с тобою сила
Re[2]: Загадка с хендлами
От: Hacker_Delphi Россия  
Дата: 20.02.08 11:47
Оценка:
Здравствуйте, Unhandled_Exception, Вы писали:

U_E>да, забыл добавить: hEvent1 не равен hEvent

по-моему — два младших бита могут быть не значимы, но уверенности нету — давно я уже читал устройство винды внутрях...
Хендл — всего-лишь толи индекс в таблице указателей, толи прямо адрес... и то и то округляется до 4...
... << RSDN@Home 1.2.0 alpha rev. 790>>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[2]: Загадка с хендлами
От: DronG Украина  
Дата: 20.02.08 12:06
Оценка:
Здравствуйте, 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;


соответсвенно

ex_h.GenericHandleOverlay=hEvent;
ex_h.GenericHandleOverlay=hEvent1;


при поиске нужного хэндла в таблице учитывается только Handle.Index, да и то лишь младшие 24 бита из него.
Re[3]: Загадка с хендлами
От: Сергей Мухин Россия  
Дата: 20.02.08 16:35
Оценка:
Здравствуйте, Hacker_Delphi, Вы писали:

H_D>Здравствуйте, Unhandled_Exception, Вы писали:


U_E>>да, забыл добавить: hEvent1 не равен hEvent

H_D>по-моему — два младших бита могут быть не значимы, но уверенности нету — давно я уже читал устройство винды внутрях...
H_D>Хендл — всего-лишь толи индекс в таблице указателей, толи прямо адрес... и то и то округляется до 4...

handle это то что тебе дали, что бы отдать в другие (заранее оговорённые ф-ии). И более ничего. Никакие арифметические или логические операции могут привести к UB. Некоторые заметили что handle mod 4 == 0. Некоторые, зная внутренность Windows могут добавить информации об этом. Но формально взял handle не меняй его отдавай целым, он же нашего флага цвета одного. Шутка.
---
С уважением,
Сергей Мухин
Re[4]: Загадка с хендлами
От: Hacker_Delphi Россия  
Дата: 20.02.08 17:52
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>handle это то что тебе дали, что бы отдать в другие (заранее оговорённые ф-ии). И более ничего. Никакие арифметические или логические операции могут привести к UB. Некоторые заметили что handle mod 4 == 0. Некоторые, зная внутренность Windows могут добавить информации об этом. Но формально взял handle не меняй его отдавай целым, он же нашего флага цвета одного. Шутка.

а я и не спорил никогда с этим — я про внутреннюю их функцию...
... << RSDN@Home 1.2.0 alpha rev. 790>>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[5]: Загадка с хендлами
От: Сергей Мухин Россия  
Дата: 20.02.08 18:03
Оценка:
Здравствуйте, Hacker_Delphi, Вы писали:

H_D>Здравствуйте, Сергей Мухин, Вы писали:


СМ>>handle это то что тебе дали, что бы отдать в другие (заранее оговорённые ф-ии). И более ничего. Никакие арифметические или логические операции могут привести к UB. Некоторые заметили что handle mod 4 == 0. Некоторые, зная внутренность Windows могут добавить информации об этом. Но формально взял handle не меняй его отдавай целым, он же нашего флага цвета одного. Шутка.

H_D>а я и не спорил никогда с этим — я про внутреннюю их функцию...

тогда озаглавим тему так: не верное значения параметра в некоторые ф-ии WinApi не приводят к возврату ими "неверные параметры"
---
С уважением,
Сергей Мухин
Re: Загадка с хендлами
От: Pzz Россия https://github.com/alexpevzner
Дата: 20.02.08 18:09
Оценка:
Здравствуйте, Unhandled_Exception, Вы писали:

U_E>Выходит, что хендлы определяются с точностью до второго бита??...


С хендлами так лучше не шутить. Такая вот описка: CloseHandle( &handle ) (обратите внимание на амперсенд) приводила в моей программе к тому, что ломался ни в чем не повинный socket() в другом потоке. Причем не сразу.
Re[2]: Загадка с хендлами
От: Unhandled_Exception Россия  
Дата: 20.02.08 18:11
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>С хендлами так лучше не шутить.


само собой.

Pzz>Такая вот описка: CloseHandle( &handle ) (обратите внимание на амперсенд) приводила в моей программе к тому, что ломался ни в чем не повинный socket() в другом потоке. Причем не сразу.


неужели при отладке CloseHandle не ругнулся на invalid handle?
Re[3]: Загадка с хендлами
От: Pzz Россия https://github.com/alexpevzner
Дата: 20.02.08 18:15
Оценка:
Здравствуйте, Unhandled_Exception, Вы писали:

U_E>неужели при отладке CloseHandle не ругнулся на invalid handle?


Не знаю, я не проверял. Но масштаб последствий меня весьма удивил. Я думал, венда как-то более аккуратно свои хендлы проверяет. Спасибо хоть, с ней BSOD не случился
Re[2]: Загадка с хендлами
От: Аноним  
Дата: 20.02.08 19:49
Оценка:
Pzz>С хендлами так лучше не шутить. Такая вот описка: CloseHandle( &handle ) (обратите внимание на амперсенд) приводила в моей программе к тому, что ломался ни в чем не повинный socket() в другом потоке. Причем не сразу.
возможно у вас на системе кривая LSP стоит?
Re[3]: Загадка с хендлами
От: Pzz Россия https://github.com/alexpevzner
Дата: 20.02.08 19:51
Оценка:
Здравствуйте, Аноним, Вы писали:

Pzz>>С хендлами так лучше не шутить. Такая вот описка: CloseHandle( &handle ) (обратите внимание на амперсенд) приводила в моей программе к тому, что ломался ни в чем не повинный socket() в другом потоке. Причем не сразу.

А>возможно у вас на системе кривая LSP стоит?

Нет, самая стандартная. К тому же, непонятно, как CloseHandle() на то, что не является сокетом, может "обидеть" LSP.
Re[4]: Загадка с хендлами
От: Аноним  
Дата: 20.02.08 23:12
Оценка:
Pzz>Нет, самая стандартная. К тому же, непонятно, как CloseHandle() на то, что не является сокетом, может "обидеть" LSP.
ну в таком случае чтото у вас не то, ибо CloseHandle на другие процессы не влияет. А LSP он может обидеть очень просто: если LSP юзает какой нить глобальный IPC для синхронизации своей работы между процессами, то закрыв какой нить ее хэндл в своем процессе вы могли снести крышу всей ее логике.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.