将引导扇区读取到缓冲区

时间:2017-05-01 20:55:00

标签: c winapi

我正在尝试编写一个程序来备份和编写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;
        }

    }
}

0 个答案:

没有答案