📄 resource.c
字号:
*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_SIZEBYTE 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 + -