亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? task.c

?? 一個用C和匯編寫的Dos操作系統的源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/****************************************************************/
/*                                                              */
/*                           task.c                             */
/*                                                              */
/*                 Task Manager for DOS Processes               */
/*                                                              */
/*                      Copyright (c) 1995                      */
/*                      Pasquale J. Villani                     */
/*                      All Rights Reserved                     */
/*                                                              */
/* This file is part of DOS-C.                                  */
/*                                                              */
/* DOS-C is free software; you can redistribute it and/or       */
/* modify it under the terms of the GNU General Public License  */
/* as published by the Free Software Foundation; either version */
/* 2, or (at your option) any later version.                    */
/*                                                              */
/* DOS-C is distributed in the hope that it will be useful, but */
/* WITHOUT ANY WARRANTY; without even the implied warranty of   */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See    */
/* the GNU General Public License for more details.             */
/*                                                              */
/* You should have received a copy of the GNU General Public    */
/* License along with DOS-C; see the file COPYING.  If not,     */
/* write to the Free Software Foundation, 675 Mass Ave,         */
/* Cambridge, MA 02139, USA.                                    */
/****************************************************************/

#include "../../hdr/portab.h"
#include "globals.h"

/* $Logfile:   C:/dos-c/src/kernel/task.c_v  $ */
#ifdef VERSION_STRINGS
static BYTE *RcsId = "$Header:   C:/dos-c/src/kernel/task.c_v   1.14   07 Feb 1998 20:38:32   patv  $";
#endif

/* $Log:   C:/dos-c/src/kernel/task.c_v  $
 * 
 *    Rev 1.14   07 Feb 1998 20:38:32   patv
 * Modified stack fram to match DOS standard
 * 
 *    Rev 1.13   31 Jan 1998 14:39:20   patv
 * Corrected type in load high code.
 * 
 *    Rev 1.12   31 Jan 1998 14:02:52   patv
 * Added load high in memory option in DosExeLoader.
 * 
 *    Rev 1.11   22 Jan 1998 22:17:14   patv
 * Eliminated warnings.
 * 
 *    Rev 1.10   22 Jan 1998 21:31:36   patv
 * Corrected short .COM problem.
 * 
 *    Rev 1.9   04 Jan 1998 23:15:16   patv
 * Changed Log for strip utility
 * 
 *    Rev 1.8   22 Jan 1997 13:18:14   patv
 * pre-0.92 Svante Frey bug fixes.
 * 
 *    Rev 1.7   16 Jan 1997 12:46:56   patv
 * pre-Release 0.92 feature additions
 * 
 *    Rev 1.5   29 Aug 1996 13:07:22   patv
 * Bug fixes for v0.91b
 * 
 *    Rev 1.4   29 May 1996 21:03:36   patv
 * bug fixes for v0.91a
 * 
 *    Rev 1.3   19 Feb 1996  3:21:48   patv
 * Added NLS, int2f and config.sys processing
 * 
 *    Rev 1.2   01 Sep 1995 17:54:22   patv
 * First GPL release.
 * 
 *    Rev 1.1   30 Jul 1995 20:51:58   patv
 * Eliminated version strings in ipl
 * 
 *    Rev 1.0   02 Jul 1995  8:34:06   patv
 * Initial revision.
 */
/* $EndLog$ */

#define LOADNGO 0
#define LOAD    1
#define OVERLAY 3

static exe_header header;

#define CHUNK 16384
#define MAXENV 32768

#ifndef PROTO
COUNT ChildEnv(exec_blk FAR *, UWORD *, char far *);
#else
COUNT ChildEnv();
#endif

#ifndef IPL
COUNT 
ChildEnv (exec_blk FAR *exp, UWORD *pChildEnvSeg, char far *pathname)
{
        BYTE FAR *pSrc;
        BYTE FAR *pDest;
        UWORD nEnvSize;
        COUNT RetCode;
        UWORD MaxEnvSize;
        psp FAR *ppsp = MK_FP( cu_psp, 0);
       
        /* create a new environment for the process             */
        /* copy parent's environment if exec.env_seg == 0       */

        pSrc = exp -> exec.env_seg ? 
                        MK_FP(exp -> exec.env_seg, 0) :
                        MK_FP(ppsp -> ps_environ, 0);
                   
        if (!pSrc)    /* no environment to copy */
        {
                *pChildEnvSeg = 0;
                return SUCCESS;
        }

        for(nEnvSize = 0; *pSrc != '\0'; )
        {
                while(*pSrc != '\0')
                {
                        ++pSrc;
                        ++nEnvSize;
                }
                /* account for terminating null         */
                ++nEnvSize;
                ++pSrc;
        }

        /* Test env size and abort if greater than max          */
        if(nEnvSize >= MAXENV)
                return DE_INVLDENV;

        /* allocate enough space for env + path                 */
        if((RetCode = DosMemAlloc(long2para(nEnvSize + 65), 
          FIRST_FIT, (seg FAR *)pChildEnvSeg,
          (UWORD FAR *)MaxEnvSize)) < 0)
                return RetCode;
        else
                pDest = MK_FP(*pChildEnvSeg + 1, 0);

        /* fill the new env and inform the process of its       */
        /* location throught the psp                            */
        pSrc = exp -> exec.env_seg ? 
                        MK_FP(exp -> exec.env_seg, 0) :
                        MK_FP(ppsp -> ps_environ, 0);
        
        /* copy the environment */
        for( ; *pSrc != '\0'; )
        {
                while (*pSrc) 
                {
                        *pDest++ = *pSrc++;  
                } 
                pSrc++;
                *pDest++ = 0;
        }
        *pDest++ = 0;
        /* initialize 'extra strings' count */
        *pDest++ = 1;
        *pDest++ = 0;
        
        /* copy complete pathname */
        truename(pathname, pDest);
        return SUCCESS;
}

#endif


/* The following code is 8086 dependant                         */
VOID 
new_psp (psp FAR *p, int psize)
{
        REG COUNT i;
        BYTE FAR *lpPspBuffer;
        psp FAR *q = MK_FP(cu_psp, 0);

        /* Clear out new psp first                              */
        for(lpPspBuffer = (BYTE FAR *)p, i = 0; i < sizeof(psp) ; ++i)
                *lpPspBuffer = 0;
        
        /* initialize all entries and exits                     */
        /* CP/M-like exit point                                 */
        p -> ps_exit = 0x20cd;     
        
        /* CP/M-like entry point - jump to special entry        */
        p -> ps_farcall= 0xea;
#ifndef IPL
        p -> ps_reentry = cpm_entry;
#endif
        /* unix style call - 0xcd 0x21 0xcb (int 21, retf)      */
        p -> ps_unix[0] = 0xcd;
        p -> ps_unix[1] = 0x21; 
        p -> ps_unix[2] = 0xcb; 

        /* Now for parent-child relationships                   */
        /* parent psp segment                                   */
        p -> ps_parent = cu_psp;
        /* previous psp pointer                                 */
        p -> ps_prevpsp = q;

#ifndef IPL
        /* Environment and memory useage parameters             */
        /* memory size in paragraphs                            */
        p -> ps_size = psize;
        /* environment paragraph                                */
        p -> ps_environ = 0;
        /* process dta                                          */
        p -> ps_dta = (BYTE FAR *)(&p -> ps_cmd_count);
        
        /* terminate address                                    */
        p -> ps_isv22 = (VOID(interrupt FAR *)(void))getvec(0x22);
        /* break address                                        */
        p -> ps_isv23 = (VOID(interrupt FAR *)(void))getvec(0x23);
        /* critical error address                               */
        p -> ps_isv24 = (VOID(interrupt FAR *)(void))getvec(0x24);
#endif

        /* File System parameters                               */
        /* user stack pointer - int 21                          */
        p -> ps_stack = (BYTE FAR *)-1;
        /* file table - 0xff is unused                          */
        for(i = 0; i < 20; i++)
                p -> ps_files[i] = 0xff;
        
        /* maximum open files                                   */
        p -> ps_maxfiles = 20;
        /* open file table pointer                              */
        p -> ps_filetab = p -> ps_files;

#ifndef IPL
        /* clone the file table                                 */
        if(InDOS > 0)
        {
                REG COUNT i;
                
                for(i = 0; i < 20; i++)
                {
                        REG COUNT ret;

                        if(q -> ps_filetab[i] != 0xff
                         && ((ret = CloneHandle(q -> ps_filetab[i])) >= 0))
                        {        
                                p -> ps_filetab[i] = ret;
                        }
                        else
                                p -> ps_filetab[i] = 0xff;
                }
        }
        else
        {
                /* initialize stdin, stdout, etc                        */
                p -> ps_files[STDIN] = 0;       /* stdin                */
                p -> ps_files[STDOUT] = 1;      /* stdout               */
                p -> ps_files[STDERR] = 2;      /* stderr               */
                p -> ps_files[STDAUX] = 3;      /* stdaux               */
                p -> ps_files[STDPRN] = 4;      /* stdprn               */
       }
#else
        /* initialize stdin, stdout, etc                        */
        p -> ps_files[STDIN] = 0;       /* stdin                */
        p -> ps_files[STDOUT] = 1;      /* stdout               */
        p -> ps_files[STDERR] = 2;      /* stderr               */
        p -> ps_files[STDAUX] = 3;      /* stdaux               */
        p -> ps_files[STDPRN] = 4;      /* stdprn               */
#endif

        /* first command line argument                          */
        p -> ps_fcb1.fcb_drive = 0;
        /* second command line argument                         */
        p -> ps_fcb2.fcb_drive = 0;

        /* local command line                                   */
        p -> ps_cmd_count = 0;  /* command tail                 */
        p -> ps_cmd[0] = 0;     /* command tail                 */
}


#ifndef IPL
static COUNT 
DosComLoader (BYTE FAR *namep, exec_blk FAR *exp, COUNT mode)
{
        COUNT rc, env_size, nread;
        UWORD mem;
        UWORD env, asize;
        BYTE FAR *sp, FAR *dp;
        psp FAR *p;
        psp FAR *q = MK_FP(cu_psp, 0);
        mcb FAR *mp, FAR *envp = 0;
        iregs FAR *irp;
        LONG com_size;
        
        if(mode != OVERLAY)
        {
                
                if((rc = ChildEnv(exp, &env, namep)) != SUCCESS)
                {        
                        return rc;
                }
                /* Allocate our memory and pass back any errors         */
                if((rc = DosMemAlloc(0, LARGEST, (seg FAR *)&mem, (UWORD FAR *)&asize)) < 0)
                {
                        if(env != 0)
                           DosMemFree(env);
                        
                        return rc;
                }
                mp = MK_FP(mem, 0);
                ++mem;
                envp = MK_FP(env, 0);
        }
        else mem = exp -> load.load_seg;

        /* Now load the executable                              */
        /* If file not found - error                            */
        /* NOTE - this is fatal because we lost it in transit   */
        /* from DosExec!                                        */
        if((rc = dos_open(namep, 0)) < 0)
                fatal("(DosComLoader) com file lost in transit");
        /* do it in 32K chunks                                  */
        sp = MK_FP(mem, mode == OVERLAY? 0 : sizeof(psp));
        for(com_size = dos_getfsize(rc), nread = 0; com_size > 0; )
        {
                nread = dos_read(rc, sp, CHUNK);
                sp = add_far((VOID FAR *)sp, (ULONG)nread);
                com_size -= nread;
                if(nread < CHUNK)
                        break;
        }
        dos_close(rc);

        if(mode == OVERLAY)
                 return SUCCESS;

        /* point to the PSP so we can build it                  */
        p = MK_FP(mem, 0);
        setvec(0x22, (VOID (INRPT FAR *)(VOID))MK_FP(user_r -> CS, user_r -> IP));
        new_psp(p, mem + asize);

        p -> ps_environ = env == 0 ? 0 : env + 1;

        /* complete the psp by adding the command line          */
        p -> ps_cmd_count = exp -> exec.cmd_line -> ctCount;
        fbcopy(exp -> exec.cmd_line -> ctBuffer, p -> ps_cmd, 127);
#if 0
        /* stick a new line on the end for safe measure         */
        p -> ps_cmd[p -> ps_cmd_count] = '\r';
#endif
        /* identify the mcb as this functions'                  */
        /* use the file name less extension - left adjusted and */
        /* space filled                                         */
        mp -> m_psp = mem;
        if (envp) envp -> m_psp = mem;   

        for(asize = 0; asize < 8; asize++)
        {
                if(namep[asize] != '.')
                        mp -> m_name[asize] = namep[asize];
                else
                        break;
        }
        for(; asize < 8; asize++)
                        mp -> m_name[asize] = ' ';

        /* build the user area on the stack                     */
        irp = MK_FP(mem, (0xfffe - sizeof(iregs)));

        /* start allocating REGs                                */
        irp -> ES = irp -> DS = mem;
        irp -> CS = mem;
        irp -> IP = 0x100;
        irp -> AX = 0xffff; /* for now, until fcb code is in    */
        irp -> BX =
        irp -> CX =
        irp -> DX =
        irp -> SI =
        irp -> DI =
        irp -> BP = 0;
        irp -> FLAGS = 0x200;

        /* Transfer control to the executable                   */
        p -> ps_parent = cu_psp;
        p -> ps_prevpsp = (BYTE FAR *)MK_FP(cu_psp, 0);
        q -> ps_stack = (BYTE FAR *)user_r;
        user_r -> FLAGS &= ~FLG_CARRY;
        
        switch(mode)
        {
        case LOADNGO:
        {        
                cu_psp = mem;
                dta = p -> ps_dta;
                if (InDOS)
                	--InDOS;
                exec_user(irp);

                /* We should never be here                      */
                fatal("KERNEL RETURNED!!!");
                break;
        }
        case LOAD:
                cu_psp = mem;
                exp -> exec.stack = (BYTE FAR *)irp;
                exp -> exec.start_addr = MK_FP(irp -> CS, irp -> IP);
                return SUCCESS;
        }

        return DE_INVLDFMT;
}


