호출 규칙, 매개 변수, 반환 형식
도우미 루틴의 프로토타입은 다음과 같습니다.
FARPROC WINAPI __delayLoadHelper2(
PCImgDelayDescr pidd,
FARPROC * ppfnIATEntry
);
다음은 각 옵션에 대한 설명입니다.
pidd
다양한 가져오기 관련 데이터의 오프셋, 바인딩에 대한 타임스탬프 정보, 설명자 내용에 대한 추가 정보를 제공하는 특성 등을 포함하고 있는 ImgDelayDescr(delayimp.h 참조)에 대한 const 포인터입니다. 현재는 설명자의 주소가 가상 주소의 반대인 상대 가상 주소임을 나타내는 dlattrRva라는 한 가지 특성만 제공됩니다.PCImgDelayDescr 구조체의 정의에 대한 내용은 구조체 및 상수 정의를 참조하십시오.
ppfnIATEntry
가져온 함수의 주소로 업데이트될 지연 로드 IAT(가져오기 주소 테이블)의 슬롯에 대한 포인터입니다. 도우미 루틴은 해당 위치로 반환될 값과 동일한 값을 저장해야 합니다.
예상되는 반환 값
함수가 정상적으로 실행되면 가져온 함수의 주소가 반환됩니다.
함수가 실행되지 못하면 예외가 발생하고 0이 반환됩니다. 다음 세 가지 예외가 발생할 수 있습니다.
잘못된 매개 변수입니다. 이 예외는 pidd 의 특성이 올바로 지정되지 않은 경우 발생합니다.
지정한 DLL에서 LoadLibrary를 실행할 수 없습니다.
GetProcAddress를 실행할 수 없습니다.
이 예외는 사용자가 처리해야 합니다.
설명
도우미 함수에 대한 호출 규칙은 __stdcall입니다. 반환 값의 형식이 적절하지 않으므로 FARPROC이 사용됩니다. 이 함수에는 C 링크가 있습니다.
도우미 루틴을 알림 후크에 사용하지 않으려면 지연 로드 도우미의 반환 값은 전달된 함수 포인터 위치에 저장되어야 합니다. 이 경우 반환할 적절한 함수 포인터를 찾는 코드를 작성해야 합니다. 링커가 생성하는 썽크 코드는 이 반환 값을 가져오기의 실제 대상으로 사용하고 대상 위치로 바로 점프합니다.
샘플
다음 코드에서는 간단한 후크 함수를 구현하는 방법을 보여 줍니다.
FARPROC WINAPI delayHook(unsigned dliNotify, PDelayLoadInfo pdli)
{
switch (dliNotify) {
case dliStartProcessing :
// If you want to return control to the helper, return 0.
// Otherwise, return a pointer to a FARPROC helper function
// that will be used instead, thereby bypassing the rest
// of the helper.
break;
case dliNotePreLoadLibrary :
// If you want to return control to the helper, return 0.
// Otherwise, return your own HMODULE to be used by the
// helper instead of having it call LoadLibrary itself.
break;
case dliNotePreGetProcAddress :
// If you want to return control to the helper, return 0.
// If you choose you may supply your own FARPROC function
// address and bypass the helper's call to GetProcAddress.
break;
case dliFailLoadLib :
// LoadLibrary failed.
// If you don't want to handle this failure yourself, return 0.
// In this case the helper will raise an exception
// (ERROR_MOD_NOT_FOUND) and exit.
// If you want to handle the failure by loading an alternate
// DLL (for example), then return the HMODULE for
// the alternate DLL. The helper will continue execution with
// this alternate DLL and attempt to find the
// requested entrypoint via GetProcAddress.
break;
case dliFailGetProc :
// GetProcAddress failed.
// If you don't want to handle this failure yourself, return 0.
// In this case the helper will raise an exception
// (ERROR_PROC_NOT_FOUND) and exit.
// If you choose you may handle the failure by returning
// an alternate FARPROC function address.
break;
case dliNoteEndProcessing :
// This notification is called after all processing is done.
// There is no opportunity for modifying the helper's behavior
// at this point except by longjmp()/throw()/RaiseException.
// No return value is processed.
break;
default :
return NULL;
}
return NULL;
}
/*
and then at global scope somewhere
PfnDliHook __pfnDliNotifyHook2 = delayHook;
*/