Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 30.03.2022
Сообщений: 12

Восстановление bad секторов

30.03.2022, 22:34. Показов 2983. Ответов 12
Метки с++ (Все метки)

Студворк — интернет-сервис помощи студентам
Может кто поможет, нужно найти код, выполняющий следующее:
1 - находит бэд блоки на HDD и SSD
2 - восстанавливает эти плохие сектора
Причем нужно использовать "многократное чтение", а что означает "восстановить" не имею представления
Сам искать информацию пытался, но кроме кучи неработающего кода и ссылок на WMI ничего не нашел
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.03.2022, 22:34
Ответы с готовыми решениями:

Как получить список bad секторов на диске?
Всем привет! Как получить список HDD и SSD, подключённых к машине? Как получить список секторов, помеченных как bad? Где хранится эта...

HDD восстановление bad секторов
Здравствуйте, имеется диск Seagate Barracuda 7200.12, на котором куча полезной информации, и с которого нужно ее восстановить. Диск...

300+ (bad) секторов
Здраствуйте, хотел только спросить, это ООООчень плохо когда на ноуте в програме Victoria в тесте я обноружил 300+ битых секторов. Это...

12
 Аватар для JmpShort
6 / 6 / 3
Регистрация: 24.03.2022
Сообщений: 22
31.03.2022, 01:43
Лучший ответ Сообщение было отмечено matthews как решение

Решение

matthews, думаю, единственная загвоздка как восстанавливать,
с этим не сталкивался, но по всей видимости нужно переназначать блок из
смарт-информации диска (как это делать нужно интересоваться)
лично я занимался уничтожением данных, брал по пятьсот двенадцать байт
заполнял значением или опустошал нулями.
У меня есть программа на ассемблере (MS-Dos), если нужен исходный код - подарю,
я его уже дарил китайцам, но что-то этот сайт пропал, он назывался "pudn.com"
там можно было обмениваться кодом на код, мне нужно было что-то там, а они
достаточно ушлые и ничего не принимали, ну я подумал, вот, интересно, и - взяли.
Все довольны!
Ну тебе конечно нужна программа под Windows (разумеется), тогда можно так
читать как обычный файл, например:
C++
1
2
HANDLE hFile=CreateFileA("\\\\.\\PhysicalDrive0",
GENERIC_ALL, FILE_SHARE_READ | FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
Если прочитал и записал - сектор годен, ну и т.д..
1
0 / 0 / 0
Регистрация: 30.03.2022
Сообщений: 12
31.03.2022, 16:59  [ТС]
Спасибо огромное, ассемблера мне и так хватает)
Я как раз и пытаюсь реализовать все с помощью чтения, однако мне не совсем понятно, что делать с записью
Т.е. я должен прочесть сектор в какой-то буффер,а далее с этого буффера записать значение обратно в сектор?
Возможно ли при этом сохранить целостность данных в секторе?
Узнавал по поводу восстановления, нужно добиться remap-а сектора, что-то на подобие функции из Victoria HDD.
Т.е. мы читаем сектор огромное кол-во раз,чтобы привод обнаружил бэд сектор, тогда он сам чудо образом "лечит" его.
Теперь мой главный вопрос - как пройтись по всем секторам носителя, знаю, что с помощью цикла, но не могу понять, какое условие ставить и какое число итераций.

По факту мне нужно реализовать аналог CHKDSK на винде, это мой первый проект по системному программированию, поэтому могу задавать кучу неккоректных и глупых вопросов, за что и дико извиняюсь.

Заранее спасибо за ответы!
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
01.04.2022, 09:26
Цитата Сообщение от matthews Посмотреть сообщение
это мой первый проект по системному программированию
а вам не кажется, что это ещё не ваш уровень.
подобное ПО предполагает знания файловой системы, а не разбора функций CreateFile\ReadFile\WritrFile.
начните с чего-нить попроще.
1
0 / 0 / 0
Регистрация: 30.03.2022
Сообщений: 12
01.04.2022, 17:15  [ТС]
_lunar_, а вам не кажется, что тема создана не для высказывания своего личного мнения, а для оказания помощи человеку?) Несомненно я рад, что такой профессионал дела, как вы, дал мне совет, но если вам нечего изложить по данной теме, не могли бы вы просто не засорять топик :*

