📄 resource.c
字号:
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 SizeofResource
DWORD 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 LoadResource
HANDLE 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 + -