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

📄 resource.c

📁 wince下的源代码集合打包
💻 C
📖 第 1 页 / 共 3 页
字号:
		BasePtr2 = (LPBYTE)MapPtrProc(((PMODULE)hModule)->BasePtr,&ProcArray[0]);		eptr2 = &(((PMODULE)hModule)->e32);		if(!(pmodRes = ((PMODULE)hModule)->pmodResource))			pmodRes = InterlockedUpdatePmodRes(&(((PMODULE)hModule)->pmodResource), hModule, BasePtr2, eptr2);	} else {		KSetLastError(pCurThread,ERROR_INVALID_HANDLE);		DEBUGMSG(ZONE_ENTRY,(L"SC_FindResource exit: %8.8lx\r\n",0));		return 0;	}	// If we have a MUI dll try to load from it first	hRet = 0;	if(pmodRes != (PMODULE)-1) {		//DEBUGMSG(1,(L"SC_FindResource: Trying MUI %08x\r\n",pmodRes));		DEBUGCHK(IsValidModule(pmodRes)); // at this point pmodRes is a valid PMODULE or -1		hRet = FindResourcePart2((LPBYTE)MapPtrProc(pmodRes->BasePtr,&ProcArray[0]), &(pmodRes->e32), lpszName, lpszType);	}	// if no MUI or failed to find resource, try the module itself	if(!hRet) {		//DEBUGMSG(1,(L"SC_FindResource: Trying self\r\n"));		hRet = FindResourcePart2(BasePtr2, eptr2, lpszName, lpszType);	}	if(!hRet) 		KSetLastError(pCurThread,ERROR_RESOURCE_NAME_NOT_FOUND);	DEBUGMSG(ZONE_ENTRY,(L"SC_FindResource exit: %8.8lx\r\n",hRet));	return hRet;}// Win32 SizeofResourceDWORD SC_SizeofResource(HANDLE hModule, HANDLE hRsrc) {	DEBUGMSG(ZONE_ENTRY,(L"SC_SizeofResource entry: %8.8lx %8.8lx\r\n",hModule,hRsrc));	if (!hRsrc) {		KSetLastError(pCurThread,ERROR_INVALID_HANDLE);		DEBUGMSG(ZONE_ENTRY,(L"SC_SizeofResource exit: %8.8lx\r\n",0));		return 0;	}	DEBUGMSG(ZONE_ENTRY,(L"SC_SizeofResource exit: %8.8lx\r\n",((resdata_t *)hRsrc)->size));	return ((resdata_t *)hRsrc)->size;}// Win32 LoadResourceHANDLE SC_LoadResource(HANDLE hModule, HANDLE hRsrc) {	DWORD pnum;	PMODULE pMod;	LPBYTE BasePtr;	PPROCESS pProc;	HANDLE h;	DEBUGMSG(ZONE_ENTRY,(L"SC_LoadResource entry: %8.8lx %8.8lx\r\n",hModule,hRsrc));	if (hModule == GetCurrentProcess())		hModule = hCurProc;	if (!hRsrc) {		KSetLastError(pCurThread,ERROR_INVALID_HANDLE);		DEBUGMSG(ZONE_ENTRY,(L"SC_LoadResource exit: %8.8lx\r\n",0));		return 0;	}	if (!hModule) {		pnum = ((DWORD)hRsrc >> VA_SECTION);		if (pnum-- && ProcArray[pnum].dwVMBase) {			if (!pnum) {				EnterCriticalSection(&ModListcs);				pMod = pModList;				pnum = ZeroPtr(hRsrc);				for (pMod = pModList; pMod; pMod = pMod->pMod)					if ((pnum >= ZeroPtr(pMod->BasePtr)) && (pnum < ZeroPtr(pMod->BasePtr)+pMod->e32.e32_vsize))						break;				LeaveCriticalSection(&ModListcs);				if (!pMod) {					KSetLastError(pCurThread,ERROR_INVALID_HANDLE);					DEBUGMSG(ZONE_ENTRY,(L"SC_LoadResource exit: %8.8lx\r\n",0));					return 0;				}				BasePtr = MapPtrProc(pMod->BasePtr,&ProcArray[0]);			} else				BasePtr = MapPtrProc(ProcArray[pnum].BasePtr,&ProcArray[pnum]);		} else {			KSetLastError(pCurThread,ERROR_INVALID_HANDLE);			DEBUGMSG(ZONE_ENTRY,(L"SC_LoadResource exit: %8.8lx\r\n",0));			return 0;		}		pMod = 0;	} else if (pProc = HandleToProc(hModule)) { // a process		pMod = pProc->pmodResource;		BasePtr = (LPBYTE)MapPtrProc(pProc->BasePtr,pProc);	} else if (IsValidModule((LPMODULE)hModule)) { // a module		pMod = ((PMODULE)hModule)->pmodResource;		BasePtr = (LPBYTE)MapPtrProc(((PMODULE)hModule)->BasePtr,&ProcArray[0]);	} else {		KSetLastError(pCurThread,ERROR_INVALID_HANDLE);		DEBUGMSG(ZONE_ENTRY,(L"SC_LoadResource exit: %8.8lx\r\n",0));		return 0;	}	// check if it came out of the MUI resource dll	if( pMod && (pMod != (PMODULE)-1) && 		(ZeroPtr(hRsrc) >= ZeroPtr(pMod->BasePtr)) && 		(ZeroPtr(hRsrc) < ZeroPtr(pMod->BasePtr)+pMod->e32.e32_vsize) )			BasePtr = (LPBYTE)MapPtrProc(pMod->BasePtr,&ProcArray[0]);		DEBUGMSG(ZONE_ENTRY,(L"SC_LoadResource exit: %8.8lx\r\n",BasePtr + ((resdata_t *)hRsrc)->rva));	__try {		h = (HANDLE)(BasePtr + ((resdata_t *)hRsrc)->rva);	} __except(1) {		h = 0;		SetLastError(ERROR_INVALID_ADDRESS);	}	return h;}DWORD Decompress(LPBYTE BufIn, DWORD InSize, LPBYTE BufOut, DWORD OutSize, DWORD skip);#pragma pack(2)typedef struct {	WORD idReserved;	WORD idType;	WORD idCount;} ICONHEADER;typedef struct ResourceDirectory {	BYTE bWidth;	BYTE bHeight;	BYTE bColorCount;	BYTE bReserved;	WORD wPlanes;	WORD wBitCount;	DWORD dwBytesInRes;	WORD wOrdinal;	   /* points to an RT_ICON resource */} RESDIR;typedef struct {	ICONHEADER ih;	RESDIR rgdir[1];  /* may really be > 1 */} HEADER_AND_DIR, *PHEADER_AND_DIR;LPBYTE OpenResourceFile(LPCWSTR lpszFile, BOOL *pInRom, DWORD *o32rva) {	openexe_t oe;	e32_lite e32l;	o32_obj o32;	o32_rom *o32rp;	LPBYTE lpres;	DWORD bytesread, loop;	BOOL bRet;	CALLBACKINFO cbi;	OEinfo_t OEinfo;	*pInRom = 0;	__try {		cbi.hProc = ProcArray[0].hProc;		cbi.pfn = (FARPROC)SafeOpenExe;		cbi.pvArg0 = MapPtr(lpszFile);		bRet = PerformCallBack(&cbi,MapPtr(&oe),0,0,&OEinfo);	} __except(EXCEPTION_EXECUTE_HANDLER) {		bRet = FALSE;	}	if (!bRet) {		KSetLastError(pCurThread,ERROR_RESOURCE_NAME_NOT_FOUND);		DEBUGMSG(ZONE_ENTRY,(L"SC_ExtractResource exit: %8.8lx\r\n",0));		return 0;	}	if (LoadE32(&oe,&e32l,0,0,1,1,0)) {		CloseExe(&oe);		KSetLastError(pCurThread,ERROR_RESOURCE_NAME_NOT_FOUND);		DEBUGMSG(ZONE_ENTRY,(L"SC_ExtractResource exit: %8.8lx\r\n",0));		return 0;	}	if (!e32l.e32_unit[RES].rva) {		CloseExe(&oe);		KSetLastError(pCurThread,ERROR_RESOURCE_NAME_NOT_FOUND);		DEBUGMSG(ZONE_ENTRY,(L"SC_ExtractResource exit: %8.8lx\r\n",0));		return 0;	}	if (oe.filetype == FT_PPFSFILE) {		for (loop = 0; loop < e32l.e32_objcnt; loop++) {			rlseek(oe.hppfs,oe.offset+sizeof(e32_exe)+loop*sizeof(o32_obj),0);			rread(oe.hppfs,(LPBYTE)&o32,sizeof(o32_obj));			if (o32.o32_rva == e32l.e32_unit[RES].rva)				break;		}		if (loop == e32l.e32_objcnt) {			CloseExe(&oe);			KSetLastError(pCurThread,ERROR_RESOURCE_NAME_NOT_FOUND);			DEBUGMSG(ZONE_ENTRY,(L"SC_ExtractResource exit: %8.8lx\r\n",0));			return 0;		}		if (!(lpres = (LPBYTE)LocalAlloc(LMEM_FIXED,o32.o32_vsize))) {			CloseExe(&oe);			KSetLastError(pCurThread,ERROR_RESOURCE_NAME_NOT_FOUND);			DEBUGMSG(ZONE_ENTRY,(L"SC_ExtractResource exit: %8.8lx\r\n",0));			return 0;		}		rlseek(oe.hppfs,o32.o32_dataptr,0);		rread(oe.hppfs,lpres,min(o32.o32_psize,o32.o32_vsize));		*o32rva = o32.o32_rva;	} else if (oe.filetype == FT_OBJSTORE) {		for (loop = 0; loop < e32l.e32_objcnt; loop++) {			SetFilePointer(oe.hf,oe.offset+sizeof(e32_exe)+loop*sizeof(o32_obj),0,FILE_BEGIN);			ReadFile(oe.hf,(LPBYTE)&o32,sizeof(o32_obj),&bytesread,0);			if (o32.o32_rva == e32l.e32_unit[RES].rva)				break;		}		if (loop == e32l.e32_objcnt) {			CloseExe(&oe);			KSetLastError(pCurThread,ERROR_RESOURCE_NAME_NOT_FOUND);			DEBUGMSG(ZONE_ENTRY,(L"SC_ExtractResource exit: %8.8lx\r\n",0));			return 0;		}		if (!(lpres = (LPBYTE)LocalAlloc(LMEM_FIXED,o32.o32_vsize))) {			CloseExe(&oe);			KSetLastError(pCurThread,ERROR_RESOURCE_NAME_NOT_FOUND);			DEBUGMSG(ZONE_ENTRY,(L"SC_ExtractResource exit: %8.8lx\r\n",0));			return 0;		}		SetFilePointer(oe.hf,o32.o32_dataptr,0,FILE_BEGIN);		ReadFile(oe.hf,lpres,min(o32.o32_psize,o32.o32_vsize),&bytesread,0);		*o32rva = o32.o32_rva;	} else {		for (loop = 0; loop < e32l.e32_objcnt; loop++) {			o32rp = (o32_rom *)(oe.tocptr->ulO32Offset+loop*sizeof(o32_rom));			if (o32rp->o32_rva == e32l.e32_unit[RES].rva)				break;		}		if (loop == e32l.e32_objcnt) {			CloseExe(&oe);			KSetLastError(pCurThread,ERROR_RESOURCE_NAME_NOT_FOUND);			DEBUGMSG(ZONE_ENTRY,(L"SC_ExtractResource exit: %8.8lx\r\n",0));			return 0;		}		if (o32rp->o32_psize) {			if (o32rp->o32_flags & IMAGE_SCN_COMPRESSED) {				if (!(lpres = (LPBYTE)LocalAlloc(LMEM_FIXED,o32rp->o32_vsize))) {					CloseExe(&oe);					KSetLastError(pCurThread,ERROR_RESOURCE_NAME_NOT_FOUND);					DEBUGMSG(ZONE_ENTRY,(L"SC_ExtractResource exit: %8.8lx\r\n",0));					return 0;				}				bytesread = Decompress((LPVOID)(o32rp->o32_dataptr),o32rp->o32_psize,lpres,o32rp->o32_vsize,0);				if (bytesread < o32rp->o32_vsize)					memset(lpres+bytesread,0,o32rp->o32_vsize-bytesread);			} else {				lpres = (LPVOID)(o32rp->o32_dataptr);				*pInRom = 1;			}		}		*o32rva = o32rp->o32_rva;	}	CloseExe(&oe);	return lpres;}LPVOID ExtractOneResource(LPBYTE lpres, LPCWSTR lpszName, LPCWSTR lpszType, DWORD o32rva, LPDWORD pdwSize) {	LPBYTE lpres2;	DWORD trva;	if (!(trva = FindType(lpres, lpres, (LPWSTR)lpszType)) ||	   !(trva = FindType(lpres, lpres+(trva&0x7fffffff),(LPWSTR)lpszName)) ||	   !(trva = FindFirst(lpres+(trva&0x7fffffff))) ||	   (trva & 0x80000000)) {		KSetLastError(pCurThread,ERROR_RESOURCE_NAME_NOT_FOUND);		return 0;	}	trva = (ULONG)(lpres + trva);	if (!(lpres2 = (LPBYTE)LocalAlloc(LMEM_FIXED,((resdata_t *)trva)->size))) {		KSetLastError(pCurThread,ERROR_RESOURCE_NAME_NOT_FOUND);		return 0;	}		if (pdwSize)		*pdwSize = ((resdata_t *)trva)->size;	memcpy(lpres2,lpres+((resdata_t *)trva)->rva-o32rva,((resdata_t *)trva)->size);	return lpres2;}LPVOID SC_ExtractResource(LPCWSTR lpszFile, LPCWSTR lpszName, LPCWSTR lpszType) {	LPBYTE lpres, lpres2;	BOOL inRom;	DWORD o32rva;	DEBUGMSG(ZONE_ENTRY,(L"SC_ExtractResource entry: %8.8lx %8.8lx %8.8lx\r\n",lpszFile,lpszName,lpszType));	if (!(lpres = OpenResourceFile(lpszFile, &inRom, &o32rva))) {		DEBUGMSG(ZONE_ENTRY,(L"SC_ExtractResource exit: %8.8lx\r\n",0));		return 0;	}	lpres2 = ExtractOneResource(lpres,lpszName,lpszType,o32rva,0);	if (!inRom)		LocalFree(lpres);	DEBUGMSG(ZONE_ENTRY,(L"SC_ExtractResource exit: %8.8lx\r\n",lpres2));	return lpres2;}typedef void (* KEICB_t)(LPVOID, PHEADER_AND_DIR,PWORD);UINT SC_KernExtractIcons(LPCWSTR lpszFile, int nIconIndex, LPBYTE *pIconLarge, LPBYTE *pIconSmall, CALLBACKINFO *pcbi) {	LPBYTE lpres;	BOOL inRom;	UINT nRet = 0;	PHEADER_AND_DIR phd;	DWORD o32rva;	WORD index[2];	if (!(lpres = OpenResourceFile(lpszFile, &inRom, &o32rva)))		return 0;	if (phd = (PHEADER_AND_DIR)ExtractOneResource(lpres, MAKEINTRESOURCE(nIconIndex), RT_GROUP_ICON, o32rva,0)) {		if (phd->ih.idCount) {			((KEICB_t)pcbi->pfn)(pcbi->pvArg0,phd,index);			if (pIconLarge && (*pIconLarge = ExtractOneResource(lpres, MAKEINTRESOURCE(phd->rgdir[index[0]].wOrdinal), RT_ICON, o32rva,0)))				nRet++;			if (pIconSmall && (*pIconSmall = ExtractOneResource(lpres, MAKEINTRESOURCE(phd->rgdir[index[1]].wOrdinal), RT_ICON, o32rva,0)))				nRet++;		}		LocalFree(phd);	}	if (!inRom)		LocalFree(lpres);	return nRet;}BOOL SC_VerQueryValueW(VERBLOCK *pBlock, LPWSTR lpSubBlock, LPVOID *lplpBuffer, PUINT puLen) {	LPWSTR lpSubBlockOrg, lpEndBlock, lpEndSubBlock, lpStart;	WCHAR cEndBlock, cTemp;	BOOL bString;	DWORD dwTotBlockLen, dwHeadLen;	int nCmp;	*puLen = 0;	if ((int)pBlock->wTotLen < sizeof(VERBLOCK)) {		KSetLastError(pCurThread,ERROR_INVALID_DATA);		return FALSE;	}	if (!(lpSubBlockOrg = (LPWSTR)LocalAlloc(LPTR,(strlenW(lpSubBlock)+1)*sizeof(WCHAR)))) {		KSetLastError(pCurThread,ERROR_NOT_ENOUGH_MEMORY);		return FALSE;	}	kstrcpyW(lpSubBlockOrg,lpSubBlock);	lpSubBlock = lpSubBlockOrg;	lpEndBlock = (LPWSTR)((LPBYTE)pBlock + pBlock->wTotLen - sizeof(WCHAR));	cEndBlock = *lpEndBlock;	*lpEndBlock = 0;	bString = FALSE;	while (*lpSubBlock) {		while (*lpSubBlock == L'\\')			++lpSubBlock;		if (*lpSubBlock) {			dwTotBlockLen = (DWORD)((LPSTR)lpEndBlock - (LPSTR)pBlock + sizeof(WCHAR));			if (((int)dwTotBlockLen < sizeof(VERBLOCK)) || (pBlock->wTotLen > (WORD)dwTotBlockLen))				goto NotFound;			dwHeadLen = DWORDUP(sizeof(VERBLOCK) - sizeof(WCHAR) + (strlenW(pBlock->szKey) + 1) * sizeof(WCHAR)) + DWORDUP(pBlock->wValLen);			if (dwHeadLen > pBlock->wTotLen)				goto NotFound;			lpEndSubBlock = (LPWSTR)((LPBYTE)pBlock + pBlock->wTotLen);			pBlock = (VERBLOCK*)((LPBYTE)pBlock+dwHeadLen);			for (lpStart=lpSubBlock; *lpSubBlock && (*lpSubBlock!=L'\\'); lpSubBlock++)				;			cTemp = *lpSubBlock;

⌨️ 快捷键说明

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