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

📄 resource.c

📁 See Hanoi.cpp for the implementation of this cla
💻 C
📖 第 1 页 / 共 3 页
字号:
			*lpSubBlock = 0;
			nCmp = 1;
			while (((int)pBlock->wTotLen > sizeof(VERBLOCK)) && ((int)pBlock->wTotLen <= (LPBYTE)lpEndSubBlock-(LPBYTE)pBlock)) {
				if (!(nCmp=kstrcmpi(lpStart, pBlock->szKey)))
					break;
				pBlock=(VERBLOCK*)((LPBYTE)pBlock+DWORDUP(pBlock->wTotLen));
			}
			*lpSubBlock = cTemp;
			if (nCmp)
				goto NotFound;
		}
	}
	*puLen = pBlock->wValLen;
	lpStart = (LPWSTR)((LPBYTE)pBlock+DWORDUP((sizeof(VERBLOCK)-sizeof(WCHAR))+(strlenW(pBlock->szKey)+1)*sizeof(WCHAR)));
	*lplpBuffer = lpStart < (LPWSTR)((LPBYTE)pBlock+pBlock->wTotLen) ? lpStart : (LPWSTR)(pBlock->szKey+strlenW(pBlock->szKey));
	bString = pBlock->wType;
	*lpEndBlock = cEndBlock;
	LocalFree(lpSubBlockOrg);
	return (TRUE);
NotFound:
	KSetLastError(pCurThread,ERROR_RESOURCE_NAME_NOT_FOUND);
	*lpEndBlock = cEndBlock;
	LocalFree(lpSubBlockOrg);
	return (FALSE);
}

DWORD SC_GetFileVersionInfoSizeW(LPWSTR lpFilename, LPDWORD lpdwHandle) {
	LPBYTE lpres;
	BOOL inRom;
	DWORD o32rva, dwRet = 0;
	VERHEAD *pVerHead;
	if (lpdwHandle)
		*lpdwHandle = 0;
	DEBUGMSG(ZONE_ENTRY,(L"SC_GetFileVersionInfoSizeW entry: %8.8lx %8.8lx\r\n",lpFilename, lpdwHandle));
	if (lpres = OpenResourceFile(lpFilename, &inRom, &o32rva)) {
		if (pVerHead = (VERHEAD *)ExtractOneResource(lpres, MAKEINTRESOURCE(VS_VERSION_INFO), VS_FILE_INFO, o32rva, &dwRet)) {
			if (((DWORD)pVerHead->wTotLen > dwRet) || (pVerHead->vsf.dwSignature != VS_FFI_SIGNATURE))
				KSetLastError(pCurThread,ERROR_INVALID_DATA);
			else
				dwRet = pVerHead->wTotLen;
			LocalFree(pVerHead);
		}
		if (!inRom)
			LocalFree(lpres);
	}
	DEBUGMSG(ZONE_ENTRY,(L"SC_GetFileVersionInfoSizeW exit: %8.8lx\r\n",dwRet));
	return dwRet;
}

