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

📄 kmisc.c

📁 wince下的源代码集合打包
💻 C
📖 第 1 页 / 共 5 页
字号:
				loop++;			} else				WaitForMultipleObjects(1,&hSignalApp,0,INFINITE);		}		// launch apps!	}	pappinfo = 0;	CloseHandle(hSignalApp);	pPSLNotify(DLL_SYSTEM_STARTED,0,0);}BOOL SC_SetDbgZone(DWORD dwProcid, LPVOID lpvMod, LPVOID BasePtr, DWORD zone, LPDBGPARAM lpdbgTgt) {	DWORD retval = FALSE;	PMODULE pMod;	PPROCESS pProc;	LPDBGPARAM lpdbgSrc = 0;    ACCESSKEY ulOldKey;    SWITCHKEY(ulOldKey,0xffffffff);	if (dwProcid) {		if (!lpvMod && (pProc = HandleToProc((HANDLE)dwProcid)) && pProc->ZonePtr) {			if (zone != 0xffffffff)				pProc->ZonePtr->ulZoneMask=zone;			lpdbgSrc = pProc->ZonePtr;			retval = TRUE;		}	} else if (lpvMod) {		pMod = (PMODULE)lpvMod;	    if (IsValidModule(pMod) && pMod->ZonePtr) {			DWORD dwUseMask = pMod->inuse | 0x1;    // Add the kernel's bit			DWORD dwZeroAddr = (DWORD)(ZeroPtr((LPVOID)(pMod->ZonePtr)));			INT i=0;			// set source for copying names: use kernel's version since it's guaranteed to be there !			lpdbgSrc = (LPDBGPARAM)(MapPtrProc(dwZeroAddr,&ProcArray[0]));			if (zone != 0xffffffff) {				for (i = 0; dwUseMask; i++, dwUseMask >>= 1) {				    if (dwUseMask & 0x1)					    ((LPDBGPARAM)MapPtrProc(dwZeroAddr,&ProcArray[i]))->ulZoneMask = zone;				}			}			retval = TRUE;	    }	}    // Copy information if required    if (lpdbgSrc && lpdbgTgt)		memcpy(lpdbgTgt, lpdbgSrc, sizeof(DBGPARAM));	// restore access rights	SETCURKEY(ulOldKey);	return retval;}BOOL SC_RegisterDbgZones(HANDLE hMod, LPDBGPARAM lpdbgparam) {	DWORD hKeyPeg=0, hKeyZones=0;    DWORD dwType, dwData, dwSize;    CHAR szName[16];	PMODULE pMod = (PMODULE)hMod;	HKEY hZones;	BOOL bTryLocal;	lpdbgparam = MapPtr(lpdbgparam);	if (pMod) {		if (!IsValidModule(pMod))			return FALSE;		if (pMod->ZonePtr)			return TRUE;		pMod->ZonePtr = (LPDBGPARAM)MapPtrProc(ZeroPtr(lpdbgparam),&ProcArray[0]);	} else	    pCurThread->pOwnerProc->ZonePtr = lpdbgparam;	bTryLocal = TRUE;	//	// See if the debug zone mask is specified in the desktop PC's registry	//	rRegOpen((DWORD)HKEY_CURRENT_USER, "Pegasus", &hKeyPeg);	if (hKeyPeg) {		rRegOpen(hKeyPeg, "Zones", &hKeyZones);		if (hKeyZones) {			KUnicodeToAscii(szName, lpdbgparam->lpszName, sizeof(szName));			rRegGet(hKeyZones, szName, &dwType, (LPBYTE)&dwData, &dwSize);			if (dwType == REG_DWORD) {			    if (pMod)			    	SC_SetDbgZone(0,pMod,0,dwData,0);				else					SC_SetDbgZone((DWORD)hCurProc,0,0,dwData,0);				bTryLocal = FALSE;			}			rRegClose(hKeyZones);		}		rRegClose(hKeyPeg);	}	//	// Can only check the local registry if the filesys API is registered.	//	if (bTryLocal && (UserKInfo[KINX_API_MASK] & (1 << SH_FILESYS_APIS))) {		//		// See if the debug zone mask is specified in the Windows CE registry		// (in HLM\DebugZones:<module name>)		//		if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("DebugZones"), 0, 0,						&hZones) == ERROR_SUCCESS) {			dwSize = sizeof(DWORD);			if (RegQueryValueEx(hZones, lpdbgparam->lpszName, 0, &dwType,						(PUCHAR)&dwData, &dwSize) == ERROR_SUCCESS) {				if (dwType == REG_DWORD) {					if (pMod)						SC_SetDbgZone(0,pMod,0,dwData,0);					else						SC_SetDbgZone((DWORD)hCurProc,0,0,dwData,0);				}			}			RegCloseKey(hZones);		}	}	return TRUE;}PTHREAD ZeroAllThreadsTLS(PTHREAD pCur, DWORD slot) {    KCALLPROFON(65);    if (pCur == (PTHREAD)1)        pCur = pCurProc->pTh;    else if (HandleToThread(pCur->hTh) != pCur)        return (PTHREAD)1;    pCur->tlsPtr[slot] = 0;    KCALLPROFOFF(65);    return pCur->pNextInProc;}/* Thread local storage APIs */DWORD SC_TlsCall(DWORD type, DWORD slot) {	int loop, mask;	DWORD used;	PTHREAD pth;	DEBUGMSG(ZONE_ENTRY,(L"SC_TlsCall entry: %8.8lx %8.8lx\r\n",type,slot));	switch (type) {		case TLS_FUNCALLOC:			do {				used = pCurProc->tlsLowUsed;				for (loop = 0, mask = 1; loop < 32; loop++, mask <<= 1)					if (!(used & mask))						break;			} while ((loop != 32) && ((DWORD)InterlockedTestExchange(&pCurProc->tlsLowUsed,used,used | mask) != used));			if (loop == 32) {				do {					used = pCurProc->tlsHighUsed;					for (mask = 1; loop < 64; loop++, mask <<= 1)						if (!(used & mask))							break;				} while ((loop != 64) && ((DWORD)InterlockedTestExchange(&pCurProc->tlsHighUsed,used,used|mask) != used));				if (loop == 64) {					DEBUGMSG(ZONE_ENTRY,(L"SC_TlsCall exit: %8.8lx\r\n",0xffffffff));					return 0xffffffff;				}			}			DEBUGMSG(ZONE_ENTRY,(L"SC_TlsCall exit: %8.8lx\r\n",loop));			return loop;		case TLS_FUNCFREE:			if (slot >= 64) {				DEBUGMSG(ZONE_ENTRY,(L"SC_TlsCall exit: %8.8lx\r\n",0));				return 0;			}			pth = (PTHREAD)1;			while (pth = (PTHREAD)KCall((PKFN)ZeroAllThreadsTLS,pth,slot))				;			if (slot < 32) {				do {					used = pCurProc->tlsLowUsed;				} while ((DWORD)InterlockedTestExchange(&pCurProc->tlsLowUsed,used,used & ~(1<<slot)) != used);			} else {				do {					used = pCurProc->tlsHighUsed;				} while ((DWORD)InterlockedTestExchange(&pCurProc->tlsHighUsed,used,used & ~(1<<(slot-32))) != used);			}			DEBUGMSG(ZONE_ENTRY,(L"SC_TlsCall exit: %8.8lx\r\n",1));			return 1;		default:			DEBUGCHK(0);			DEBUGMSG(ZONE_ENTRY,(L"SC_TlsCall exit: %8.8lx\r\n",0));			return 0;	}}//  @func DWORD | SetProcPermissions | Sets the kernel's internal thread permissions//  @rdesc Returns the new permission dword//  @parm DWORD | newpermissions | the new permissions bitmask//  @comm Sets the internal permissions bitmask for the current threadDWORD SC_SetProcPermissions(DWORD newperms) {	DWORD retval;	DEBUGMSG(ZONE_ENTRY,(L"SC_SetProcPermissions entry: %8.8lx\r\n",newperms));	if (!newperms)		newperms = 0xffffffff;	else {		// prevent user from removing kernel access		AddAccess(&newperms, ProcArray[0].aky);		// prevent user from removing access to his stack		AddAccess(&newperms, pCurThread->pOwnerProc->aky);	}	ERRORMSG(pCurProc->bTrustLevel != KERN_TRUST_FULL,(L"SC_SetProcPermissions failed due to insufficient trust\r\n"));	if (pCurProc->bTrustLevel == KERN_TRUST_FULL)		SWITCHKEY(retval, newperms);	DEBUGMSG(ZONE_ENTRY,(L"SC_SetProcPermissions exit: %8.8lx\r\n",retval));	return retval;}//  @func DWORD | GetCurrentPermissions | Obtains the kernel's internal thread permissions dword//  @rdesc Returns the thread permissions dword//  @comm Obtains the internal permissions bitmask for the current threadDWORD SC_GetCurrentPermissions(void) {	DEBUGMSG(ZONE_ENTRY,(L"SC_GetCurrentPermissions entry\r\n"));	DEBUGMSG(ZONE_ENTRY,(L"SC_GetCurrentPermissions exit: %8.8lx\r\n",pCurThread->aky));	return pCurThread->aky;}DWORD NormalBias, DaylightBias, InDaylight;void SC_SetDaylightTime(DWORD dst) {	DEBUGMSG(ZONE_ENTRY,(L"SC_SetDaylightTime entry: %8.8lx\r\n",dst));	InDaylight = dst;	KInfoTable[KINX_TIMEZONEBIAS] = (InDaylight ? DaylightBias : NormalBias);	DEBUGMSG(ZONE_ENTRY,(L"SC_SetDaylightTime exit\r\n"));}void SC_SetTimeZoneBias(DWORD dwBias, DWORD dwDaylightBias) {	DEBUGMSG(ZONE_ENTRY,(L"SC_SetTimeZoneBias entry: %8.8lx %8.8lx\r\n",dwBias,dwDaylightBias));	NormalBias = dwBias;	DaylightBias = dwDaylightBias;	KInfoTable[KINX_TIMEZONEBIAS] = (InDaylight ? DaylightBias : NormalBias);	DEBUGMSG(ZONE_ENTRY,(L"SC_SetTimeZoneBias exit\r\n"));}/* Set thread last error */void SC_SetLastError(DWORD dwError) {	DEBUGMSG(ZONE_ENTRY,(L"SC_SetLastError entry: %8.8lx\r\n",dwError));	pCurThread->dwLastError = dwError;	DEBUGMSG(ZONE_ENTRY,(L"SC_SetLastError exit\r\n"));}/* Get thread last error */DWORD SC_GetLastError(void) {	DEBUGMSG(ZONE_ENTRY,(L"SC_GetLastError entry\r\n"));	DEBUGMSG(ZONE_ENTRY,(L"SC_GetLastError exit: %8.8lx\r\n",pCurThread->dwLastError));	return pCurThread->dwLastError;}/* Get thread return code */BOOL SC_ThreadGetCode(HANDLE hTh, LPDWORD lpExit) {	DEBUGMSG(ZONE_ENTRY,(L"SC_ThreadGetCode entry: %8.8lx %8.8lx\r\n",hTh,lpExit));	*lpExit = GetUserInfo(hTh);	DEBUGMSG(ZONE_ENTRY,(L"SC_ThreadGetCode exit: %8.8lx\r\n",TRUE));	return TRUE;}/* Get process return code */BOOL SC_ProcGetCode(HANDLE hProc, LPDWORD lpExit) {	DEBUGMSG(ZONE_ENTRY,(L"SC_ProcGetCode entry: %8.8lx %8.8lx\r\n",hProc,lpExit));	*lpExit = GetUserInfo(hProc);	DEBUGMSG(ZONE_ENTRY,(L"SC_ProcGetCode exit: %8.8lx\r\n",TRUE));	return TRUE;}DWORD SC_ProcGetIndex(HANDLE hProc) {	PPROCESS pproc;	DEBUGMSG(ZONE_ENTRY,(L"SC_ProcGetIndex entry: %8.8lx\r\n",hProc));	if (!(pproc = HandleToProc(hProc))) {		DEBUGMSG(ZONE_ENTRY,(L"SC_ProcGetIndex exit: %8.8lx\r\n",0xffffffff));		return 0xffffffff;	}	DEBUGMSG(ZONE_ENTRY,(L"SC_ProcGetIndex exit: %8.8lx\r\n",pproc->procnum));	return pproc->procnum;}BOOL SC_ProcFlushICache(HANDLE hProc, LPCVOID lpBaseAddress, DWORD dwSize) {	SC_CacheSync(CACHE_SYNC_INSTRUCTIONS);	return TRUE;}BOOL SC_ProcReadMemory(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead) {	BOOL retval = FALSE;	LPBYTE ptr;	PPROCESS pproc;   	if (pCurProc->bTrustLevel != KERN_TRUST_FULL) {		ERRORMSG(1,(L"SC_ProcReadMemory failed due to insufficient trust\r\n"));		KSetLastError(pCurThread,ERROR_ACCESS_DENIED);		return FALSE;	}    if (lpNumberOfBytesRead)    	*lpNumberOfBytesRead = 0;	if (pproc = HandleToProc(hProcess)) {	    ACCESSKEY ulOldKey;    	SWITCHKEY(ulOldKey,0xffffffff);		ptr = MapPtrProc(lpBaseAddress,pproc);		__try {			memcpy(lpBuffer,ptr,nSize);			if (lpNumberOfBytesRead)				*lpNumberOfBytesRead = nSize;			retval = TRUE;		} __except (EXCEPTION_EXECUTE_HANDLER) {			SetLastError(ERROR_NOACCESS);		}		SETCURKEY(ulOldKey);	}	return retval;}BOOL SC_ProcWriteMemory(HANDLE hProcess, LPVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesWritten) {	BOOL retval = FALSE;	LPBYTE ptr, ptr2, ptrend;	PPROCESS pproc;	DWORD bytesleft, bytestocopy;   	if (pCurProc->bTrustLevel != KERN_TRUST_FULL) {		ERRORMSG(1,(L"SC_ProcWriteMemory failed due to insufficient trust\r\n"));		KSetLastError(pCurThread,ERROR_ACCESS_DENIED);		return FALSE;	}	if (lpNumberOfBytesWritten)		*lpNumberOfBytesWritten = 0;	if (pproc = HandleToProc(hProcess)) {	    ACCESSKEY ulOldKey;	    SWITCHKEY(ulOldKey,0xffffffff);		ptr = MapPtrProc(lpBaseAddress,pproc);		__try {			bytesleft = nSize;			while (bytesleft) {				BOOL bUnlock;				bytestocopy = 0x10000 - ((DWORD)ptr & 0xffff);				if (bytestocopy > bytesleft)					bytestocopy = bytesleft;				bUnlock = LockPages(ptr,bytestocopy,0,LOCKFLAG_READ);				ptr2 = ptr;				ptrend = ptr2 + bytestocopy;				while (ptr2 < ptrend) {					MEMORY_BASIC_INFORMATION mbi;					if (!VirtualQuery(ptr2,&mbi,sizeof(mbi)))						bUnlock = FALSE;					else if ((mbi.Protect != PAGE_READWRITE) && (mbi.Protect != PAGE_EXECUTE_READWRITE)) {						DWORD dwProt;						dwProt = ((mbi.Protect == PAGE_EXECUTE) || (mbi.Protect == PAGE_EXECUTE_READ)) ?							PAGE_EXECUTE_READWRITE : PAGE_READWRITE;						VirtualProtect(ptr2,PAGE_SIZE - ((DWORD)ptr2 & (PAGE_SIZE-1)), dwProt, &dwProt);						bUnlock = FALSE;					}					ptr2 += PAGE_SIZE - ((DWORD)ptr2 & (PAGE_SIZE-1));				}				if (bUnlock)					UnlockPages(ptr,bytestocopy);				memcpy(ptr,lpBuffer,bytestocopy);				ptr += bytestocopy;				lpBuffer = (LPVOID)((LPBYTE)lpBuffer + bytestocopy);				bytesleft -= bytestocopy;			}			if (lpNumberOfBytesWritten)				*lpNumberOfBytesWritten = nSize;			SC_CacheSync(CACHE_SYNC_DISCARD | CACHE_SYNC_INSTRUCTIONS);			retval = TRUE;		} __except (EXCEPTION_EXECUTE_HANDLER) {			SetLastError(ERROR_NOACCESS);		}		SETCURKEY(ulOldKey);	}	return retval;}HANDLE SC_OpenProcess(DWORD fdwAccess, BOOL fInherit, DWORD IDProcess) {	if (!fInherit && (GetHandleType((HANDLE)IDProcess) == SH_CURPROC) && IncRef((HANDLE)IDProcess, pCurProc))		return (HANDLE)IDProcess;	SetLastError(ERROR_INVALID_PARAMETER);	return NULL;}LPBYTE SC_THGrow(THSNAP *pSnap, DWORD dwSize) {	LPBYTE lpRet = pSnap->pNextFree;	pSnap->pNextFree += dwSize;	if (pSnap->pNextFree > pSnap->pHighReserve) {		ERRORMSG(1,(L"THGrow: Not enough reservation for toolhelp!\r\n"));		return 0;	}	if (pSnap->pNextFree > pSnap->pHighCommit) {		if (!VirtualAlloc(pSnap->pHighCommit, (pSnap->pNextFree - pSnap->pHighCommit + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1),			MEM_COMMIT, PAGE_READWRITE))			return 0;		pSnap->pHighCommit = (LPBYTE)((DWORD)(pSnap->pNextFree + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1));	}	return lpRet;}BOOL THGetProcs(THSNAP *pSnap, BOOL bGetHeap) {	TH32PROC **ppNext;	PTHREAD pTh;	DWORD loop;	CALLBACKINFO cbi;	LPBYTE pNextFree;	ppNext = &pSnap->pProc;	for (loop = 0; loop < MAX_PROCESSES; loop++) {		if (ProcArray[loop].dwVMBase && (!loop || ProcStarted(&ProcArray[loop]))) {			if (!(*ppNext = (TH32PROC *)THGrow(pSnap,sizeof(TH32PROC))))				return FALSE;			(*ppNext)->procentry.dwSize = sizeof(PROCESSENTRY32);			(*ppNext)->procentry.cntUsage = 1;			(*ppNext)->procentry.th32ProcessID = (DWORD)ProcArray[loop].hProc;			(*ppNext)->procentry.th32ModuleID = 0;			(*ppNext)->procentry.cntThreads = 0;			for (pTh = ProcArray[loop].pTh; pTh; pTh = pTh->pNextInProc)				(*ppNext)->procentry.cntThreads++;			(*ppNext)->procentry.th32ParentProcessID = 0;			(*ppNext)->procentry.pcPriClassBase = THREAD_PRIORITY_NORMAL;			(*ppNext)->procentry.dwFlags = ProcArray[loop].ZonePtr ? ProcArray[loop].ZonePtr->ulZoneMask : 0;			(*ppNext)->procentry.th32MemoryBase = ProcArray[loop].dwVMBase;			(*ppNext)->procentry.th32AccessKey = ProcArray[loop].aky;			kstrcpyW((*ppNext)->procentry.szExeFile,ProcArray[loop].lpszProcName);			if (loop && bGetHeap) {				pNextFree = pSnap->pNextFree;				__try {					cbi.hProc = ProcArray[loop].hProc;					cbi.pfn = (FARPROC)pGetProcessHeap;					cbi.pvArg0 = 0;					(*ppNext)->procentry.th32DefaultHeapID = PerformCallBack4(&cbi);					cbi.pfn = (FARPROC)pGetHeapSnapshot;					cbi.pvArg0 = pSnap;					if (!PerformCallBack4(&cbi,1,&(*ppNext)->pMainHeapEntry)) {						(*ppNext)->procentry.th32DefaultHeapID = 0;						(*ppNext)->pMainHeapEntry = 0;						pSnap->pNextFree = pNextFree;					}				} __except (EXCEPTION_EXECUTE_HANDLER) {					(*ppNext)->procentry.th32DefaultHeapID = 0;

⌨️ 快捷键说明

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