📄 koreos.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 + -