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

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

?? objdisp.c

?? 可用于嵌入式編程學習
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* Copyright (c) 1995-2000 Microsoft Corporation.  All rights reserved. */

/*+
    objdisp.c - object call dispatch routines.

    This file contains the routines for dispatching method calls to objects
    implemented by protected system libraries, direct kernel functions,
    and kernel mode threads.
*/

#include "kernel.h"
#include "xtime.h"
#include "winsock.h"

#ifdef XTIME							//XTIME
void SyscallTime(DWORD);				//XTIME record exception elapsed time
#endif									//XTIME

void SC_CloseAPISet(HANDLE hSet);
BOOL SC_RegisterAPISet(HANDLE hSet, DWORD dwSetID);
LPVOID SC_VerifyAPIHandle(HANDLE hSet, HANDLE h);
void GoToUserTime(void);
void GoToKernTime(void);

extern CRITICAL_SECTION LLcs;

const PFNVOID APISetMethods[] = {
    (PFNVOID)SC_CloseAPISet,
    (PFNVOID)SC_NotSupported,
    (PFNVOID)SC_RegisterAPISet,
    (PFNVOID)SC_CreateAPIHandle,
    (PFNVOID)SC_VerifyAPIHandle,
};

const CINFO cinfAPISet = {
	"APIS",
	DISPATCH_KERNEL_PSL,
	HT_APISET,
	sizeof(APISetMethods)/sizeof(APISetMethods[0]),
	APISetMethods,
};

// Head of double linked list of active handles in the system.
DList HandleList = { &HandleList, &HandleList };

// Serial # for handle values.
unsigned int HandleSerial;

// Array of pointers to system api sets.
const CINFO *SystemAPISets[NUM_SYSTEM_SETS];

// Find a process index from an access lock.
int IndexFromLock(ulong lock)
{
    ulong mask;
    int inxRet;
    int inx;

    mask = 0x0000FFFFul;
    for (inxRet = 0, inx = 16 ; inx ; inx >>= 1, mask >>= inx) {
        if ((lock & mask) == 0) {
            inxRet += inx;
            lock >>= inx;
        }
    }
    return inxRet;
}


// Insert an item into a double linked list
void AddToDList(DList *head, DList *item)
{
    item->back = head;
    item->fwd = head->fwd;
    head->fwd->back = item;
    head->fwd = item;
}

// Remove an item from a double linked list
void RemoveDList(DList *item)
{
    item->fwd->back = item->back;
    item->back->fwd = item->fwd;
}

// Convert a HANDLE to an HDATA pointer.
//
// HandleToPointer() is a function which can be used by other kernel modules.
//
//  h2p() is an private macro used to speed up the internal processing of
// ObjectCall() and the various GetXXX/SetXXX functions.

#define h2p(h, phdRet) \
    do { \
        if ((ulong)h < NUM_SYS_HANDLES+SYS_HANDLE_BASE && (ulong)h >= SYS_HANDLE_BASE) \
             h = KData.ahSys[(uint)h-SYS_HANDLE_BASE]; \
        if (h) {            \
            phdRet = (PHDATA)(((ulong)h & HANDLE_ADDRESS_MASK) + KData.handleBase); \
            if (!IsValidKPtr(phdRet) || phdRet->hValue != h) \
                phdRet = 0; \
        } else              \
            phdRet = 0;     \
    } while (0)

PHDATA HandleToPointer(HANDLE h)
{
    PHDATA phdRet;

    h2p(h, phdRet);
    return phdRet;
}

// Return the next handle to close.
//
// The active handle list is scanned for a handle which is referenced by the process
// whose procnum is (id). (hLast) is the previous return value from this
// routine.  If a handle is found, its reference count for the process is forced
// to 1 so that it will be closed by a single call to CloseHandle(). To speed up the
// iterative process of scanning the entire table, a pointer to the next handle in
// the list is retained. The next call will use that value if the list is unchanged,
// except for the possible freeing of the handle previously returned. If the list
// has changed, the scan will restart at the beginning of the list.
//
//NOTE: This function is called via KCall().

