NHZ Ответов: 3

Ошибка "файл не найден" при доступе к некоторым файлам, хотя они существуют и доступ через проводник / CMD-box работает.


Привет,
У меня есть следующая проблема, которая возникает только на некоторых файлах в C:\Windows\system32 справочник.
Затронутые файлы, например hal.dll, hardres.dll, HalExtIntcLpioDMA.dll, HalExtPL080.dll-да.

Когда я пытаюсь получить доступ или скопировать один из этих файлов, я всегда получаю сообщение об ошибке "файл не найден", даже если файлы присутствуют и я могу получить к ним доступ через проводник. Копирование с помощью команды copy в окне cmd также работает.
Это работает не только с программой, написанной на C #.
Разрешения NTFS для hal.dll и еще help.exe они идентичны.

Есть идеи?

Спасибо за помощь.

Что я уже пробовал:

Я попробовал следующие варианты в C#, чтобы проверить, присутствует ли файл.

Внутренние функции C# :
File.Exists (pFileName) -> returns false
fi = FileInfo (pFileName)
FileInfo.Exists   -> returns false
File.Copy ...        Error: File not found

Win32API:
[DllImport ("shlwapi.dll", CharSet = CharSet.Unicode, EntryPoint = "PathFileExistsW")]
public static extern Int32 PathFileExists (String pszPath);

Int32 x = PathFileExists (pFileName) -> returns 1 (error)

внешний процесс:
var psI = new ProcessStartInfo
                {
                    CreateNoWindow = true,
                    Arguments = @"/c copy C:\Windows\system32\hal.dll C:\Temp\hal.dll",
                    FileName = @"C:\Windows\system32\cmd.exe",
                    RedirectStandardError = true,
                    RedirectStandardOutput = true,
                 }
proc.StartInfo = psI;
proc.Start();

if (psI.RedirectStandardError)
{
    var sErrStream = proc.StandardError.ReadToEnd();
                    
    sbOutPut.Append("ExitCode (" + proc.ExitCode + ") : " + sErrStream);
                    
}

proc.WaitForExit();
Console.WriteLine(sbOutPut.ToString());
proc.Close();

-> returns exit code 1 (File not found)

Richard MacCutchan

У меня такое чувство, что эти файлы защищены от хакеров и вирусов.

3 Ответов

Рейтинг:
22

Richard Deeming

Предположим, что ваша программа работает как 32-битный процесс, и вы получаете удар от перенаправителя файловой системы:
Перенаправление файловой системы - Win32-приложений, Майкрософт документы[^]

Когда ваш 32-битный процесс ищет:

C:\Windows\system32\hal.dll
перенаправитель означает, что он действительно ищет:
C:\Windows\SysWOW64\hal.dll
Даже если вы запускаете cmd.exe на самом деле вы запускаете 32-разрядную версию , поэтому применяется то же перенаправление.


Если это так, то вы можете обойти перенаправитель, используя sysnative виртуальный каталог:
C:\Windows\sysnative\hal.dll
будет на самом деле указывать на
C:\Windows\system32\hal.dll
в 32-битном процессе.


Это грязно и запутанно, но это был единственный способ для Windows поддерживать обратную совместимость с программами, которые жестко кодировали специальные пути к папкам вместо использования SHGetKnownFolderPath (или Environment.GetFolderPath в .Чистый код).


RickZeeland

5d!

Richard MacCutchan

Я только что заглянул в SYSWOW64 в своей системе и hal.dll там его нет, но он существует в System32. Так что я предполагаю, что это означает, что hal.dll на самом деле это 64-битная библиотека, а 32-битной версии нет. Правильно?

Richard Deeming

Я предполагаю, что может существовать 32-разрядная версия, но она будет существовать только в 32-разрядной версии Windows. 64-разрядная версия Windows будет иметь только 64-разрядную версию файла.

Richard MacCutchan

Спасибо, теперь все чисто.

NHZ

Спасибо!! Это и есть решение проблемы!

Рейтинг:
1

NHZ

Вот что меня тоже удивляет. Не имеет значения, запускаю ли я программу как администратор или как пользователь.


Рейтинг:
0

RickZeeland

Запуск программы от имени администратора может помочь.


Richard MacCutchan

Я попробовал это сделать, но не смог заставить его работать.