Я лезу в эту тему не из-за нечего делать, а по нужде. Для общего развития конечно я бы начал с чего-то попроще.

Добавлено через 19 минут
Цитата Сообщение от JmpShort Посмотреть сообщение
читать как обычный файл, например:
C++Выделить код
1
2
HANDLE hFile=CreateFileA("\\\\.\\PhysicalDrive0 ",
GENERIC_ALL, FILE_SHARE_READ | FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
Если прочитал и записал - сектор годен, ну и т.д..
Вот код, вопрос в следующем, прочитаю ли я таким циклом все сектора диска?
Если да, то еще вопрос
Если появится ошибка, означает ли это, что бэдблок обнаружен? Опять же, если да, то как мне многократно прочесть именно его?
И вообще, можно ли обойтись без записи в сектор, для выяснения нормальный это сектор или поврежденный?

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
    HANDLE Hdevice = INVALID_HANDLE_VALUE;
    PARTITION_INFORMATION partitionInfo = { 0 };
    DISK_GEOMETRY diskGeometry = { 0 };
    BYTE* buffer = NULL;
    DWORD bufferSize = 0;
    DWORD bytesReturned = 0;
    DWORD bytesWritten = 0;
    BOOL result;
 
    Hdevice = CreateFile(L"\\\\.\\PhysicalDrive1",
        GENERIC_ALL,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        0,
        NULL);
 
    if (Hdevice == INVALID_HANDLE_VALUE)
    {
        cout << "Disk don't open" << endl;
        cout << "Error: " << GetLastError() << endl;
    }
 
 
    if (!DeviceIoControl(Hdevice,
        IOCTL_DISK_GET_DRIVE_GEOMETRY,
        NULL,
        0,
        &diskGeometry,
        sizeof(DISK_GEOMETRY),
        &bytesReturned,
        (LPOVERLAPPED)NULL))
    {
        cout << "Error: " << GetLastError() << endl;
        CloseHandle(Hdevice);
    }
 
    if (!DeviceIoControl(Hdevice,
        IOCTL_DISK_GET_PARTITION_INFO,
        NULL,
        0,
        &partitionInfo,
        sizeof(PARTITION_INFORMATION),
        &bytesReturned,
        (LPOVERLAPPED)NULL))
    {
        cout << "Error: " << GetLastError() << endl;
        CloseHandle(Hdevice);
    }
 
    cout << "Partition's size (in bytes): " << partitionInfo.PartitionLength.QuadPart << endl;
    cout << "Disk's size (in bytes):      " << (diskGeometry.Cylinders.QuadPart) *
        diskGeometry.TracksPerCylinder * diskGeometry.SectorsPerTrack *
        diskGeometry.BytesPerSector << endl;
    cout << "Num of cylinders:    " << diskGeometry.Cylinders.QuadPart << endl;
    cout << "Tracks per cylinder: " << diskGeometry.TracksPerCylinder << endl;
    cout << "Sectors per track:   " << diskGeometry.SectorsPerTrack << endl;
    cout << "Bytes per sector:    " << diskGeometry.BytesPerSector << endl;
    system("PAUSE");
 
 
    bufferSize = diskGeometry.BytesPerSector;
    buffer = new BYTE[bufferSize];
 
    do
    {
        // Чтение секторов раздела.
        result = ReadFile(Hdevice, buffer, bufferSize, &bytesReturned, NULL);
        if (!result)
        {
            //cout << " Error ! " << GetLastError() << endl;
            delete[] buffer;
            buffer = NULL;
            CloseHandle(Hdevice);
        }
        if (!(s++ % (t)))
        {
            system("CLS");
            cout << "Reading all sectors " << p++ << " %" << endl;
        }
    } while (result && bytesReturned);
 
    cout << "All okey!\n";
    delete[] buffer;
    CloseHandle(Hdevice);
    system("PAUSE");
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
01.04.2022, 19:12
Цитата Сообщение от matthews Посмотреть сообщение
а вам не кажется, что тема создана не для высказывания своего личного мнения, а для оказания помощи человеку?
о какой помощи может идти речь, если вы даже ни малейшего представления не имеете о том, что пытаетесь сделать.
это тоже самое, что повар начнёт собирать космический корабль.
действительно, а что такого? у него же есть огромное желание построить оный..

Цитата Сообщение от matthews Посмотреть сообщение
но если вам нечего изложить по данной теме, не могли бы вы просто не засорять топик :*
уважаемый, вы тут тупыми фразами и своими идиотским сарказмом не раскидывайтесь.
я вам дал всё, что нужно.
или вам сюда маны переписать? в гугле забанили?

Цитата Сообщение от matthews Посмотреть сообщение
И вообще, можно ли обойтись без записи в сектор, для выяснения нормальный это сектор или поврежденный?
можно, но не этим детским кодом.

в untfs.dll есть класс NTFS_BAD_CLUSTER_FILE со следующими функциями
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
_QWORD *__fastcall NTFS_BAD_CLUSTER_FILE::QueryNumBad(
        NTFS_FILE_RECORD_SEGMENT *a1,
        _QWORD *a2);
 
char __fastcall NTFS_BAD_CLUSTER_FILE::ResetBadClusters(
        NTFS_BAD_CLUSTER_FILE *this,
        struct NTFS_BITMAP *a2);
 
char __fastcall NTFS_BAD_CLUSTER_FILE::VerifyAndFix(
        __int64 a1,
        struct NTFS_BITMAP *a2,
        struct NTFS_INDEX_TREE *a3,
        _BYTE *a4,
        unsigned int a5,
        MESSAGE *a6);
файловая система умная штука, и сама способна на уровне драйвера определить битый сектор с метрикой $Bad
1
0 / 0 / 0
Регистрация: 30.03.2022
Сообщений: 12
01.04.2022, 19:24  [ТС]
_lunar_, и как интересно вы поняли, что я не имею представления, о том что нужно сделать?
Если вы, сия, господь железа, почему же просто не взять и ответить на мои выше поставленные вопросы?)
И мне вот интересно, что вы дали? Совет погуглить? Браво, только бревно не поймет, что для изучения вопроса нужно поискать инфу в интернете, чем я и занимался перед написанием этой темы.

