Неподдерживаемый код ошибки WinAPI с GetConsoleCharType - PullRequest
0 голосов
/ 28 апреля 2020

Я решил изучить недокументированную функцию WinAPI, потому что некоторые из них все еще могут использоваться и могут делать то, что без них невозможно (например: GetConsoleCommandHistory или MessageBoxTimeout).

Когда Я попытался импортировать GetConsoleCharType из kernel32.dll с объявлением, которое я нашел в inte rnet. Когда я запустил его, я получил код ошибки 16385 от GetLastError. Я попытался запустить его в FormatMessage, чтобы получить сообщение об ошибке, но затем FormatMessage не удалось с кодом 15100 из GetLastError. Я ввел страницу windows с кодами ошибок и увидел, что они поддерживают только коды ошибок от 0 до 15999. Кто-нибудь может помочь мне понять эту ошибку?

Объявление функции от https://doxygen.reactos.org/df/d28/dll_2win32_2kernel32_2client_2console_2console_8c.html

Мой код:

HMODULE hModule = LoadLibraryA("kernel32.dll");
if (hModule)
{
    puts("Kernel32 loaded!");
    BOOL(WINAPI * GetConsoleCharType)(HANDLE hConsole, COORD Coord, PDWORD Type);
    GetConsoleCharType = (decltype(GetConsoleCharType))GetProcAddress(hModule, "GetConsoleCharType");
    if(GetConsoleCharType)
    {
        puts("Function loaded!");
        DWORD type = 0;
        if (GetConsoleCharType(GetStdHandle(STD_OUTPUT_HANDLE), { 0, 0 }, &type))
            puts("Function worked!");
        else
        {
            printf("Function failed with code %lu\n", GetLastError());
            char* msg;
            if(FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL, GetLastError(),
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (LPSTR)&msg, 0, NULL))
            {
                printf("Error: %s", msg);
                LocalFree(msg);
            }
            else
            {
                printf("FormatMessage failed with code %lu\n", GetLastError());
            }
        }
        FreeLibrary(hModule);
    }
}

Выход:

Kernel32 loaded!
Function loaded!
Function failed with code 16385
FormatMessage failed with code 15100

1 Ответ

1 голос
/ 28 апреля 2020

GetConsoleCharType возврат C0074001 - вы можете получить его через RtlGetLastNtStatus(). действительно вызов обрабатывается внутри conhost.exe . если вы прикрепите к нему отладчик, вы сможете просмотреть следующую отладочную печать:

onecore\windows\core\console\open\src\server\apidispatchersinternal.cpp(23)\ConhostV2.dll!00007FFFB6D35863: (caller: 00007FFFB6D35681) ReturnHr(5) tid(ae4) 80004001 Not implemented
    Msg:[Deprecated API attempted: 0x00000007] 

вызов обработан внутри

HRESULT ApiDispatchers::ServerDeprecatedApi(_CONSOLE_API_MSG * const,int * const)
{
  return wil::details::in1diag3::Return_HrMsg(*,E_NOTIMPL, 
  "onecore\windows\core\console\open\src\server\apidispatchersinternal.cpp");
}

он вернет E_NOTIMPL (0x80004001), затем преобразует

80004001 -> 4001 -> 4001 | c0070000 = c0074001

наконец RtlNtStatusToDosError преобразовал его в 0x4001 = 16385

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...