VOID 
return_user (void)
{
        psp FAR *p, FAR *q;
        REG COUNT i;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜av区久久| av男人天堂一区| 国产成人精品免费网站| 在线精品观看国产| 国产偷v国产偷v亚洲高清| 一个色妞综合视频在线观看| 国产精品一品视频| 欧美精品三级日韩久久| 亚洲天堂成人在线观看| 狠狠色丁香婷婷综合| 69久久夜色精品国产69蝌蚪网| 中文字幕av资源一区| 九九视频精品免费| 欧美一区二区性放荡片| 亚洲成a人在线观看| 99国内精品久久| 欧美极品另类videosde| 麻豆成人在线观看| 在线成人av影院| 午夜日韩在线电影| 欧美午夜理伦三级在线观看| 中文字幕亚洲不卡| 99在线热播精品免费| 国产日韩成人精品| 国产在线视频不卡二| 欧美成人a∨高清免费观看| 午夜精品一区二区三区免费视频 | 一区二区三区不卡在线观看 | 日本乱码高清不卡字幕| 国产精品视频看| 国产成人精品免费| 国产欧美久久久精品影院| 国产精品一区二区x88av| 欧美成人猛片aaaaaaa| 日本麻豆一区二区三区视频| 欧美一区二区三区爱爱| 免费黄网站欧美| 91 com成人网| 免费看黄色91| 久久精品在线免费观看| 成人美女视频在线观看18| 日本一区二区三区dvd视频在线| 国产成人午夜精品影院观看视频 | 亚洲一二三四在线| 欧美日韩久久久一区| 青娱乐精品视频| 久久综合狠狠综合久久激情| 丁香婷婷深情五月亚洲| 亚洲伦在线观看| 精品视频一区二区不卡| 麻豆精品在线观看| 国产网红主播福利一区二区| 成人视屏免费看| 亚洲国产精品一区二区久久 | 色素色在线综合| 性感美女久久精品| 日韩欧美国产一区在线观看| 成人性生交大片| 亚洲成人久久影院| 久久精品一区八戒影视| 91一区二区三区在线播放| 日韩经典中文字幕一区| 国产欧美一区二区三区鸳鸯浴 | 久久精品国产99国产| 国产日韩精品一区二区三区| 91成人看片片| 国产在线视频一区二区三区| 亚洲人成在线播放网站岛国| 日韩女优制服丝袜电影| www.成人网.com| 日韩国产在线一| 中文在线资源观看网站视频免费不卡| 一本色道a无线码一区v| 九色|91porny| 亚洲图片欧美视频| 国产欧美一区二区在线| 欧美一区二区三区四区高清| jvid福利写真一区二区三区| 久久aⅴ国产欧美74aaa| 亚洲与欧洲av电影| 欧美国产欧美综合| 日韩一区二区三区电影| 91精彩视频在线观看| 国产福利一区二区| 久久精品国产亚洲高清剧情介绍| 亚洲精品国久久99热| 久久久国产精品不卡| 欧美福利视频导航| 色综合久久中文字幕| 国产69精品久久久久777| 奇米精品一区二区三区四区 | 国产亚洲欧美在线| 51精品视频一区二区三区| 91美女在线观看| jlzzjlzz国产精品久久| 精品一区二区三区免费观看| 婷婷综合在线观看| 亚洲一区二区三区四区的| 中文字幕永久在线不卡| 欧美国产精品v| 久久精品人人做人人综合| 日韩写真欧美这视频| 91精品婷婷国产综合久久| 欧美日韩久久久| 欧美日韩国产精选| 欧美三级一区二区| 欧美日韩一区二区三区高清| 色综合久久中文字幕综合网| a4yy欧美一区二区三区| 国产成人高清在线| 成人激情图片网| av电影在线观看不卡 | 婷婷国产在线综合| 亚洲3atv精品一区二区三区| 亚洲资源在线观看| 亚洲v日本v欧美v久久精品| 亚洲精品老司机| 亚洲自拍偷拍麻豆| 午夜视频一区二区三区| 日本中文字幕一区二区视频 | 亚洲欧美欧美一区二区三区| 国产精品美女久久久久久久网站| 国产喂奶挤奶一区二区三区| 久久久久国产一区二区三区四区| 久久九九99视频| 国产精品视频第一区| 日韩理论片一区二区| 亚洲与欧洲av电影| 日韩经典一区二区| 国产精品亚洲综合一区在线观看| 韩国成人在线视频| 成人性生交大片免费看中文网站| 99re热视频精品| 欧洲av一区二区嗯嗯嗯啊| 7777精品伊人久久久大香线蕉 | 日本亚洲三级在线| 毛片av一区二区| 高清国产午夜精品久久久久久| av资源站一区| 欧美影院精品一区| 91精品国产综合久久国产大片| 日韩三级中文字幕| 亚洲国产精品国自产拍av| 亚洲欧美国产高清| 日本亚洲天堂网| 成人晚上爱看视频| 欧美日韩在线播| 久久久亚洲精品一区二区三区| 亚洲欧洲www| 日韩高清不卡一区二区| 国产乱国产乱300精品| 一本到高清视频免费精品| 欧美va亚洲va| 亚洲精品国产高清久久伦理二区 | 亚洲福利视频一区| 韩日精品视频一区| 欧美在线免费视屏| 久久精品男人天堂av| 亚洲成人免费影院| av不卡免费电影| 精品蜜桃在线看| 一区二区三区在线视频免费| 国产麻豆欧美日韩一区| 欧美三级欧美一级| 国产精品久久网站| 六月丁香婷婷色狠狠久久| 一本色道久久加勒比精品| 久久久777精品电影网影网| 丝瓜av网站精品一区二区| 波多野结衣亚洲一区| 日韩欧美在线影院| 亚洲国产成人porn| 成人国产精品免费| 精品播放一区二区| 日日夜夜免费精品视频| 91热门视频在线观看| 国产色91在线| 欧美a级一区二区| 欧美日韩亚洲不卡| 亚洲激情图片一区| 99久久国产综合精品麻豆| 久久久不卡网国产精品一区| 免费看黄色91| 在线综合视频播放| 亚洲韩国一区二区三区| 色天使色偷偷av一区二区| 中文字幕一区在线观看视频| 丁香五精品蜜臀久久久久99网站| 欧美xxxxxxxx| 精品中文av资源站在线观看| 欧美日韩高清一区| 亚洲高清免费观看高清完整版在线观看 | 国产精品久久福利| 国产精品亚洲午夜一区二区三区| 欧美一级爆毛片| 麻豆精品一区二区av白丝在线| 日韩欧美一区二区不卡| 人人超碰91尤物精品国产| 91 com成人网| 麻豆精品在线播放|