С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1 / 1 / 0
Регистрация: 10.11.2018
Сообщений: 85

Перезаписывать данные на жестком диске из под Винды

23.02.2024, 08:33. Показов 2152. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Говорю сразу: я не пишу вирус!
Мне нужно затирать данные о стёртых файлах, поэтому на c++ пишу такую прогу. Такой вопрос встал: почему начиная с 4.194.304 смещения в FAT32 Винда не позволяет туда что-либо записывать, при этом записать что-то с нулевого смещения ось позволяет (само-собой весь раздел к чертям летит).
Для чего я это делаю? Родина поставила задачу сделать софтину, которая полностью будет стирать данные об удаленном файле. Проблема в том, что Recuva и прочие находят метаданные удаленного файла. Да, восстановить его нельзя, но остается след о том, что файл в принципе был на этом компьютере. Поэтому возникает необходимость лезть напрямую в раздел.
Имею вот такой код:
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include <windows.h>
#include <iostream>
#include <filesystem>
#include <iomanip>
#include <sstream>
#include <Dbt.h>
 
 
int main() {
    setlocale(LC_ALL, "rus");
    //Путь к диску U:, его открытие     L"\\\\.\\PhysicalDrive0\\Partition2";
    
    //Путь к разделу через физический диск
    const wchar_t* partitionU = L"\\\\.\\U:";
 
    HANDLE hDisk = CreateFile(partitionU, 
        GENERIC_READ | GENERIC_WRITE, 
        FILE_SHARE_READ | FILE_SHARE_WRITE, 
        NULL, OPEN_EXISTING, 0, NULL);
 
    if (hDisk == INVALID_HANDLE_VALUE) {
        std::cout << GetLastError() << std::endl;
        return 0;
    }
    else std::cout << "Success!" << std::endl;
    //****************************************
 
 
    
 
    // Получаем информацию о геометрии диска
    DISK_GEOMETRY diskGeometry;
    DWORD bytesReturned;
 
    if (DeviceIoControl(hDisk, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, &diskGeometry, sizeof(diskGeometry), &bytesReturned, NULL)) {
        // Выводим информацию о геометрии диска
        std::cout << "DISK INFO\n*************************************\n";
        std::cout << "Тип диска: " << diskGeometry.MediaType << std::endl;
        std::cout << "Секторов на треке: " << diskGeometry.SectorsPerTrack << std::endl;
        std::cout << "Число головок: " << diskGeometry.TracksPerCylinder << std::endl;
        std::cout << "Общее число секторов: " << diskGeometry.Cylinders.QuadPart * diskGeometry.TracksPerCylinder * diskGeometry.SectorsPerTrack << std::endl;
    }
    else {
        std::cerr << "Ошибка при получении информации о геометрии диска. Код ошибки: " << GetLastError() << std::endl;
    }
    std::cout << "*****************************************\n\n\n" << std::endl;
    //*******************************************
    
 
 
 
    //Проверка атрибутов тома
    const wchar_t* diskPath = L"\\\\.\\U:";
    DWORD attributes = GetFileAttributes(diskPath);
    if (attributes != INVALID_FILE_ATTRIBUTES) {
        // Проверка наличия атрибута FILE_ATTRIBUTE_READONLY
        if (attributes & FILE_ATTRIBUTE_READONLY) {
            std::cout << "Диск доступен только для чтения." << std::endl;
        }
        else {
            std::cout << "Диск доступен для записи." << std::endl;
        }
    }
    else {
        std::cerr << "Ошибка при получении атрибутов диска. Код ошибки: " << GetLastError() << std::endl;
        
    }
    //******************
 
 
 
    //указатель должен быть установлен на бит кратный 512-ти от 0 (0, 512, 1024, 1536 и т.д)
    //чтение данных с байта 4 194 304. 
        if (SetFilePointer(hDisk, 4194304, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER) {
            std::cerr << "Ошибка установки указателя: ";
            return GetLastError();
        }
   
        byte buffer[512*1]; //кол-во секторов *n
        DWORD dwRead;
 
        int sector_count = 0;
        int row_count = 0;
        int str_count = 0;
 
        if (ReadFile(hDisk, buffer, sizeof(buffer), &dwRead, NULL)) {
            std::cout << "Прочитано байт:" << dwRead << std::endl;
            for (DWORD i = 0; i < dwRead; ++i) {
                if (row_count != 15) {
                    std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(buffer[i]) << " ";
                    row_count++;
                }
                else {
                    std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(buffer[i]) << " "<<std::endl; 
                    row_count = 0;
                    sector_count++;
                }
                if (sector_count == 32) {
                    std::cout << "-----------------------" << str_count++ << "------------------------" << std::endl;
                    sector_count = 0;
                }
            }
            std::cout << std::endl;
        }
        else {
            std::cerr << "Ошибка при чтении: " <<GetLastError() << std::endl;
        }
    //*********************************
 
 
 
 
    //сделать замену в имени файла 
    //    for (int i = 0; i <=30;i++)
    //    buffer[321+i] = 0xff;
    //**************
 
 
 
 
    //*******поиск нужных данных*******
        
    //*********************************
 
 
    //***************Переписывание данных**********
    byte* pointer = reinterpret_cast<byte*>(4194304);
    LARGE_INTEGER largeInt;
    largeInt.QuadPart = reinterpret_cast<LONG_PTR>(pointer);
 
    if (!SetFilePointerEx(hDisk, largeInt, NULL, FILE_BEGIN)) { //file_begin - от начала файла
        std::cerr << "Ошибка установки указателя: ";
        return GetLastError();
    }
 
    DWORD dwBytesWritten = 0;
    //const char dataToWrite[] = "\xd2";
    // Создаем массив из 512 значений
    unsigned char byteArray[512];
    // Заполняем массив нужными значениями, например, 0xFF
    memset(byteArray, 0xFF, sizeof(byteArray));
 
 
    /*
    for (int i = 0; i <= 240; i++) {
        byteArray[i] = buffer[i];
    }
    for (int i = 241; i <= 511; i++) {
        byteArray[i] = 0x00;
    }*/
    
    
    if (WriteFile(hDisk, byteArray , sizeof(byteArray), &dwBytesWritten, NULL)) {
        std::cout << "Данные успешно записаны. Байтов записано: " << dwBytesWritten << std::endl;
    }
    else {
        std::cerr << "Ошибка при записи данных: " << GetLastError() << std::endl;
    }
    //**************************************
 
 
 
 
    //**************************************
    
    CloseHandle(hDisk);
    return 0;
}
Вопрос: как ось заставить дать мне полный карт-бланш на редактирование?
p.s надеюсь вопрос в правильном разделе задал, а не в ремонте холодильников
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.02.2024, 08:33
Ответы с готовыми решениями:

Можно ли перенести информацию о жестком диске, чтобы на новом жестком диске была информация со старого
можно ли как то перенести или подминить информация о жестком диске. чтобы на новом жестком диске была информация со старого. путь к...

Защитить данные на жестком диске
Подскажите, злодеи смогут ли убрать пароль на HDD который на уровне БИОСа ставится на ноутбуке ? То есть смогут ли прочитать диски SSD и...

Как восстановить данные на неисправном жестком диске?
Здравствуйте. Такое дело - у меня перестал загружаться жесткий диск после недолгих попыток самому разобраться с ситуацией - я вызвал...

19
Злостный нарушитель
 Аватар для Verevkin
10242 / 5670 / 1261
Регистрация: 12.03.2015
Сообщений: 26,270
23.02.2024, 10:19
Родина попросила стирать инфу только с FAT32-разделов?



Как Родина называется?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
23.02.2024, 10:41
А какую ошибку возвращает?
0
1 / 1 / 0
Регистрация: 10.11.2018
Сообщений: 85
23.02.2024, 10:50  [ТС]
nmcf, ошибка 5 - ERROR_ACCESS_DENIED, доступ запрещен. Причем запрещает доступ к таблице, от нулевого смещения и до таблицы он позволяет легко вносить изменения и ронять раздел
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
23.02.2024, 10:59
Запускал от имени Администратора? Без share пробовал?
0
1 / 1 / 0
Регистрация: 10.11.2018
Сообщений: 85
23.02.2024, 11:08  [ТС]
nmcf, да, всё от админа. А "без share" - это как это понять?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
23.02.2024, 11:24
Ну когда открываешь (CreateFile), запретить совместный доступ.
0
1 / 1 / 0
Регистрация: 10.11.2018
Сообщений: 85
23.02.2024, 11:41  [ТС]
nmcf, не канает, сразу же ошибка 32 - файл занят другим процессом. Вроде никто к нему не обращается, я это раздел для тестов на 100 мб выделил
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
23.02.2024, 12:00
Наверное, нужен какой-то монопольный доступ.
Есть такая программа - Win32 Disk Imager. Небольшая, с использованием Qt. Посмотри, как там сделана запись.
https://sourceforge.net/projects/win32diskimager/
0
1 / 1 / 0
Регистрация: 10.11.2018
Сообщений: 85
23.02.2024, 12:08  [ТС]
nmcf, Благодарю!
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
26.02.2024, 13:29
Цитата Сообщение от Qouk Посмотреть сообщение
указатель должен быть установлен на бит кратный 512-ти
Видимо, не 512, а размеру сектора. Они не всегда равны.
Цитата Сообщение от Qouk Посмотреть сообщение
почему начиная с 4.194.304 смещения
Чем примечательно именно это смещение?
0
1 / 1 / 0
Регистрация: 10.11.2018
Сообщений: 85
27.02.2024, 08:39  [ТС]
COKPOWEHEU, указанное смещение является началом FAT таблицы. Создавал несколько разделов - именно с него везде начинается таблица.
Про размер сектора - он однозначно равен 512, потому что практика показала именно это значение, при котором получается считывать биты, иначе ошибка 87 - не верно переданные аргументы. + ко всему, если взять какую-либо авторитетную программу типа WinHex - она сама показывает что сектора равны именно 512-ти
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
27.02.2024, 12:30
Qouk, а честно читать и парсить FAT вы не пытаетесь? Там ведь от способа форматирвоания зависит и размер сектора, и количество копий FAT, и начало корневого раздела (кстати, в fat16 сделано еще более упорото: под корневой каталог выделена область фиксированного размера).
Собственно, на вашем месте я бы с этого и начал - с парсинга существующих FAT-ов, чтения файлов и т.д. И, в общем-то, когда я делал эмуляцию fat16 на контроллере, так и делал.
Цитата Сообщение от Qouk Посмотреть сообщение
Про размер сектора - он однозначно равен 512, потому что практика показала именно это значение, при котором получается считывать биты, иначе ошибка 87 - не верно переданные аргументы
Это точно размер сектора FAT, а не особенность доступа к устройству? Ну то есть блочные устройства вроде жестких дисков на то и блочные, что работа с ними возможна только по блокам, а не по байтам.
Скажем, у SD-карточки тоже работа возможна только с 512 байтами за раз, и это никак не связано с файловой системой. Это ограничение железки.
0
1 / 1 / 0
Регистрация: 10.11.2018
Сообщений: 85
28.02.2024, 05:09  [ТС]
COKPOWEHEU, ох ёлки зелёные... Вот об этом не задумывался. Да суть даже не в этом, а в том что ОС не даёт туда ничо писать. Взять тот же DOS - так тому пофигу будет.
Мне просто нужно разобраться как сказать оси, чтобы дала мне полный карт-бланш на запись в диск что угодно и где угодно.

На счёт блочных устройств и соответствующей с ними работы - не проблема. Копировать блок, искать в нем название стертого файла, вписывать туда ересь, переписать всё на место.
P.S Вспомнил! Устройство одно - террабайтник HDD, на нём я создавал несколько тестовых секторов FAT и NTFS. В NTFS раздел можно по одному байту писать куда угодно. Стало быть дело явно не в железке.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
28.02.2024, 09:53
Qouk, ты посмотрел ту программу? Разобрался?
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
28.02.2024, 10:41
Цитата Сообщение от Qouk Посмотреть сообщение
Да суть даже не в этом, а в том что ОС не даёт туда ничо писать.
А в другие места? До какого адреса вам еще разрешена запись? Точно ли вы уверены, что по этим адресам находятся нужные вам данные? Не используется ли этот раздел самой ОС? Не вышли ли вы за его пределы?
Можно попробовать создать "эталонный" образ FAT, создавать-удалять файлы, монтировать его в ОС и смотреть как он там будет выглядеть. Опять же для проверки адресов. Ладно к реальному устройству ОС может не давать доступа, но уж к локальному-то файлу мешать не будет.
Или винда так не умеет?
Цитата Сообщение от Qouk Посмотреть сообщение
Копировать блок, искать в нем название стертого файла
Не найдете. Прямым поиском по памяти можно найти разве что короткое имя файла, 8.3. А полноценное (длинное, с юникодом и все такое) разбито мелкими кусками по файлу каталога. Там тоже по-дурацки сделано, что одна запись (один "файл") хранит короткое имя и все атрибуты, включая адрес первого сектора и все такое, а потом идет еще запись (невидимый "файл"), в которой обычные поля используются для хранения частей полного имени файла. ЕМНИП на три части делится. Если имя длинное и в одно запись не помещается (а они фиксированного размера), то выделяется еще одна. В общем, организация у FAT веселая.
Кстати об адресе первого сектора. Вы не забываете перед удалением пройтись по всей цепочке секторов и очистить содержимое? Потому что обычное удаление это всего лишь очистка флага "занято" на секторе и удаление записи из каталога.
0
1 / 1 / 0
Регистрация: 10.11.2018
Сообщений: 85
28.02.2024, 12:49  [ТС]
nmcf, программку я ту смотрел, да не нашел того, что мне нужно. Однако вопрос можно закрывать, поскольку я разобрался в чём беда: демонтаж раздела.

Добавлено через 5 минут
COKPOWEHEU, да, с этим я давно разбирался. Отвечу на ваши вопросы, потом уже на свой (точнее там все просто - демонтирование раздела решило мою проблему).
До какого раздела разрешена запись? 512*6669.
Уверен ли я что по этим адресам находятся нужные мне данные? Нужные мне данные хранятся в таблице FAT, с которой я так же разобрался. Спасибо великому WinHex (и демонтированию раздела, который так же вывел меня из тупика).

Эталонный образ FAT? Громко сказано, конечно, скорее тестовый. Да, только на таких и экспериментирую.
Про разделение на имени файла на части - не страшно, с докой к фатке уже разобрался. Экскремент, конечно, тот еще этот фат, NTFS мне понравился больше в этом плане
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
28.02.2024, 13:20
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Не используется ли этот раздел самой ОС?
Цитата Сообщение от Qouk Посмотреть сообщение
демонтирование раздела решило мою проблему
Если вы на смонтированной ФС экспериментировали, удивительно, что хоть куда-то писать могли.
Цитата Сообщение от Qouk Посмотреть сообщение
Экскремент, конечно, тот еще этот фат, NTFS мне понравился больше в этом плане
Неужели у NTFS структура проще, чем у FAT?!
0
1 / 1 / 0
Регистрация: 10.11.2018
Сообщений: 85
28.02.2024, 13:54  [ТС]
COKPOWEHEU, прикол в том, что узнав из книжки по криминалистическому анализу, у FAT есть скрытый раздел, который даже системой не используется (т.е вот эти самые первые 0 - 6669 кластеров). Видимо поэтому я "на горячую" смог туда че-то пихать.
Про простоту NTFS перед фатом... "-А я вам этот фиг вам сейчас нарисую". (там внизу - это чем заполнен текстовик. Т.е нет такого как у FAT что метаданные на отшибе диска, тут вот, метаданные и тут же наполнение файла)
Даже если картинку со структурой найти - там все будет просто друг за другом идти: имя, дата создания, изменения и т.п
А не как в фате: посреди имени хэш сумма, еще че-то, потом разбиение длинного имени на части, потом указание сколько частей у имени. Короче, геморрой. К тому же у NTFS не надо целый кластер переписывать, можно обратиться к конкретному байту и только его переписать.
Миниатюры
Перезаписывать данные на жестком диске из под Винды  
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
28.02.2024, 21:36
Цитата Сообщение от Qouk Посмотреть сообщение
у FAT есть скрытый раздел, который даже системой не используется
Его запросто может не быть. А может быть другого размера. В заголовке FAT есть такое поле, как SecReserved (14-15 байты). Оно не может быть меньше 1, поскольку туда входит весь заголовочный сектор, но может быть больше. Для чего конкретно оно используется не знаю. Возможно, некоторые драйверы там хранят какие-то данные. В своей реализации я его выставил в 1 (только PBR), и никаких скрытых разделов не создавал.
Если интересно, вот краткое описание моих экспериментов с fat16: https://habr.com/ru/articles/654853/ Там есть и про структуру PBR, и про структуру каталогов, имен файлов, даже длинные имена вскользь упомянуты.
Цитата Сообщение от Qouk Посмотреть сообщение
Про простоту NTFS перед фатом..
Именно про NTFS не скажу, но вроде как общий подход у них схожий с ext2 и подобными. Про них я тоже знаю немного, но вроде как там хранение файла вообще иерархическое, то есть в "файле" может храниться как сам файл, так и ссылки на его части. И потом ползай по дереву, собирай. Кстати, имя файла там принадлежит не файлу, а каталогу, ведь есть такая замечательная штука как хардлинки. Это когда один и тот же файл принадлежит нескольким разным каталогам.
Цитата Сообщение от Qouk Посмотреть сообщение
А не как в фате: посреди имени хэш сумма
В Фате нет хеш-суммы, это слишком старая и примитивная файловая система.
Цитата Сообщение от Qouk Посмотреть сообщение
К тому же у NTFS не надо целый кластер переписывать, можно обратиться к конкретному байту и только его переписать.
Еще раз: это не особенность FAT, это особенность железа. Вы на своем жестком диске не можете переписать один байт, неважно FAT там или что-то другое. А разделение на кластеры есть, кажется, во всех ФС.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.02.2024, 21:36
Помогаю со студенческими работами здесь

Возможно ли спасти данные, которые остались на жестком диске?
Прочитав немного-немало на этом форуме, поняла, что жесткому диску пришел конец. Вопрос Возможно ли спасти данные, которые остались на...

Я, кажется, удалил все разделы на жестком диске, как теперь достать данные?
Есть жесткий диск с windows 8 и важными данными, данные с которого нужно скопировать на другой компьютер. Диск подключен через usb...

Как защитить и зашифровать данные на жестком диске с Windows 2000 и Windows 98?
Привет всем. Есть проблемка. Необходимо защитить данные на жестком диске с Win2000 и Win98(стоят совместно) причём защитить так, то...

Не перезаписывать данные в функции
Здравствуйте, помогите логически составить схему, запрограммировать я смогу и сам, есть данные: table1: ID | кол-во блоков 2 | 5 ...

Как перезаписывать данные из таблицы №1 в таблицу №2?
всем привет вот такая проблема мне надо перезаписывать данные из `ss` в `&quot;.$varvar.&quot;` если `ss`.`id`=...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru