Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2017, 15:43   #1
AntonCH
Пользователь
 
Регистрация: 28.11.2017
Сообщений: 58
По умолчанию Чтение\Запись в загрузочный сектор

Задача такая - осуществить чтение и запись из\в загрузочный сектор usb диска.
Код:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PasswordUSB
{
    class FileReader
    {
        const uint GENERIC_READ = 0x80000000;
        const uint FILE_SHARE_READ = 0x00000001;
        const uint FILE_SHARE_WRITE = 0x00000002;
        const uint FILE_ATTRIBUTE_NORMAL = 0x80;
        const uint OPEN_EXISTING = 3;
        System.IntPtr handle;

        [System.Runtime.InteropServices.DllImport("kernel32", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = System.Runtime.InteropServices.CharSet.Unicode)]
        static extern unsafe System.IntPtr CreateFile
        (
            string FileName,          // file name
            uint DesiredAccess,       // access mode
            uint ShareMode,           // share mode
            uint SecurityAttributes,  // Security Attributes
            uint CreationDisposition, // how to create
            uint FlagsAndAttributes,  // file attributes
            int hTemplateFile         // handle to template file
        );

        [System.Runtime.InteropServices.DllImport("kernel32", SetLastError = true)]
        static extern unsafe bool ReadFile
        (
            System.IntPtr hFile,      // handle to file
            void* pBuffer,            // data buffer
            int NumberOfBytesToRead,  // number of bytes to read
            int* pNumberOfBytesRead,  // number of bytes read
            int Overlapped            // overlapped buffer
        );

        [System.Runtime.InteropServices.DllImport("kernel32", SetLastError = true)]
        static extern unsafe bool CloseHandle
        (
            System.IntPtr hObject // handle to object
        );

        public bool Open(string FileName)
        {
            
            // open the existing file for reading       
            handle = CreateFile
            (
                FileName,
                GENERIC_READ,
                FILE_SHARE_READ | FILE_SHARE_WRITE,
                0,
                OPEN_EXISTING,
                FILE_ATTRIBUTE_NORMAL,
                0
            );
            

            if (handle.ToInt32() != -1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public unsafe int Read(byte[] buffer, int index, int count)
        {
            int n = 0;
            fixed (byte* p = buffer)
            {
                if (!ReadFile(handle, p + index, count, &n, 0))
                {
                    System.Windows.Forms.MessageBox.Show("WinError - "+System.Runtime.InteropServices.Marshal.GetLastWin32Error().ToString());

                    return n;

                }
            }
            return n;
        }

        public bool Close()
        {
            return CloseHandle(handle);
        }
    }
}
При попытке чтения с usb диска G выдает ошибку 87 - неверный параметр. При попытке читать с жесткого диска ошибку 6 - неверный дескриптор.
Код:
private void button1_Click(object sender, EventArgs e)
        {
            PasswordUSB.FileReader FReader = new PasswordUSB.FileReader();
            // \\\\.\\G:
            if (FReader.Open("\\\\.\\C:"))
            {
                byte[] buffer = new byte[1024];
                int Count = FReader.Read(buffer, 0, buffer.Length);
                MessageBox.Show(Count.ToString());
            }
            else
            {
                MessageBox.Show("Не открыли");
            }
            FReader.Close();
        }
Что не так с параметрами?
AntonCH вне форума Ответить с цитированием
Старый 28.11.2017, 23:11   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Ваш код отлично читает 1024 байта с диска C: при запуске с элевацией прав.
При запуске без элевации, как и ожидалось, "Не открыли".

Windows 8.1. Может быть, в десятке что-то изменилось, ночью попробую

Последний раз редактировалось Black Fregat; 28.11.2017 в 23:13. Причина: Добавил про версию Windows
Black Fregat вне форума Ответить с цитированием
Старый 29.11.2017, 14:20   #3
AntonCH
Пользователь
 
Регистрация: 28.11.2017
Сообщений: 58
По умолчанию

При запуске с правами администратора действительно читает с жесткого, а вот с флешки почему-то не хочет - по прежнему winerror 87.
AntonCH вне форума Ответить с цитированием
Старый 29.11.2017, 14:39   #4
AntonCH
Пользователь
 
Регистрация: 28.11.2017
Сообщений: 58
По умолчанию

С флешки не читал потому что там размер кластера 4096. Увеличил размер буфера до оного и запустил с правами админа и все заработало.
AntonCH вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
записать свой загрузочный сектор на флешку MetR Помощь студентам 0 10.12.2011 18:15
Запись в первые 512байт(бут сектор) флешки. asmars C++ Builder 5 11.09.2011 18:31
Запись в МХ сектор HellMercenariess Свободное общение 0 03.08.2009 04:07
ЗАПИСЬ В ЗАГРУЗОЧНЫЙ СЕКТОР ERASERROR Общие вопросы Delphi 6 15.01.2008 23:27