PHDATA PhdPrevReturn, PhdNext;

PHDATA NextCloseHandle(PHDATA *phdLast, int ixProc) {
    PHDATA phd;
	KCALLPROFON(7);
	if (!PhdPrevReturn || !PhdNext || (*phdLast != PhdNext))
    	phd = (PHDATA)HandleList.fwd;
    else
    	phd = (PHDATA)PhdNext->linkage.fwd;
    DEBUGCHK(phd != 0);
    if (&phd->linkage == &HandleList) {
        PhdPrevReturn = 0;
		KCALLPROFOFF(7);
        return 0;
    }
    PhdPrevReturn = phd;
    if ((phd->lock & (1<<ixProc)) && (phd->hValue != hCurThread) && (phd->hValue != hCurProc)) {
        // Force handle reference count for this process to one.
        if (phd->ref.count < 0x10000)
            phd->ref.count = 1;
        else
            phd->ref.pFr->usRefs[ixProc] = 1;
    } else {
	    PhdNext = *phdLast = phd;
        phd = (PHDATA)((ulong)phd | 1);
	}
	KCALLPROFOFF(7);
    return phd;
}

void SC_CloseAllHandles(void) {
    PHDATA phd, next;
    int ixProc;
	next = 0;
	ixProc = pCurProc->procnum;
    while (phd = (PHDATA)KCall((PKFN)NextCloseHandle, &next, ixProc))
    	if (!((DWORD)phd & 1))
    		CloseHandle(phd->hValue);
}

// Non-preemtible handle setup for AllocHandle().
BOOL SetupHandle(PHDATA phdNew, PPROCESS pprc) {
	KCALLPROFON(8);
	phdNew->hValue = (HANDLE)(((ulong)phdNew & HANDLE_ADDRESS_MASK) | 2 | ((ulong)phdNew->hValue & 0xE0000000));
	LockFromKey(&phdNew->lock, &pprc->aky);
    // Zap PhdPrevReturn so to force a restart the next time
    // NextCloseHandle() is called.
    PhdPrevReturn = 0; 
    AddToDList(&HandleList, &phdNew->linkage);
	KCALLPROFOFF(8);
    return TRUE;
}

// Non-preemtible handle cleanup for FreeHandle().
PHDATA ZapHandle(HANDLE h) {
    PHDATA phd;
	KCALLPROFON(9);
    h2p(h, phd);
    if (phd) {
        phd->lock = 0;
        // make it so that the handle no longer matches existing handles given out
        DEBUGCHK(((DWORD)phd->hValue & 0x1fffffff) == (((ulong)phd & HANDLE_ADDRESS_MASK) | 2));
		phd->hValue = (HANDLE)((DWORD)phd->hValue+0x20000000);
        // If freeing a handle other than the last one returned by
        // NextCloseHandle(), then zap PhdPrevReturn so to force
        // a restart the next time NextCloseHandle() is called.
        if (phd != PhdPrevReturn)
            PhdPrevReturn = 0; 
        if (phd == PhdNext)
        	PhdNext = 0;
        RemoveDList(&phd->linkage);
    }
	KCALLPROFOFF(9);
    return phd;
}

// Create a new handle.
HANDLE AllocHandle(const CINFO *pci, PVOID pvObj, PPROCESS pprc)
{
    PHDATA phdNew;

    DEBUGMSG(ZONE_MEMORY, (TEXT("AllocHandle: pci=%8.8lx pvObj=%8.8lx pprc=%8.8lx\r\n"),
            pci, pvObj, pprc));
    if ((phdNew = AllocMem(HEAP_HDATA)) != 0) {
        phdNew->pci = pci;
        phdNew->pvObj = pvObj;
        phdNew->dwInfo = 0;
        phdNew->ref.count = 1;
        if (KCall((PKFN)SetupHandle, phdNew, pprc)) {
            DEBUGMSG(ZONE_MEMORY, (TEXT("AllocHandle: phd=%8.8lx hValue=%8.8lx\r\n"),
                    phdNew, phdNew->hValue));
            return phdNew->hValue;
        }
        DEBUGMSG(ZONE_MEMORY, (TEXT("AllocHandle: SetupHandle Failed!\r\n")));
        FreeMem(phdNew, HEAP_HDATA);
    } else
        DEBUGMSG(ZONE_MEMORY, (TEXT("AllocHandle: AllocMem Failed!\r\n")));
    return 0;
}


