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

📄 koreos.cpp

📁 A small tool for grab all resources from WM devices. Can be used for localization and create MUI fil
💻 CPP
字号:
/*********************************************************************************
 *
 *	koreos.cpp : 10/22/2002
 *
 *	Simply functions
 *
 *********************************************************************************/



#include <windows.h>
#include "KOREOS.h"
#include "MyOpenSource.h"

DWORD CEDecompress(LPBYTE  lpbSrc, DWORD cbSrc, LPBYTE  lpbDest, DWORD cbDest, DWORD dwSkip, WORD wStep, DWORD dwPagesize);


#include "logcore.h"

extern "C" BOOL GetRomFileInfo(DWORD type, LPWIN32_FIND_DATA lpfd,DWORD count);
extern "C" DWORD GetRomFileBytes(DWORD type, DWORD count, DWORD pos,LPVOID buffer,DWORD nBytesToRead);
extern "C" BOOL LockPages(LPVOID lpvAddress, DWORD cbSize,PDWORD pPFNs,int fOptions) ;
extern "C" BOOL UnlockPages(LPVOID lpvAddress, DWORD cbSize);
extern "C" DWORD BinaryDecompress(LPBYTE bufin, DWORD  lenin, LPBYTE bufout, DWORD  lenout, DWORD  skip) ;
extern "C" DWORD StringDecompress(LPBYTE bufin, DWORD  lenin, LPBYTE bufout, DWORD  lenout) ;
extern "C" DWORD Decompress(LPBYTE  lpbSrc, DWORD cbSrc, LPBYTE  lpbDest, DWORD cbDest, DWORD dwSkip);
extern "C" BOOL KernelLibIoControl(HANDLE hLib, DWORD dwIoControlCode, LPVOID lpInBuf, DWORD nInBufSize, LPVOID lpOutBuf, DWORD nOutBufSize, LPDWORD lpBytesReturned);
extern "C" DWORD SetProcPermissions (DWORD);
extern "C" BOOL SetKMode (BOOL);
extern "C" LPVOID ExtractResource(LPCWSTR lpszFile, LPCWSTR lpszName, LPCWSTR lpszType) ;

ROMChain_t* KLibGetROMChain (void)
{
    return (ROMChain_t*) KernelLibIoControl ((HANDLE) KMOD_CORE, IOCTL_KLIB_GETROMCHAIN, 0, 0, 0, 0, 0);
}

static ROMChain_t* g_pRom = (ROMChain_t*)0x8107bbf0; // valid only for emulations

#define LOCKFLAG_WRITE      1
#define CEDECOMPRESS_FAILED 0xffffffffUL

resfileentry_t rfeSpace =
{
	0,
	0x20,
	0xFFFF,
	0xFFFF,
	0,
	0,
	0,
	0
};

void Char2WChar(char* szInChar, TCHAR* szOutTChar, UINT uCP =1252)
{
	szOutTChar[MultiByteToWideChar(uCP,0,szInChar,strlen(szInChar),szOutTChar,600)]=0;
}

TCHAR* wcscpy_p2c(TCHAR* szDest, TCHAR* szSrc)
{
	memcpy(szDest, szSrc+1, szSrc[0] * sizeof(TCHAR));
	szDest[szSrc[0]] = 0;
	return szDest;
}


DWORD CreateRESFile(PBYTE pBuffer, TCHAR* szName, DWORD dwBase)
{
	resfileentry_t tmpEnt = {0};
	resdata_t* pData;
	DWORD dwCurPos;
	DWORD dwWritten;
	DWORD dwAddHead;
	DWORD dwAddData;

	BYTE NullBuffer[4] = {0};
	BOOL bTNames;
	BOOL bNNames;
	TCHAR szTypeName[200];
	TCHAR szNameName[200];

    resroot_t *NameRoot;
    resent_t *NameEntry;

    resroot_t *tmpRoot;
    resent_t *tmpEntry;

    resroot_t *TypeRoot = (resroot_t *)pBuffer;
    resent_t *TypeEntry = (resent_t *)(pBuffer + sizeof(resroot_t));

	if (!(TypeRoot->numidents + TypeRoot->numnameents))
		return 0;
	HANDLE hFile = CreateFile(szName, GENERIC_WRITE, FILE_SHARE_WRITE,
		NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL);

	WriteFile(hFile, &rfeSpace, sizeof(resfileentry_t), &dwWritten,NULL);


	for (int i = 0; i < TypeRoot->numnameents + TypeRoot->numidents; i++)
	{
		if (bTNames = i < TypeRoot->numnameents)
		{
			wcscpy_p2c(szTypeName, (TCHAR*)(pBuffer + (TypeEntry->id  & 0x7fffffff)));
		}else
		{
			szTypeName[0]=0;
		}
		NameRoot = (resroot_t*)(pBuffer + (TypeEntry->rva & 0x7fffffff));
		NameEntry = (resent_t*)(pBuffer + (TypeEntry->rva & 0x7fffffff) + sizeof(resroot_t));
		for (int j = 0; j < NameRoot->numnameents + NameRoot->numidents; j++)
		{
			if (bNNames = j < NameRoot->numnameents)
			{
				wcscpy_p2c(szNameName, (TCHAR*)(pBuffer + (NameEntry->id  & 0x7fffffff)));
			}else
			{
				szNameName[0]=0;
			}

			tmpRoot = (resroot_t *)(pBuffer + (NameEntry->rva &0x7fffffff));
			tmpEntry = (resent_t *)(pBuffer + (NameEntry->rva &0x7fffffff) 
				+ sizeof(resroot_t) + tmpRoot->numnameents*sizeof(resent_t));
			pData = (resdata_t*)(pBuffer + tmpEntry->rva);

			tmpEnt.dwDataSize = pData->size;
			if (dwAddData = tmpEnt.dwDataSize % 4)
			{
				dwAddData = 4 - dwAddData;
				tmpEnt.dwDataSize  += dwAddData;
			}

			tmpEnt.dwHeadSize = 0x20;
			tmpEnt.dwTypeID = 0x0000FFFF | ((DWORD)TypeEntry->id<<16);
			tmpEnt.dwEntryID = 0x0000FFFF | ((DWORD)NameEntry->id<<16);
			tmpEnt.wFlags = 0x1030;
			tmpEnt.wLanguage = 0;

			if (!bTNames && !bNNames)
			{
				WriteFile(hFile, &tmpEnt, sizeof(resfileentry_t), &dwWritten,NULL);
			}else{
				if (bTNames)
					tmpEnt.dwHeadSize += (wcslen(szTypeName)-1) * sizeof(TCHAR);
				if (bNNames)
					tmpEnt.dwHeadSize += (wcslen(szNameName)-1) * sizeof(TCHAR);

				if (dwAddHead = tmpEnt.dwHeadSize % 4)
				{
					dwAddHead = 4 - dwAddHead;
					tmpEnt.dwHeadSize += dwAddHead;
				}

				WriteFile(hFile, &tmpEnt, 2 * sizeof(DWORD), &dwWritten, NULL);

				if (bTNames)
					WriteFile(hFile, szTypeName, (wcslen(szTypeName)+1) * sizeof(TCHAR), &dwWritten, NULL);
				else
					WriteFile(hFile, &tmpEnt.dwTypeID, sizeof(DWORD), &dwWritten, NULL);

				if (bNNames)
					WriteFile(hFile, szNameName, (wcslen(szNameName)+1) * sizeof(TCHAR), &dwWritten, NULL);
				else
					WriteFile(hFile, &tmpEnt.dwEntryID, sizeof(DWORD), &dwWritten, NULL);

				if (dwAddHead)
				{
					WriteFile(hFile, NullBuffer, dwAddHead, &dwWritten,NULL);
				}
				
				WriteFile(hFile, &tmpEnt.dwDataVer, sizeof(resfileentry_t) - (4 * sizeof(DWORD)), &dwWritten, NULL);
			}
			WriteFile(hFile, pBuffer + pData->rva - dwBase, pData->size, &dwWritten,NULL);
			if (dwAddData)
			{
				WriteFile(hFile, NullBuffer, dwAddData, &dwWritten,NULL);
			}

			NameEntry++;
		}
		TypeEntry++;
	}
exitfunk:
	CloseHandle(hFile);
	return 1;
}



DWORD 
FindTypeByName(
    LPBYTE BasePtr,
    LPBYTE curr,
    LPWSTR str
    ) 
{
    resroot_t *rootptr = (resroot_t *)curr;
    resent_t *resptr = (resent_t *)(curr + sizeof(resroot_t));
    int count = rootptr->numnameents;
    while (count--) {
        if (!str || !wcscmp(str,(LPWSTR)(BasePtr+(resptr->id&0x7fffffff)))) {
            return resptr->rva;
        }
        resptr++;
    }
    return 0;
}




//------------------------------------------------------------------------------
// Search for a numbered type
//------------------------------------------------------------------------------
DWORD 
FindTypeByNum(
    LPBYTE curr,
    DWORD id
    ) 
{
    resroot_t *rootptr = (resroot_t *)curr;
    resent_t *resptr = (resent_t *)(curr + sizeof(resroot_t) +
        rootptr->numnameents*sizeof(resent_t));
    int count = rootptr->numidents;
    while (count--) {
        if (!id || (resptr->id == id)) {

            return resptr->rva;
        }
        resptr++;
    }
    return 0;
}




//------------------------------------------------------------------------------
// Find first entry (from curr pointer)
//------------------------------------------------------------------------------
DWORD 
FindFirst(
    LPBYTE curr
    ) 
{
    resroot_t *rootptr = (resroot_t *)curr;
    resent_t *resptr = (resent_t *)(curr + sizeof(resroot_t) +
        rootptr->numnameents*sizeof(resent_t));
    return resptr->rva;
}




//------------------------------------------------------------------------------
// Find type entry (by name or number)
//------------------------------------------------------------------------------
DWORD 
FindType(
    LPBYTE BasePtr,
    LPBYTE curr,
    LPWSTR str
    ) 
{
    DWORD res;
    if (((DWORD)str)>>16)
        if (str[0] == (WCHAR)'#')
            return FindTypeByNum(curr, wcstol(str+1,NULL,10));
        else
            return FindTypeByName(BasePtr, curr, str);
    if (!(res = FindTypeByNum(curr, (DWORD)str)) && !str)
        res = FindTypeByName(BasePtr, curr, str);
    return res;
}

TCHAR szNamee[200];

LPBYTE 
GetResourcePointer(
    e32_rom *e32l,
    o32_rom *o32rva,
	DWORD* pdwRVA,
	BOOL* pbCompressed = NULL
    ) 
{
    o32_obj o32;
    o32_rom *o32rp;
    LPBYTE lpres;
    DWORD bytesread, loop;
    BOOL bRet;
	DWORD *pPageSize = (unsigned long*)0x80223e7f;
    if (!e32l->e32_unit[RES].rva) {
        return 0;
    }
    for (loop = 0; loop < e32l->e32_objcnt; loop++) {
        o32rp = (o32_rom *)((DWORD)o32rva+loop*sizeof(o32_rom));
        if (o32rp->o32_rva == e32l->e32_unit[RES].rva)
            break;
    }
    if (loop == e32l->e32_objcnt) {
        return 0;
    }
	*pdwRVA = o32rp->o32_rva;
    if (o32rp->o32_psize) {
        lpres = (unsigned char*)(o32rp->o32_dataptr);
        if (o32rp->o32_flags & IMAGE_SCN_COMPRESSED) {

            if (!(lpres = new BYTE[o32rp->o32_vsize])) {
                return 0;
            }
//			if (*pPageSize != 0x1000)
//				*pPageSize = 0x1000;
//			PVOID pPos = ExtractResource(szNamee, NULL, NULL);
			PVOID pPos = GetProcAddress(GetModuleHandle(_T("coredll.dll")), _T("BinaryDecompress"));
			

			int nSrc = o32rp->o32_psize;
			int nDst = o32rp->o32_vsize;
			unsigned char* pSrc = (unsigned char*)(o32rp->o32_dataptr);
//            bytesread = Decompress((unsigned char*)(o32rp->o32_dataptr),o32rp->o32_psize,lpres,o32rp->o32_vsize,0);
			bytesread = BinaryDecompress(pSrc, nSrc, lpres, nDst, 0);
//			bytesread = CEDecompress((unsigned char*)(o32rp->o32_dataptr),o32rp->o32_psize,lpres,o32rp->o32_vsize,0, 1, PAGE_SIZE);
//			*pPageSize = 0x400;
            if ((bytesread == CEDECOMPRESS_FAILED) || (bytesread == 0)) {
                return 0;
            }
            if (bytesread < o32rp->o32_vsize)
                memset(lpres+bytesread,0,o32rp->o32_vsize-bytesread);
			if (pbCompressed)
				*pbCompressed = TRUE;
        } else 
		{
			if (pbCompressed)
				*pbCompressed = FALSE;
        }
    }else
		return 0;
    return lpres;
}


