首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用dbgeng.h实现命令的文本自动完成?

如何使用dbgeng.h实现命令的文本自动完成?
EN

Stack Overflow用户
提问于 2021-04-30 07:42:21
回答 1查看 118关注 0票数 0

我正在为windbg开发一个前端,它使用了很好的文档化的dbgeng.h API。但是,有一些功能我不知道如何实现,比如选项卡自动完成。我相信我需要的是以下API:IDebugAdvanced3 3:请求

输出

在……里面

DEBUG_REQUEST_GET_TEXT_COMPLETIONS_ANSI (无证)

dbgeng.h中也有一些注释,其中定义了这些结构:

代码语言:javascript
复制
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;
代码语言:javascript
复制
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。

编辑:我按照评论中的建议尝试了以下几点:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-01 20:20:33

  1. 部分输入是通配符,因此需要在输入后加上星号,如".db*“。
  2. out需要两次迭代--一次用于使用S_FALSE获取大小和可用的完成大小 第二个内存被分配后作为带类型的结构退出,如IN。

下面的代码有一个固定大小的缓冲区OUT作为poc。

如果您在没有缓冲区的情况下传递出去,您应该收到一个S_FALSE(01)作为HRESULT。

选项必须指示完成字符所需的内存大小。

代码如下

代码语言:javascript
复制
#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]);
    }
}

汇编并链接到

代码语言:javascript
复制
:\>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
:\>

编译和执行

代码语言:javascript
复制
:\>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:
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67330077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档