BOOL SC_GetFileVersionInfoW(LPWSTR lpFilename, DWORD dwHandle, DWORD dwLen, LPVOID lpData) {
	LPBYTE lpres;
	BOOL inRom, bRet = FALSE;
	DWORD o32rva, dwTemp;
	VERHEAD *pVerHead;
	DEBUGMSG(ZONE_ENTRY,(L"SC_GetFileVersionInfoW entry: %8.8lx %8.8lx %8.8lx %8.8lx\r\n",lpFilename, dwHandle, dwLen, lpData));
	if (dwLen < sizeof(((VERHEAD*)lpData)->wTotLen))
		KSetLastError(pCurThread,ERROR_INSUFFICIENT_BUFFER);
	else if (lpres = OpenResourceFile(lpFilename, &inRom, &o32rva)) {
		if (pVerHead = (VERHEAD *)ExtractOneResource(lpres, MAKEINTRESOURCE(VS_VERSION_INFO), VS_FILE_INFO, o32rva, &dwTemp)) {
			if (((DWORD)pVerHead->wTotLen > dwTemp) || (pVerHead->vsf.dwSignature != VS_FFI_SIGNATURE))
				KSetLastError(pCurThread,ERROR_INVALID_DATA);
			else {
				dwTemp = (DWORD)pVerHead->wTotLen;
				if (dwTemp > dwLen)
					dwTemp = dwLen;
				memcpy(lpData,pVerHead,dwTemp);
				((VERHEAD*)lpData)->wTotLen = (WORD)dwTemp;
				bRet = TRUE;
			}
			LocalFree(pVerHead);
		}
		if (!inRom)
			LocalFree(lpres);
	}
	DEBUGMSG(ZONE_ENTRY,(L"SC_GetFileVersionInfoSizeW exit: %d\r\n",bRet));
	return bRet;;
}

void AToUCopy(WCHAR *wptr, LPBYTE aptr, int maxlen) {
	int len;
	for (len = 1; (len<maxlen) && *aptr; len++)
		*wptr++ = (WCHAR)*aptr++;
	*wptr = 0;
}

#define COMP_BLOCK_SIZE PAGE_SIZE

BYTE lpDecBuf[COMP_BLOCK_SIZE];
DWORD cfile=0xffffffff,cblock=0xffffffff;

DWORD SC_GetRomFileBytes(DWORD type, DWORD count, DWORD pos, LPVOID buffer, DWORD nBytesToRead) {
	TOCentry *tocptr;
	FILESentry *filesptr;
	DWORD dwBlock,bRead,csize, fullsize;
	LPVOID buffercopy;
	ROMChain_t *pROM = ROMChain;
//	DEBUGMSG(ZONE_ENTRY,(L"SC_GetRomFileBytes entry: %8.8lx %8.8lx %8.8lx %8.8lx %8.8lx\r\n",
//		type,count,pos,buffer,nBytesToRead));
	if (type == 2) {
		while (pROM && (count >= pROM->pTOC->numfiles)) {
			count -= pROM->pTOC->numfiles;
			pROM = pROM->pNext;
		}
		if (!pROM) {
//			DEBUGMSG(ZONE_ENTRY,(L"SC_GetRomFileBytes exit: %8.8lx\r\n",0));
			return 0;
		}
		tocptr = &(((TOCentry *)&pROM->pTOC[1])[pROM->pTOC->nummods]);
		filesptr = &(((FILESentry *)tocptr)[count]);
		if (pos > filesptr->nRealFileSize) {
//			DEBUGMSG(ZONE_ENTRY,(L"SC_GetRomFileBytes exit: %8.8lx\r\n",0));
			return 0;
		}
		if (pos + nBytesToRead > filesptr->nRealFileSize)
			nBytesToRead = filesptr->nRealFileSize - pos;
		if (!nBytesToRead)
			fullsize = 0;
		else {
			fullsize = nBytesToRead;
			buffercopy = buffer;
			LockPages(buffercopy,fullsize,0,LOCKFLAG_WRITE);
			EnterCriticalSection(&RFBcs);
			if (filesptr->nRealFileSize == filesptr->nCompFileSize)
				memcpy(buffer,(LPBYTE)filesptr->ulLoadOffset+pos,nBytesToRead);
			else if (!filesptr->nCompFileSize)
				memset(buffer,0,nBytesToRead);
			else while (nBytesToRead) {
				dwBlock = pos/COMP_BLOCK_SIZE;
				bRead = nBytesToRead;
				if ((pos + bRead-1)/COMP_BLOCK_SIZE != dwBlock)
					bRead = COMP_BLOCK_SIZE - (pos&(COMP_BLOCK_SIZE-1));
				if ((count != cfile) || (dwBlock != cblock)) {
					if (dwBlock == filesptr->nRealFileSize/COMP_BLOCK_SIZE)
						csize = filesptr->nRealFileSize - (COMP_BLOCK_SIZE*dwBlock);
					else
						csize = COMP_BLOCK_SIZE;
					if (bRead == csize)
						Decompress((LPBYTE)filesptr->ulLoadOffset,filesptr->nCompFileSize,buffer,csize,dwBlock*COMP_BLOCK_SIZE);
					else {
						Decompress((LPBYTE)filesptr->ulLoadOffset,filesptr->nCompFileSize,lpDecBuf,csize,dwBlock*COMP_BLOCK_SIZE);
						cfile = count;
						cblock = dwBlock;
						memcpy(buffer,lpDecBuf+(pos&(COMP_BLOCK_SIZE-1)),bRead);
					}
				} else
					memcpy(buffer,lpDecBuf+(pos&(COMP_BLOCK_SIZE-1)),bRead);
				buffer = (LPVOID)((LPBYTE)buffer+bRead);
				nBytesToRead -= bRead;
				pos += bRead;
			}
			LeaveCriticalSection(&RFBcs);
			UnlockPages(buffercopy,fullsize);
		}
//		DEBUGMSG(ZONE_ENTRY,(L"SC_GetRomFileBytes exit: %8.8lx\r\n",fullsize));
		return fullsize;
	}
//	DEBUGMSG(ZONE_ENTRY,(L"SC_GetRomFileBytes exit: %8.8lx\r\n",0));
	return 0;
}

LPVOID SC_MapUncompressedFileW(LPCWSTR pFileName, LPDWORD pLen) {
	DWORD loop;
	TOCentry *tocptr;
	FILESentry *filesptr;
	BYTE *bTrav;
	const WCHAR *wTrav;
	ROMChain_t *pROM = ROMChain;
	for (pROM = ROMChain; pROM; pROM = pROM->pNext) {
		tocptr = &(((TOCentry *)&pROM->pTOC[1])[pROM->pTOC->nummods]);
		for (loop = 0; loop < pROM->pTOC->numfiles; loop++) {
			filesptr = &(((FILESentry *)tocptr)[loop]);
			for (bTrav = filesptr->lpszFileName, wTrav = pFileName; *wTrav && (*wTrav == *bTrav); wTrav++, bTrav++)
				;
			if (!*wTrav && !*bTrav) {
				if (filesptr->nRealFileSize != filesptr->nCompFileSize) {
					KSetLastError(pCurThread,ERROR_INVALID_FLAGS);
					return 0;
				}
				if (pLen)
					*pLen = filesptr->nRealFileSize;
				return (LPVOID)filesptr->ulLoadOffset;
			}
		}
	}
	KSetLastError(pCurThread,ERROR_FILE_NOT_FOUND);
	return 0;
}