Мой деревянный друг, искренне соболезную, что ваше ЧСВ и попытки показать себя знающим тему, не дают вам просто взять и помочь мне. Надеюсь вы когда-нибудь окажетесь в подобной ситуации в реальной жизни.

Удачи и спасибо за ответы! благодаря вам, я узнал, что такое гугл, вау, потрясающе

Добавлено через 1 минуту
_lunar_, Так, видимо я не дочитал ваш ответ до конца, поэтому реально извиняюсь, вы дали мне хорошую информацию.
0
 Аватар для JmpShort
6 / 6 / 3
Регистрация: 24.03.2022
Сообщений: 22
01.04.2022, 23:17
Лучший ответ Сообщение было отмечено matthews как решение

Решение

Я смастерил набросок, думаю он поможет осмотреться.
Программу лучше всего запускать по-шагово, только!
Кликните здесь для просмотра всего текста
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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
////////////////////////////////////////////////////////////////////////////////
// main.cpp
//
// Программа проверит жесткий диск или любой другого накопитель.
// Интерфейс подобен программе "MHDD".
// Будет проверена скорость отклика, не будет произведена диагностика
// возможности чтения/записи - это нужно добавить вам, как и дополнительные
// функции - т.к. проверка ошибок.
 
#pragma comment(lib,"winmm.lib")
 
#include <windows.h>
#include <stdio.h>
#include <time.h>
#include <winioctl.h>
 
#define DRIVE       "\\\\.\\PhysicalDrive0"
#define BUFFSIZE    512
#define MAX_COLUMNS 49
#define MAX_ROWS 23
 