DWORD GrabRomModulesRes(TCHAR* szDirectory)
{
	TOCentry *tocptr;
	WIN32_FIND_DATA fd;
	e32_rom* e32r;
	o32_rom* o32r;
	LPBYTE BasePtr;
	DWORD dwRVA;
	DWORD dwTotalRes = 0;
	DWORD dwTotalComp = 0;
	DWORD dwTotalNotComp = 0;
	WCHAR szTemp[100];
	WCHAR szPath[100];
	GetRomFileInfo(0,0,0);
	SetProcPermissions(0xFFFFFFFF);
	SetKMode(TRUE);

	ROMChain_t* pROM = KLibGetROMChain();
	pROM = pROM->pNext;

//	ROMChain_t* pROM = g_pRom->pNext;
	BOOL bCompressed;
	char* pPos;
//	ROMHDR *pTOC = (ROMHDR*)g_pTOC;
	int n = pROM->pTOC->nummods;

	if (Log_IsInit())
	{
		Log_WriteMsg(TEXT("GrabModulesRes: Start"));
		Log_WriteMsg(TEXT("GrabModulesRes: modules found - %d"), pROM->pTOC->nummods);
	}

	for (int i = 0; i <= pROM->pTOC->nummods; i++)
//	for (int i = 0; i <= pTOC->nummods; i++)
	{
//		tocptr = &(((TOCentry *)&pTOC[1])[i]);
		tocptr = &(((TOCentry *)&pROM->pTOC[1])[i]);
		e32r = (e32_rom*)tocptr->ulE32Offset;
		o32r = (o32_rom*)tocptr->ulO32Offset;
		pPos = tocptr->lpszFileName + strlen(tocptr->lpszFileName);

		wcscpy(szPath, szDirectory);
		Char2WChar(tocptr->lpszFileName, szTemp);
		wcscpy(szNamee, szTemp);
		wcscat(szPath, szTemp);
		wcscat(szPath, L".res");
		while (*(pPos-1) != '.' && pPos > tocptr->lpszFileName)
			pPos--;
		if (_stricmp(pPos,"dll") && _stricmp(pPos,"exe") && _stricmp(pPos,"cpl"))
		{
			if (Log_IsInit())
				Log_WriteMsg(L"GrabModulesRes: Skip grabing for %s", szTemp);
			continue;
		}
		if (e32r->e32_unit[RES].rva)
		{
			if (Log_IsInit())
				Log_WriteMsg(L"GrabModulesRes: GetResourcePointer for %s", szTemp);

			if (BasePtr = GetResourcePointer(e32r, o32r, &dwRVA, &bCompressed))
			{
				if (Log_IsInit())
					Log_WriteMsg(L"GrabModulesRes: CreateRESFile");

				if (!bCompressed&&!CreateRESFile(BasePtr, szPath, dwRVA))
					if (Log_IsInit())
					{
						Log_WriteMsg(TEXT("GrabFilesRes: Cannot create res file."), fd.cFileName);
						Log_WriteMsg(TEXT("GrabFilesRes: Resource section present but clean"), fd.cFileName);
					}
				if (bCompressed)
				{
					if (Log_IsInit())
						Log_WriteMsg(L"GrabModulesRes: Module compressed");
					delete[] BasePtr;
					dwTotalComp++;
				}else
				{
					if (Log_IsInit())
						Log_WriteMsg(L"GrabModulesRes: Module NOT compressed");
					dwTotalNotComp++;
				}
				dwTotalRes++;
			}else
			{
				if (Log_IsInit())
					Log_WriteErr(L"GrabModulesRes: GetResourcePointer return NULL");
			}

		}else
		{
				if (Log_IsInit())
					Log_WriteMsg(L"GrabModulesRes: Module '%s' havn't resource", szTemp);
		}
	};
	if (Log_IsInit())
	{
		Log_Write(TEXT("GrabModulesRes: !!! TotalGrabbed %d (compr: %d, not compr: %d !!!"), dwTotalRes, dwTotalComp, dwTotalNotComp);
		Log_WriteMsg(TEXT("GrabModulesRes: End"));
	}
	return TRUE;
}