const PFNVOID ExtraMethods[] = {
	(LPVOID)SC_EventModify,			// 000
	(LPVOID)SC_ReleaseMutex,		// 001
	(LPVOID)SC_CreateAPIHandle,		// 002
	(LPVOID)SC_MapViewOfFile,		// 003
	(LPVOID)SC_ThreadGetPrio,		// 004
	(LPVOID)SC_ThreadSetPrio,		// 005
	(LPVOID)SC_SelectObject,		// 006
	(LPVOID)SC_PatBlt,				// 007
	(LPVOID)SC_GetTextExtentExPointW,// 008
	(LPVOID)SC_GetSysColorBrush,	// 009
	(LPVOID)SC_SetBkColor,			// 010
	(LPVOID)SC_GetParent,			// 011
	(LPVOID)SC_InvalidateRect,		// 012
	(LPVOID)SC_RegOpenKeyExW,		// 013
	(LPVOID)SC_RegQueryValueExW,	// 014
	(LPVOID)SC_CreateFileW,			// 015
	(LPVOID)SC_ReadFile,			// 016
	(LPVOID)SC_OpenDatabaseEx,		// 017
	(LPVOID)SC_SeekDatabase,		// 018
	(LPVOID)SC_ReadRecordPropsEx,	// 019
	(LPVOID)SC_RegCreateKeyExW,		// 020
	(LPVOID)SC_DeviceIoControl,		// 021
	(LPVOID)SC_CloseHandle,			// 022
	(LPVOID)SC_RegCloseKey,			// 023
	(LPVOID)SC_ClientToScreen,		// 024
	(LPVOID)SC_DefWindowProcW,		// 025
	(LPVOID)SC_GetClipCursor,		// 026
	(LPVOID)SC_GetDC,				// 027
	(LPVOID)SC_GetFocus,			// 028
	(LPVOID)SC_GetMessageW,			// 029
	(LPVOID)SC_GetWindow,			// 030
	(LPVOID)SC_PeekMessageW,		// 031
	(LPVOID)SC_ReleaseDC,			// 032
	(LPVOID)SC_SendMessageW,		// 033
	(LPVOID)SC_SetScrollInfo,		// 034
	(LPVOID)SC_SetWindowLongW,		// 035
	(LPVOID)SC_SetWindowPos,		// 036
	(LPVOID)SC_CreateSolidBrush,	// 037
	(LPVOID)SC_DeleteMenu,			// 038
	(LPVOID)SC_DeleteObject,		// 039
	(LPVOID)SC_DrawTextW,			// 040
	(LPVOID)SC_ExtTextOutW,			// 041
	(LPVOID)SC_FillRect,			// 042
	(LPVOID)SC_GetAsyncKeyState,	// 043
	(LPVOID)SC_GetDlgCtrlID,		// 044
	(LPVOID)SC_GetStockObject,		// 045
	(LPVOID)SC_GetSystemMetrics,	// 046
	(LPVOID)SC_RegisterClassWStub,	// 047
	(LPVOID)SC_RegisterClipboardFormatW, // 048
	(LPVOID)SC_SetBkMode,			// 049
	(LPVOID)SC_SetTextColor,		// 050
	(LPVOID)SC_TransparentImage,	// 051
	(LPVOID)SC_IsDialogMessageW,	// 052
	(LPVOID)SC_PostMessageW,		// 053
	(LPVOID)SC_IsWindowVisible,		// 054
	(LPVOID)SC_GetKeyState,			// 055
	(LPVOID)SC_BeginPaint,			// 056
	(LPVOID)SC_EndPaint,			// 057
	(LPVOID)SC_PerformCallBack4,	// 058
	(LPVOID)SC_CeWriteRecordProps,	// 059
	(LPVOID)SC_ReadFileWithSeek,	// 060
	(LPVOID)SC_WriteFileWithSeek,	// 061
};

ERRFALSE(sizeof(ExtraMethods) == sizeof(ExtraMethods[0])*62);

