#ifndef __KHIMAIRA_KMMINTERNAL_H
#define __KHIMAIRA_KMMINTERNAL_H
#define _NIMLIB_
#include<windows.h>
#include<shlwapi.h>
#include<strsafe.h>
#define KHERR_FACILITY kmm_facility
#define KHERR_FACILITY_ID KHM_FACILITY_KMM
#define KHERR_HMODULE ((HMODULE) kmm_hInstance)
#include<kherr.h>
#include<kmm.h>
#include<khmsgtypes.h>
#include<kherror.h>
#include<kplugin.h>
#define NOEXPORT
#include<utils.h>
#include<kconfig.h>
#include<kcreddb.h>
#include<kmm_msgs.h>
struct kmm_plugin_i_t;
typedef struct kmm_module_i_t {
khm_int32 magic;
wchar_t * name;
wchar_t * path;
wchar_t * description;
wchar_t * vendor;
wchar_t * support;
khm_version file_version;
khm_version prod_version;
HMODULE h_module;
HMODULE h_resource;
WORD lcid_resource;
khm_int32 flags;
khm_int32 state;
khm_int32 plugin_count;
void * version_info;
khm_int32 refcount;
struct kmm_plugin_i_t * plugins;
LDCL(struct kmm_module_i_t);
} kmm_module_i;
#define KMM_MODULE_MAGIC 0x482f4e88
#define kmm_is_module(m) ((m) && ((kmm_module_i *)m)->magic == KMM_MODULE_MAGIC)
#define kmm_module_from_handle(m) ((kmm_module_i *) m)
#define kmm_handle_from_module(m) ((kmm_module) m)
#define KMM_MODULE_FLAG_LOADED 0x00000001
#define KMM_MODULE_FLAG_INITP 0x00000002
#define KMM_MODULE_FLAG_RES_LOADED 0x00000008
#define KMM_MODULE_FLAG_SIG 0x00000010
#define KMM_MODULE_FLAG_DISABLED 0x00000400
#define KMM_MODULE_FLAG_NOUNLOAD 0x00000800
#define KMM_MODULE_FLAG_INACTIVE 0x00001000
typedef struct kmm_plugin_i_t {
kmm_plugin_reg p;
khm_int32 magic;
kmm_module_i * module;
HANDLE ht_thread;
DWORD tid_thread;
khm_int32 state;
khm_int32 flags;
int refcount;
int n_depends;
int n_unresolved;
struct kmm_plugin_i_t * dependants[KMM_MAX_DEPENDANTS];
int n_dependants;
LDCL(struct kmm_plugin_i_t);
} kmm_plugin_i;
#define KMM_PLUGIN_MAGIC 0x320e8fb4
#define kmm_is_plugin(p) ((p) && ((kmm_plugin_i *) (p))->magic == KMM_PLUGIN_MAGIC)
#define kmm_handle_from_plugin(p) ((kmm_plugin) p)
#define kmm_plugin_from_handle(ph) ((kmm_plugin_i *) ph)
#define KMM_PLUGIN_FLAG_UNLOAD 0x00000001
#define KMM_PLUGIN_FLAG_IN_LIST 0x00000002
#define KMM_PLUGIN_FLAG_IN_MODLIST 0x00000004
#define KMM_PLUGIN_FLAG_IN_QUEUE 0x00000010
#define KMM_PLUGIN_FLAG_IN_MODCOUNT 0x00000020
enum kmm_registrar_uparam_t {
KMM_REG_INIT_MODULE,
KMM_REG_EXIT_MODULE,
KMM_REG_INIT_PLUGIN,
KMM_REG_EXIT_PLUGIN
};
extern kmm_module_i * kmm_all_modules;
extern khm_size kmm_active_modules;
extern kmm_plugin_i * kmm_listed_plugins;
extern HANDLE ht_registrar;
extern DWORD tid_registrar;
extern DWORD tls_kmm;
extern hashtable * hash_plugins;
extern hashtable * hash_modules;
extern CRITICAL_SECTION cs_kmm;
extern int ready;
extern HANDLE evt_startup;
extern HANDLE evt_exit;
extern const wchar_t * kmm_facility;
extern HINSTANCE kmm_hInstance;
extern kconf_schema schema_kmmconfig[];
khm_boolean KHMAPI
kmmint_reg_cb(khm_int32 msg_type,
khm_int32 msg_sub_type,
khm_ui_4 uparam,
void *vparam);
DWORD WINAPI kmmint_registrar(LPVOID lpParameter);
DWORD WINAPI kmmint_plugin_broker(LPVOID lpParameter);
void kmmint_init_plugin(kmm_plugin_i * p);
void kmmint_exit_plugin(kmm_plugin_i * p);
void kmmint_init_module(kmm_module_i * m);
void kmmint_exit_module(kmm_module_i * m);
kmm_module_i *
kmmint_get_module_i(wchar_t * name);
kmm_module_i *
kmmint_find_module_i(wchar_t * name);
void
kmmint_free_module(kmm_module_i * m);
khm_int32
kmmint_read_module_info(kmm_module_i * m);
kmm_plugin_i *
kmmint_get_plugin_i(wchar_t * name);
kmm_plugin_i *
kmmint_find_plugin_i(wchar_t * name);
void
kmmint_free_plugin(kmm_plugin_i * pi);
void
kmmint_list_plugin(kmm_plugin_i * p);
void
kmmint_delist_plugin(kmm_plugin_i * p);
khm_boolean
kmmint_load_locale_lib(kmm_module_i * m, kmm_module_locale * l);
#define KMM_CSNAME_ROOT L"PluginManager"
#define KMM_CSNAME_PLUGINS L"Plugins"
#define KMM_CSNAME_MODULES L"Modules"
#define KMM_VALNAME_LOADLIST L"LoadList"
#define KMM_VALNAME_IMAGEPATH L"ImagePath"
void
kmmint_add_to_module_queue(void);
void
kmmint_remove_from_module_queue(void);
#define _WAIT_FOR_START \
do { \
if(ready) break; \
WaitForSingleObject(evt_startup, INFINITE); \
} while(0)
#endif