MS VC++ 프로젝트의 WinAPI 함수 호출을 자체 구현으로 바꾸는 방법(이름과 매개변수 세트는 동일함)

StackOverflow https://stackoverflow.com/questions/60641

  •  09-06-2019
  •  | 
  •  

문제

모든 WinAPI 호출을 교체해야 합니다.

  • 파일 생성,
  • 파일 읽기,
  • SetFilePointer,
  • 닫기 핸들

내 자신의 구현(블루투스를 통한 낮은 수준의 파일 읽기 사용)을 사용합니다.기능이 대체될 코드는 Video File Player이며 이미 일반 HDD 파일에서 작동합니다.VideoPlayer 입력의 파일이 일반 hdd 파일인 경우 Video Player가 여전히 HDD에서 파일을 재생할 수 있어야 합니다.

그러한 작업에 대한 모범 사례는 무엇입니까?

도움이 되었습니까?

해결책

다음 단계를 따르는 것이 좋습니다.

  1. 처음에는 해당 API를 호출하고 동일한 인수를 수정되지 않은 상태로 전달하는 래퍼 함수 세트(예: MyCreateFile, MyReadFile 등)를 작성합니다.
  2. 텍스트 편집기를 사용하여 원본 API에 대한 모든 호출을 검색하고 이를 새 래퍼 함수에 대한 호출로 바꿉니다.
  3. 애플리케이션이 여전히 올바르게 작동하는지 테스트합니다.
  4. 자신의 목적에 맞게 래퍼 함수를 ​​수정합니다.

CreateFile은 UNICODE 정의 여부에 따라 CreateFileW 또는 CreateFileA로 확장되는 매크로입니다.LPCTSTR 사용을 고려하고 TCHAR 함수 그러면 애플리케이션을 ANSI 또는 유니코드로 구축할 수 있습니다.

여기의 다른 응답에서 제안한 것처럼 #define을 사용하지 마십시오. 이는 유지 관리 문제로 이어질 뿐이며 Maximilian이 올바르게 지적했듯이 모범 사례는 아닙니다.

다른 팁

사용자 정의 네임스페이스에 새 함수를 작성할 수 있습니다.예를 들어

namespace Bluetooth
{
  void CreateFile(/*params*/);
  void etc...
}

그런 다음 코드에서 변경해야 할 유일한 사항은 다음과 같습니다.

if (::CreateFile(...))
{
}

에게

if (Bluetooth::CreateFile(...))
{
}

쉬운!:)

다른 애플리케이션에서 이러한 API에 대한 호출을 가로채려는 경우 다음을 고려하세요. 우회.

코드를 편집할 수 있다면 원하는 작업을 수행하는 사용자 정의 API를 사용하도록 코드를 다시 작성하면 됩니다.실패하면 Maximilian의 기술을 사용하십시오. 그러나 유지 관리에 대한 공포가 있다는 점에 유의하십시오.

코드를 편집할 수 없는 경우 가져오기 테이블을 패치하여 호출을 자신의 코드로 리디렉션할 수 있습니다.이 기술에 대한 설명은 다음에서 찾을 수 있습니다. 이 기사 - "가져오기 주소 테이블 변경을 통한 감시" 섹션을 검색하세요.

이것은 위험하지만 조심한다면 성공할 수 있습니다.또한 확인해보세요 마이크로소프트 우회, 동일한 종류의 작업을 수행하지만 실제 패치를 어지럽힐 필요는 없습니다.

정말로 API를 하이재킹하고 싶다면 다음을 보세요. 주사기.dll (L-GPL).

나는 이것이 모범 사례라고 생각하지 않지만 변경하려는 함수가 호출되는 모든 곳에 포함된 포함 파일에 넣으면 작동할 것입니다.

#define CreateFile MyCreateFile

HRESULT MyCreateFile(whatever the params are);

MyCreateFile 구현은 다음과 같습니다.

#undef CreateFile
HRESULT MyCreateFile(NobodyCanRememberParamListsLikeThat params)
{
    if (InputIsNormalFile())
        CreateFile(params);
    else
        // do your thing
}

기본적으로 모든 CreateFile 호출을 MyCreateFile 호출로 만들어서 자체 구현을 사용해야 하는지 아니면 원래 구현을 사용해야 하는지 결정할 수 있습니다.

부인 성명:나는 이것을 하는 것이 추악하다고 생각하고 그렇게 하지 않을 것입니다.차라리 모든 사건이나 무언가를 검색하고 교체하고 싶습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top