enum COLORS {
BLACK,
BLUE,
GREEN,
CYAN,
RED,
MAGENTA,
BROWN,
LIGHTGRAY,
DARKGRAY,
LIGHTBLUE,
LIGHTGREEN,
LIGHTCYAN,
LIGHTRED,
LIGHTMAGENTA,
YELLOW,
WHITE
};
 
void wrch(int x, int y, unsigned char* ch, int n, int clr);
DOUBLE appSeconds();
int GetStatus();
 
//
// Entry point
//
void main(void)
{
    char buf[BUFFSIZE];
 
    DWORD dwBytes, dw;
    DOUBLE StartSeconds, Total;
    LONG lDistanceToMove=0;
 
    // Access (read-write) mode
    DWORD dwDesiredAccess;
 
    dwDesiredAccess=0;      // No access to the drive
    //dwDesiredAccess=GENERIC_ALL;  // Read-write access!
 
    HANDLE hDevice=CreateFile(DRIVE,
    dwDesiredAccess,
    FILE_SHARE_READ |   // share mode
    FILE_SHARE_WRITE,
    NULL,           // pointer to security attributes)
    OPEN_EXISTING,      // Disposition (how to create)
    0,          // file attributes
    NULL);          // do not copy file attributes
 
    if(INVALID_HANDLE_VALUE==hDevice)
    {
        printf("Failed open \"%s\"\n",DRIVE);
        system("pause>nul");
        return;
    }
 
    DWORD BytesReturned;
 
    // Obtains information on the physical disk's geometry
 
    DWORD dwIoControlCode = IOCTL_DISK_GET_DRIVE_GEOMETRY;
    DISK_GEOMETRY dg;// Disk drive geometry structure
 
    LPVOID lpOutBuffer = &dg;
    DWORD nOutBufferSize = sizeof(dg);
 
    BOOL ret=DeviceIoControl(
    hDevice,            // handle to device of interest
    dwIoControlCode,        // control code of operation to perform
    NULL,           // pointer to buffer to supply input data
    0,          // size of input buffer
    lpOutBuffer,        // pointer to buffer to receive output data
    nOutBufferSize,     // size of output buffer
    &BytesReturned,     // pointer to variable to receive output byte count
    NULL);          // pointer to overlapped structure for asynchronous operation
 
    //CloseHandle(hDevice);
 
    if(!ret)
    {
        printf("Failed DeviceIoControl\nError %ld.\n",GetLastError());
        system("pause>nul");
        return;
    }
 
    ULONGLONG DiskSize;     // Size of the drive, in bytes
 
    DiskSize = dg.Cylinders.QuadPart *
    dg.TracksPerCylinder * dg.SectorsPerTrack * dg.BytesPerSector;
 
    printf("Start check sector\n");
 
    unsigned char B0[1] = { 0xB0 };
    unsigned char B1[1] = { 0xB1 };
    unsigned char B2[1] = { 4 };
    unsigned char space[1] = { 0x20 };
 
    int col, row, status;
    col=0;
    row=2;
 
    unsigned char leg[] ="Legenda";
    unsigned char ms3[5] = { 0xB0, '<', '3', 'm', 's'};
    unsigned char ms10[6] = { 0xB1, '<', '1', '0', 'm', 's'};
    unsigned char ms50[6] = { 0x4, '<', '5', '0', 'm', 's'};
 
    unsigned char squ[1] = { 0xB1 };
    unsigned char ms150[6] = { '<', '1', '5', '0', 'm', 's'};
    unsigned char ms500[6] = { '<', '5', '0', '0', 'm', 's'};
    unsigned char ms500_2[6] = { '>', '5', '0', '0', 'm', 's'};
 
    wrch(60, 0, leg, 7, LIGHTGRAY);
 
    // <3 Ms
    wrch(60, 2, ms3, 5, LIGHTGRAY);
 
    // <10 Ms
    wrch(60, 3, ms10, sizeof(ms10), LIGHTGRAY);
 
    // <50 Ms
    wrch(60, 4, ms50, sizeof(ms50), LIGHTGRAY);
 
    // <150 Ms
    wrch(60, 5, squ, 1, LIGHTGREEN);
    wrch(61, 5, ms150, sizeof(ms150), LIGHTGRAY);
 
    // <500 Ms
    wrch(60, 6, squ, 1, LIGHTRED);
    wrch(61, 6, ms500, sizeof(ms500), LIGHTGRAY);
 
    // >500 Ms
    wrch(60, 7, squ, 1, YELLOW);
    wrch(61, 7, ms500_2, sizeof(ms500_2), LIGHTGRAY);
 
    while(DiskSize>0)
    {
        // Засекаю время
        StartSeconds=appSeconds();
 
        // Читаю сектор в буфер
        ReadFile(hDevice,buf,BUFFSIZE,&dwBytes,NULL);
 
        // Устанавливаю позицию - назад, на размер буфера
        SetFilePointer(hDevice,lDistanceToMove,NULL,FILE_BEGIN);
 
        // Записываю
        WriteFile(hDevice,buf,BUFFSIZE,&dw,0);
 
        // Вычисляю время
        Total=appSeconds() - StartSeconds;
 
        // Устанавливаю позицию - вперед, на размер буфера
        lDistanceToMove+=dwBytes;
        SetFilePointer(hDevice,lDistanceToMove,NULL,FILE_BEGIN);
 
        DiskSize-=dwBytes;
 
        status=(int)Total;
        //status=GetStatus();
 
        if(status<3)
        status=3;
        else if(status<10)
        status=10;
        else if(status<50)
        status=50;
        else if(status<150)
        status=150;
        else if(status<500)
        status=500;
        else
        status=999;
 
        switch(status)
        {
        case 3:
            wrch(col, row, B0, 1, LIGHTGRAY);
            break;
        case 10:
            wrch(col, row, B1, 1, LIGHTGRAY);
            break;
        case 50:
            wrch(col, row, B2, 1, LIGHTGRAY);
            break;
        case 150:
            wrch(col, row, squ, 1, LIGHTGREEN);
            break;
        case 500:
            wrch(col, row, squ, 1, LIGHTRED);
            break;
        case 999:
            wrch(col, row, squ, 1, YELLOW);
            break;
        default:
            wrch(col, row, squ, 1, LIGHTGRAY);
        }
 
        ++col;
        if(MAX_COLUMNS==col)
        {
            col=0;
            ++row;
        }
 
        if(MAX_ROWS==row)
        {
            for(int x=2;x<MAX_ROWS;++x)
            {
                for(int i=0;i<MAX_COLUMNS;++i)
                wrch(i, x, space, 1, LIGHTGRAY);
            }
            row=2;
        }
    }
 
    CloseHandle(hDevice);
 
    wrch(0, 23, (unsigned char*)"---[ Done ]---", 14, WHITE);
    system("pause>nul");
}
 