DWORD GrabRomFilesRes(TCHAR* szDirectory)
{
	WIN32_FIND_DATA fd;
	HMODULE hMod;
	PMODULE pMod;
	WCHAR szTemp[100];
	WCHAR szPath[100];
	BOOL bIsNext = TRUE;
	HANDLE hFile;
	TCHAR szToFind[] = L"dll;cpl;exe";
	TCHAR *pPos = szToFind;
	TCHAR *pPos1 = szToFind;
	PBYTE pBuffer;

	DWORD dwLen;
	DWORD dwOffset;
	char szPE[5];
	e32_exe* e32head;
	o32_obj* o32p;

	if (Log_IsInit())
	{
		Log_WriteMsg(TEXT("GrabFilesRes: Start"));
	}

	for (int i=0; 1; i++)
	{
		if (!GetRomFileInfo(2, &fd, i))
			break;
/*		if (!wcsncmp(fd.cFileName, L"cespell.dll",11))
		{
			fd.cFileName[0] = L'!';
		}*/
		GetRomFileBytes(2, i, 0, szPE, 4);
		if (szPE[0] == 'M' &&
			szPE[1] == 'Z' &&
			szPE[2] == (char)0x90 &&
			szPE[3] == 0)
		{
			if (Log_IsInit())
			{
				Log_WriteMsg(TEXT("GrabFilesRes: Try grab for '%s'"), fd.cFileName);
			}
			if (!fd.nFileSizeLow)
			{
				if (Log_IsInit())
				{
					Log_WriteMsg(TEXT("GrabFilesRes: File have null size"), fd.cFileName);
				}
				continue;
			}
			pBuffer = new BYTE[fd.nFileSizeLow];
			GetRomFileBytes(2, i, 0, pBuffer, fd.nFileSizeLow);
			dwOffset = *(DWORD*)(pBuffer + 0x3c);
			e32head = (e32_exe*)(pBuffer + dwOffset);
			if (e32head->e32_unit[RES].rva)
			{
				o32p = (o32_obj*)((PBYTE)(e32head) + sizeof(e32_exe));
				for (int j = 0; j < e32head->e32_objcnt; j++)
				{
					if (o32p->o32_rva ==  e32head->e32_unit[RES].rva)
						break;
					o32p++;
				}
				if (j < e32head->e32_objcnt)
				{
			        if (o32p->o32_flags & IMAGE_SCN_COMPRESSED) 
					{
						Log_WriteErr(TEXT("GrabFilesRes: Compressed resource !"));
					}
					wcscpy(szPath, szDirectory);
					wcscat(szPath, fd.cFileName);
					wcscat(szPath, L".res");

					if (!CreateRESFile(pBuffer + o32p->o32_dataptr, szPath,e32head->e32_unit[RES].rva))
						if (Log_IsInit())
						{
							Log_WriteMsg(TEXT("GrabFilesRes: Cannot create res file."), fd.cFileName);
							Log_WriteMsg(TEXT("GrabFilesRes: Resource section present but clean"), fd.cFileName);
						}
				}else
				{
					if (Log_IsInit())
					{
						Log_WriteErr(TEXT("GrabFilesRes: Cannot fint resource object"));
					}
				}
			}else
			{
				if (Log_IsInit())
				{
					Log_WriteMsg(TEXT("GrabFilesRes: File havn't resource"), fd.cFileName);
				}
			}
			delete[] pBuffer;
		}
	}
	return 1;
}

⌨️ 快捷键说明

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