// Destroy a handle.
BOOL FreeHandle(HANDLE h)
{
    PHDATA phd;

    if ((phd = (PHDATA)KCall((PKFN)ZapHandle, h)) != 0) {
        if (phd->ref.count >= 0x10000)
            FreeMem(phd->ref.pFr, HEAP_FULLREF);
        FreeMem(phd, HEAP_HDATA);
        return TRUE;
    }
    return FALSE;
}

// Non-preemtible: copies single refcount to FULLREF.
BOOL CopyRefs(HANDLE h, FULLREF *pFr) {
    PHDATA phd;
    int inx;
    KCALLPROFON(12);
    h2p(h, phd);
    if (phd && phd->ref.count < 0x10000) {
        inx = IndexFromLock(phd->lock);
        pFr->usRefs[inx] = (ushort)phd->ref.count;
        phd->ref.pFr = pFr;
	    KCALLPROFOFF(12);
        return FALSE;
    }
    KCALLPROFOFF(12);
    return TRUE;
}

// Non-preemtible worker for IncRef().
int DoIncRef(HANDLE h, PPROCESS pprc) {
    PHDATA phd;
    ACCESSKEY aky;
    int inx;
    KCALLPROFON(11);
    aky = pprc->aky;
    inx = pprc->procnum;
    h2p(h, phd);
    if (phd && phd->lock != 0) {
        if (phd->ref.count < 0x10000) {               
            if (TestAccess(&phd->lock, &aky)) {
                ++phd->ref.count;
			    KCALLPROFOFF(11);
                return 1;
            }
		    KCALLPROFOFF(11);
            return 2;   // Tell IncRef to allocate a FULLREF.
        }
        // There is a FULLREF structure. Increment the entry for this
        // process and add it to the access key.
        AddAccess(&phd->lock, aky);
        ++phd->ref.pFr->usRefs[inx];
	    KCALLPROFOFF(11);
        return 1;
    }
    KCALLPROFOFF(11);
    return 0;
}

// Returns FALSE if handle not valid or refcnt==0.
BOOL IncRef(HANDLE h, PPROCESS pprc)
{
    FULLREF *pFr;
    int ret;

    while ((ret = KCall(DoIncRef, h, pprc)) == 2) {
        // Second process referencing handle. Must allocate
        // a FULLREF structure to track references from
        // multiple processes.
        if ((pFr = AllocMem(HEAP_FULLREF)) == 0)
            return FALSE;
        memset(pFr,0,sizeof(FULLREF));
        if (KCall(CopyRefs, h, pFr)) {
            // Another thread already allocated a FULLREF for this handle.
            FreeMem(pFr, HEAP_FULLREF);
        }
    }
    return ret;
}

// Non-preemtible worker for DecRef().
BOOL DoDecRef(HANDLE h, PPROCESS pprc, BOOL fAll) {
    PHDATA phd;
    ACCESSKEY aky;
    int inx;
    KCALLPROFON(30);
    aky = pprc->aky;
    inx = pprc->procnum;
    h2p(h, phd);
    if (phd && TestAccess(&phd->lock, &aky)) {
        if (phd->ref.count < 0x10000) {               
            if (fAll || phd->ref.count == 1) {
                phd->lock = 0;
                phd->ref.count = 0;
			    KCALLPROFOFF(30);
                return TRUE;
            }
            --phd->ref.count;
        } else {
            // There is a FULLREF structure. Decrement the entry for this
            // process. If the last reference for this process is removed,
            // remove its permission to access the handle.
            if (fAll || phd->ref.pFr->usRefs[inx] == 1) {
                phd->ref.pFr->usRefs[inx] = 0;
                if (RemoveAccess(&phd->lock, aky) == 0) {
				    KCALLPROFOFF(30);
                    return TRUE;
				}
            } else
                --phd->ref.pFr->usRefs[inx];
        }
    }
    KCALLPROFOFF(30);
    return FALSE;
}