DOUBLE appSeconds()
{
    static DWORD InitialTime=timeGetTime();
    static DOUBLE TimeCounter=0.0;
    DWORD NewTime=timeGetTime();
    TimeCounter+=(NewTime-InitialTime)*(1./1000.);
    InitialTime=NewTime;
    return TimeCounter;
}
 
void wrch(int x, int y, unsigned char* ch, int n, int clr)
{
    DWORD r;
    CONSOLE_SCREEN_BUFFER_INFO i;
    static HANDLE h;
    if(!h) h=GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(h,&i);
    i.dwCursorPosition.X=x;
    i.dwCursorPosition.Y=y;
    WriteConsoleOutputCharacter(h,(char*)ch,n,i.dwCursorPosition,&r);
    FillConsoleOutputAttribute(h,clr,n,i.dwCursorPosition,&r);
}
 
/*
int GetStatus()
{
    // This function simulator (функция симулятор ответа-отклика)
    srand((unsigned)time(NULL));
    int n=rand() % 6;
    return n;
}
*/
 
////////////////////////////////////////////////////////////////////////////////
// <<eof>> main.cpp
////////////////////////////////////////////////////////////////////////////////


2
20 / 9 / 2
Регистрация: 30.05.2018
Сообщений: 56
02.04.2022, 17:59
Цитата Сообщение от _lunar_ Посмотреть сообщение
в untfs.dll есть класс NTFS_BAD_CLUSTER_FILE со следующими функциями
Но это видимо касается ситуаций когда битый сектор не скорректирован аппаратно. Лет 25 назад, когда уже было NTFS но не было SMART.
А для более новых винтов - битые сектора ремапятся на уровне винта без участия винды.

Тут надо копать в сторону Extended Comprehensive SMART Error log…
1
0 / 0 / 0
Регистрация: 30.03.2022
Сообщений: 12
03.04.2022, 19:48  [ТС]
JmpShort, Спасибо, буду отталкиваться от вашего ответа.
Есть один нюанс ,функция
Цитата Сообщение от JmpShort Посмотреть сообщение
WriteConsoleOutputCharacter(h,(char*)ch, n,i.dwCursorPosition,&r);
2-ым аргументом должен быть тип LPCSTR, а здесь unsigned char* , хочу сказать спасибо за ваше терпение, не каждый сможет вытерпеть столько глупых вопросов)
0
 Аватар для JmpShort
6 / 6 / 3
Регистрация: 24.03.2022
Сообщений: 22
04.04.2022, 13:22
Цитата Сообщение от matthews Посмотреть сообщение
2-ым аргументом должен быть тип LPCSTR, а здесь unsigned char* , хочу сказать спасибо за ваше терпение, не каждый сможет вытерпеть столько глупых вопросов)
Да. Я предпочитаю - последнее время работать только с "MBCS" - символами кодировки проекта.
Если помните, по умолчания студия включает "UNICODE".
Поэтому, чтобы проект - как-бы был универсален, вся эта путаница с макро-определениями.
Вот и сейчас, возможно я вас запутал. Одним словом - все, что относится к строкам и начинается с "LP"
можно назвать "char" (несколько грубо).

Добавлю, самый интересный код обозначен в while(Размер>0) - отмечен кириллическим комментарием.
Не забывайте, программу нужно изучать под отладчиком, вывод показан относительно, он не годится
для проекта на выставку.
1
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
04.04.2022, 14:10
Цитата Сообщение от JmpShort Посмотреть сообщение
все, что относится к строкам и начинается с "LP" можно назвать "char"
неправильно.
LP это вообще совсем о другом.
L в данном случае это всего лишь макрос для совместимости древних программ - LPVOID и PVOID одно и тоже в современном программировании.
P это pointer (указатель), поэтому это не char, а char *
3
0 / 0 / 0
Регистрация: 30.03.2022
Сообщений: 12
06.04.2022, 00:24  [ТС]
JmpShort, У меня возникли проблемы с функцией WriteFile(), она просто не выполняется возвращая 0.
Может я что-то напутал с атрибутами открытия файла? GetLastError возвращает 5.
Вот открытие файла:
C++
1
2
3
4
5
6
7
8
9
10
 DRIVE = CreateFile
    (
        L"\\\\.\\PhysicalDrive1",
        GENERIC_ALL,                             // Read-write access!
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        NULL,
        NULL
    );
Добавлено через 1 час 0 минут
Запускаю все от имени администратора, привилегии подняты. Причины отказа в доступе не вижу
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.04.2022, 00:24
Помогаю со студенческими работами здесь

Обрезание bad секторов
Поясните возможно ли обрезать эти бед секторы без сноса винды, тк они находятся на диске с ОС?

Проверка на наличие BAD-секторов
Подскажите, какими средствами можно проверить хард на бэды? Сейчас проверяю через HD Tune Pro даст ли он стопроцентный результать что нет...

Возможно ли зависания из-за BAD-секторов?
может ли комп периодически зависать из за поврежденных секторов в жестком диске?

Большая разница в количестве bad секторов
доброго дня! проблема в следующем. есть жесткий диск, с файловой системой raw. когда то там была ntfs, винда своими средствами при...

Восстановление MBR секторов
Всем доброго времени суток. У меня появился новый вопрос,в ходе которого я делаю антивинлокер, вопрос заключается в том, что можно ли при...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru