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

8 《Undocumented Windows 2000 Secrets》翻譯 --- 第四章( 二 )


BOOL WINAPI DeviceIoControl( HANDLE hDevice,
DWORD dwIoControlCode,
PVOID lpInBuffer,
DWORD nInBufferSize,
PVOID lpOutBuffer,
DWORD nOutBufferSize,
PDWORD lpBytesReturned,
POVERLAPPED lpOverlapped);
列表 4-27. DeviceIoControl 函數(shù)的原型
BOOL WINAPI IoControl (HANDLE hDevice,
DWORD dCode,
PVOID pInput,
DWORD dInput,
PVOID pOutput,
DWORD dOutput)
{
DWORD dData = https://www.rkxy.com.cn/dnjc/0;
return DeviceIoControl (hDevice, dCode,
pInput, dInput,
pOutput, dOutput,
&dData, NULL)
&&
(dData =https://www.rkxy.com.cn/dnjc/= dOutput);
}
// -----------------------------------------------------------------
BOOL WINAPI ReadBinary (HANDLE hDevice,
DWORD dCode,
PVOID pOutput,
DWORD dOutput)
{
return IoControl (hDevice, dCode, NULL, 0, pOutput, dOutput);
}
// -----------------------------------------------------------------
BOOL WINAPI ReadCpuInfo (HANDLE hDevice,
PSPY_CPU_INFO psci)
{
return IoControl (hDevice, SPY_IO_CPU_INFO,
NULL, 0,
psci, SPY_CPU_INFO_);
}
// -----------------------------------------------------------------
BOOL WINAPI ReadSegment (HANDLE hDevice,
DWORD dSelector,
PSPY_SEGMENT pss)
{
return IoControl (hDevice, SPY_IO_SEGMENT,
&dSelector, DWORD_,
pss, SPY_SEGMENT_);
}
// -----------------------------------------------------------------
BOOL WINAPI ReadPhysical (HANDLE hDevice,
PVOID pLinear,
PPHYSICAL_ADDRESS ppa)
{
return IoControl (hDevice, SPY_IO_PHYSICAL,
&pLinear, PVOID_,
ppa, PHYSICAL_ADDRESS_)
&&
(ppa->LowPart || ppa->HighPart);
}
列表 4-28 幾個(gè) IOCTL 的外包函數(shù)
到目前為止,本節(jié)列出的所有函數(shù)都需要 Spy 設(shè)備的一個(gè)句柄 ?,F(xiàn)在,我將介紹如何獲取該句柄 。這實(shí)際上是一個(gè)非常簡單的 Win32 操作,和打開文件類似 。列表 4-29 展示了 w2k_mem.exe 的命令處理例程的實(shí)現(xiàn)細(xì)節(jié) 。該代碼使用 API 函數(shù) w2kFilePath() 、 w2kServiceLoad() 和 w2kServiceUnload(),這幾個(gè)函數(shù)由 w2k_lib.dll 導(dǎo)出 。如果你已經(jīng)讀過第三章中關(guān)于 Windows 2000 服務(wù)控制管理器的介紹,你應(yīng)該通過 列表 3-8 已了解了 w2kServiceLoad() 和 w2kServiceUnload()。這些強(qiáng)大的函數(shù)可隨時(shí)加載或卸載內(nèi)核模式的設(shè)備驅(qū)動(dòng),并且能處理一些良性的錯(cuò)誤,如,妥善的處理加載一個(gè)已經(jīng)載入內(nèi)存的驅(qū)動(dòng)程序 。w2kFilePath() 是一個(gè)幫助函數(shù) 。w2k_mem.exe 調(diào)用它來獲取 Spy 驅(qū)動(dòng)程序的完整路徑 。
WORD awSpyFile [] = SW(DRV_FILENAME);
WORD awSpyDevice [] = SW(DRV_MODULE);
WORD awSpyDisplay [] = SW(DRV_NAME);
WORD awSpyPath [] = SW(DRV_PATH);
// -----------------------------------------------------------------
void WINAPI Execute (PPWORD ppwArguments,
DWORD dArguments)
{
SPY_VERSION_INFO svi;
DWORD dOptions, dRequest, dReceive;
WORD awPath [MAX_PATH] = L"?";
SC_HANDLE hControl = NULL;
HANDLE hDevice = INVALID_HANDLE_VALUE;
_printf (L"rnLoading "%s" (%s) ...rn",
awSpyDisplay, awSpyDevice);
if (w2kFilePath (NULL, awSpyFile, awPath, MAX_PATH))
{
_printf (L"Driver: "%s"rn",
awPath);
hControl = w2kServiceLoad (awSpyDevice, awSpyDisplay,
awPath, TRUE);
}
if (hControl != NULL)
{
_printf (L"Opening "%s" ...rn",
awSpyPath);
hDevice = CreateFile (awSpyPath, GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
}
else
{
_printf (L"Unable to load the spy device driver.rn");
}
if (hDevice != INVALID_HANDLE_VALUE)
{
if (ReadBinary (hDevice, SPY_IO_VERSION_INFO,

推薦閱讀