Вот ссылка на нужную вам документацию, захваченную архивом 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, поэтому в данной ситуации его следует игнорировать, а не предпринимать никаких действий.