dlxload.cc
来自「SEAL是DOS 下的32位保护模式的GUI程序」· CC 代码 · 共 597 行 · 第 1/2 页
CC
597 行
void (*DLXSetLMaxInstance)(hdlx_t n, long i) = _DefaultSetLMaxInstance; /* my */
void (*DLXSetLOverload)(hdlx_t n, int i) = _DefaultSetLOverload; /* my */
void* (*DLXGetFileData)(hdlx_t n) = _DefaultGetFileData; /* my */
hdlx_t (*DLXGetID)(char*)=_DefaultGet;
void* (*DLXCodeAlloc)(unsigned long, long mclas)=_DefaultCodeAlloc;
static CDLX* _DLXLoad1(char* name)
{
void* me=DLXOpenFile(name);
if(me==NULL)
{
DLXError(0,name);
return NULL;
}
CDLX* ndlx=new CDLX(name,me);
DLXCloseFile(me);
if(ndlx==NULL)
{
DLXError(7,name);
return NULL;
}
ndlx=ndlx->Pass1();
return ndlx;
}
static void _DLXUnload1(CDLX* d)
{
delete(d);
}
static CDLX* _DLXLoad2(char* name)
{
CDLXLinkedList* tdlx=_dlxlist.GetLink(name);
if(tdlx!=NULL)
if ( DLXGetLInstanceC((CDLX*)*tdlx) < DLXGetLMaxInstanceC((CDLX*)*tdlx) ) { /* that's my */
if ( DLXGetLOverloadC((CDLX*)*tdlx) ) return (CDLX*)*tdlx;
else tdlx = NULL;
} else return NULL;
tdlx=_toilist.GetLink(name);
if(tdlx!=NULL)
return (CDLX*)*tdlx;
hdlx_t test=DLXGetID(name);
if(test!=0)
{
tdlx=_dlxlist.GetLink(test);
if(tdlx!=NULL)
if ( DLXGetLInstanceC((CDLX*)*tdlx) < DLXGetLMaxInstanceC((CDLX*)*tdlx) ) { /* that's my */
if ( DLXGetLOverloadC((CDLX*)*tdlx) ) return (CDLX*)*tdlx;
else tdlx = NULL;
} else return NULL;
tdlx=_toilist.GetLink(test);
if(tdlx!=NULL)
return (CDLX*)*tdlx;
}
CDLX* ndlx=_DLXLoad1(name);
if(ndlx==NULL)
return NULL;
CDLXLinkedList* n=new CDLXLinkedList(ndlx);
if(n==NULL)
{
DLXError(7,name);
_DLXUnload1(ndlx);
return NULL;
}
_toilist.AddNewLink(n);
return ndlx;
}
static void _DLXUnload2(CDLX* d)
{
CDLXLinkedList* n=_toilist.GetLink((hdlx_t)*d);
if(n==NULL)
return;
_toilist.RemoveLink(n);
_DLXUnload1(d);
}
// continue here...
static CDLX* _DLXLoad3(char* name, char* args)
{
CDLX* tdlx=_DLXLoad2(name);
if(tdlx==NULL)
return NULL;
CDLXLinkedList* n=new CDLXLinkedList(tdlx);
if(n==NULL)
{
DLXError(7,name);
_DLXUnload2(tdlx);
return NULL;
}
if(_toflist.AddNewLink(n)) // only load libs if not linked...
if(tdlx->Pass2()) // load libraries...
{
_toilist.Unload1();
_toflist.Clear();
return NULL;
}
tdlx->args = strdup(args);
return tdlx;
}
hdlx_t _DLXLoad(char* name, char *args)
{
strlwr(name);
DEBUG_printf("Run %s with %s args\n",name,args);
if(name==NULL)
return 0;
CDLX* myd=_DLXLoad3(name, args);
if(myd==NULL)
{
return 0;
}
hdlx_t mydlx=(hdlx_t)*myd;
if(_toilist.Pass3()) // intrace
{
_toilist.Unload1();
_toflist.Clear();
return 0;
}
DLXAddInAppList( mydlx ,myd,name); // *
_toilist.Initialize();
_dlxlist.GetLinks(_toilist);
_toflist.RInstanceInc();
myd->LInstanceInc();
_toflist.Clear();
return mydlx;
}
static int __DLXUnload(CDLX* tdlx)
{
if(tdlx==NULL)
{
DLXError(1,"(by number)");
return 1;
}
if(tdlx->AddDependancies(_toflist))
{
return 1;
}
hdlx_t id = (hdlx_t)*tdlx;
// working from here...
tdlx->LInstanceDec();
_toflist.RInstanceDec();
_toilist.GetLinks(_toflist);
_toilist.StripToUnload();
_toilist.DeInitialize();
_toilist.Unload2();
DelInAppList(id); // *
return 0;
}
int _DLXUnload(hdlx_t handle)
{
return __DLXUnload((CDLX*)*_dlxlist.GetLink(handle));
}
int _DLXUnloadEx(char* name)
{
strlwr(name);
return __DLXUnload((CDLX*)*_dlxlist.GetLink(name));
}
int _DLXImport(char** symbols)
{
return GlobalSymbols.AddExports(0,symbols);
}
void* _DLXGetEntry(hdlx_t target, char* name)
{
CDLX* tdlx=(CDLX*)*_dlxlist.GetLink(target);
if(tdlx==0)
return NULL;
return tdlx->GetEntry(name);
}
void* _DLXGetMemoryBlock(hdlx_t target)
{
CDLX* tdlx=(CDLX*)*_dlxlist.GetLink(target);
if(tdlx==0)
return NULL;
return tdlx->data;
}
void* _DLXGetResource(hdlx_t target)
{
CDLX* tdlx=(CDLX*)*_dlxlist.GetLink(target);
if(tdlx==0)
return NULL;
return tdlx->resdata;
}
long _DLXGetResourceLength(hdlx_t target)
{
CDLX* tdlx=(CDLX*)*_dlxlist.GetLink(target);
if(tdlx==0)
return NULL;
return tdlx->reslen;
}
long _DLXGetMemoryBlockLength(hdlx_t target)
{
CDLX* tdlx=(CDLX*)*_dlxlist.GetLink(target);
if(tdlx==0)
return NULL;
return tdlx->datalen;
}
////////////////////////////////////////////////////////////////////////////////
void* _DLXGetVersions(hdlx_t target) // *
{ return NULL;
/*if ( !target ) return NULL;
CDLX* tdlx=(CDLX*)*_dlxlist.GetLink(target);
if(tdlx==0)
return NULL;
return &tdlx->versions;*/
}
////////////////////////////////////////////////////////////////////////////////
void* _DLXReadVersions(char* name) // *
{ return NULL;
/*if ( !name ) return NULL;
void *f = DLXOpenFile(name);
if ( !f ) return NULL;
p_dlxiddesc ver = (p_dlxiddesc)malloc(sizeof(t_dlxiddesc));
memset(ver, 0, sizeof(t_dlxiddesc));
fpos_t pos = sizeof(dlxheader)+sizeof(long long);
long magic = 0;
if(!DLXReadFile(&magic, sizeof(long),f)) return NULL;
if ( magic != DLX3_MAGIC && magic != DLX2_MAGIC ) {
fseek((FILE*)f, EXE_HEADER, SEEK_SET);
if(!DLXReadFile(&magic, sizeof(long),f) && magic != DLX3_MAGIC && magic != DLX3_MAGIC ) return NULL;
pos += EXE_HEADER;
};
if ( magic == DLX3_MAGIC ) pos += sizeof(long)+sizeof(long long)+sizeof(long);
fsetpos((FILE*)f,&pos);
DLXReadFile(ver,sizeof(t_dlxiddesc),f);
DLXCloseFile(f);
return ver; */
}
////////////////////////////////////////////////////////////////////////////////
p_list listapp = NULL; // *
////////////////////////////////////////////////////////////////////////////////
void free_p_app ( void *p ) { // *
if ( p ) {
p_app o = (p_app)p;
if ( o->filename ) free ( o->filename );
if ( o->filename ) free ( o->appname );
if ( o->filename ) free ( o->desciption );
if ( o->filename ) free ( o->copyright );
if ( o->filename ) free ( o->manufacturer );
free(o);
};
};
l_uint info_free_memory ( void ) {
__dpmi_free_mem_info info;
__dpmi_get_free_memory_information(&info);
return info.total_number_of_free_pages * 4096;
};
////////////////////////////////////////////////////////////////////////////////
void DLXAddInAppList ( hdlx_t id, CDLX* o, char* filename ) { // *
if (!listapp) listapp = list_init( (p_list) malloc(sizeof(t_list)),&free_p_app,0);
p_app ap = (p_app) malloc(sizeof(t_app));
if ( !ap ) return;
memset(ap, 0, sizeof(t_app));
memcpy(&ap->id,&id,sizeof(hdlx_t));
ap->filename = strdup(filename);
if ( o->info.appname > 0 )
ap->appname = strdup(o->data+o->info.appname);
else
ap->appname = strdup("Unknow");
if ( o->info.description > 0 )
ap->desciption = strdup(o->data+o->info.description);
else
ap->desciption = strdup("Unknow");
if ( o->info.copyright > 0 )
ap->copyright = strdup(o->data+o->info.copyright);
else
ap->copyright = strdup("Unknow");
if ( o->info.manufacturer > 0 )
ap->manufacturer = strdup(o->data+o->info.manufacturer);
else
ap->manufacturer = strdup("Unknow");
memcpy(&ap->version,&o->info.version,sizeof(long));
memcpy(&ap->need_seal_version,&o->info.need_seal_version,sizeof(long));
listapp->insert ( listapp, ap );
DEBUG_printf("XDL :: Start running %s (%s) XDL N
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?