2009-07-26 4 views
0

인가가후킹 스레드 종료

내가 작업 스레드 종료를 후킹하는 메커니즘을 개발 한 날 (즉, 그것이 종료 직전, 스레드에 대한 몇 가지 코드를 실행?) 관리되는 스레드의 종료 후크 할 수있는 방법 일부 스레드. 1 단계 : 콜백 함수를 사용하여 소멸자에서 호출하는 '후크'STA COM 클래스를 개발합니다. 2 단계 : 연결하려는 스레드에서이 개체의 ThreadStatic 인스턴스를 만들고 관리되지 않는 함수 포인터로 변환 된 관리되는 대리자를 개체에 전달합니다. 그런 다음 대리자는 스레드 종료시 호출됩니다 (CLR이 스레드 종료의 일부로 모든 STA COM RCW에서 IUnknown :: Release를 호출하기 때문에).

이 메커니즘은 예를 들어 스레드 클래스를 사용하여 코드로 작성한 작업자 스레드에서 작동합니다.

그러나 응용 프로그램의 주 스레드 (콘솔 또는 Windows 응용 프로그램)에서는 작동하지 않는 것 같습니다. '후크'COM 개체가 종료 프로세스에서 너무 늦게 삭제 된 것으로 보이고 대리인을 호출하려는 시도가 실패합니다.

(이 기능을 구현하려는 이유는 스레드에서 생성 된 STA COM 개체와 함께 작동하는 기존 스레드에서 네이티브 COM 코드를 실행할 수 있기 때문입니다. '너무 늦기 전에'(즉 스레드 전에 이 스레드에서 STA COM 개체로 더 이상 작업 할 수 없습니다.)

답변

0

스레드 만들기를 제어합니까? try ... finally 절에서 쓰레드의 코드를 간단히 감싸고 마침내 코드를 넣는 것이 가장 간단합니다.

AppDomain이 종료 될 때 시스템 종료가 적절하지 않을 수 있으므로 코드를 호출 할 수 없음을 유의하십시오.

"Destructor"라고 할 때 나는 C++/CLI 소멸자, 즉 .Dispose() 메소드를 사용한다고 가정합니다.

프로세스가 종료되기 전에 후크를 지원해야하는 경우 처리되지 않은 예외에 대해 실행되지 않는 것으로 보이는 AppDomain.CurrentDomain.ProcessExit 이벤트 또는 처리되지 않은 예외에서만 발생하는 것으로 보이는 AppDomain.CurrentDomain.UnhandledException 이벤트를 시도 할 수 있습니다.

이 중 특히 강건 해 보이지 않습니다.

+0

단락 1 : 아니오. 단락 2 : 네,하지만 문제 없습니다. 3 단락 : 아니오, 네이티브 C++의 소멸자가 코 클라스를 구현했습니다. 4 단락 : 흠, 나는 그것을 조사 할 것이다. 그럼에도 불구하고 제 5 항. – mackenir

+0

아쉽게도 AppDomain ProcessExit은 주 스레드와 다른 스레드에서 호출됩니다. – mackenir