<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=469991&amp;view=findpost&amp;p=3933012</guid>
        <pubDate>Wed, 10 Dec 2025 08:34:41 +0000</pubDate>
        <title>Чтение секторов физического диска на C#</title>
        <link>https://forum.sources.ru/index.php?showtopic=469991&amp;view=findpost&amp;p=3933012</link>
        <description><![CDATA[hd44780: Результат 2-х недельных копаний:<br><br>Выкинул P/Invoke функций WinApi, заменил всё это сишной dll-кой, из которой наружу торчит не винапи, а готовые функции типа OpenPhysicalDisk, Readsector и т.п. Какой-то положительный эффект от этого получился - под отладкой диск открывается, типа ок. Но когда вызывается ReadFile (чтение секторов), приходит та же фигня, вид сбоку - ReadFile не работает, говорит, что считано 0 байт. При этом она же говорит, что ошибок нет, errno == 0.<br><br>Жил какое-то время без отладки, потом поставил VS 2026 - отладчик заработал, всё открывается, читается и т.д. Пока через ту же мою сишную dll-ку.<br>Выкидывать её и менять на импорт WinApi непосредственно в C#, как было изначально, пока лениво. Может быть потом, пока не капает.<br><br>Запись пока не пробовал.]]></description>
        <author>hd44780</author>
        <category>.NET: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=469991&amp;view=findpost&amp;p=3932427</guid>
        <pubDate>Sun, 30 Nov 2025 16:40:23 +0000</pubDate>
        <title>Чтение секторов физического диска на C#</title>
        <link>https://forum.sources.ru/index.php?showtopic=469991&amp;view=findpost&amp;p=3932427</link>
        <description><![CDATA[hd44780: Доброго времени суток всем.<br>
<br>
Возникла задачка читать/писать данные на хард, работающий не на PC. Кому интересно, где именно - это хард от ZX Spectrum Scorpion.<br>
Соответственно там нет никаких Fat и прочего. Есть ряд прог, понимающих &quot;православные&quot; Fat32, LFN, но не об этом речь, т.к. всё это читается/пишется без всяких бубнов стандартными для той же винды средствами.<br>
Читать/писать нужно чисто спектрумовский раздел. Он есть в MBR с кодом системы 53h, винда его видит просто как какой-то раздел.<br>
<br>
Структура его мне известна. Захотелось мне работать с ним на компе. Решил писать на C#.<br>
Список физ хардов считал через WMI, там всё норм, оттуда же вытащил имена физ дисков вида &#092;&#092;.&#092;PhysicalDrive3. Дальше нужно читать MBR и прочее.<br>
Сама .NET, как я понимаю, и по сей день не научилась делать такие вещи, нашёл решение через P/Invoke. Упрощённо:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// Use interop to call the CreateFile function.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// For more information about CreateFile, see the unmanaged MSDN reference library.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;[DllImport(&quot;kernel32.dll&quot;, SetLastError = true, CharSet = CharSet.Unicode)]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;private static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;uint dwFlagsAndAttributes, IntPtr hTemplateFile);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;[DllImport(&quot;kernel32.dll&quot;, SetLastError = true)]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;private static extern bool ReadFile(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;IntPtr hFile, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// handle to file</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;byte[] lpBuffer, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// data buffer</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int nNumberOfBytesToRead, &nbsp; &nbsp; &nbsp; &nbsp;// number of bytes to read</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ref int lpNumberOfBytesRead, &nbsp; &nbsp;// number of bytes read</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;IntPtr lpOverlapped</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// ref OVERLAPPED lpOverlapped &nbsp; &nbsp; &nbsp; &nbsp;// overlapped buffer</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;);</div><div class="code_line">........</div><div class="code_line">&nbsp;</div><div class="code_line">Использование:</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Try to open the file.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;IntPtr ptr = CreateFile(Path, GENERIC_READ, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Console.WriteLine($&quot;Path: {Path}; descriptor: {ptr:X8}h&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;handleValue = new SafeFileHandle(ptr, true);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_fs = new FileStream(handleValue, FileAccess.Read);</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Path - тот самый стандартный для винды &quot;&#092;&#092;.&#092;PhysicalDrive3&quot; (имя нерегистрочувствительное, проверял  :D ).<br>
Читает оно через винапишный ReadFile.<br>
<br>
Прикол в том, что когда я запускаю прогу напрямую (из фара, проводника) всё шикарно работает, сектора читаются.<br>
Но когда запускаю из-под студии (у меня 2022) - CreateFile кидает ошибку и всё. Причём неважно - Release/Debug.<br>
По итогу я не могу пользоваться отладкой.<br>
<br>
Вопрос почему оно так себя ведёт? И как это побороть?<br>
<br>
Спасибо.]]></description>
        <author>hd44780</author>
        <category>.NET: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	