#ifndef _H_MODLOAD_PLUGIN
#define _H_MODLOAD_PLUGIN
#include "modloader.h"
namespace Security {
class LoadablePlugin : public Plugin, public CodeSigning::LoadableBundle {
public:
LoadablePlugin(const char *path);
void load();
void unload();
bool isLoaded() const;
CSSM_RETURN CSSM_SPI_ModuleLoad (const CSSM_GUID *CssmGuid,
const CSSM_GUID *ModuleGuid,
CSSM_SPI_ModuleEventHandler CssmNotifyCallback,
void *CssmNotifyCallbackCtx)
{ return fLoad(CssmGuid, ModuleGuid, CssmNotifyCallback, CssmNotifyCallbackCtx); }
CSSM_RETURN CSSM_SPI_ModuleUnload (const CSSM_GUID *CssmGuid,
const CSSM_GUID *ModuleGuid,
CSSM_SPI_ModuleEventHandler CssmNotifyCallback,
void *CssmNotifyCallbackCtx)
{ return fUnload(CssmGuid, ModuleGuid, CssmNotifyCallback, CssmNotifyCallbackCtx); }
CSSM_RETURN CSSM_SPI_ModuleAttach (const CSSM_GUID *ModuleGuid,
const CSSM_VERSION *Version,
uint32 SubserviceID,
CSSM_SERVICE_TYPE SubServiceType,
CSSM_ATTACH_FLAGS AttachFlags,
CSSM_MODULE_HANDLE ModuleHandle,
CSSM_KEY_HIERARCHY KeyHierarchy,
const CSSM_GUID *CssmGuid,
const CSSM_GUID *ModuleManagerGuid,
const CSSM_GUID *CallerGuid,
const CSSM_UPCALLS *Upcalls,
CSSM_MODULE_FUNCS_PTR *FuncTbl)
{
return fAttach(ModuleGuid, Version, SubserviceID, SubServiceType,
AttachFlags, ModuleHandle, KeyHierarchy, CssmGuid,
ModuleManagerGuid, CallerGuid, Upcalls, FuncTbl);
}
CSSM_RETURN CSSM_SPI_ModuleDetach (CSSM_MODULE_HANDLE ModuleHandle)
{ return fDetach(ModuleHandle); }
private:
CSSM_SPI_ModuleLoadFunction *fLoad;
CSSM_SPI_ModuleAttachFunction *fAttach;
CSSM_SPI_ModuleDetachFunction *fDetach;
CSSM_SPI_ModuleUnloadFunction *fUnload;
template <class FunctionType>
void findFunction(FunctionType * &func, const char *name)
{ func = (FunctionType *)lookupSymbol(name); }
};
}
#endif //_H_MODLOAD_PLUGIN