Как использовать SafeWaitHandle.DangerousGetHandle? - PullRequest
1 голос
/ 24 декабря 2009

У меня есть неуправляемый код, который вызывает асинхронный управляемый метод, который возвращает дескриптор, а затем неуправляемый код использует этот дескриптор для ожидания. Согласно документации, SafeWaitHandle предоставляет 2 других метода (DangerousAddRef и DangerousRelease). Должен ли я использовать эти методы, чтобы предотвратить выпуск дескриптора? Как следует из названия метода DangerousGetHandle, мне кажется, я должен быть очень осторожен с чем-то, что здесь опасного?

Редактировать: Есть ли лучший способ реализовать этот сценарий (не опасно)?

Ответы [ 2 ]

2 голосов
/ 28 декабря 2009

Если управляемый метод возвращает дескриптор, но не передает владение дескриптором вызывающему неуправляемому методу, то вы должны просто вернуть дескриптор как SafeWaitHandle напрямую (он будет перенаправлен в дескриптор) - это Кстати, неуправляемому коду не нужно беспокоиться об освобождении дескриптора.
Если вы хотите передать владение дескриптором неуправляемому методу, вам следует вызвать DangerousAddRef перед возвратом дескриптора, но затем вы должны освободить дескриптор, используя неуправляемый код.

0 голосов
/ 24 декабря 2009

С MSDN :

Использование метода DangerousGetHandle может представлять угрозу безопасности, потому что, если дескриптор был помечен как недействительный с SetHandleAsInvalid, DangerousGetHandle по-прежнему возвращает оригинальная, потенциально несвежая ручка значение. Возвращенная ручка также может быть переработано в любой момент. В лучшем случае это означает, что ручка может внезапно остановиться за работой. В худшем случае, если ручка или ресурс, который обрабатывает представляет подвергается ненадежным код, это может привести к утилизации атака безопасности на повторно или возвращенная ручка.

...