BOOL SC_GetRomFileInfo(DWORD type, LPWIN32_FIND_DATA lpfd, DWORD count) {
	TOCentry *tocptr;
	FILESentry *filesptr;
	ROMChain_t *pROM = ROMChain;
	extern const PFNVOID Win32Methods[];
	DEBUGMSG(ZONE_ENTRY,(L"SC_GetRomFileInfo entry: %8.8lx %8.8lx %8.8lx\r\n",type,lpfd,count));
	switch (type) {
		case 1:
			while (pROM && (count >= pROM->pTOC->nummods)) {
				count -= pROM->pTOC->nummods;
				pROM = pROM->pNext;
			}
			if (!pROM) {
				DEBUGMSG(ZONE_ENTRY,(L"SC_GetRomFileInfo exit: %8.8lx\r\n",FALSE));
				return FALSE;
			}
			tocptr = &(((TOCentry *)&pROM->pTOC[1])[count]);
			lpfd->dwFileAttributes = (tocptr->dwFileAttributes | FILE_ATTRIBUTE_INROM | FILE_ATTRIBUTE_ROMMODULE) & ~FILE_ATTRIBUTE_ROMSTATICREF;
			lpfd->ftCreationTime = tocptr->ftTime;
			lpfd->ftLastAccessTime = tocptr->ftTime;
			lpfd->ftLastWriteTime = tocptr->ftTime;
			lpfd->nFileSizeHigh = 0;
			lpfd->nFileSizeLow = tocptr->nFileSize;
			AToUCopy(lpfd->cFileName,tocptr->lpszFileName,MAX_PATH);
			DEBUGMSG(ZONE_ENTRY,(L"SC_GetRomFileInfo exit: %8.8lx\r\n",TRUE));
			return TRUE;
		case 2:
			while (pROM && (count >= pROM->pTOC->numfiles)) {
				count -= pROM->pTOC->numfiles;
				pROM = pROM->pNext;
			}
			if (!pROM) {
				DEBUGMSG(ZONE_ENTRY,(L"SC_GetRomFileInfo exit: %8.8lx\r\n",FALSE));
				return FALSE;
			}
			tocptr = &(((TOCentry *)&pROM->pTOC[1])[pROM->pTOC->nummods]);
			filesptr = &(((FILESentry *)tocptr)[count]);
			lpfd->dwFileAttributes = filesptr->dwFileAttributes | FILE_ATTRIBUTE_INROM;
			lpfd->ftCreationTime = filesptr->ftTime;
			lpfd->ftLastAccessTime = filesptr->ftTime;
			lpfd->ftLastWriteTime = filesptr->ftTime;
			lpfd->nFileSizeHigh = 0;
			lpfd->nFileSizeLow = filesptr->nRealFileSize;
			AToUCopy(lpfd->cFileName,filesptr->lpszFileName,MAX_PATH);
			DEBUGMSG(ZONE_ENTRY,(L"SC_GetRomFileInfo exit: %8.8lx\r\n",TRUE));
			return TRUE;
		case 3:
			*(LPVOID *)lpfd = Win32Methods;
						*(BOOL UNALIGNED *)count = bAllKMode;
			return TRUE;
		case 4:
			*(LPVOID *)lpfd = ExtraMethods;
			return TRUE;
		case 5:
#ifdef CELOG			
			if (pTOC->ulKernelFlags & KFLAG_CELOGENABLE) {
				// Tell COREDLL that CeLogData is present.
				*((LPBOOL)lpfd) = TRUE;
			} else {
				*((LPBOOL)lpfd) = FALSE;
			}
#else
			*((LPBOOL)lpfd) = FALSE;
#endif
			return TRUE;
		case 0xffffffff:
			for (count = 0; count < pROM->pTOC->nummods; count++) {
				tocptr = &(((TOCentry *)&pROM->pTOC[1])[count]);
				if (!StrCmpAPascW(tocptr->lpszFileName,lpfd->cFileName)) {
					DEBUGMSG(ZONE_ENTRY,(L"SC_GetRomFileInfo exit: %8.8lx\r\n",TRUE));
					return TRUE;
				}
			}
			for (count = 0; count < pROM->pTOC->numfiles; count++) {
				tocptr = &(((TOCentry *)&pROM->pTOC[1])[pROM->pTOC->nummods]);
				filesptr = &(((FILESentry *)tocptr)[count]);
				if (!StrCmpAPascW(filesptr->lpszFileName,lpfd->cFileName)) {
					DEBUGMSG(ZONE_ENTRY,(L"SC_GetRomFileInfo exit: %8.8lx\r\n",TRUE));
					return TRUE;
				}
			}
			DEBUGMSG(ZONE_ENTRY,(L"SC_GetRomFileInfo exit: %8.8lx\r\n",FALSE));
			return FALSE;
	}		
	DEBUGCHK(0);
	DEBUGMSG(ZONE_ENTRY,(L"SC_GetRomFileInfo exit: %8.8lx\r\n",FALSE));
	return FALSE;
}

⌨️ 快捷键说明

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