// Returns TRUE if all references removed.
BOOL DecRef(HANDLE h, PPROCESS pprc, BOOL fAll)
{
    return KCall(DoDecRef, h, pprc, fAll);
}

BOOL CheckLastRef(HANDLE hTh) {
	PHDATA phd;
	BOOL bRet;
	KCALLPROFON(49);
	bRet = TRUE;
	h2p(hTh,phd);
	if (phd && phd->pvObj && (phd->pci->type==SH_CURTHREAD) && ((THREAD *)(phd->pvObj))->pOwnerProc == pCurProc) {
		if (phd->ref.count < 0x10000) {
			if (phd->ref.count == 1)
				bRet = FALSE;
		} else {
        	if (phd->ref.pFr->usRefs[pCurProc->procnum] == 1)
        		bRet = FALSE;
        }
    }
	KCALLPROFOFF(49);
	return bRet;
}

// Returns 0 if handle is not valid.
DWORD GetUserInfo(HANDLE h)
{
    PHDATA phd;

    h2p(h, phd);
    return phd ? phd->dwInfo : 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区美女| 亚洲欧美偷拍三级| 中文字幕一区二区三区不卡在线| 亚洲精品久久久蜜桃| 加勒比av一区二区| 在线精品观看国产| 国产精品久久久久久久岛一牛影视 | 久久er精品视频| 色婷婷亚洲一区二区三区| 精品成a人在线观看| 亚洲一区二区在线免费看| 成人免费黄色在线| 日韩亚洲欧美综合| 午夜电影一区二区| 一本大道久久精品懂色aⅴ| 国产精品理伦片| 国产麻豆精品久久一二三| 欧美第一区第二区| 日韩精品免费专区| 欧美色视频一区| 亚洲一二三专区| 在线看国产一区二区| 亚洲丝袜精品丝袜在线| hitomi一区二区三区精品| 久久久久国产精品厨房| 国产一区二区视频在线| 欧美电视剧免费全集观看| 免费不卡在线视频| 日韩一区二区高清| 秋霞国产午夜精品免费视频| 91麻豆精品国产91久久久使用方法| 亚洲美女偷拍久久| 欧美伊人精品成人久久综合97 | 国产精品免费视频观看| 懂色av中文一区二区三区| 精品国产凹凸成av人导航| 久久精品国产99久久6| 日韩视频在线永久播放| 欧美aaa在线| 精品剧情在线观看| 国产成人免费在线视频| 国产精品网站在线| 99精品黄色片免费大全| 亚洲精品日韩一| 欧美日韩免费电影| 琪琪久久久久日韩精品| wwwwxxxxx欧美| 99久久er热在这里只有精品15| 国产精品久久久爽爽爽麻豆色哟哟| 99综合电影在线视频| 亚洲最大色网站| 777久久久精品| 国产精品一品二品| 中文字幕一区二区不卡| 欧美色图12p| 国产一区二区视频在线| 亚洲精品乱码久久久久久日本蜜臀| 色综合网站在线| 美女网站在线免费欧美精品| 久久免费美女视频| 91黄视频在线| 紧缚捆绑精品一区二区| 亚洲欧美另类小说| 日韩一区二区三区三四区视频在线观看 | 欧美一卡在线观看| 成人高清在线视频| 视频一区视频二区中文| 国产欧美一区二区三区网站| 一本色道久久综合亚洲精品按摩| 亚洲18色成人| 国产精品美女视频| 欧美二区在线观看| 不卡的av在线播放| 美女网站视频久久| 一区二区三区.www| 国产欧美一区视频| 91精品国产综合久久久蜜臀粉嫩 | 成人国产一区二区三区精品| 婷婷综合另类小说色区| 国产欧美日韩精品a在线观看| 欧美色电影在线| 成人不卡免费av| 玖玖九九国产精品| 亚洲一本大道在线| 国产精品成人免费在线| 欧美狂野另类xxxxoooo| 91免费国产在线观看| 国产麻豆午夜三级精品| 午夜精品在线视频一区| 《视频一区视频二区| 久久综合久久综合久久| 欧美日韩三级一区二区| 99久久精品情趣| 国产一区亚洲一区| 免费在线欧美视频| 免费精品99久久国产综合精品| 中文字幕一区二区三区四区不卡| 久久久久久久久久久电影| 欧美大片在线观看| 欧美一级国产精品| 91精品国产综合久久国产大片| 在线观看视频欧美| 色婷婷国产精品| 91网站在线观看视频| 国产成人av电影在线| 九九视频精品免费| 久久av资源网| 精品中文字幕一区二区小辣椒| 亚洲国产精品久久艾草纯爱 | 蜜桃av噜噜一区二区三区小说| 亚洲黄网站在线观看| 中文字幕亚洲区| 亚洲免费看黄网站| 亚洲免费av观看| 亚洲一区二区四区蜜桃| 亚洲一二三区在线观看| 亚洲成a人v欧美综合天堂 | 国内精品久久久久影院薰衣草| 美国毛片一区二区三区| 另类小说一区二区三区| 久久国产精品一区二区| 韩日欧美一区二区三区| 国产成人无遮挡在线视频| 99久久久国产精品免费蜜臀| 一本到不卡免费一区二区| 精品视频一区三区九区| 欧美一区二区三区四区高清| 精品欧美黑人一区二区三区| 久久精品欧美一区二区三区不卡 | 91麻豆国产香蕉久久精品| 色综合久久中文字幕综合网| 欧美日韩在线一区二区| 欧美大胆人体bbbb| 国产视频一区二区三区在线观看| 亚洲国产激情av| 亚洲精品国产视频| 日本午夜精品一区二区三区电影| 国内成+人亚洲+欧美+综合在线| 国产成人精品亚洲午夜麻豆| 91在线观看视频| 欧美日韩aaaaa| 久久久久久夜精品精品免费| 亚洲同性同志一二三专区| 婷婷亚洲久悠悠色悠在线播放 | 色综合久久综合网欧美综合网| 欧美日韩高清不卡| 精品播放一区二区| 亚洲精品福利视频网站| 久久精品国内一区二区三区| 亚洲精品在线观| 色先锋资源久久综合| 6080午夜不卡| 91久久精品网| 91麻豆精品国产91久久久久| 国产欧美日韩三区| 日韩一区二区三区精品视频| 日韩黄色免费电影| 欧美日本韩国一区| 一区二区三区美女视频| 日本高清视频一区二区| 国产精品美女久久福利网站| 国产精品一区二区x88av| wwww国产精品欧美| 国产伦精品一区二区三区在线观看 | 91精品办公室少妇高潮对白| 国产精品久久久爽爽爽麻豆色哟哟| 国产高清久久久| 国产精品青草久久| 波多野结衣在线一区| 国产精品国产三级国产普通话蜜臀| 丁香天五香天堂综合| 国产精品久久久久久久久免费丝袜 | 青青草97国产精品免费观看无弹窗版| 在线视频国内一区二区| 亚洲免费在线播放| 在线观看国产91| 午夜精品一区在线观看| 在线播放亚洲一区| 久久成人精品无人区| 久久综合狠狠综合| 不卡电影一区二区三区| 亚洲美女视频在线观看| 欧美日韩精品一区二区三区蜜桃 | 《视频一区视频二区| 日本精品一区二区三区四区的功能| 亚洲黄色在线视频| 欧美片网站yy| 国产尤物一区二区| 亚洲欧美影音先锋| 717成人午夜免费福利电影| 狠狠狠色丁香婷婷综合激情| 国产精品久久久久久一区二区三区| 99精品视频一区二区| 三级精品在线观看| 久久久影视传媒| 一本到三区不卡视频| 久久精品国产色蜜蜜麻豆| 亚洲国产成人午夜在线一区| 欧美中文字幕亚洲一区二区va在线| 美女一区二区三区在线观看|