Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/54: Рейтинг темы: голосов - 54, средняя оценка - 4.50
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449

Как читать/записывать ячейки SD карты (Flash карты)

03.04.2013, 17:29. Показов 11442. Ответов 60
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток, возникла необходимость прочесть/записать ячейки SD карты.

Подобно тому как это делает программа WinHex

Смотри

Как возможно это сделать ?

Заранее спасибо!
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.04.2013, 17:29
Ответы с готовыми решениями:

Как записывать со встроенной звуковой карты?
Здравствуйте. Есть ноут ASUS K52JB и есть проблема: в аудиоустройствах отображаются только динамики Conexant CX20671 SmartAudio HD (для...

Есть номер банкоматовской карты. Как по одному номеру карты можно снять деньги?
Есть номер банкоматовской карты. Как по одному номеру карты можно снять деньги? Пин кода нет. Только номер карты Добавлено через 7...

Восстановление SDHC-flash карты.
Давно, когда покупал фотик, прикупил к нему флешку на 16гиг. Кароче проработала она с месяц гдето, и перестала опознаваться, похоронив в...

60
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449
12.04.2013, 19:55  [ТС]
Студворк — интернет-сервис помощи студентам
A1exSun, спасибо большое, хоть немного прояснилось)

Вот только почему то читаемые значения не совпадают со значения записанными на SD

Добавлено через 3 минуты
Цитата Сообщение от A1exSun Посмотреть сообщение
Попробуй в HEX вывести:

C#
1
for (int i = 0; i < data.Length; i++) Console.Write(data[i].ToString("X2"));
Так ?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
        static void Main(string[] args)
        {
             //handle = CreateFile("\\\\.\\PhysicalDrive1", GENERIC_READ, 1 | 2, 0, OPEN_EXISTING, 0x80, 0);
           handle = CreateFile("\\\\.\\PhysicalDrive1", GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
 
            Console.WriteLine("Last error: " + Marshal.GetLastWin32Error());
 
            Console.Write(handle.ToInt64());
 
            SetFilePointer(handle, 0x400, 0, EMoveMethod.Begin);
 
            byte[] data = new byte[512];
            int n = Read(data, 0, 512);
 
            for (int i = 0; i < data.Length; i++) Console.Write(data[i].ToString("X2"));
 
            Console.WriteLine(Encoding.Default.GetString(data));
            Console.WriteLine("Bytes read: " + n + ", last error: " + Marshal.GetLastWin32Error());
 
            Console.ReadKey();
            CloseHandle(handle);
        }
 
        static unsafe int Read(byte[] buffer, int index, int count)
        {
            int n = 0;
            fixed (byte* p = buffer)
                if (!ReadFile(handle, p + index, count, &n, 0)) return 0;
            return n;
        }
0
C#
57 / 57 / 5
Регистрация: 09.03.2013
Сообщений: 216
12.04.2013, 20:22
Да, так. С буквой диска тоже не совпадают?

C#
1
handle = CreateFile("\\\\.\\C:", GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
(проверяй на флешке, на локальных дисках может быть ошибка 32 - используется другим процессом)
0
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449
12.04.2013, 20:26  [ТС]
Цитата Сообщение от A1exSun Посмотреть сообщение
(проверяй на флешке, на локальных дисках может быть ошибка 32 - используется другим процессом)
Ага 32

Добавлено через 1 минуту
Цитата Сообщение от A1exSun Посмотреть сообщение
Да, так. С буквой диска тоже не совпадают?
Неа
0
C#
57 / 57 / 5
Регистрация: 09.03.2013
Сообщений: 216
12.04.2013, 20:39
У меня все сходится. Специально скачал WinHex. В нем тоже можно смотреть диск как устройство и как логический...
Миниатюры
Как читать/записывать ячейки SD карты (Flash карты)   Как читать/записывать ячейки SD карты (Flash карты)  
0
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449
12.04.2013, 20:40  [ТС]
Чудеса ! Работает кажись !

Только вот что то не все байты читает

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
        public enum EMoveMethod : uint
        {
            Begin = 0,
            Current = 1,
            End = 2
        }
 
        [DllImport("Kernel32.dll", SetLastError = true)]
        static extern uint SetFilePointer(IntPtr hFile, int lDistanceToMove, int lpDistanceToMoveHigh, EMoveMethod dwMoveMethod);
 
        [DllImport("kernel32", SetLastError = true)]
        static extern unsafe bool CloseHandle
        (
            System.IntPtr hObject // handle to object
        );
 
        static IntPtr handle;
 
        static void Main(string[] args)
        {
           //handle = CreateFile("\\\\.\\PhysicalDrive1", GENERIC_READ, 1 | 2, 0, OPEN_EXISTING, 0x80, 0);
           //handle = CreateFile("\\\\.\\PhysicalDrive1", GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
           handle = CreateFile("\\\\.\\G:", GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
 
 
 
           Console.WriteLine("Last error: " + Marshal.GetLastWin32Error());
 
           Console.Write(handle.ToInt64());
 
           SetFilePointer(handle, 0x200, 0, EMoveMethod.Begin);
 
           byte[] data = new byte[2048];
           int n = Read(data, 0, 2048);
 
           //for (int i = 0; i < data.Length; i++) Console.Write(data[i].ToString("X2"));
 
           Console.WriteLine(Encoding.Default.GetString(data));
           Console.WriteLine("Bytes read: " + n + ", last error: " + Marshal.GetLastWin32Error());
 
           Console.ReadKey();
           CloseHandle(handle);
        }
Миниатюры
Как читать/записывать ячейки SD карты (Flash карты)  
0
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449
12.04.2013, 20:43  [ТС]
А не все все читает !
Огромное спасибо !
0
C#
57 / 57 / 5
Регистрация: 09.03.2013
Сообщений: 216
12.04.2013, 20:46
Отлично
Зачем это, если не секрет?
0
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449
12.04.2013, 20:49  [ТС]
Во еще что глянь

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
        public enum EMoveMethod : uint
        {
            Begin = 0,
            Current = 1,
            End = 2
        }
 
        [DllImport("Kernel32.dll", SetLastError = true)]
        static extern uint SetFilePointer(IntPtr hFile, int lDistanceToMove, int lpDistanceToMoveHigh, EMoveMethod dwMoveMethod);
 
        [DllImport("kernel32", SetLastError = true)]
        static extern unsafe bool CloseHandle
        (
            System.IntPtr hObject // handle to object
        );
 
        static IntPtr handle;
 
        static void Main(string[] args)
        {
           handle = CreateFile("\\\\.\\G:", GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
 
 
 
           Console.WriteLine("Last error: " + Marshal.GetLastWin32Error());
 
           Console.Write(handle.ToInt64());
 
           SetFilePointer(handle, 0x200, 0, EMoveMethod.Begin);
 
           byte[] data = new byte[1024];
           int n = Read(data, 0, 1024);
 
           //for (int i = 0; i < data.Length; i++) Console.Write(data[i].ToString("X2"));
 
           Console.WriteLine(Encoding.Default.GetString(data));
           Console.WriteLine("Bytes read: " + n + ", last error: " + Marshal.GetLastWin32Error());
 
           Console.ReadKey();
           CloseHandle(handle);
        }
По идеи должен читать от 0x000 до 0x200, а получается от 0x200 до 0x600 читает
Миниатюры
Как читать/записывать ячейки SD карты (Flash карты)  
0
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449
12.04.2013, 20:51  [ТС]
Цитата Сообщение от A1exSun Посмотреть сообщение
Зачем это, если не секрет?
Секрета нет
первым дело нужно прочитать, а вторым записать.
Это нужно для того, чтобы после записанные байты прочить с SD карты при помощи контроллера MSP430G и вывести на LED матрицу

Ранее на SD карту при помощи MSP430G записал 1КБ по адресу с 0x200 по 0x600, вот мучился чтобы прочитать SD на компе
Спасибо тебе за помощь

Теперь буду мучится как записать на SD
0
C#
57 / 57 / 5
Регистрация: 09.03.2013
Сообщений: 216
12.04.2013, 21:00
Цитата Сообщение от sasha0192 Посмотреть сообщение
По идеи должен читать от 0x000 до 0x200, а получается от 0x200 до 0x600 читает
Дык куда указатель в файле установлен:
C#
1
SetFilePointer(handle, 0x200, 0, EMoveMethod.Begin);
И читаешь 1024, что равно 0x400.

Добавлено через 6 минут
Цитата Сообщение от sasha0192 Посмотреть сообщение
Это нужно для того, чтобы после записанные байты прочить с SD карты при помощи контроллера MSP430G и вывести на LED матрицу

Ранее на SD карту при помощи MSP430G записал 1КБ по адресу с 0x200 по 0x600, вот мучился чтобы прочитать SD на компе
Спасибо тебе за помощь

Теперь буду мучится как записать на SD
Зачем все это? Что устройство будет делать? Или просто учишься работать с флешкой?

Пожалуйста. Я тоже вместе с тобой учился читать/писать диски

Писать полностью аналогично - открывать с флагом GENERIC_WRITE (или можно GENERIC_READ | GENERIC_WRITE) и WriteFile().
C#
1
const uint GENERIC_WRITE = 0x40000000;
0
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449
12.04.2013, 21:03  [ТС]
Цитата Сообщение от A1exSun Посмотреть сообщение
Зачем все это? Что устройство будет делать? Или просто учишься работать с флешкой?
Тупо выводить байты на матрицу, типа бегущая строка.
Работали с микроконтроллерами ?

Добавлено через 36 секунд
Цитата Сообщение от A1exSun Посмотреть сообщение
Писать полностью аналогично - открывать с флагом GENERIC_WRITE (или можно GENERIC_READ | GENERIC_WRITE) и WriteFile().
Сейчас попробую
0
C#
57 / 57 / 5
Регистрация: 09.03.2013
Сообщений: 216
12.04.2013, 21:05
Цитата Сообщение от sasha0192 Посмотреть сообщение
Тупо выводить байты на матрицу, типа бегущая строка.
Работали с микроконтроллерами ?
С PIC18F252 в универе совсем немного
0
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449
12.04.2013, 21:10  [ТС]
А как запустить с параметром запись ?
0
C#
57 / 57 / 5
Регистрация: 09.03.2013
Сообщений: 216
12.04.2013, 21:15
В смысле с параметром?
Кстати, я забыл, полученный хендл с помощью CreateFile можно использовать в FileStream.
C#
1
2
3
4
5
6
7
8
9
10
11
        [DllImport("kernel32", SetLastError = true)]
        static extern SafeFileHandle 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
        );
И для чтения/записи использовать его методы Read/Write.
0
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449
12.04.2013, 21:21  [ТС]
Цитата Сообщение от A1exSun Посмотреть сообщение
В смысле с параметром?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
        static void Main(string[] args)
        {
           // Write
           handle = CreateFile("\\\\.\\G:", GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
           Console.WriteLine("Last error: " + Marshal.GetLastWin32Error());
 
           SetFilePointer(handle, 0x200, 0, EMoveMethod.Begin);
 
           byte[] data = new byte[1024];
 
           for (int i = 0; i < 1024; i++)
           {
               data[i] = 6;
           }
 
           Write(data, 0, 2048);
 
 
           // Read
           handle = CreateFile("\\\\.\\G:", GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
           Console.WriteLine("Last error: " + Marshal.GetLastWin32Error());
           SetFilePointer(handle, 0x200, 0, EMoveMethod.Begin);
 
 
 
 
           byte[] datas = new byte[1024];
           int n = Read(datas, 0, 2048);
 
 
           Console.WriteLine(Encoding.Default.GetString(data));
           Console.WriteLine("Bytes read: " + n + ", last error: " + Marshal.GetLastWin32Error());
 
           Console.ReadKey();
           CloseHandle(handle);
        }
 
        static unsafe int Read(byte[] buffer, int index, int count)
        {
            int n = 0;
            fixed (byte* p = buffer)
                if (!ReadFile(handle, p + index, count, &n, 0)) return 0;
            return n;
        }
 
        static unsafe int Write(byte[] buffer, int index, int count)
        {
            int n = 0;
            fixed (byte* p = buffer)
                if (!WriteFile(handle, p + index, count, &n, 0)) return 0;
            return n;
        }
Так ?
0
C#
57 / 57 / 5
Регистрация: 09.03.2013
Сообщений: 216
12.04.2013, 21:27
C#
1
2
3
Write(data, 0, 2048);
...
int n = Read(datas, 0, 2048);
1024?

Во как все упростилось с помощью FileStream:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;
using Microsoft.Win32.SafeHandles;
 
namespace ReadDisk
{
    class Program
    {
        const uint OPEN_EXISTING = 3;
        const uint GENERIC_READ = 0x80000000;
        const uint GENERIC_WRITE = 0x40000000;
        
        [DllImport("kernel32", SetLastError = true)]
        static extern SafeFileHandle 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
        );
 
        static SafeFileHandle handle;
 
        static void Main(string[] args)
        {
            handle = CreateFile("\\\\.\\PhysicalDrive2", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
            byte[] data = new byte[1024];
            FileStream fs = new FileStream(handle, FileAccess.ReadWrite);
            fs.Read(data, 0, 1024);
            for (int i = 0; i < data.Length; i++) Console.Write(data[i].ToString("X2"));
            Console.ReadKey();
        }
    }
}
1
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449
12.04.2013, 21:33  [ТС]
А тут как адрес указывать ?
0
C#
57 / 57 / 5
Регистрация: 09.03.2013
Сообщений: 216
12.04.2013, 21:36
C#
1
fs.Position = 0x200;
http://msdn.microsoft.com/ru-r... tream.aspx
1
 Аватар для sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449
12.04.2013, 21:40  [ТС]
Ага работает спасибо

Запись так ?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        static void Main(string[] args)
        {
           //Write / Read
           handle = CreateFile("\\\\.\\G:", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
           byte[] DataReadWrite = new byte[1024];
           for (int i = 0; i < 1024; i++)
           {
               DataReadWrite[i] = 0x37;
           }
           FileStream WriteRead = new FileStream(handle, FileAccess.ReadWrite);
           WriteRead.Position = 0x200;
           WriteRead.Write(DataReadWrite, 0, 1024);
 
           WriteRead.Position = 0x200;
           WriteRead.Read(DataReadWrite, 0, 1024);
           for (int i = 0; i < DataReadWrite.Length; i++) Console.Write(DataReadWrite[i].ToString("X2"));
           Console.ReadKey();
        }
0
C#
57 / 57 / 5
Регистрация: 09.03.2013
Сообщений: 216
12.04.2013, 21:44
Зачем 2 FileStream?
Проверь, я не пробовал записывать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.04.2013, 21:44

Сколькими способами из колоды (52 карты) можно выбрать 4 карты одной масти?
сколькими способами из колоды(52 карты) можно выбрать 4 карты одной масти? Можно найти общее число исходов, а дальше не знаю как,...

Вывести название карты, заданной двумя числами (достоинство и масть карты)
Здравствуйте , не могу понять как объявить переменные.. требуется же вроде как номер и имя(масть) не понимаю что-то.. помогите пожалуйста,...

Определить вероятность выпадения 4 дам, если из колоды в 32 карты взяли 4 карты
ЗАДАЧА 2: ИЗ 32 карт взяли 4 карты. Какова вероятность, что эти 4 карты все дамы ?

Поиск дисконтной карты при считывании кода с магнитной карты
Добрый день. Конфигурация: Управление торговлей 10.3 Если в Чеке ККМ (или Реализации товаров и услуг) нажать на поле &quot;Дисконтная...

Ввести порядковый номер карты из колоды и вывести в консоль масть и достоинство карты
ввести порядковый номер карты из колоды и выводит в консоль масть и достоинство карты. Колода, начинается с двоек до туза, по очереди, для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru