00001
00002
00003
00004
00023 #ifndef _MODULE_H
00024 #define _MODULE_H
00025
00029 #define MODULE_MAGIC ('A'|('M'<<8)|('D'<<16)|('\2'<<24))
00030
00035
00036 #if ARCHDIR == x86
00037 # define MODULE_ARCH_ID 1
00038
00039 #elif ARCHDIR == x64
00040 # define MODULE_ARCH_ID 2
00041 #else
00042 # error "Unknown architecture when determining MODULE_ARCH_ID ('" #ARCHDIR "')"
00043 #endif
00044
00055 #define MODULE_DEFINE(_flags,_ver,_ident,_entry,_deinit,_deps...) \
00056 char *EXPAND_CONCAT(_DriverDeps_,_ident)[]={_deps};\
00057 tModule __attribute__ ((section ("KMODULES"),unused))\
00058 EXPAND_CONCAT(_DriverInfo_,_ident)=\
00059 {MODULE_MAGIC,MODULE_ARCH_ID,_flags,_ver,NULL,EXPAND_STR(_ident),\
00060 _entry,_deinit,EXPAND_CONCAT(_DriverDeps_,_ident)}
00061
00067 typedef struct sModule
00068 {
00069 Uint32 Magic;
00070 Uint8 Arch;
00071 Uint8 Flags;
00072 Uint16 Version;
00073 struct sModule *Next;
00074 char *Name;
00075 int (*Init)(char **Arguments);
00076 void (*Deinit)();
00077 char **Dependencies;
00078 } PACKED tModule;
00079
00083 enum eModuleErrors
00084 {
00085 MODULE_ERR_OK,
00086 MODULE_ERR_MISC,
00087 MODULE_ERR_NOTNEEDED,
00088 MODULE_ERR_MALLOC,
00089
00090 MODULE_ERR_MAX
00091 };
00092
00099 typedef struct sModuleLoader
00100 {
00101 struct sModuleLoader *Next;
00102 char *Name;
00103 int (*Detector)(void *Base);
00104 int (*Loader)(void *Base);
00105 int (*Unloader)(void *Base);
00106 } PACKED tModuleLoader;
00107
00113 extern int Module_RegisterLoader(tModuleLoader *Loader);
00114
00115 #endif