Вызов Wow64GetThreadContext возвращает ошибку «Если файл уже существует, файл не может быть создан». - PullRequest
0 голосов
/ 10 июля 2020

Я использую вызов Wow64GetThreadContext из 64-битного процесса в 32-битном процессе. Я улавливаю структуру контекста WOW64 с помощью этого метода.

MSDN, похоже, больше не имеет документации для этого метода , однако он все еще упоминается в GetThreadContext страница документации. Я не уверен, почему это так. Поскольку документация недоступна, мне трудно понять, почему я получаю указанную ниже ошибку.

Код, в котором возникает ошибка, приведен ниже. Когда я проверяю GetLastWin32Error, возникает ошибка: When the file already exists, the file cannot be created.

Есть ли у кого-нибудь идеи, почему это вызывает эту ошибку? Я вообще не создаю файл, что меня смущает.

ContextWow = new WOW_CONTEXT();
ContextWow.ContextFlags = CONTEXT_FLAGS.CONTEXT_ALL;
try
{
    Wow64GetThreadContext(ThreadHandle, ref ContextWow);
    if (new Win32Exception(Marshal.GetLastWin32Error()).Message != "The operation completed successfully")
    {
        throw new Exception("Win32 Exception encountered when attempting to get thread context" + new Win32Exception(Marshal.GetLastWin32Error()).Message);
    }
}

1 Ответ

0 голосов
/ 10 июля 2020

Вот ссылка на нужную вам документацию, захваченную архивом Inte rnet 10 июля 2019 г .:

Wow64GetThreadContext() функция

Согласно документация:

Возвращаемое значение

Если функция завершается успешно, возвращаемое значение не равно нулю.

Если функция не работает, возвращаемое значение равно нулю. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Обработка ошибок неверна. Это эквивалентно выполнению следующего:

ContextWow = new WOW_CONTEXT();
ContextWow.ContextFlags = CONTEXT_FLAGS.CONTEXT_ALL;
try
{
    Wow64GetThreadContext(ThreadHandle, ref ContextWow);
    if (Marshal.GetLastWin32Error() != 0)
    {
        throw new Exception("Win32 Exception encountered when attempting to get thread context" + new Win32Exception().Message);
    }
}

Вы делаете очень частую ошибку, звоня на GetLastError() не в то время. Как говорится в документации, код ошибки Win32 можно использовать только в том случае, если Wow64GetThreadContext() возвращает false, что вы не проверяете.

То, что вы делаете, не является правильным способом проверки наличия ошибки (либо для получения кода ошибки или для его сравнения). Вместо этого правильный код должен выглядеть примерно так:

ContextWow = new WOW_CONTEXT();
ContextWow.ContextFlags = CONTEXT_FLAGS.CONTEXT_ALL;

if (!Wow64GetThreadContext(ThreadHandle, ref ContextWow))
{
    throw new Exception("Error encountered when attempting to get thread context", new Win32Exception());
}

При этом сообщение об ошибке, которое вы видите, "When the file already exists, the file cannot be created", является текстом вашей системы для кода ошибки ERROR_ALREADY_EXISTS (183), который не является кодом ошибки, который Wow64GetThreadContext() задокументирован как сообщение об ошибке, и на самом деле просто не имеет большого смысла для такой функции сообщать об ошибке. Итак, что, скорее всего, происходит, так это то, что Wow64GetThreadContext() на самом деле возвращает true, но поскольку вы неправильно проверяете сбой, вы фактически видите код ошибки из более раннего / внутреннего вызова API, который не был перезаписан при Wow64GetThreadContext() возвращает true, поэтому в данной ситуации его следует игнорировать, а не предпринимать никаких действий.

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