На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Чтение секторов физического диска на C# , Под отладчиком (VS 2022) не может открыть диск
    Доброго времени суток всем.

    Возникла задачка читать/писать данные на хард, работающий не на PC. Кому интересно, где именно - это хард от ZX Spectrum Scorpion.
    Соответственно там нет никаких Fat и прочего. Есть ряд прог, понимающих "православные" Fat32, LFN, но не об этом речь, т.к. всё это читается/пишется без всяких бубнов стандартными для той же винды средствами.
    Читать/писать нужно чисто спектрумовский раздел. Он есть в MBR с кодом системы 53h, винда его видит просто как какой-то раздел.

    Структура его мне известна. Захотелось мне работать с ним на компе. Решил писать на C#.
    Список физ хардов считал через WMI, там всё норм, оттуда же вытащил имена физ дисков вида \\.\PhysicalDrive3. Дальше нужно читать MBR и прочее.
    Сама .NET, как я понимаю, и по сей день не научилась делать такие вещи, нашёл решение через P/Invoke. Упрощённо:

    ExpandedWrap disabled
              // Use interop to call the CreateFile function.
              // For more information about CreateFile, see the unmanaged MSDN reference library.
              [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
              private static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess,
                uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition,
                uint dwFlagsAndAttributes, IntPtr hTemplateFile);
       
              [DllImport("kernel32.dll", SetLastError = true)]
              private static extern bool ReadFile(
                  IntPtr hFile,                        // handle to file
                  byte[] lpBuffer,                // data buffer
                  int nNumberOfBytesToRead,        // number of bytes to read
                  ref int lpNumberOfBytesRead,    // number of bytes read
                  IntPtr lpOverlapped
                  //
                  // ref OVERLAPPED lpOverlapped        // overlapped buffer
                  );
      ........
       
      Использование:
       
                  // Try to open the file.
                  IntPtr ptr = CreateFile(Path, GENERIC_READ, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
                  Console.WriteLine($"Path: {Path}; descriptor: {ptr:X8}h");
       
                  handleValue = new SafeFileHandle(ptr, true);
                  _fs = new FileStream(handleValue, FileAccess.Read);


    Path - тот самый стандартный для винды "\\.\PhysicalDrive3" (имя нерегистрочувствительное, проверял :D ).
    Читает оно через винапишный ReadFile.

    Прикол в том, что когда я запускаю прогу напрямую (из фара, проводника) всё шикарно работает, сектора читаются.
    Но когда запускаю из-под студии (у меня 2022) - CreateFile кидает ошибку и всё. Причём неважно - Release/Debug.
    По итогу я не могу пользоваться отладкой.

    Вопрос почему оно так себя ведёт? И как это побороть?

    Спасибо.
    Сообщение отредактировано: hd44780 -
      Результат 2-х недельных копаний:

      Выкинул P/Invoke функций WinApi, заменил всё это сишной dll-кой, из которой наружу торчит не винапи, а готовые функции типа OpenPhysicalDisk, Readsector и т.п. Какой-то положительный эффект от этого получился - под отладкой диск открывается, типа ок. Но когда вызывается ReadFile (чтение секторов), приходит та же фигня, вид сбоку - ReadFile не работает, говорит, что считано 0 байт. При этом она же говорит, что ошибок нет, errno == 0.

      Жил какое-то время без отладки, потом поставил VS 2026 - отладчик заработал, всё открывается, читается и т.д. Пока через ту же мою сишную dll-ку.
      Выкидывать её и менять на импорт WinApi непосредственно в C#, как было изначально, пока лениво. Может быть потом, пока не капает.

      Запись пока не пробовал.
      Сообщение отредактировано: hd44780 -
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0313 ]   [ 16 queries used ]   [ Generated: 19.12.25, 18:25 GMT ]