📄 w2k_img.c
字号:
}
return fOk;
}
// -----------------------------------------------------------------
PVOID WINAPI imgFileLoadA (PBYTE pbPath,
PDWORD pdSize)
{
HANDLE hf;
DWORD n;
DWORD dOffset = (pdSize != NULL ? *pdSize : 0);
DWORD dSize = 0;
PBYTE pbData = NULL;
if ((hf = imgFileOpenA (pbPath)) != INVALID_HANDLE_VALUE)
{
if ((dSize = GetFileSize (hf, NULL)) != INVALID_FILE_SIZE)
{
if ((dOffset + dSize + 1 > dSize)
&&
((pbData = imgMemoryCreate (dOffset + dSize + 1))
!= NULL))
{
n = 0;
if ((!dSize)
||
(ReadFile (hf, pbData + dOffset, dSize,
&n, NULL) &&
(dSize == n)))
{
if (dOffset) ZeroMemory (pbData, dOffset);
pbData [dOffset + dSize] = 0;
}
else
{
pbData = imgMemoryDestroy (pbData);
}
}
}
else
{
dSize = 0;
}
imgFileClose (hf);
}
if (pdSize != NULL) *pdSize = dSize;
return pbData;
}
// -----------------------------------------------------------------
PVOID WINAPI imgFileLoadW (PWORD pwPath,
PDWORD pdSize)
{
HANDLE hf;
DWORD n;
DWORD dOffset = (pdSize != NULL ? *pdSize : 0);
DWORD dSize = 0;
PBYTE pbData = NULL;
if ((hf = imgFileOpenW (pwPath)) != INVALID_HANDLE_VALUE)
{
if ((dSize = GetFileSize (hf, NULL)) != INVALID_FILE_SIZE)
{
if ((dOffset + dSize + 1 > dSize)
&&
((pbData = imgMemoryCreate (dOffset + dSize + 1))
!= NULL))
{
n = 0;
if ((!dSize)
||
(ReadFile (hf, pbData + dOffset, dSize,
&n, NULL) &&
(dSize == n)))
{
if (dOffset) ZeroMemory (pbData, dOffset);
pbData [dOffset + dSize] = 0;
}
else
{
pbData = imgMemoryDestroy (pbData);
}
}
}
else
{
dSize = 0;
}
imgFileClose (hf);
}
if (pdSize != NULL) *pdSize = dSize;
return pbData;
}
// -----------------------------------------------------------------
BOOL WINAPI imgFileSaveA (PBYTE pbPath,
PVOID pData,
DWORD dData)
{
HANDLE hf;
DWORD n;
BOOL fOk = FALSE;
if ((hf = imgFileNewA (pbPath)) != INVALID_HANDLE_VALUE)
{
n = 0;
if ((pData != NULL) && dData)
{
if (!WriteFile (hf, pData, dData, &n, NULL)) n = 0;
}
fOk = (n == dData) && SetEndOfFile (hf);
imgFileClose (hf);
if (!fOk) DeleteFileA (pbPath);
}
return fOk;
}
// -----------------------------------------------------------------
BOOL WINAPI imgFileSaveW (PWORD pwPath,
PVOID pData,
DWORD dData)
{
HANDLE hf;
DWORD n;
BOOL fOk = FALSE;
if ((hf = imgFileNewW (pwPath)) != INVALID_HANDLE_VALUE)
{
n = 0;
if ((pData != NULL) && dData)
{
if (!WriteFile (hf, pData, dData, &n, NULL)) n = 0;
}
fOk = (n == dData) && SetEndOfFile (hf);
imgFileClose (hf);
if (!fOk) DeleteFileW (pwPath);
}
return fOk;
}
// =================================================================
// CodeView DATA MANAGEMENT
// =================================================================
PCV_ENTRY WINAPI imgCvEntry (PCV_NB09 pc09,
DWORD dType,
DWORD dIndex)
{
DWORD i, j;
PCV_ENTRY pce = NULL;
if ((pc09 != NULL) &&
(pc09->Header.Signature.dVersion == CV_SIGNATURE_NB09))
{
for (i = j = 0; i < pc09->Directory.dEntries; i++)
{
if ((pc09->Entries [i].wSubSectionType == dType) &&
(j++ == dIndex))
{
pce = pc09->Entries + i;
break;
}
}
}
return pce;
}
// -----------------------------------------------------------------
PCV_MODULE WINAPI imgCvModule (PCV_NB09 pc09,
DWORD dIndex,
PDWORD pdSize)
{
PCV_ENTRY pce;
DWORD dSize = 0;
PCV_MODULE pcm = NULL;
if ((pce = imgCvEntry (pc09, sstModule, dIndex)) != NULL)
{
pcm = (PCV_MODULE)
((PBYTE) pc09 + pce->lSubSectionOffset);
dSize = pce->dSubSectionSize;
}
if (pdSize != NULL) *pdSize = dSize;
return pcm;
}
// -----------------------------------------------------------------
PCV_PUBSYM WINAPI imgCvSymbols (PCV_NB09 pc09,
PDWORD pdCount,
PDWORD pdSize)
{
PCV_ENTRY pce;
PCV_PUBSYM pcp1;
DWORD i;
DWORD dCount = 0;
DWORD dSize = 0;
PCV_PUBSYM pcp = NULL;
if ((pce = imgCvEntry (pc09, sstGlobalPub, 0)) != NULL)
{
pcp = CV_PUBSYM_DATA ((PBYTE) pc09
+ pce->lSubSectionOffset);
dSize = pce->dSubSectionSize;
for (i = 0; dSize - i >= CV_PUBSYM_;
i += CV_PUBSYM_SIZE (pcp1))
{
pcp1 = (PCV_PUBSYM) ((PBYTE) pcp + i);
if (dSize - i < CV_PUBSYM_SIZE (pcp1)) break;
if (pcp1->Header.wRecordType == CV_PUB32) dCount++;
}
}
if (pdCount != NULL) *pdCount = dCount;
if (pdSize != NULL) *pdSize = dSize;
return pcp;
}
// -----------------------------------------------------------------
PCV_SEGMAP WINAPI imgCvSegments (PCV_NB09 pc09,
PDWORD pdCount)
{
PCV_ENTRY pce;
DWORD dCount = 0;
PCV_SEGMAP pcs = NULL;
if ((pce = imgCvEntry (pc09, sstSegMap, 0)) != NULL)
{
pcs = (PCV_SEGMAP)
((PBYTE) pc09 + pce->lSubSectionOffset);
dCount = pcs->wTotal;
}
if (pdCount != NULL) *pdCount = dCount;
return pcs;
}
// -----------------------------------------------------------------
PVOID WINAPI imgCvPdbA (PCV_NB10 pc10,
PBYTE pbPath,
PDWORD pdSize)
{
BYTE abPath [MAX_PATH];
DWORD dName, i, n;
DWORD dSize = 0;
PVOID pData = NULL;
if ((pc10 != NULL) &&
(pc10->Header.Signature.dVersion == CV_SIGNATURE_NB10))
{
dName = imgPathNameA (pbPath, NULL);
if (dName + lstrlenA (pc10->abPdbName) < MAX_PATH)
{
for (i = n = 0; i < dName; i++)
{
abPath [n++] = pbPath [i];
}
for (i = 0; pc10->abPdbName [i]; i++)
{
abPath [n++] = pc10->abPdbName [i];
}
abPath [n] = 0;
dSize = (pdSize != NULL ? *pdSize : 0);
pData = imgPdbLoadA (abPath, &dSize);
}
}
if (pdSize != NULL) *pdSize = dSize;
return pData;
}
// -----------------------------------------------------------------
PVOID WINAPI imgCvPdbW (PCV_NB10 pc10,
PWORD pwPath,
PDWORD pdSize)
{
WORD awPath [MAX_PATH];
DWORD dName, i, n;
DWORD dSize = 0;
PVOID pData = NULL;
if ((pc10 != NULL) &&
(pc10->Header.Signature.dVersion == CV_SIGNATURE_NB10))
{
dName = imgPathNameW (pwPath, NULL);
if (dName + lstrlenA (pc10->abPdbName) < MAX_PATH)
{
for (i = n = 0; i < dName; i++)
{
awPath [n++] = pwPath [i];
}
for (i = 0; pc10->abPdbName [i]; i++)
{
awPath [n++] = pc10->abPdbName [i];
}
awPath [n] = 0;
dSize = (pdSize != NULL ? *pdSize : 0);
pData = imgPdbLoadW (awPath, &dSize);
}
}
if (pdSize != NULL) *pdSize = dSize;
return pData;
}
// =================================================================
// DBG FILE MANAGEMENT
// =================================================================
BOOL WINAPI imgDbgVerify (PIMG_DBG pid,
DWORD dSize)
{
PIMAGE_DEBUG_DIRECTORY pidd;
DWORD i, n, n1, n2;
BOOL fOk = FALSE;
if ((pid != NULL) && (dSize >= IMG_DBG_)
&&
(pid->Header.Signature == IMAGE_SEPARATE_DEBUG_SIGNATURE)
&&
(dSize >= IMG_DBG__ (pid->Header.NumberOfSections) +
pid->Header.ExportedNamesSize +
pid->Header.DebugDirectorySize)
&&
(!(pid->Header.DebugDirectorySize % IMAGE_DEBUG_DIRECTORY_))
&&
((pidd = imgDbgDirectories (pid, &n)) != NULL))
{
fOk = TRUE;
for (i = 0; i < n; i++)
{
n1 = pidd [i].PointerToRawData;
n2 = pidd [i].SizeOfData;
if ((n1 + n2 < n1) || (n1 + n2 > dSize))
{
fOk = FALSE;
break;
}
}
}
return fOk;
}
// -----------------------------------------------------------------
PVOID WINAPI imgDbgLoadA (PBYTE pbPath,
PDWORD pdSize)
{
DWORD dOffset = (pdSize != NULL ? *pdSize : 0);
DWORD dSize = dOffset;
PBYTE pbData = imgFileLoadA (pbPath, &dSize);
if ((pbData != NULL) &&
(!imgDbgVerify ((PIMG_DBG) (pbData + dOffset), dSize)))
{
pbData = imgMemoryDestroy (pbData);
}
if (pdSize != NULL) *pdSize = dSize;
return pbData;
}
// -----------------------------------------------------------------
PVOID WINAPI imgDbgLoadW (PWORD pwPath,
PDWORD pdSize)
{
DWORD dOffset = (pdSize != NULL ? *pdSize : 0);
DWORD dSize = dOffset;
PBYTE pbData = imgFileLoadW (pwPath, &dSize);
if ((pbData != NULL) &&
(!imgDbgVerify ((PIMG_DBG) (pbData + dOffset), dSize)))
{
pbData = imgMemoryDestroy (pbData);
}
if (pdSize != NULL) *pdSize = dSize;
return pbData;
}
// -----------------------------------------------------------------
PBYTE WINAPI imgDbgExports (PIMG_DBG pid,
PDWORD pdCount)
{
DWORD i, j;
DWORD dCount = 0;
PBYTE pbExports = NULL;
if (pid != NULL)
{
pbExports = (PBYTE) pid->aSections
+ (pid->Header.NumberOfSections
* IMAGE_SECTION_HEADER_);
for (i = 0; i < pid->Header.ExportedNamesSize; i = j)
{
if (!pbExports [j = i]) break;
while ((j < pid->Header.ExportedNamesSize) &&
pbExports [j++]);
if ((j > i) && (!pbExports [j-1])) dCount++;
}
}
if (pdCount != NULL) *pdCount = dCount;
return pbExports;
}
// -----------------------------------------------------------------
PIMAGE_DEBUG_DIRECTORY WINAPI imgDbgDirectories (PIMG_DBG pid,
PDWORD pdCount)
{
DWORD dCount = 0;
PIMAGE_DEBUG_DIRECTORY pidd = NULL;
if (pid != NULL)
{
pidd = (PIMAGE_DEBUG_DIRECTORY)
((PBYTE) pid
+ IMG_DBG__ (pid->Header.NumberOfSections)
+ pid->Header.ExportedNamesSize);
dCount = pid->Header.DebugDirectorySize
/ IMAGE_DEBUG_DIRECTORY_;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -