該程序模擬UNIX中save與resume函數,并介紹在VC中如何使用匯編進行機器級的操作.
主函數很簡單首先引入兩個外部函數,extern "C"表示按傳統C命名習慣.函數save將程序指針保存在(*s)中并返回0,為什么有
if(save(&sp)){...}
if后的語句看起來永遠都不會被執行,但是運行結果表明它被執行了.這個問題同UNIX中處理機調度函數(switch)的那個if語句(第一句)一樣.
程序執行完save(&sp)后得到因為條件為假而執行else語句,卻在判斷之前將程序指針保存在sp中了.
else語句中的resume(&sp),該函數很狡猾將堆棧中的返回地址改變了,改到了sp所指出,即將程序指針改到了執行條件判斷前.resume返回1,條件滿足,執行if語句.
save函數堆棧:
eip ebp+8
s ebp+4
ebp ebp+0
resume函數堆棧與save的相同.
新建一個win32的工程,將unixc.cpp和unix.obj加入過程即可.
unix.obj是用masm6.11生成的:ml /c /coff unix.asm,生成coff格式的obj而不是omf格式.
標簽:
save
resume
extern
函數
上傳時間:
2015-09-10
上傳用戶:變形金剛
//打開 USB 口讀寫, 由驅動程序的 Pipe 名確定
HANDLE hPipe = OpenMyDevPipe("MyPipe1") //驅動程序里面的 Pipe 名, 對應訪問某個端點的 I/O, 這里我亂寫的, 需要與驅動一致
if(hPipe != INVALID_HANDLE_VALUE) //打開 Pipe 成功
{
ReadFile(hPipe, Buffer, BufSize, &nBytesRead, NULL) //從 hPipe 里讀取數據到 Buffer 里
//WriteFile(hPipe, Buffer, BytesToWrite, &nBytesWritten, NULL) //把 Buffer 里面的 BytesToWrite 字節寫入 hPipe
CloseHandle(hPipe)
}
//使用 DeviceIoControl 訪問 USB 設備
HANDLE hDevice = OpenMyDevice()
if(hDevice != INVALID_HANDLE_VALUE) //打開設備成功
{
//這些 DeviceIoControl 功能都是由設備定義的, 具體看設備和驅動的資料
if(DeviceIoControl(hDevice, IOCTL_READ_xxxx, &IOBlock, sizeof(IOBLOCK), &c, 1, &nBytes, NULL))
{
//成功
}
CloseHandle(hDevice)
}
標簽:
Pipe
OpenMyDevPipe
MyPipe1
HANDLE
上傳時間:
2014-11-25
上傳用戶:stampede