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 + -
显示快捷键?