如何实现带“返回值”的WinDBG扩展命令?
问题描述:
对于条件判断的 j 命令,比如j ( 1<2 ) 'r esp'。
括号内是一个表达式,请问可否自己编写一个 WinDBG 扩展命令 myExt.dll,
它导出函数UnicodeCompare,可以返回布尔值给WinDBG的命令行。作用是:
当输入!myExt.UnicodeCompare irpsp->FileObject->FileName L”test.txt”,假如FileName是值为test.txt的UNICODE字符串,则返回真,否则为假。这样,可以将该命令扩展、 j 命令和断点相结合,形如:
bu `Sfilter.c:XXX` “j (!myExt.UnicodeCompare irpsp->FileObject->FileName L”test.txt” ) '.echo catche the File _test.txt_'”
作用是,当调试Sfilter.sys时,在Sfilter.cpp:XXX 行下个条件断点,当准备打开test.txt文件时,中断在Sfilter.cpp的XXX行上。
Wdbgexts.h中
#define DECLARE_API(s) \
CPPMOD VOID \
s( \
HANDLE hCurrentProcess, \
HANDLE hCurrentThread, \
ULONG dwCurrentPc, \
ULONG dwProcessor, \
PCSTR args \
)
采用WdbgExts(c语言函数调用)方式编写如下代码:
CPPMOD
int ext_Test(HANDLE hCurrentProcess, \
HANDLE hCurrentThread, \
ULONG dwCurrentPc, \
ULONG dwProcessor, \
PCSTR args
)
{ dprintf("试图像执行一个表达式后,返回一个值到WinDBG命令行\n");
return 0x13;
}
该代码能够编译通过,但:
1. 不能被识别为一个表达式,因为直观的发现WinDBG的命令行没有获得返回值。
2. 该代码中的args值无效, 而 DECLARE_API()版本中的args有效。
怀疑WdbgExts方式不能实现上述功能,或者连DbgEng方式也不行???
|