日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

6 《Undocumented Windows 2000 Secrets》翻譯 --- 第四章( 三 )


#define SPY_MEMORY_BLOCK_ sizeof (SPY_MEMORY_BLOCK)
// -----------------------------------------------------------------
NTSTATUS SpyInputMemory (PSPY_MEMORY_BLOCK psmb,
PVOID pInput,
DWORD dInput)
{
return SpyInputBinary (psmb, SPY_MEMORY_BLOCK_, pInput, dInput);
}
// -----------------------------------------------------------------
NTSTATUS SpyOutputMemory (PSPY_MEMORY_BLOCK psmb,
PVOID pOutput,
DWORD dOutput,
PDWORD pdInfo)
{
NTSTATUS ns = STATUS_BUFFER_TOO_SMALL;
if (*pdInfo = SpyMemoryReadBlock (psmb, pOutput, dOutput))
{
ns = STATUS_SUCCESS;
}
return ns;
}
列表 4-23. 處理內(nèi)存塊
DWORD SpyMemoryReadBlock (PSPY_MEMORY_BLOCK psmb,
PSPY_MEMORY_DATA psmd,
DWORD dSize)
{
DWORD i;
DWORD n = SPY_MEMORY_DATA__ (psmb->dBytes);
if (dSize >= n)
{
psmd->smb = *psmb;
for (i = 0; i < psmb->dBytes; i)
{
psmd->awData [i] =
(SpyMemoryTestAddress (psmb->pbAddressi)
? SPY_MEMORY_DATA_VALUE (psmb->pbAddress [i], TRUE)
: SPY_MEMORY_DATA_VALUE (0, FALSE));
}
}
else
{
if (dSize >= SPY_MEMORY_DATA_)
{
psmd->smb.pbAddress = NULL;
psmd->smb.dBytes = 0;
}
n = 0;
}
return n;
}
// -----------------------------------------------------------------
BOOL SpyMemoryTestAddress (PVOID pVirtual)
{
return SpyMemoryPageEntry (pVirtual, NULL);
}
// -----------------------------------------------------------------
BOOL SpyMemoryTestBlock (PVOID pVirtual,
DWORD dBytes)
{
PBYTE pbData;
DWORD dData;
BOOL fOk = TRUE;
if (dBytes)
{
pbData = https://www.rkxy.com.cn/dnjc/(PBYTE) ((DWORD_PTR) pVirtual & X86_PAGE_MASK);
dData = https://www.rkxy.com.cn/dnjc/(((dBytesX86_OFFSET_4K (pVirtual) - 1)
/ PAGE_SIZE)1) * PAGE_SIZE;
do {
fOk = SpyMemoryTestAddress (pbData);
pbData= https://www.rkxy.com.cn/dnjc/PAGE_SIZE;
dData -= PAGE_SIZE;
}
while (fOk && dData);
}
return fOk;
}
列表 4-24. 復(fù)制內(nèi)存塊中的數(shù)據(jù)
SpyMemoryTestAddress() 用于測試數(shù)據(jù)的有效性,SpyMemoryReadBlock() 針對要讀取的每個(gè)字節(jié)都會調(diào)用 SpyMemoryTestAddress()。SpyMemoryTestAddress() 在 列表 4-24 的下半部分給出,該函數(shù)只是簡單的調(diào)用 SpyMemoryPageEntry(),不過傳入的第二個(gè)參數(shù)為 NULL。SpyMemoryPageEntry() 在討論 SPY_IO_PAGE_ENTRY 時(shí)已經(jīng)介紹過( 列表 4-22 ) 。將其 PSPY_PAGE_ENTRY 指針參數(shù)設(shè)為 NULL,意味著調(diào)用者不關(guān)心指定線性地址對應(yīng)的 page entry,因此,如果線性地址有效,函數(shù)將返回 TRUE。在 SpyMemoryPageEntry() 的上下文中,僅當(dāng)一個(gè)線性地址對應(yīng)的數(shù)據(jù)頁存在于物理內(nèi)存中,或者位于頁面文件中,該地址才是有效的 。注意,這種行為與 ntoskrnl.exe 中的 API 函數(shù) MmIsAddressValid() 并不一致,當(dāng)指定的頁不存在于物理內(nèi)存中時(shí),MmIsAddressValid() 總是返回 FALSE,即使這個(gè)有效的數(shù)據(jù)據(jù)頁位于頁面文件中也會如此 。列表 4-24 中的另一個(gè)函數(shù) SpyMemoryTestBlock() 是 SpyMemoryTestAddress() 的增強(qiáng)版 。它可測試一個(gè)內(nèi)存區(qū)域的有效性,它每次可測試指定塊中的 4,096 個(gè)字節(jié),直到測試完區(qū)域中的所有頁為止 。
#define SPY_MEMORY_DATA_N(_n)
struct _SPY_MEMORY_DATA_##_n
【6 《Undocumented Windows 2000 Secrets》翻譯 --- 第四章】{
SPY_MEMORY_BLOCK smb;
WORD awData [_n];
}
typedef SPY_MEMORY_DATA_N (0)
SPY_MEMORY_DATA, *PSPY_MEMORY_DATA, **PPSPY_MEMORY_DATA;
#define SPY_MEMORY_DATA_ sizeof (SPY_MEMORY_DATA)
#define SPY_MEMORY_DATA__(_n) (SPY_MEMORY_DATA_((_n) * WORD_))
#define SPY_MEMORY_DATA_BYTE 0x00FF
#define SPY_MEMORY_DATA_VALID 0x0100

推薦閱讀