Чтение секторов физического диска на C#
, Под отладчиком (VS 2022) не может открыть диск
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.43] |
|
|
Чтение секторов физического диска на C#
, Под отладчиком (VS 2022) не может открыть диск
|
Сообщ.
#1
,
|
|
|
|
Доброго времени суток всем.
Возникла задачка читать/писать данные на хард, работающий не на PC. Кому интересно, где именно - это хард от ZX Spectrum Scorpion. Соответственно там нет никаких Fat и прочего. Есть ряд прог, понимающих "православные" Fat32, LFN, но не об этом речь, т.к. всё это читается/пишется без всяких бубнов стандартными для той же винды средствами. Читать/писать нужно чисто спектрумовский раздел. Он есть в MBR с кодом системы 53h, винда его видит просто как какой-то раздел. Структура его мне известна. Захотелось мне работать с ним на компе. Решил писать на C#. Список физ хардов считал через WMI, там всё норм, оттуда же вытащил имена физ дисков вида \\.\PhysicalDrive3. Дальше нужно читать MBR и прочее. Сама .NET, как я понимаю, и по сей день не научилась делать такие вещи, нашёл решение через P/Invoke. Упрощённо: ![]() ![]() // 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" (имя нерегистрочувствительное, проверял ).Читает оно через винапишный ReadFile. Прикол в том, что когда я запускаю прогу напрямую (из фара, проводника) всё шикарно работает, сектора читаются. Но когда запускаю из-под студии (у меня 2022) - CreateFile кидает ошибку и всё. Причём неважно - Release/Debug. По итогу я не могу пользоваться отладкой. Вопрос почему оно так себя ведёт? И как это побороть? Спасибо. |
|
Сообщ.
#2
,
|
|
|
|
Результат 2-х недельных копаний:
Выкинул P/Invoke функций WinApi, заменил всё это сишной dll-кой, из которой наружу торчит не винапи, а готовые функции типа OpenPhysicalDisk, Readsector и т.п. Какой-то положительный эффект от этого получился - под отладкой диск открывается, типа ок. Но когда вызывается ReadFile (чтение секторов), приходит та же фигня, вид сбоку - ReadFile не работает, говорит, что считано 0 байт. При этом она же говорит, что ошибок нет, errno == 0. Жил какое-то время без отладки, потом поставил VS 2026 - отладчик заработал, всё открывается, читается и т.д. Пока через ту же мою сишную dll-ку. Выкидывать её и менять на импорт WinApi непосредственно в C#, как было изначально, пока лениво. Может быть потом, пока не капает. Запись пока не пробовал. |