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

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

?? fiber.c

?? 這是一個開放源代碼的與WINNT/WIN2K/WIN2003兼容的操作系統
?? C
字號:
/*
 * COPYRIGHT:   See COPYING in the top level directory
 * PROJECT:     ReactOS System Libraries
 * FILE:        lib/kernel32/thread/fiber.c
 * PURPOSE:     Fiber Implementation
 * PROGRAMMERS: 
 *              Alex Ionescu (alex@relsoft.net)
 *              KJK::Hyperion <noog@libero.it>
 */
#include <k32.h>

#define NDEBUG
#include "../include/debug.h"

typedef struct _FIBER                                      /* Field offsets:  */
{                                                          /* 32 bit   64 bit */
    /* this must be the first field */
    LPVOID Parameter;                                      /*   0x00     0x00 */
    struct _EXCEPTION_REGISTRATION_RECORD * ExceptionList; /*   0x04     0x08 */
    LPVOID StackBase;                                      /*   0x08     0x10 */
    LPVOID StackLimit;                                     /*   0x0C     0x18 */
    LPVOID DeallocationStack;                              /*   0x10     0x20 */
    CONTEXT Context;                                       /*   0x14     0x28 */
    ULONG GuaranteedStackBytes;                            /*   0x2E0         */
    PVOID FlsData;                                         /*   0x2E4         */
    PVOID ActivationContextStack;                          /*   0x2E8         */
} FIBER, *PFIBER;

/*
 * @implemented
 */
BOOL
WINAPI
ConvertFiberToThread(VOID)
{
    PTEB pTeb = NtCurrentTeb();
    DPRINT1("Converting Fiber to Thread\n");

    /* the current thread isn't running a fiber: failure */
    if(!pTeb->HasFiberData)
    {
        SetLastError(ERROR_INVALID_PARAMETER);
        return FALSE;
    }

    /* this thread won't run a fiber anymore */
    pTeb->HasFiberData = FALSE;

    /* free the fiber */
    if(pTeb->Tib.FiberData != NULL)
    {
        RtlFreeHeap(GetProcessHeap(), 0, pTeb->Tib.FiberData);
    }

    /* success */
    return TRUE;
}

/*
 * @implemented
 */
LPVOID
WINAPI
ConvertThreadToFiberEx(LPVOID lpParameter, 
                       DWORD dwFlags)
{
    PTEB pTeb = NtCurrentTeb();
    PFIBER pfCurFiber;
    DPRINT1("Converting Thread to Fiber\n");

    /* the current thread is already a fiber */
    if(pTeb->HasFiberData && pTeb->Tib.FiberData) return pTeb->Tib.FiberData;

    /* allocate the fiber */
    pfCurFiber = (PFIBER)RtlAllocateHeap(GetProcessHeap(), 
                                         0,
                                         sizeof(FIBER));

    /* failure */
    if(pfCurFiber == NULL)
    {
        SetLastError(ERROR_NOT_ENOUGH_MEMORY);
        return NULL;
    }

    /* copy some contextual data from the thread to the fiber */
    pfCurFiber->ExceptionList = pTeb->Tib.ExceptionList;
    pfCurFiber->StackBase = pTeb->Tib.StackBase;
    pfCurFiber->StackLimit = pTeb->Tib.StackLimit;
    pfCurFiber->DeallocationStack = pTeb->DeallocationStack;
    pfCurFiber->FlsData = pTeb->FlsData;
    pfCurFiber->GuaranteedStackBytes = pTeb->GuaranteedStackBytes;
    pfCurFiber->ActivationContextStack = pTeb->ActivationContextStackPointer;
    pfCurFiber->Context.ContextFlags = CONTEXT_FULL;
    
    /* Save FPU State if requsted */
    if (dwFlags & FIBER_FLAG_FLOAT_SWITCH)
    {
        pfCurFiber->Context.ContextFlags |= CONTEXT_FLOATING_POINT;
    }

    /* associate the fiber to the current thread */
    pTeb->Tib.FiberData = pfCurFiber;
    pTeb->HasFiberData = TRUE;

    /* success */
    return (LPVOID)pfCurFiber;
}

/*
 * @implemented
 */
LPVOID
WINAPI
ConvertThreadToFiber(LPVOID lpParameter)
{
    /* Call the newer function */
    return ConvertThreadToFiberEx(lpParameter, 0);
}

/*
 * @implemented
 */
LPVOID
WINAPI
CreateFiber(SIZE_T dwStackSize,
            LPFIBER_START_ROUTINE lpStartAddress,
            LPVOID lpParameter)
{
    /* Call the Newer Function */
    return CreateFiberEx(dwStackSize, 0, 0, lpStartAddress, lpParameter);
}

/*
 * @implemented
 */
LPVOID
WINAPI
CreateFiberEx(SIZE_T dwStackCommitSize,
              SIZE_T dwStackReserveSize,
              DWORD dwFlags,
              LPFIBER_START_ROUTINE lpStartAddress,
              LPVOID lpParameter)
{
    PFIBER pfCurFiber;
    NTSTATUS nErrCode;
    INITIAL_TEB usFiberInitialTeb;
    CONTEXT ctxFiberContext;
    PVOID ActivationContextStack = NULL;
    DPRINT1("Creating Fiber\n");

    #ifdef SXS_SUPPORT_ENABLED
    /* Allocate the Activation Context Stack */
    nErrCode = RtlAllocateActivationContextStack(&ActivationContextStack);
    #endif
    
    /* Allocate the fiber */
    pfCurFiber = (PFIBER)RtlAllocateHeap(GetProcessHeap(), 
                                         0,
                                         sizeof(FIBER));
    /* Failure */
    if(pfCurFiber == NULL)
    {
        SetLastError(ERROR_NOT_ENOUGH_MEMORY);
        return NULL;
    }

    /* Create the stack for the fiber */
    nErrCode = BasepCreateStack(NtCurrentProcess(),
                                dwStackCommitSize,
                                dwStackReserveSize,
                                &usFiberInitialTeb);
    /* Failure */
    if(!NT_SUCCESS(nErrCode)) 
    {
        /* Free the fiber */
        RtlFreeHeap(GetProcessHeap(), 0, pfCurFiber);

        /* Failure */
        SetLastErrorByStatus(nErrCode);
        return NULL;
    }
    
    /* Clear the context */
    RtlZeroMemory(&pfCurFiber->Context, sizeof(CONTEXT));
    
    /* copy the data into the fiber */
    pfCurFiber->StackBase = usFiberInitialTeb.StackBase;
    pfCurFiber->StackLimit = usFiberInitialTeb.StackLimit;
    pfCurFiber->DeallocationStack = usFiberInitialTeb.AllocatedStackBase;
    pfCurFiber->Parameter = lpParameter;
    pfCurFiber->ExceptionList = (struct _EXCEPTION_REGISTRATION_RECORD *)-1;
    pfCurFiber->GuaranteedStackBytes = 0;
    pfCurFiber->FlsData = NULL;
    pfCurFiber->ActivationContextStack = ActivationContextStack;
    pfCurFiber->Context.ContextFlags = CONTEXT_FULL;
    
    /* Save FPU State if requsted */
    if (dwFlags & FIBER_FLAG_FLOAT_SWITCH)
    {
        pfCurFiber->Context.ContextFlags |= CONTEXT_FLOATING_POINT;
    }
    
    /* initialize the context for the fiber */
    BasepInitializeContext(&ctxFiberContext,
                           lpParameter,
                           lpStartAddress,
                           usFiberInitialTeb.StackBase,
                           2);
 
    /* Return the Fiber */ 
    return pfCurFiber;
}

/*
 * @implemented
 */
VOID
WINAPI
DeleteFiber(LPVOID lpFiber)
{
    SIZE_T nSize = 0;
    PVOID pStackAllocBase = ((PFIBER)lpFiber)->DeallocationStack;

    /* free the fiber */
    RtlFreeHeap(GetProcessHeap(), 0, lpFiber);

    /* the fiber is deleting itself: let the system deallocate the stack */
    if(NtCurrentTeb()->Tib.FiberData == lpFiber) ExitThread(1);

    /* deallocate the stack */
    NtFreeVirtualMemory(NtCurrentProcess(),
                        &pStackAllocBase,
                        &nSize,
                        MEM_RELEASE);
}

/*
 * @implemented
 */
BOOL
WINAPI
IsThreadAFiber(VOID)
{
    return NtCurrentTeb()->HasFiberData;
}


__declspec(noreturn)
VOID
WINAPI
BaseFiberStartup(VOID)
{
    PFIBER Fiber = GetFiberData();
    
    /* Call the Thread Startup Routine */
    DPRINT1("Starting Fiber\n");
    BaseThreadStartup((LPTHREAD_START_ROUTINE)Fiber->Context.Eax,
                      (LPVOID)Fiber->Context.Ebx);
}

/* EOF */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
寂寞少妇一区二区三区| 日韩亚洲欧美成人一区| 成人免费高清在线| 高清视频一区二区| 精品制服美女丁香| 国产一区二区三区黄视频| 韩国毛片一区二区三区| 狠狠色丁香久久婷婷综合_中 | 亚洲最新在线观看| 亚洲精品视频免费看| 亚洲午夜国产一区99re久久| 亚洲午夜精品久久久久久久久| 一区二区在线免费观看| 一区二区三区日韩精品视频| 亚洲午夜日本在线观看| 亚洲国产va精品久久久不卡综合| 亚洲电影视频在线| 亚洲第一主播视频| 免费成人在线观看视频| 国产精品综合久久| 成人久久18免费网站麻豆| 成人av电影免费观看| 99精品欧美一区二区蜜桃免费| 色视频成人在线观看免| 欧美放荡的少妇| 日韩欧美国产三级电影视频| 久久网这里都是精品| 欧美激情一区二区在线| 亚洲视频一二三区| 日韩高清电影一区| 国产一区欧美日韩| 成人av网站在线观看| 91美女精品福利| 91精品国产综合久久久久久久久久| 日韩欧美aaaaaa| 国产人伦精品一区二区| 亚洲男人的天堂av| 免费看日韩a级影片| 国产成人免费av在线| 91麻豆国产香蕉久久精品| 欧美男人的天堂一二区| 国产日本一区二区| 亚洲久本草在线中文字幕| 日韩精品1区2区3区| 国产成人午夜精品影院观看视频| 色综合久久中文综合久久牛| 欧美一级片免费看| 亚洲欧美日韩电影| 久久国产乱子精品免费女| 91在线观看一区二区| 在线播放亚洲一区| 亚洲国产成人一区二区三区| 亚洲国产另类av| 国产一区在线观看视频| 欧美亚洲一区三区| 国产日韩欧美电影| 午夜亚洲国产au精品一区二区| 国产成人精品免费在线| 欧美日韩成人在线| 中文字幕不卡在线| 青青草一区二区三区| 99久久国产综合精品色伊| 日韩一级精品视频在线观看| 亚洲精品大片www| 国产精品一线二线三线精华| 91极品视觉盛宴| 欧美激情在线一区二区| 青青草97国产精品免费观看无弹窗版| 91在线视频免费观看| 精品精品欲导航| 亚洲成av人片在www色猫咪| 成人av网站在线| 337p粉嫩大胆噜噜噜噜噜91av| 亚洲国产一区视频| 成人av手机在线观看| 日韩美女天天操| 午夜日韩在线观看| 一本大道av伊人久久综合| 国产欧美日韩不卡免费| 麻豆精品在线播放| 欧美夫妻性生活| 亚洲午夜精品网| 99久精品国产| 中文字幕第一区第二区| 国产在线一区二区| 欧美一区二区性放荡片| 亚洲国产精品影院| 欧美亚洲图片小说| 亚洲视频一二三区| www.日韩av| 精品国产免费久久| 蜜桃视频一区二区三区在线观看| 欧美特级限制片免费在线观看| 亚洲欧洲精品成人久久奇米网| 国产精品羞羞答答xxdd| 精品福利一二区| 激情五月激情综合网| 日韩一级完整毛片| 日韩激情中文字幕| 欧美二区三区91| 日本午夜一区二区| 欧美日韩国产精品自在自线| 一区二区三区色| 色综合激情久久| 亚洲电影欧美电影有声小说| 欧美亚洲高清一区| 亚洲一区二区三区免费视频| 欧美综合色免费| 亚洲18色成人| 欧美一区二区国产| 免费成人性网站| 久久美女艺术照精彩视频福利播放 | 久久精品亚洲一区二区三区浴池| 国产一区福利在线| 久久综合久久鬼色| 国产成人精品影视| 欧美韩国日本综合| 91色在线porny| 亚洲一区二区三区四区五区黄| 精品视频123区在线观看| 视频一区二区不卡| 精品国产乱码久久久久久夜甘婷婷 | 国产精品青草久久| 97成人超碰视| 一个色在线综合| 欧美精品视频www在线观看| 天堂一区二区在线免费观看| 日韩一区二区免费在线观看| 久久99精品国产麻豆婷婷| 国产亚洲精品aa| 色综合久久久久综合体| 亚洲午夜av在线| 日韩一级免费观看| 粉嫩av一区二区三区| 亚洲日穴在线视频| 在线电影院国产精品| 精品一区二区日韩| 国产精品久久99| 欧美日韩一区高清| 九色综合国产一区二区三区| 日本一区二区三区dvd视频在线| 成人av电影在线观看| 一区二区三区日韩精品视频| 欧美一区二区成人6969| 国产一区二区日韩精品| 国产精品久久久久久久蜜臀| 色综合久久天天综合网| 蜜臀av性久久久久蜜臀av麻豆| 国产精品久久久久久久久免费丝袜 | 国产剧情一区在线| 一区二区三区四区不卡在线| 欧美成人a∨高清免费观看| 99免费精品在线观看| 日韩精品一级中文字幕精品视频免费观看 | 欧美性极品少妇| 国产一区二区三区在线观看免费视频| 国产精品拍天天在线| 欧美一区二区视频在线观看| 丁香桃色午夜亚洲一区二区三区| 亚洲电影视频在线| 欧美激情综合网| 777奇米四色成人影色区| 成人性视频免费网站| 日韩精品欧美成人高清一区二区| 欧美极品少妇xxxxⅹ高跟鞋| 欧美日韩成人综合在线一区二区| 成人午夜精品在线| 老色鬼精品视频在线观看播放| 亚洲免费av在线| 精品久久国产老人久久综合| 欧洲视频一区二区| 国产黄色精品视频| 麻豆精品国产91久久久久久| 一区二区三区免费网站| 国产三级精品三级在线专区| 欧美一区二区视频在线观看2022| 91麻豆免费看| 国产精品性做久久久久久| 日韩av一二三| 曰韩精品一区二区| 国产精品成人网| 欧美激情综合五月色丁香| 日韩区在线观看| 欧美美女一区二区三区| 91首页免费视频| 成人aaaa免费全部观看| 久久99久久精品| 久久成人免费网| 天堂精品中文字幕在线| 亚洲精品国产成人久久av盗摄| 最近中文字幕一区二区三区| 久久久午夜精品理论片中文字幕| 日韩区在线观看| 欧美精品1区2区3区| 欧美精品欧美精品系列| 在线一区二区三区四区五区 | 在线电影院国产精品| 91成人免费电影| 欧美吻胸吃奶大尺度电影| 91视视频在线观看入口直接观看www|