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

📄 compr2.c

📁 wince下的源代码集合打包
💻 C
字号:
/*		Copyright (c) 1995-2000 Microsoft Corporation.  All rights reserved. */#include <kernel.h>#define STRSIZEMASK 0x3fff#define STRPART1RAW 0x8000#define STRPART2RAW 0x4000extern CRITICAL_SECTION CompCS;DWORD Decompress(LPBYTE BufIn, DWORD InSize, LPBYTE BufOut, DWORD OutSize, DWORD skip) {	DWORD result;	LockPages(BufIn,InSize,0,LOCKFLAG_READ);	if (BufOut)		LockPages(BufOut,OutSize,0,LOCKFLAG_WRITE);	EnterCriticalSection(&CompCS);	DEBUGCHK(!(skip & (PAGE_SIZE-1)));	result = CEDecompress(BufIn,InSize,BufOut, OutSize, skip, 1, PAGE_SIZE);	LeaveCriticalSection(&CompCS);	UnlockPages(BufIn,InSize);	if (BufOut)		UnlockPages(BufOut,OutSize);	return result;}// Compressors - bufin and bufout must be WORD aligned, lenout must be at least as// large as lenin, CECOMPRESS_FAILED is returned if it doesn't fit, else compressed length// CECOMPRESS_ALL_ZEROS returned if buffer entirely zero.  If bufout is NULL, the output// length is computed, but the results are not stored.  Lenin must be a multiple of 2.DWORD SC_FSStringCompress(LPBYTE bufin, DWORD lenin, LPBYTE bufout, DWORD lenout) {	DWORD result, result2, newsize;	LPBYTE ptr1, ptr2, ptrend;	DEBUGMSG(ZONE_ENTRY,(L"SC_FSStringCompress entry: %8.8lx %8.8lx %8.8lx %8.8lx\r\n",bufin,lenin,bufout,lenout));	LockPages(bufin,lenin,0,LOCKFLAG_READ);	if (bufout)		LockPages(bufout,lenout,0,LOCKFLAG_WRITE);	EnterCriticalSection(&CompCS);	result = CECompress(bufin,(WORD)((lenin+1)/2),(bufout ? bufout+2 : 0),lenout - 2, 2, 1024);	if (result == CECOMPRESS_ALLZEROS) {		newsize = 0;		if (bufout)			*(LPWORD)bufout = 0;	} else if ((result != CECOMPRESS_FAILED) && (result < (lenin+1)/2)) {		newsize = result;		if (bufout)	{			DEBUGCHK(newsize <= STRSIZEMASK);			*(LPWORD)bufout = (WORD)newsize;		}	} else {		newsize = (lenin+1)/2;		if (newsize + 2 > lenout) {			DEBUGMSG(ZONE_ENTRY,(L"SC_FSStringCompress exit 1: %8.8lx\r\n",CECOMPRESS_FAILED));			LeaveCriticalSection(&CompCS);			UnlockPages(bufin,lenin);			if (bufout)				UnlockPages(bufout,lenout);			return CECOMPRESS_FAILED;		}		if (bufout) {			DEBUGCHK(newsize <= STRSIZEMASK);			*(LPWORD)bufout = STRPART1RAW | (WORD)newsize;			for (ptr1 = &bufout[2], ptr2 = bufin, ptrend = ptr1+newsize; ptr1 < ptrend; ptr2+=2)				*ptr1++ = *ptr2;		}	}	result2 = CECompress(bufin+1,(WORD)(lenin/2),(bufout ? bufout+2+newsize : 0), lenout - 2 - newsize, 2, 1024);	LeaveCriticalSection(&CompCS);	UnlockPages(bufin,lenin);	if (bufout)		UnlockPages(bufout,lenout);	if (result2 == CECOMPRESS_ALLZEROS) {		if (result == CECOMPRESS_ALLZEROS) {			DEBUGMSG(ZONE_ENTRY,(L"SC_FSStringCompress exit: %8.8lx\r\n",CECOMPRESS_ALLZEROS));			return CECOMPRESS_ALLZEROS;		} else {			DEBUGMSG(ZONE_ENTRY,(L"SC_FSStringCompress exit 2: %8.8lx\r\n",2+newsize >= lenin ? CECOMPRESS_FAILED : 2+newsize));			return (2+newsize >= lenin ? CECOMPRESS_FAILED : 2+newsize);		}	} else if ((result2 == CECOMPRESS_FAILED) || (result2 >= (lenin/2))) {		result2 = lenin/2;		if (2 + newsize + result2 > lenout) {			DEBUGMSG(ZONE_ENTRY,(L"SC_FSStringCompress exit 3: %8.8lx\r\n",CECOMPRESS_FAILED));			return CECOMPRESS_FAILED;		}		if (bufout) {			*(LPWORD)bufout |= STRPART2RAW;			for (ptr1 = &bufout[2+newsize], ptr2 = &bufin[1], ptrend = ptr1+(lenin/2); ptr1 < ptrend; ptr2+=2)				*ptr1++ = *ptr2;		}	}	DEBUGMSG(ZONE_ENTRY,(L"SC_FSStringCompress exit 4: %8.8lx\r\n",2+newsize+result2 >= lenin ? CECOMPRESS_FAILED : 2+newsize+result2));	return (2+newsize+result2 >= lenin ? CECOMPRESS_FAILED : 2+newsize+result2);}// Decompressors - bufin and bufout must be WORD aligned, lenout *must* be large// enough to handle the entire decompressed contents.DWORD SC_FSStringDecompress(LPBYTE bufin, DWORD lenin, LPBYTE bufout, DWORD lenout) {	DWORD newsize1, newsize2, insize1, insize2, loop;	DEBUGMSG(ZONE_ENTRY,(L"SC_FSStringDecompress entry: %8.8lx %8.8lx %8.8lx %8.8lx\r\n",bufin,lenin,bufout,lenout));	LockPages(bufin,lenin,0,LOCKFLAG_READ);	if (bufout)		LockPages(bufout,lenout,0,LOCKFLAG_WRITE);	EnterCriticalSection(&CompCS);	insize1 = *(LPWORD)bufin;	insize2 = lenin - (insize1 & STRSIZEMASK) - 2;	if (!(insize1 & STRSIZEMASK)) {		for (loop = 0; loop < lenout; loop+=2)			bufout[loop] = 0;		newsize1 = 0;	} else if (insize1 & STRPART1RAW) {		newsize1 = (insize1 & STRSIZEMASK);		for (loop = 0; loop < newsize1; loop++)			bufout[loop*2] = bufin[2+loop];	} else {		newsize1 = CEDecompress(bufin+2,insize1&STRSIZEMASK,bufout,(lenout+1)/2,0,2, 1024);		if (newsize1 == CEDECOMPRESS_FAILED) {			DEBUGMSG(ZONE_ENTRY,(L"SC_FSStringDecompress exit 1: %8.8lx\r\n",CEDECOMPRESS_FAILED));			LeaveCriticalSection(&CompCS);			UnlockPages(bufin,lenin);			if (bufout)				UnlockPages(bufout,lenout);			return CEDECOMPRESS_FAILED;		}	}	if (!insize2) {		for (loop = 1; loop < lenout; loop+=2)			bufout[loop] = 0;		newsize2 = 0;	} else if (insize1 & STRPART2RAW) {		newsize2 = insize2;		for (loop = 0; loop < newsize2; loop++)			bufout[loop*2+1] = bufin[2+(insize1&STRSIZEMASK)+loop];	} else {		newsize2 = CEDecompress(bufin+2+(insize1&STRSIZEMASK),insize2,bufout+1,lenout/2,0,2, 1024);		if (newsize2 == CEDECOMPRESS_FAILED) {			DEBUGMSG(ZONE_ENTRY,(L"SC_FSStringDecompress exit 2: %8.8lx\r\n",CEDECOMPRESS_FAILED));			LeaveCriticalSection(&CompCS);			UnlockPages(bufin,lenin);			if (bufout)				UnlockPages(bufout,lenout);			return CEDECOMPRESS_FAILED;		}	}	LeaveCriticalSection(&CompCS);	UnlockPages(bufin,lenin);	if (bufout)		UnlockPages(bufout,lenout);	if (newsize1 > newsize2) {		DEBUGMSG(ZONE_ENTRY,(L"SC_FSStringDecompress exit 3: %8.8lx\r\n",newsize1*2));		return (newsize1*2);	}	DEBUGMSG(ZONE_ENTRY,(L"SC_FSStringDecompress exit: %8.8lx\r\n",newsize2*2));	return (newsize2*2);}// Compressors - bufin and bufout must be WORD aligned, lenout must be at least as// large as lenin, CECOMPRESS_FAILED is returned if it doesn't fit, else compressed length// CECOMPRESS_ALL_ZEROS returned if buffer entirely zero.  If bufout is NULL, the output// length is computed, but the results are not stored.  Lenin must be a multiple of 2.DWORD SC_FSBinaryCompress(LPBYTE bufin, DWORD lenin, LPBYTE bufout, DWORD lenout) {	DWORD retval;	DEBUGMSG(ZONE_ENTRY,(L"SC_FSBinaryCompress entry: %8.8lx %8.8lx %8.8lx %8.8lx\r\n",bufin,lenin,bufout,lenout));	LockPages(bufin,lenin,0,LOCKFLAG_READ);	if (bufout)		LockPages(bufout,lenout,0,LOCKFLAG_WRITE);	EnterCriticalSection(&CompCS);	retval = CECompress(bufin,lenin,bufout,lenout,1, 1024);	LeaveCriticalSection(&CompCS);	UnlockPages(bufin,lenin);	if (bufout)		UnlockPages(bufout,lenout);	DEBUGMSG(ZONE_ENTRY,(L"SC_FSBinaryCompress exit: %8.8lx\r\n",retval));	return retval;}DWORD BufferedDecompress(LPBYTE bufin, DWORD lenin, LPBYTE bufout, DWORD lenout, DWORD skip) {	BYTE buf[4096];	// file system blocking factor	DWORD retval;	LockPages(buf,4096,0,LOCKFLAG_WRITE);	EnterCriticalSection(&CompCS);	retval = CEDecompress(bufin,lenin,buf,lenout + (skip&1023),skip & ~1023,1, 1024);	LeaveCriticalSection(&CompCS);	if (retval != CEDECOMPRESS_FAILED)		memcpy(bufout,buf+(skip&1023),lenout);	UnlockPages(buf,4096);	return retval;		}// Decompressors - bufin and bufout must be WORD aligned, lenout *must* be large// enough to handle the entire decompressed contents.DWORD SC_FSBinaryDecompress(LPBYTE bufin, DWORD lenin, LPBYTE bufout, DWORD lenout, DWORD skip) {	DWORD retval;	DEBUGMSG(ZONE_ENTRY,(L"SC_FSBinaryDecompress entry: %8.8lx %8.8lx %8.8lx %8.8lx\r\n",bufin,lenin,bufout,lenout));	LockPages(bufin,lenin,0,LOCKFLAG_READ);	if (bufout)		LockPages(bufout,lenout,0,LOCKFLAG_WRITE);	if (skip & 1023)		retval = BufferedDecompress(bufin,lenin,bufout,lenout,skip);	else {		EnterCriticalSection(&CompCS);		retval = CEDecompress(bufin,lenin,bufout,lenout,skip,1, 1024);		LeaveCriticalSection(&CompCS);	}	UnlockPages(bufin,lenin);	if (bufout)		UnlockPages(bufout,lenout);	DEBUGMSG(ZONE_ENTRY,(L"SC_FSBinaryDecompress exit: %8.8lx\r\n",retval));	return retval;}

⌨️ 快捷键说明

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