zoukankan      html  css  js  c++  java
  • c把bin二进制文件写入磁盘任意扇区(引用)

    原文 https://blog.csdn.net/c5113620/article/details/84061600

    //编译
    nasm -f bin boot.asm -o boot.bin
    // 然后以【管理员权限】运行下面编译的c程序
    PHYSICALDRIVE3 后面的数字,表示磁盘序号,可以右键看--此电脑(我的电脑)--管理--磁盘管理,下面写的,磁盘0,磁盘1
    /*读取asm编译好的bin字节文件,写入加载的vhd磁盘扇区
    **需要管理员权限运行
    */
    
    #include <Windows.h>
    #include <stdio.h>
    
    //存放扇区内容
    unsigned char container[512];
    
    //参数:输出的字符串指针,开始位置,长度
    //返回值:读取的大小
    DWORD ReadDisk(DWORD start, DWORD size)
    {
        OVERLAPPED over = { 0 };
        over.Offset = start;
        HANDLE handle = CreateFile(TEXT("\\.\PHYSICALDRIVE3"), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
        DWORD  Error = ERROR_SUCCESS;
        if (handle == INVALID_HANDLE_VALUE)
        {
            Error = GetLastError();
            //5 表示拒绝访问,没有权限
            wprintf(L"ReadDisk sector failed with error code %d
    ", Error);
            return 0;
        }
        
        DWORD readsize;
        if (ReadFile(handle, container, size, &readsize, &over) == 0)
        {
            CloseHandle(handle);
            return 0;
        }
    
        //注意这里需要自己释放内存
        CloseHandle(handle);
        return readsize;
    }
    
    DWORD WriteDisk( DWORD start, DWORD size)
    {
        OVERLAPPED over = { 0 };
        over.Offset = start;
        HANDLE handle = CreateFile(TEXT("\\.\PHYSICALDRIVE3"), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
        DWORD  Error = ERROR_SUCCESS;
        if (handle == INVALID_HANDLE_VALUE)
        {
            Error = GetLastError();
            wprintf(L"WriteDisk sector failed with error code %d
    ", Error);
            return 0;
        }
        DWORD writesize;
        if (WriteFile(handle, container, size, &writesize, &over) == 0)
        {
            CloseHandle(handle);
            return 0;
        }
        
        CloseHandle(handle);
        return writesize;
    }
    
    void readBin(DWORD start, DWORD size)
    {
        OVERLAPPED over = { 0 };
        over.Offset = start;
        HANDLE handle = CreateFile(TEXT("\\.\D:\print.bin"), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
        DWORD  Error = ERROR_SUCCESS;
        if (handle == INVALID_HANDLE_VALUE)
        {
            Error = GetLastError();
            wprintf(L"readBin failed with error code %d
    ", Error);
            return ;
        }
        DWORD readsize;
        if (ReadFile(handle, container, size, &readsize, &over) == 0)
        {
            CloseHandle(handle);
            return ;
        }
    }
    
    void printContainer()
    {
        for (unsigned int i = 0; i < 512; i++) {
            printf("%02X ", container[i]);
        }
        printf("
    ");
    }
    
    int main()
    {
        DWORD len;
    
        len = ReadDisk(0, 512);
        printf("len:%d
    ", len);
        printContainer();
    
        //读取bin字节
        readBin(0, 512);
        printf("bin:
    ");
        printContainer();
    
        getchar();
    
        len = WriteDisk(0, 512);
        //写入字节数
        printf("len:%d
    ", len);
        
        getchar();
    
        return 0;
    
    }
  • 相关阅读:
    webstorm一键格式化为Eslint标准
    Promise 对象
    ES6类的继承
    RabbitMQ之pika模块
    常见操作
    增量式爬虫
    分布式爬虫(scrapy-redis)
    crawlspider
    scrapy框架学习
    斐波那契数列
  • 原文地址:https://www.cnblogs.com/junjunjun123/p/11597118.html
Copyright © 2011-2022 走看看