来自 input.dll 的 GetDefaultLayout 函数的输入和输出参数/参数

Input and Output Argument(s)/Parameter(s) of GetDefaultLayout function from input.dll

请帮助我从 C:\Windows\System32\input.dll.
获取 Arguments/Parameters 到 GetDefaultLayout 函数的列表 此功能是关于键盘布局的。而且我已经知道如何获得默认键盘布局。我只想知道 input.dll.

中 GetDefaultLayout 函数的参数

用于 Excel VBA 但欢迎提供任何语言的信息。
在网上搜索了一圈,没有找到相关资料。
另一个类似的未记录的函数:GetLayoutDescription 在同一个 dll 中被提到 cyberforum & vbforums (both from 2020) and miloush(从 2010 年开始)。

使用 Dll Export Viewer、PE Explorer 等检查从 input.dll 导出的函数,发现列出了该函数但没有 documentation on MS site,与其他函数不同,在同一个 DLL 中,如:EnumEnabledLayoutOrTip.

EnumEnabledLayoutOrTipGetLayoutDescription 通过 LoadLibraryGetProcAddressDispCallFunc 的组合使用 [=74 成功调用=]CC_CDECL 调用约定分别为 Jaafar Triback's help. The arguments were mentioned in the link above。如果可以的话,这个函数应该是可以调用的!

我知道还有其他函数,如GetKeyboardLayoutGetKeyboardLayoutNameGetKeyboardLayoutListwin32 API函数,也知道可以从注册表中获取相同的信息,事实上,我知道所有这些函数都是从注册表中检索信息的。我已经知道如何获取键盘布局信息了。

这个问题的目的不是获取默认键盘布局信息,而是能够调用一个 arguments/parameters 未被 MS 解释的函数。
我知道这是有原因的,但我不是要对其进行逆向工程或为了盈利而这样做,而是要教育自己如何做到这一点并帮助像我这样的人。

反汇编代码可以得到函数arguments/parameters,但以我目前的知识水平,这太难了。
我被告知函数的 arguments/parameters 可以在 Visual Studio 和 Ollydbg 或 IDA 等中查看,但 GetLayoutDescriptionGetDefaultLayout 甚至都不显示此类信息带有未修饰选项。

我试着像 GetDefaultLayout(StrPtr(sBuffer),uBufLength) 那样调用它,或者尝试了 ANSI 或 Unicode 字符串传递等等,甚至尝试只传递一个 0& 但它仍然使我的 Excel 文件崩溃了很多多次损坏我的 .xlsm 文件以至于我什至无法 copy/paste 进入它并且当前正在执行 chkdsk 操作。

提前致谢。

WINAPI HRESULT GetDefaultLayout(LPCWSTR pszUserReg, LPWSTR pszLayout, LPUINT uBufLength);

用法似乎很简单:

std::wstring GetDefaultLayoutProfileId()
{
    typedef HRESULT(WINAPI* GetDefaultLayoutFunc)(LPCWSTR pszUserReg, LPWSTR pszLayout, LPUINT uBufLength);
    static GetDefaultLayoutFunc GetDefaultLayout = reinterpret_cast<GetDefaultLayoutFunc>(::GetProcAddress(::LoadLibraryA("input.dll"), "GetDefaultLayout"));

    if (!GetDefaultLayout)
        return {};

    UINT length = 0;

    CHECK(SUCCEEDED(GetDefaultLayout(nullptr, nullptr, &length)));

    std::wstring defaultLayoutProfileId;
    defaultLayoutProfileId.resize(length);

    CHECK(SUCCEEDED(GetDefaultLayout(nullptr, defaultLayoutProfileId.data(), &length)));

    return defaultLayoutProfileId;
}

...

// Returns default layout profile set in user settings (with IME support!)
// For example "0409:00000409" for English - US layout
std::wstring defaultLayoutProfileId = GetDefaultLayoutProfileId();

布局的字符串格式为:

<LangID>:<KLID>

文本服务配置文件 (TSF IME) 的字符串格式为:

<LangID>:{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

更多信息here