«Указанная процедура не найдена» после отключения перенаправления wow64 - PullRequest
1 голос
/ 27 февраля 2012

Я использую 32-битное приложение в системе x64. (Windows 7) Я пытаюсь запустить резервное копирование Windows, которое находится по адресу: c: \ System32 \ sdclt.exe.Поскольку я работаю как 32-битный процесс, я должен отключить перенаправление WOW64 (используя Wow64DisableWow64FsRedirection).Проблема в том, что после отключения перенаправления wow64 я получаю ошибку «Указанная процедура не может быть найдена».

Мне кажется, что при отключении перенаправления каким-то образом sdclt.exe не может загрузить все свои зависимые DLL.

примечания: 1. это происходит только в том случае, если я не работаю с повышенными привилегиями.2. Я устанавливаю для «use shell execute» значение true, потому что я хочу позволить пользователям использовать мое приложение без повышенных привилегий.2. эта ошибка не произойдет при компиляции в 64 бит.

Ответы [ 2 ]

5 голосов
/ 27 февраля 2012

Отключение перенаправления файлов - дело опасное. Вы делаете это здесь, чтобы ваш 32-битный процесс мог видеть файл, расположенный в system32. Обычно любая ссылка на эту папку из 32-битного процесса будет перенаправлена ​​на SysWOW64. Но, как вы обнаружили, отключение перенаправления файлов разрывает другие ссылки в цепочке.

Лучшее из известных мне решений - использовать специальный псевдоним %windir%\sysnative, чтобы найти истинный каталог system32. Не отключайте перенаправление файлов и просто передавайте %windir%\sysnative\sdclt.exe при запуске процесса.

Документация для перенаправления файлов гласит:

32-разрядные приложения могут получить доступ к собственному системному каталогу, заменив% windir% \ Sysnative на% windir% \ System32. WOW64 распознает Sysnative как специальный псевдоним, используемый для указания того, что файловая система не должна перенаправлять доступ. Этот механизм является гибким и простым в использовании, поэтому он является рекомендуемым механизмом для обхода перенаправления файловой системы. Обратите внимание, что 64-разрядные приложения не могут использовать псевдоним Sysnative, поскольку это виртуальный каталог, а не реальный.

Windows Server 2003 и Windows XP : псевдоним Sysnative был добавлен начиная с Windows Vista.

Последнее предупреждение фактически означает, что %windir%\Sysnative не распознается в XP64, если только машина не обслуживалась с помощью исправления MS, которое соответствует %windir%\Sysnative этой ОС. На практике это не имеет значения, потому что установленная база XP64 очень мала.

Единственное другое решение, которое мне известно, - это создать свой собственный выделенный модуль запуска, который является 64-битным процессом. Если вы поместите этот модуль запуска в папку, которая не подлежит перенаправлению файлов, вы можете вызвать этот модуль запуска из 32-разрядного процесса, и тогда средство запуска сможет увидеть 64-разрядный системный каталог. Я думаю, что вам придется использовать этот подход, если вам нужно поддерживать XP64.

0 голосов
/ 01 февраля 2015

У меня была похожая проблема.Я заметил, что проблема возникает только в системах Windows 7 x64 без установленного SP1.В системах, где возникла проблема, обновление до SP1 исправило ее.

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