2011-03-18 6 views
1

현재 폐쇄 된 작업 프로젝트의 확장 DLL입니다.CRT의 _purecall 구현을 재정의합니다.

모든 순수 호출 버그를 잡아두고 싶습니다. 그래서 검색을하고 _purecall 처리기를 발견했습니다. 내 질문에 대한 구현입니다. 그 뒤에서 무슨 일이 일어나고있는거야? 컴파일러 자체는 (정의 된 경우) 내 처리기 함수 주소를 사용하고 클래스 함수 주소 자체 (초기화 후)에서 오버라이드되기 전에 v-table의 각 행에 기본값을 씁니다. CRT와 글로벌 포인터?

내 응용 프로그램 DLL에서 _purecall 처리기를 덮어 쓰는 플러그인 DLL을 원하지 않기 때문에이 질문을 던지고 있습니다. 내 purecall 처리기가 내 모듈의 purecall 만 처리 할 수 ​​있습니까?

감사합니다.

답변

1

대답은 컴파일러가 purecall 처리기를 구현하는 방법에 따라 크게 달라집니다. 컴파일러가 단순히 가상 함수 테이블의 "순수"함수 포인터를 대체하면 부모 프로세스 동작을 수정하는 것이 안전합니다.

그러나 일부 컴파일러는 CRT의 핸들러에서 핸들러를 호출하여 사용자 정의 purecall 핸들러를 구현합니다. 이 경우 동작은 DLL을 작성한 방법에 따라 다릅니다. 정적으로 CRT에 연결 한 경우 DLL에 모든 CRT 상태에 대한 자체 인스턴스가 있습니다. 이 경우 컴파일러 구현은 부적합합니다. 귀하의 순수 호출 핸들러는 상위 프로세스를 방해하지 않습니다.

CRT에 동적으로 연결된 경우 동작은 호스트 프로세스가 어떻게 작성되었는지에 따라 달라집니다. DLL과 동일한 버전의 CRT에 동적으로 링크 된 경우 purecall 처리기가 실제로 간섭 할 수 있습니다. 그러나 이것은 컴파일러 구현에 달려 있습니다. CRT에서 연결 고리를 호출하는 경우에도 CRT가 각 모듈에 대해 서로 다른 후크를 유지한다면 이 될 수 있습니다.

어떤 경우 든 안전하고 확실하게하려면 DLL을 CRT에 정적으로 연결하거나 purecall 처리기를 사용하지 않아야합니다 (대안으로 추상 클래스 대신 구체적인 기본 클래스 사용).

+0

CRT에 동적으로 링크되어 있지 않은 경우 여러 모듈간에 CRT를 공유 할 수 있습니다. –

+0

네, 맞습니다. 여러 모듈이 CRT를 동적으로로드하고 다른 버전의 CRT를 동적으로로드하는 경우를 혼동했습니다. 내 대답을 받아 들일거야. –

+0

고마워요! 나는 VC2010을 사용하여 응용 프로그램을 분해했고, 단순히 순수한 함수 포인터를 대체하는 것으로 보인다 ... – MindBlower

관련 문제