我正在尝试编写一个程序来备份和编写MBR。
以下代码应读取MBR并将其放入缓冲区(puffer)。
display_hexdump()函数在运行disk_to_buffer()之前和之后显示几乎相同的内容,而不是MBR的模式。它只是随机的记忆模式。我无法弄清楚如何正确使用WinAPI的函数来读取MBR,我已经阅读了用于disk_to_buffer中使用的函数的微软帮助页面。我在ReadFile()中收到错误。
给予disk_to_buffer函数的devid参数存储此文本:" \\。\ PhysicalDrive0"如果我输入0。
/*
============================================================================
Name : MBR.c
Author :
Version :
Copyright : Your copyright notice
Description : MBR backup program
============================================================================
*/
#include <stdio.h>
#include <windows.h>
#include <unistd.h>
int disk_to_buffer(char * id, char * puffer)
{
DWORD dwRead;
HANDLE hDisk = CreateFile(id, GENERIC_READ, FILE_SHARE_VALID_FLAGS, 0, OPEN_EXISTING, 0, 0);
if (hDisk == INVALID_HANDLE_VALUE) // Fehler, wenn ein anderes Programm liest
{
CloseHandle(hDisk);
printf("Fehler bei CreateFile()");
return 1;
}
if (SetFilePointer(hDisk, 0, 0, FILE_BEGIN) == INVALID_SET_FILE_POINTER) //Setzt den Zeiger für die Lese-Methode
{
printf("Fehler bei SetFilePointer()");
return 1;
}
if (!ReadFile(hDisk, puffer, 512, &dwRead, 0))
{
printf("Fehler bei ReadFile()");
return 1;
}
return 0;
}
/*
int buffer_to_MBR()
{
}
int save()
{
}
int load()
{
}
*/
void prompt_enter()
{
char enter = 0;
while (enter != '\r' && enter != '\n') { enter = getchar(); }
}
void display_hexdump(char * puffer)
{
printf("MBR hexdump\n###############################\n###############################\n\n");
for (int i = 0; i < 512; i++)
{
printf("%02X", puffer[i]);
}
printf("\nDump Ende\n\n###############################\n###############################\n\n");
}
void clear_stdin()
{
char c;
while ((c = getchar()) != '\n' && c != EOF);
}
int main(void) {
while (1)
{
char devid[100], puffer[512], file_name[256], file_path[2048];
int userinputid = 'c';
int wahl = 0;
strcpy(devid, "\\\\.\\PhysicalDrive");
printf("Hauptmenue\n###############################\n1. MBR speichern\n2. MBR schreiben\n3. Programm beenden");
if (scanf("%d", &wahl) == 0)
clear_stdin();
display_hexdump(puffer);
switch (wahl)
{
case 1:
printf("1. Modus\nIhre Laufwerke:");
system("echo list disk | diskpart");
do
{
printf("Waehlen Sie ein Laufwerk aus [Eingabe der Datentraeger-ID]: ");
scanf("%s", &userinputid);
clear_stdin();
} while (!isdigit(userinputid));
strcat(devid, &userinputid);
disk_to_buffer(devid, userinputid);
display_hexdump(puffer);
//printf(devid);
break;
case 2:
printf("2. Modus");
system("echo list disk | diskpart");
break;
case 3:
printf("Programm wird beendet [Enter]");
clear_stdin();
prompt_enter();
return 0;
default:
printf("Ungueltig");
break;
}
}
}