来自 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
.
EnumEnabledLayoutOrTip
和 GetLayoutDescription
通过 LoadLibrary
、GetProcAddress
和 DispCallFunc
的组合使用 [=74 成功调用=] 和 CC_CDECL 调用约定分别为 Jaafar Triback's help. The arguments were mentioned in the link above。如果可以的话,这个函数应该是可以调用的!
我知道还有其他函数,如GetKeyboardLayout
或GetKeyboardLayoutName
或GetKeyboardLayoutList
win32 API函数,也知道可以从注册表中获取相同的信息,事实上,我知道所有这些函数都是从注册表中检索信息的。我已经知道如何获取键盘布局信息了。
这个问题的目的不是获取默认键盘布局信息,而是能够调用一个 arguments/parameters 未被 MS 解释的函数。
我知道这是有原因的,但我不是要对其进行逆向工程或为了盈利而这样做,而是要教育自己如何做到这一点并帮助像我这样的人。
反汇编代码可以得到函数arguments/parameters,但以我目前的知识水平,这太难了。
我被告知函数的 arguments/parameters 可以在 Visual Studio 和 Ollydbg 或 IDA 等中查看,但 GetLayoutDescription
和 GetDefaultLayout
甚至都不显示此类信息带有未修饰选项。
我试着像 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。
获取 Arguments/Parameters 到 GetDefaultLayout
函数的列表
此功能是关于键盘布局的。而且我已经知道如何获得默认键盘布局。我只想知道 input.dll.
用于 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
.
EnumEnabledLayoutOrTip
和 GetLayoutDescription
通过 LoadLibrary
、GetProcAddress
和 DispCallFunc
的组合使用 [=74 成功调用=] 和 CC_CDECL 调用约定分别为 Jaafar Triback's help. The arguments were mentioned in the link above。如果可以的话,这个函数应该是可以调用的!
我知道还有其他函数,如GetKeyboardLayout
或GetKeyboardLayoutName
或GetKeyboardLayoutList
win32 API函数,也知道可以从注册表中获取相同的信息,事实上,我知道所有这些函数都是从注册表中检索信息的。我已经知道如何获取键盘布局信息了。
这个问题的目的不是获取默认键盘布局信息,而是能够调用一个 arguments/parameters 未被 MS 解释的函数。
我知道这是有原因的,但我不是要对其进行逆向工程或为了盈利而这样做,而是要教育自己如何做到这一点并帮助像我这样的人。
反汇编代码可以得到函数arguments/parameters,但以我目前的知识水平,这太难了。
我被告知函数的 arguments/parameters 可以在 Visual Studio 和 Ollydbg 或 IDA 等中查看,但 GetLayoutDescription
和 GetDefaultLayout
甚至都不显示此类信息带有未修饰选项。
我试着像 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。