일부 패치를 적용하려면 Windows API's PatchAPI을 사용하고 싶습니다. 패치 적용은 mspatcha.dll에서 구현됩니다. mspatcha.dll은 자신의 system32 폴더에 있어야합니다.Windows API의 PatchAPI에 연결
ref 및 인터넷 검색과 같은 다양한 장소에서 읽은 후에는 아직이 DLL에 연결할 수있는 올바른 방법을 찾지 못했습니다. 나는 정적으로 링크하고 싶습니다. LoadLibrary를 다루는 것이 엉망이고 일종의 patchapi.h 헤더의 목적을 무효로합니다.
1) DUMPBIN/수출 C : 나는 더 lib 디렉토리 파일을 발견했기 때문에 나는 다음과 같은 명령을 사용하여 내 자신을 만들어, 링크입니다 \ 창 \ system32를 \ mspatcha.dll
2) 만들기 mspatcha.def 파일의 출력에 나타나는 각 기능 이름 한 줄 이어에 "수출"라인 물품
3) LIB /def:mspatcha.def /out:mspatcha.lib
DUMPBIN 이 방법이 patchapi와 정적으로 링크하는 올바른 방법이 아니라고 확신하지만 그렇게 할 올바른 방법을 찾지 못했습니다. 어쨌든, 다음 단계를 수행 한 후 ApplyPatchToFileExA()를 한 번 호출하여 간단한 테스트 케이스를 작성한 후에도 _ApplyPatchToFileA @ 16 기호에 링커 오류가 발생합니다. 발견 "ApplyPatchToFileExA"| \ TMP \ mspatcha> 수출/DUMPBIN mspatcha.lib : 내 새로 만든 mspatcha.lib의 수출 심볼을 살펴보면 ,이 기능은 잘못된 이름 규칙
D를 사용하는 것이 나타납니다 내가 틀렸다하지 않는 한
_ApplyPatchToFileExA
,이 DLL이 stdcall을 사용하고 (또는 적어도 _stdcall 등의 기능을 선언한다) 반면 LIB 수출 기능을 cdecl 규칙을 사용하는 것을 나타냅니다. 참조 : C name decoration in Microsoft Windows.
제 질문은 : 응용 프로그램에서 mspatcha.dll을 사용하는 올바른 방법은 무엇이고 DLL을 통해 lib를 만드는 과정에서 정적 링크를 할 수 있습니까?
내 터미널의 상세한 출력은 여기에서 찾을 수 있습니다 : 용어의 점으로 http://pastebin.com/q4FV4Se6
"정적으로 가져온"및 "정적으로 링크 된"이라는 용어를 구분하십시오. 전자는 로더가 이진 파일을 제어하기 전에 가져온 함수를 해결한다는 것을 의미합니다 (실패 할 수도 있음). 후자는 실제 객체 코드가 최종 이진 이미지에 링크된다는 것을 의미합니다. – 0xC0000022L
나는'lib.exe'가 당신이주는 DEF 파일에서 그것과 같은 데코 레이팅 된 이름을 만들어야한다는 것을 조금 혼란스러워합니다. 당신은 이것에 연결하려고 시도 했습니까?lib 디렉토리로 이동 한 다음 결과 바이너리의 가져 오기 디렉토리를 검사하십시오. – 0xC0000022L
이 작은 도구를 사용해보십시오 : http://vortex.masmcode.com/files/def2lib11.zip - 링커와 로더가 모두 만족할 수 있도록 .def 파일에서 데코 레이팅 된 이름을 사용합니다. – 0xC0000022L