home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magazyn Internet 2000 May
/
MICD_2000_05.iso
/
CBuilder5
/
INSTALL
/
DATA1.CAB
/
Program_Built_Files
/
Include
/
delayimp.h
< prev
next >
Wrap
C/C++ Source or Header
|
2000-02-01
|
6KB
|
156 lines
/****************************************************************************
* filename - DelayImp.h
*
* structures and prototypes necessary for delay loading of imports.
* Delay loading of DLL imports is selected when building a module by
*
*
* This technology supports delayed loading of DLLs for arbitrary images.
*
* Restrictions:
* You cannot delay loading of a reference to imported data.
* You cannot delay loading of KERNEL32.DLL.
* You cannot delay loading of the RTLDLL (since these routines need
* to be present to support delayed loading).
* You must be very careful with using __FUnloadDelayLoadedDLL in a
* multithreaded environment. It is possible to cause problems
* if one thread gets a delay loaded function address from this
* module, at the same time as another thread unloads the delayed
* load DLL. There is no way for us to guard against that, so
* the user has to be aware of the possibility.
*
* Notes:
* TLS support works for delayed load DLLs with Borland tools, as we
* have worked around the OS restrictions of handling TLS variables in
* dynamically loaded DLLs.
*
****************************************************************************/
/*
* C/C++ Run Time Library - Version 10.0
*
* Copyright (c) 1999, 2000 by Inprise Corporation
* All Rights Reserved.
*
*/
/* $Revision: 9.4 $ */
#ifndef __DELAYIMP_H
#define __DELAYIMP_H
#include <windows.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct ImgDelayDescr
{
DWORD grAttrs; /* attributes */
LPCSTR szName; /* pointer to dll name */
HMODULE hmod; /* address of module handle */
IMAGE_THUNK_DATA * pIAT; /* address of the IAT */
IMAGE_THUNK_DATA * pINT; /* address of the INT */
IMAGE_THUNK_DATA * pBoundIAT; /* address of the optional bound IAT */
IMAGE_THUNK_DATA * pUnloadIAT; /* address of optional copy of
original IAT */
DWORD dwTimeStamp; /* 0 if not bound, */
/* O.W. date/time stamp of DLL bound
to (Old BIND) */
} ImgDelayDescr;
/* Delay load import hook notifications */
typedef enum
{
dliNoteStartProcessing, /* used to bypass or note helper only */
dliNotePreLoadLibrary, /* called just before LoadLibrary, can */
/* override w/ new HMODULE return val */
dliNotePreGetProcAddress, /* called just before GetProcAddress, can */
/* override w/ new FARPROC return value */
dliFailLoadLibrary, /* failed to load library, fix it by */
/* returning a valid HMODULE */
dliFailGetProcAddress, /* failed to get proc address, fix it by */
/* returning a valid FARPROC */
dliNoteEndProcessing, /* called after all processing is done, */
/* no bypass possible at this point */
/* except by longjmp(), throw(), or
RaiseException. */
} dliNotification;
typedef struct DelayLoadProc
{
BOOL fImportByName;
union
{
LPCSTR szProcName;
DWORD dwOrdinal;
};
} DelayLoadProc;
typedef struct DelayLoadInfo
{
DWORD cb; /* size of structure */
const ImgDelayDescr * pidd; /* raw form of data (everything is
there) */
FARPROC * ppfn; /* points to address of function to
load */
LPCSTR szDll; /* name of dll */
DelayLoadProc dlp; /* name or ordinal of procedure */
HMODULE hmodCur; /* the hInstance of the library we
have loaded */
FARPROC pfnCur; /* the actual function that will be
called */
DWORD dwLastError;/* error received (if an error
notification) */
} DelayLoadInfo, *PDelayLoadInfo;
typedef FARPROC (WINAPI *DelayedLoadHook)(
dliNotification dliNotify,
DelayLoadInfo * pdli
);
/* Unload support */
/* routine definition; takes a pointer to a name to unload, or NULL to
unload all the delay load dlls in the list.
*/
BOOL WINAPI __FUnloadDelayLoadedDLL(LPCSTR szDll);
/* Hook pointers */
/* The "notify hook" gets called for every call to the
delay load helper. This allows a user to hook every call and
skip the delay load helper entirely.
dliNotify ==
{
dliNoteStartProcessing |
dliNotePreLoadLibrary |
dliNotePreGetProcAddress |
dliNoteEndProcessing
}
on this call.
*/
extern DelayedLoadHook _EXPDATA __pfnDliNotifyHook;
/* This is the failure hook,
dliNotify ==
{
dliFailLoadLibrary |
dliFailGetProcAddress
}
*/
extern DelayedLoadHook _EXPDATA __pfnDliFailureHook;
#ifdef __cplusplus
}
#endif
#endif /* __DELAYIMP_H */