⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kmisc.c

📁 wince下的源代码集合打包
💻 C
📖 第 1 页 / 共 5 页
字号:
					(*ppNext)->pMainHeapEntry = 0;					pSnap->pNextFree = pNextFree;				}			} else {				(*ppNext)->procentry.th32DefaultHeapID = 0;				(*ppNext)->pMainHeapEntry = 0;			}			ppNext = &(*ppNext)->pNext;		}	}	*ppNext = 0;	return TRUE;}BOOL THGetMods(THSNAP *pSnap, DWORD dwProcID) {	TH32MOD **ppNext;	PMODULE pMod;	PPROCESS pProc;	DWORD loop;	ppNext = &pSnap->pMod;	if (dwProcID && !(pProc = HandleToProc((HANDLE)dwProcID)))		return FALSE;	for (pMod = pModList; pMod; pMod = pMod->pMod) {		if (dwProcID && !HasModRefProcPtr(pMod,pProc))			continue;		if (!(*ppNext = (TH32MOD *)THGrow(pSnap,sizeof(TH32MOD))))			return FALSE;		(*ppNext)->modentry.dwSize = sizeof(MODULEENTRY32);		(*ppNext)->modentry.th32ModuleID = (DWORD)pMod;		(*ppNext)->modentry.th32ProcessID = dwProcID;		(*ppNext)->modentry.GlblcntUsage = 0;		for (loop = 0; loop < MAX_PROCESSES; loop++)			(*ppNext)->modentry.GlblcntUsage += pMod->refcnt[loop];		(*ppNext)->modentry.ProccntUsage = dwProcID ? pMod->refcnt[pProc->procnum] : pMod->inuse;		(*ppNext)->modentry.modBaseAddr = (LPBYTE)ZeroPtr(pMod->BasePtr);		(*ppNext)->modentry.modBaseSize = pMod->e32.e32_vsize;		(*ppNext)->modentry.hModule = (HMODULE)pMod;		(*ppNext)->modentry.dwFlags = pMod->ZonePtr ? pMod->ZonePtr->ulZoneMask : 0;		kstrcpyW((*ppNext)->modentry.szModule,pMod->lpszModName);		(*ppNext)->modentry.szExePath[0] = 0;		ppNext = &(*ppNext)->pNext;	}	*ppNext = 0;	return TRUE;}BOOL THGetThreads(THSNAP *pSnap) {	TH32THREAD **ppNext;	PTHREAD pTh;	DWORD loop;	ppNext = &pSnap->pThread;	for (loop = 0; loop < MAX_PROCESSES; loop++) {		if (ProcArray[loop].dwVMBase && (!loop || ProcStarted(&ProcArray[loop]))) {			for (pTh = ProcArray[loop].pTh; pTh; pTh = pTh->pNextInProc) {				if (!(*ppNext = (TH32THREAD *)THGrow(pSnap,sizeof(TH32THREAD))))					return FALSE;				(*ppNext)->threadentry.dwSize = sizeof(THREADENTRY32);				(*ppNext)->threadentry.cntUsage = 1;				(*ppNext)->threadentry.th32ThreadID = (DWORD)pTh->hTh;				(*ppNext)->threadentry.th32OwnerProcessID = (DWORD)ProcArray[loop].hProc;				(*ppNext)->threadentry.tpBasePri = GET_BPRIO(pTh);				(*ppNext)->threadentry.tpDeltaPri = GET_BPRIO(pTh) - GET_CPRIO(pTh);				(*ppNext)->threadentry.dwFlags = GET_SLEEPING(pTh) ? 4 + (pTh->lpProxy != 0) + (pTh->bSuspendCnt != 0) * 2 : GET_RUNSTATE(pTh);				(*ppNext)->threadentry.th32CurrentProcessID = (DWORD)pTh->pProc->hProc;				(*ppNext)->threadentry.th32AccessKey = pTh->aky;				ppNext = &(*ppNext)->pNext;			}		}	}	*ppNext = 0;	return TRUE;}BOOL THGetHeaps(THSNAP *pSnap, DWORD dwProcID) {	CALLBACKINFO cbi;	LPBYTE pNextFree = pSnap->pNextFree;	if ((HANDLE)dwProcID == ProcArray[0].hProc)		pSnap->pHeap = 0;	else {		__try {			cbi.hProc = (HANDLE)dwProcID;			cbi.pfn = (FARPROC)pGetHeapSnapshot;			cbi.pvArg0 = pSnap;			if (!PerformCallBack4(&cbi,0,&pSnap->pHeap))				return FALSE;		} __except (EXCEPTION_EXECUTE_HANDLER) {			pSnap->pNextFree = pNextFree;			pSnap->pHeap = 0;		}	}	return TRUE;}THSNAP *SC_THCreateSnapshot(DWORD dwFlags, DWORD dwProcID) {    ACCESSKEY ulOldKey;	THSNAP *pSnap;	if (!dwProcID || (dwProcID == (DWORD)GetCurrentProcess()))		dwProcID = (DWORD)hCurProc;	else if (GetHandleType((HANDLE)dwProcID) != SH_CURPROC) {		SetLastError(ERROR_INVALID_PARAMETER);		return INVALID_HANDLE_VALUE;	}	if (!(pSnap = VirtualAlloc(0, THSNAP_RESERVE, MEM_RESERVE, PAGE_NOACCESS))) {		SetLastError(ERROR_NOT_ENOUGH_MEMORY);		return INVALID_HANDLE_VALUE;	}	pSnap = MapPtr(pSnap);	if (!VirtualAlloc(pSnap,PAGE_SIZE, MEM_COMMIT, PAGE_READWRITE)) {		VirtualFree(pSnap,0,MEM_RELEASE);		SetLastError(ERROR_NOT_ENOUGH_MEMORY);		return INVALID_HANDLE_VALUE;	}	pSnap->pNextFree = (LPBYTE)pSnap + sizeof(THSNAP);	pSnap->pHighCommit = (LPBYTE)pSnap + PAGE_SIZE;	pSnap->pHighReserve = (LPBYTE)pSnap + THSNAP_RESERVE;    SWITCHKEY(ulOldKey,0xffffffff);	EnterCriticalSection(&LLcs);	if (((dwFlags & TH32CS_SNAPPROCESS) && !THGetProcs(pSnap,(dwFlags & TH32CS_SNAPNOHEAPS ? 0 : 1))) ||		((dwFlags & TH32CS_SNAPMODULE) && !THGetMods(pSnap,(dwFlags & TH32CS_GETALLMODS) ? 0 : dwProcID)) ||		((dwFlags & TH32CS_SNAPTHREAD) && !THGetThreads(pSnap)) ||		((dwFlags & TH32CS_SNAPHEAPLIST) && !THGetHeaps(pSnap,dwProcID))) {		VirtualFree(pSnap,THSNAP_RESERVE,MEM_DECOMMIT);		VirtualFree(pSnap,0,MEM_RELEASE);		SetLastError(ERROR_NOT_ENOUGH_MEMORY);		pSnap = INVALID_HANDLE_VALUE;	}	LeaveCriticalSection(&LLcs);	SETCURKEY(ulOldKey);	return pSnap;}DWORD SC_GetProcessVersion(DWORD dwProcessId) {	PPROCESS pProc;	if (!dwProcessId)		pProc = pCurProc;	else if (!(pProc = HandleToProc((HANDLE)dwProcessId))) {		SetLastError(ERROR_INVALID_PARAMETER);		return 0;	}	return MAKELONG(pProc->e32.e32_ceverminor,pProc->e32.e32_cevermajor);}BOOL SC_SetStdioPathW(DWORD id, LPCWSTR pwszPath) {	LPName pName, pName2;	DWORD len;	if ((id >= 3) || (pwszPath && ((len = strlenW(pwszPath)) > MAX_PATH-1))) {		KSetLastError(pCurThread,ERROR_INVALID_PARAMETER);		return FALSE;	}	if (pwszPath) {		if (!(pName = AllocName(sizeof(WCHAR)*(len+1)))) {			KSetLastError(pCurThread,ERROR_OUTOFMEMORY);			return FALSE;		}		memcpy(pName->name,pwszPath,sizeof(WCHAR)*(len+1));	} else		pName = 0;	EnterCriticalSection(&NameCS);	pName2 = pCurProc->pStdNames[id];	pCurProc->pStdNames[id] = pName;	LeaveCriticalSection(&NameCS);	if (pName2)		FreeName(pName2);	return TRUE;}BOOL SC_GetStdioPathW(DWORD id, PWSTR pwszBuf, LPDWORD lpdwLen) {	DWORD len;	Name name;	if (id >= 3) {		KSetLastError(pCurThread,ERROR_INVALID_PARAMETER);		return FALSE;	}	LockPages(&name,sizeof(name),0,LOCKFLAG_WRITE);	EnterCriticalSection(&NameCS);	if (!(pCurProc->pStdNames[id]))		len = 0;	else {		len = strlenW(pCurProc->pStdNames[id]->name)+1;		memcpy(name.name,pCurProc->pStdNames[id]->name,sizeof(WCHAR)*len);	}	LeaveCriticalSection(&NameCS);	UnlockPages(&name,sizeof(name));	if (*lpdwLen < len) {		*lpdwLen = len;		KSetLastError(pCurThread,ERROR_INSUFFICIENT_BUFFER);		return FALSE;	}	*lpdwLen = len;	memcpy(pwszBuf,name.name,sizeof(WCHAR)*len);	return TRUE;}BOOL (*pQueryPerformanceCounter)(LARGE_INTEGER *lpPerformanceCount);BOOL (*pQueryPerformanceFrequency)(LARGE_INTEGER *lpPerformanceFrequency);BOOL SC_QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount) {	if (pQueryPerformanceCounter)		return pQueryPerformanceCounter(lpPerformanceCount);	lpPerformanceCount->HighPart = 0;	lpPerformanceCount->LowPart = CurMSec;	return TRUE;}BOOL SC_QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency) {	if (pQueryPerformanceFrequency)		return pQueryPerformanceFrequency(lpFrequency);	lpFrequency->HighPart = 0;	lpFrequency->LowPart = 1000;	return TRUE;}DWORD (*pReadRegistryFromOEM)(DWORD dwFlags, LPBYTE pBuf, DWORD len);BOOL (*pWriteRegistryToOEM)(DWORD dwFlags, LPBYTE pBuf, DWORD len);DWORD SC_ReadRegistryFromOEM(DWORD dwFlags, LPBYTE pBuf, DWORD len) {	if (pReadRegistryFromOEM)		return pReadRegistryFromOEM(dwFlags, pBuf, len);	return 0;}BOOL SC_WriteRegistryToOEM(DWORD dwFlags, LPBYTE pBuf, DWORD len) {	if (dwFlags == REG_WRITE_BYTES_PROBE)		return (pWriteRegistryToOEM ? TRUE : FALSE);	if (pWriteRegistryToOEM)		return pWriteRegistryToOEM(dwFlags, pBuf, len);	return 0;}DWORD SC_GetModuleFileNameW(HMODULE hModule, LPWSTR lpFilename, DWORD nSize) {	PPROCESS pProc;	openexe_t *oe;	CEOIDINFO ceoi;	LPWSTR pstr;	int loop;	if (!nSize) {		SetLastError(ERROR_INVALID_PARAMETER);		return 0;	}	if (!hModule)		oe = &pCurProc->oe;	else if (pProc = HandleToProc((HANDLE)hModule))		oe = &pProc->oe;	else if (IsValidModule((PMODULE)hModule))		oe = &(((LPMODULE)hModule)->oe);	else {		SetLastError(ERROR_INVALID_PARAMETER);		return 0;	}	if (!GetNameFromOE(&ceoi,oe)) {		SetLastError(ERROR_INVALID_PARAMETER);		return 0;	}	for (pstr = ceoi.infFile.szFileName, loop = 1; (loop < (int)nSize) && *pstr; loop++)		*lpFilename++ = *pstr++;	*lpFilename = 0;	return loop-1;}void SC_CacheSync(int flags) {#if defined(SH3)	if ((flags & CACHE_SYNC_WRITEBACK) && !(flags & (CACHE_SYNC_DISCARD)))		FlushCacheNoDiscard();	else		FlushCache();#elif defined(x86)	FlushCache();#else	FlushDCache();	if (flags & (CACHE_SYNC_INSTRUCTIONS | CACHE_SYNC_DISCARD))		FlushICache();#endif}void SC_RegisterGwesHandler(LPVOID pfn) {	pGwesHandler = pfn;}VOID xxx_RaiseException(DWORD dwExceptionCode, DWORD dwExceptionFlags, DWORD cArgs, CONST DWORD *lpArgs) {	RaiseException(dwExceptionCode, dwExceptionFlags, cArgs, lpArgs);}void DoMapPtr(LPVOID *P) {	if (((DWORD)*P >= 0x10000) && !((DWORD)*P >> VA_SECTION))		*P = (LPVOID)((DWORD)*P | (DWORD)pCurProc->dwVMBase);}#define MapArgPtr(P) DoMapPtr((LPVOID *)&(P))const CINFO *SwitchToProc(PCALLSTACK pcstk, DWORD dwAPISet) {	const CINFO *pci;	if (!(pci = SystemAPISets[dwAPISet]))        RaiseException(STATUS_INVALID_SYSTEM_SERVICE, EXCEPTION_NONCONTINUABLE, 0, 0);    pcstk->pprcLast = pCurProc;    pcstk->akyLast = CurAKey;    pcstk->retAddr = 0;    pcstk->pcstkNext = pCurThread->pcstkTop;    pCurThread->pcstkTop = pcstk;	pCurThread->pProc = pci->pServer;	AddAccess(&pCurThread->aky, pci->pServer->aky);	SetCPUASID(pCurThread);	randdw1 = ((randdw1<<5) | (randdw1>>27)) ^ (CurMSec & 0x1f);	return pci;}const CINFO *SwitchToProcHandle(PCALLSTACK pcstk, HANDLE *ph, DWORD dwType) {	const CINFO *pci;    const HDATA *phd;    phd = HandleToPointer(*ph);    if (!phd || !TestAccess(&phd->lock, &pCurThread->aky))    	return 0;    pci = phd->pci;    if (pci->type != dwType)		return 0;	*ph = (HANDLE)phd->pvObj;    pcstk->pprcLast = pCurProc;    pcstk->akyLast = CurAKey;    pcstk->retAddr = 0;    pcstk->pcstkNext = pCurThread->pcstkTop;    pCurThread->pcstkTop = pcstk;	pCurThread->pProc = pci->pServer;	AddAccess(&pCurThread->aky, pci->pServer->aky);	SetCPUASID(pCurThread);	randdw1 = ((randdw1<<5) | (randdw1>>27)) ^ (CurMSec & 0x1f);	return pci;}extern BOOL TryCloseMappedHandle(HANDLE h);const CINFO *SwitchToProcHandleClosing(PCALLSTACK pcstk, HANDLE *ph, LPBOOL bRet) {	const CINFO *pci;    const HDATA *phd;    HANDLE hVal;    phd = HandleToPointer(*ph);    if (!phd)    	return 0;    pci = phd->pci;    if (!TestAccess(&phd->lock, &pCurProc->aky)) {	    if ((phd->lock == 1) && (phd->ref.count == 1)) {	    	*bRet = TryCloseMappedHandle(*ph);			return 0;		}		return 0;	}	if (pci->disp == DISPATCH_KERNEL_PSL) {		*bRet = (*(BOOL (*)(HANDLE))(pci->ppfnMethods[0]))(*ph);		return 0;	}	hVal = (HANDLE)phd->pvObj;	if (DecRef(*ph, pCurProc, FALSE))		FreeHandle(*ph);	*ph = hVal;    pcstk->pprcLast = pCurProc;    pcstk->akyLast = CurAKey;    pcstk->retAddr = 0;    pcstk->pcstkNext = pCurThread->pcstkTop;    pCurThread->pcstkTop = pcstk;	pCurThread->pProc = pci->pServer;	AddAccess(&pCurThread->aky, pci->pServer->aky);	SetCPUASID(pCurThread);	randdw1 = ((randdw1<<5) | (randdw1>>27)) ^ (CurMSec & 0x1f);	return pci;}void SwitchBack() {	PCALLSTACK pcstk;	pcstk = pCurThread->pcstkTop;	pCurThread->pcstkTop = pcstk->pcstkNext;	SETCURKEY(pcstk->akyLast);	pCurThread->pProc = pcstk->pprcLast;    SetCPUASID(pCurThread);}DWORD PerformCallBack4Int(CALLBACKINFO *pcbi, LPVOID p2, LPVOID p3, LPVOID p4) {	CALLSTACK cstk, *pcstk;	DWORD dwRet, dwFault = 0;	PPROCESS pProc;	if (!(pProc = HandleToProc(pcbi->hProc))) {        RaiseException(STATUS_INVALID_PARAMETER, EXCEPTION_NONCONTINUABLE, 0, 0);        return 0;	}    cstk.pprcLast = pCurProc;    cstk.akyLast = CurAKey;    cstk.retAddr = 0;    cstk.pcstkNext = pCurThread->pcstkTop;    pCurThread->pProc = pProc;    pCurThread->pcstkTop = &cstk;    if (pProc != &ProcArray[0]) {	    pcstk = &cstk;	    while ((pcstk = (PCALLSTACK)((ulong)pcstk->pcstkNext&~1)) && (pcstk->pprcLast != pProc))	       	;	    if (pcstk)	       	pCurThread->aky = pcstk->akyLast;	    else {			pCurThread->aky = pCurThread->pOwnerProc->aky;	       	AddAccess(&pCurThread->aky, ProcArray[0].aky);	        AddAccess(&pCurThread->aky, pProc->aky);	    }	}	SetCPUASID(pCurThread);	randdw1 = ((randdw1<<5) | (randdw1>>27)) ^ (CurMSec & 0x1f);	try {		dwRet = (*(DWORD (*)(LPVOID, LPVOID, LPVOID, LPVOID))(ZeroPtr(pcbi->pfn)))(pcbi->pvArg0,p2,p3,p4);	} except (EXCEPTION_EXECUTE_HANDLER) {		dwFault = 1;		dwRet = 0; // set return value	}	SwitchBack();	if (dwFault)        RaiseException(STATUS_INVALID_PARAMETER, EXCEPTION_NONCONTINUABLE, 0, 0);	return dwRet;}DWORD SC_PerformCallBack4(CALLBACKINFO *pcbi, LPVOID p2, LPVOID p3, LPVOID p4) {	if (pCurProc->bTrustLevel == KERN_TRUST_FULL)		return PerformCallBack4Int(pcbi,p2,p3,p4);  	RaiseException(STATUS_INVALID_PARAMETER, EXCEPTION_NONCONTINUABLE, 0, 0);	return 0;}HGDIOBJ SC_SelectObject(HANDLE hDC, HANDLE hObj) {	CALLSTACK cstk;	HGDIOBJ hRet;    const CINFO *pci;	pci = SwitchToProc(&cstk,SH_GDI);    try {		hRet = (*(HGDIOBJ (*)(HANDLE,HANDLE))(pci->ppfnMethods[SELECTOBJECT]))(hDC,hObj);	} except(EXCEPTION_EXECUTE_HANDLER) {		(*(void (*)(void))pGwesHandler)();		hRet = 0;	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -