📄 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_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 + -