我正在为windbg开发一个前端,它使用了很好的文档化的dbgeng.h API。但是,有一些功能我不知道如何实现,比如选项卡自动完成。我相信我需要的是以下API:IDebugAdvanced3 3:请求
DEBUG_REQUEST_GET_TEXT_COMPLETIONS_ANSI (无证)
在dbgeng.h中也有一些注释,其中定义了这些结构:
typedef struct _DEBUG_GET_TEXT_COMPLETIONS_IN
{
ULONG Flags;
ULONG MatchCountLimit;
ULONG64 Reserved[3];
// Input text string follows.
} DEBUG_GET_TEXT_COMPLETIONS_IN, *PDEBUG_GET_TEXT_COMPLETIONS_IN;typedef struct _DEBUG_GET_TEXT_COMPLETIONS_OUT
{
ULONG Flags;
// Char index in input string where completions start.
ULONG ReplaceIndex;
ULONG MatchCount;
ULONG Reserved1;
ULONG64 Reserved2[2];
// Completions follow.
// Completion data is zero-terminated strings ended
// by a final zero double-terminator.
} DEBUG_GET_TEXT_COMPLETIONS_OUT, *PDEBUG_GET_TEXT_COMPLETIONS_OUT;我不明白我该如何使用这个API。
编辑:我按照评论中的建议尝试了以下几点:
struct in_wrap
{
DEBUG_GET_TEXT_COMPLETIONS_IN in;
char src[4];
};
in_wrap wrp;
DEBUG_GET_TEXT_COMPLETIONS_IN in;
in.Flags = DEBUG_GET_TEXT_COMPLETIONS_NO_SYMBOLS;
in.MatchCountLimit = 5;
wrp.in = in;
strcpy(wrp.src, ".ec"); // I'm expecting to receive ".echo" back.
DEBUG_GET_TEXT_COMPLETIONS_OUT out = {};
ULONG outsize = 0;
hr = advanced->Request(DEBUG_REQUEST_GET_TEXT_COMPLETIONS_ANSI,
(void *)&wrp, sizeof(in_wrap),
(void *)&out, sizeof(DEBUG_GET_TEXT_COMPLETIONS_OUT), &outsize);返回E_INVALIDARGS。
发布于 2021-05-01 20:20:33
下面的代码有一个固定大小的缓冲区OUT作为poc。
如果您在没有缓冲区的情况下传递出去,您应该收到一个S_FALSE(01)作为HRESULT。
选项必须指示完成字符所需的内存大小。
代码如下
#include <engextcpp.cpp>
typedef struct _AUTOCOMPIN {
DEBUG_GET_TEXT_COMPLETIONS_IN auin;
char instr[8];
} Autocompin, *PAutocompin;
typedef struct _AUTOCOMPOUT {
DEBUG_GET_TEXT_COMPLETIONS_OUT auout;
char ostr[0x1000];
} Autocompout, *Pautocompout;
class EXT_CLASS : public ExtExtension {
public:
EXT_COMMAND_METHOD(autocomp);
};
EXT_DECLARE_GLOBALS();
EXT_COMMAND(autocomp, "", "") {
Autocompin ibuff = {0};
Autocompout obuff = {0};
ULONG opsize = 0;
HRESULT hr = E_FAIL;
strcpy_s(ibuff.instr, ".d*");
hr = m_Advanced2->Request(
DEBUG_REQUEST_GET_TEXT_COMPLETIONS_ANSI,
&ibuff,
sizeof(ibuff),
&obuff,
sizeof(obuff),
&opsize);
Out("hr = %x opsize = %x IDebugAdvancedCheckPointer = %p\n", hr, opsize, m_Advanced2);
for (ULONG i = 0; i < opsize; i++) {
Out("%c ", obuff.ostr[i]);
}
}汇编并链接到
:\>cl
Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27045 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
usage: cl [ option... ] filename... [ /link linkoption... ]
:\>type complink.bat (must be in one line )
cl /LD /nologo /W4 /Od /Zi /EHsc /I"C:\Program Files (x86)\Windows Kits\10\Debuggers\inc" %1.cpp
/link /EXPORT:DebugExtensionInitialize /Export:%1 /Export:help /RELEASE
:\>编译和执行
:\>complink.bat autocomp
:\>cl /LD /nologo /W4 /Od /Zi /EHsc /I"C:\Program Files (x86)\Windows Kits\10\Debuggers\inc" autocomp.cpp /link /EXPORT:DebugExtensionInitialize /Export:autocomp /Export:help /RELEASE
autocomp.cpp
C:\Program Files (x86)\Windows Kits\10\Debuggers\inc\engextcpp.cpp(1849): warning C4245: 'argument': conversion from 'int' to 'ULONG64', signed/unsigned mismatch
Creating library autocomp.lib and object autocomp.exp
:\>cdb -c ".load .\autocomp;!autocomp;q" cdb
Microsoft (R) Windows Debugger Version 10.0.17763.132 AMD64
0:000> cdb: Reading initial command '.load .\autocomp;!autocomp;q'
hr = 0 opsize = 8c IDebugAdvancedCheckPointer = 00000057edfface0
d b g d b g
d e b u g _ s w _ w o w
d e t a c h
d m l _ f i l e
d m l _ f l o w
d m l _ s t a r t
d o d r i v e r s
d u m p
d v a l l o c
d v f r e e
d i s a b l e p a c k a g e d e b u g
quit:https://stackoverflow.com/questions/67330077
复制相似问题