Wywoływanie konwencji, parametrów oraz typu powrotu
Procedura pomocnika prototypów jest:
FARPROC WINAPI __delayLoadHelper2(
PCImgDelayDescr pidd,
FARPROC * ppfnIATEntry
);
gdzie:
pidd
Element const wskaźnik do ImgDelayDescr (zobacz delayimp.h) zawiera przesunięcia różnych związane z importu danych, sygnatura czasowa, aby uzyskać informacje o wiązaniu i zestaw atrybutów, które zapewniają dodatkowych informacji na temat zawartości deskryptora.Obecnie istnieje tylko jeden atrybut dlattrRva, która wskazuje, że adresy w deskryptorze względnym wirtualnych adresów (w przeciwieństwie do wirtualne adresy).Definicja PCImgDelayDescr struktury, zobacz Struktura i stała — Definicje.
ppfnIATEntry
Wskaźnik do gniazda w ładunek opóźnienie importowania tabeli adresów (IAT), który ma zostać zaktualizowany o adresie importowanych funkcji.Procedury pomocnika musi przechowywać tę samą wartość, która będzie zwracać w tej lokalizacji.
Oczekiwano wartości zwracane
Jeśli funkcja zakończy się pomyślnie, zwraca adres importowanych funkcji.
W przypadku niepowodzenia funkcji zgłasza wyjątek i zwraca wartość 0.Można podnieść trzy typy wyjątków:
Nieprawidłowy parametr, który się stanie, jeśli atrybuty w pidd nie są poprawnie określona.
LoadLibrarynie powiodło się w określonej biblioteki DLL.
Niepowodzenie GetProcAddress.
Spoczywa odpowiedzialność do obsługi tych wyjątków.
Uwagi
Konwencja wywołania funkcji pomocnika jest __stdcall.Typ wartości zwrotnej nie jest stosowne, więc FARPROC jest używany.Ta funkcja ma powiązanie C.
Zwracana wartość opóźnienia pomocnika obciążenia musi być przechowywany w lokalizacji wskaźnik przekazanych w funkcji, chyba że mają swoje procedury pomocnika ma być używany jako zaczepienia powiadomień.W takim przypadku kodu jest odpowiedzialny za znajdowania wskaźnik odpowiednią funkcję do zwrócenia.Program łączący następnie generuje kod thunk trwa tej wartości zwracanej jako obiektu docelowego rzeczywistych importu i przechodzi do niego bezpośrednio.
Przykład
Poniższy kod przedstawia sposób implementować proste zaczepienia funkcji.
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;
*/