2016-12-03 5 views
0

요청한 함수가없는 이전 컴퓨터에서 코드를 실행하는 중입니다. 이를 확인하기 위해서는 과 GetProcAddress을 사용하고 here으로 표시하지만 GetProcAddress은 사용하기 전에 TypeDef에있는 기능의 주소가 필요합니다.
예를 들어, 가지고 예에 두, XP SP2 32 비트 :함수 포인터가있는 TypeDef : 함수가 존재하지 않습니다.

typedef BOOL (__stdcall *LPFN_Wow64RevertWow64FsRedirection) (PVOID OldValue); 
typedef BOOL (__stdcall *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); 
... 

... 
LPFN_Wow64RevertWow64FsRedirection wowRevert = NULL; 
LPFN_Wow64DisableWow64FsRedirection wowDisable = NULL; 
HINSTANCE hLib; 
if(GetProcAddresses(&hLib, "kernel32.dll", 2, &wowRevert,_ 
"Wow64RevertWow64FsRedirection", &wowDisable, Wow64DisableWow64FsRedirection")) 
{... 

코드가 여기 충돌 :

프로 시저 시작 지점의 Wow64RevertWow64FsRedirection는 동적 링크 라이브러리의 Kernal32 찾을 수 없습니다. 그것은 비 WINAPI의 형식 정의와 우리 자신의 사용자 정의 Wow64RevertWow64FsRedirection을 구현할 수있을만큼 쉽게

dll을,하지만 어떻게 그들은 때 (SECURITY) 기능을 비활성화 기본 유형으로 대체 할 수있다 kernel32.dll에 이온이 있습니까?

+0

* 그러나 GetProcAddress에는 함수의 주소가 필요합니다. * - 사실이 아닙니다. [GetProcAddress] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms683212%28v=vs.85%29.aspx)에는 모듈 핸들과 문자열 만 필요합니다. – PaulMcKenzie

+0

@Paul : 여기 도와주세요. 귀하의 [답변] (http://forums.codeguru.com/showthread.php?247936-Problem-using-GetProcAddress) 길을 돌아 보았습니다 :이 여전히 적용됩니까? –

+0

'GetProcAddress'는 함수에 대한 포인터를 반환합니다. 함수를 호출하기 위해 함수 포인터가 필요하지 않습니다 (문자열 이름에 대한 포인터 제외). – PaulMcKenzie

답변

1

질문을 이해하는 데 약간의 문제가 있습니다. Wow64RevertWow64FsRedirection 함수는 분명히 32 비트 운영 체제에는 존재하지 않으므로 32 비트 Windows XP에는 존재하지 않습니다. 따라서 GetProcAddress을 사용하여이 함수에 대한 포인터를 검색하려고하면 실패합니다. 이 진입 점을 찾을 수 없다는 현명한 오류가 발생합니다. 진입 점을 찾을 수 없으면 함수가 존재하지 않으므로 호출하지 마십시오.

당신은 자신의 사용자 정의 Wow64RevertWow64FsRedirection 함수를 구현할 수 있다고 주장하지만, 왜 그렇게하고 싶지 않은지 가장 모르는 생각입니다. 운영 체제가 WOW64 파일 시스템 리디렉션을 지원하면 Wow64RevertWow64FsRedirection 기능을 제공합니다. 그렇지 않으면 함수를 제공하지 않지만 과 같은 함수가 필요합니다. WOW64 파일 시스템 리다이렉션과 같은 것이 없기 때문입니다. 활성화, 비활성화 또는 되돌릴 필요가 없습니다.

당신이 필요로하는 것보다 훨씬 더 복잡하게 만드는 것 같습니다. 프로세스가 64 비트 프로세스인지 먼저 확인하지 않아도됩니다. 진입 점을 Wow64RevertWow64FsRedirection (또는 필요에 따라 Wow64DisableWow64FsRedirection)으로 지정하거나, 존재하는 경우 호출하거나, 존재하지 않으면 실패를 무시할 수 있습니다.

그것은만큼 간단하다 : 나는 모듈 kernel32.dll에 대한 핸들을 검색 할 GetModuleHandle 함수를 호출하고

BOOL RevertWOW64RedirectionIfNecessary(PVOID pOldValue) 
{ 
    typedef BOOL (WINAPI * fnWow64RevertWow64FsRedirection)(PVOID); 

    fnWow64RevertWow64FsRedirection pfn = 
     reinterpret_cast<fnWow64RevertWow64FsRedirection>(
      reinterpret_cast<void*>(
      GetProcAddress(GetModuleHandle(L"kernel32"), 
          "Wow64RevertWow64FsRedirection"))); 

    if (pfn) 
    { 
     // The function exists, so call it through the pointer we obtained. 
     return pfn(pOldValue); 
    } 
    else 
    { 
     // The function does not exist, so we can't call it. 
     // But we don't ever need to call it in such cases, 
     // so do nothing and feign success. 
     return TRUE; 
    } 
} 

참고합니다 (.dll 확장이 함축된다). 내가 항상 모든 응용 프로그램의 프로세스에서로드 된 보장한다는 것을 알고 있기 때문에 LoadModule 대신 여기 GetModuleHandle 사용할 수 있습니다. 그리고 GetModuleHandle을 사용했기 때문에 모듈 핸들을 해제 할 필요도 없습니다.

주소를 검색 할 함수/프로 시저의 이름이 들어있는 문자열과 함께 결과 핸들을 GetProcAddress 함수에 전달합니다. 이 함수는 해당 함수의 주소를 검색하려고 시도하고 함수가있는 경우이를 반환합니다. 그렇지 않으면 실패하고 NULL을 반환합니다.

유효 포인터가 반환되었는지 확인하고 그렇다면 포인터를 통해 동적으로 함수를 호출합니다. 그렇지 않으면 함수가 사용할 수 없다는 것을 의미하는 NULL을 반환했지만,이 경우에도 걱정할 필요가 없으므로 코드는 아무 작업도 수행하지 않습니다.

재미있는 주조에 대해서는이 트릭을 설명하는 my answer here을 참조하십시오.

+0

OUCH! 수 시간 동안 인터넷 검색이 [이] (http://stackoverflow.com/questions/25413612/wow64disablewow64fsredirection-on-32-bit-windows-xp)에 걸쳐 나타났습니다. 하지만 고마워, 문제는 WOW64 문이 실행되기 전에 코드가 충돌한다는 것입니다. 처음에는 전역 적으로 선언 된 유일한 것이 'LPFN_ISWOW64PROCESS'라고 가정했습니다. –

+0

[Codeproject] (https://www.codeproject.com/Articles/1087/Loading-DLLs-made-easy?)의 메소드가 쓸모없는 것 같습니다. –

+0

그것은 내게 지나치게 엔지니어링 된 것처럼 보입니다. 로드하려는 모듈이로드 된 것을 보장 할 수없는 경우에 더 유용 할 수 있습니다. 그것은 당신이'GetModuleHandle'을 사용할 수없고'LoadLibrary'를 호출해야한다는 것을 의미합니다. 'FreeLibrary'에 대한 호출을 의미합니다. 대용량의 동적 로딩을해야 할 때 복잡한 래퍼 매크로를 사용합니다. 주로 작성해야하는 코드의 양을 줄이고 오류 발생 가능성을 줄입니다. 그러나이 시나리오와 같은 간단한 시나리오에서는 필요하지 않습니다. –