在Windows上使用C语言读取硬盘上的特定扇区

在Windows上使用C语言读取硬盘上的特定扇区

本文介绍了在Windows上使用C语言读取硬盘上的特定扇区的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经尝试过此代码,当我从USB闪存驱动器读取扇区时它可以工作,但不适用于硬盘驱动器上的任何分区,因此当您尝试从USB读取数据时我想知道它是否是同一件事或从硬盘驱动器

i have tried this code it works when i read a sector from an USB flash drive but it does'nt work with any partiton on hard drive , so i want to know if it's the same thing when you try to read from usb or from hard drive

int ReadSector(int numSector,BYTE* buf){

int retCode = 0;
BYTE sector[512];
DWORD bytesRead;
HANDLE device = NULL;

device = CreateFile("\\\\.\\H:",    // Drive to open
                    GENERIC_READ,           // Access mode
                    FILE_SHARE_READ,        // Share Mode
                    NULL,                   // Security Descriptor
                    OPEN_EXISTING,          // How to create
                    0,                      // File attributes
                    NULL);                  // Handle to template

if(device != NULL)
{
    SetFilePointer (device, numSector*512, NULL, FILE_BEGIN) ;

    if (!ReadFile(device, sector, 512, &bytesRead, NULL))
    {
        printf("Error in reading disk\n");
    }
    else
    {
        // Copy boot sector into buffer and set retCode
        memcpy(buf,sector, 512);
        retCode=1;
    }

    CloseHandle(device);
    // Close the handle
}

return retCode;}

推荐答案

问题是共享模式.您已指定FILE_SHARE_READ,这意味着不允许其他任何人对该设备进行写操作,但是该分区已经以读/写方式挂载,因此无法为您提供该共享模式.如果使用FILE_SHARE_READ|FILE_SHARE_WRITE,它将起作用. (好吧,只要磁盘扇区大小为512字节,并且该进程正在以管理员权限运行.)

The problem is the sharing mode. You have specified FILE_SHARE_READ which means that nobody else is allowed to write to the device, but the partition is already mounted read/write so it isn't possible to give you that sharing mode. If you use FILE_SHARE_READ|FILE_SHARE_WRITE it will work. (Well, provided the disk sector size is 512 bytes, and provided the process is running with administrator privilege.)

您还在错误地检查故障;失败时,CreateFile返回INVALID_HANDLE_VALUE而不是NULL.

You're also checking for failure incorrectly; CreateFile returns INVALID_HANDLE_VALUE on failure rather than NULL.

我成功测试了此代码:

#include <windows.h>

#include <stdio.h>

int main(int argc, char ** argv)
{
    int retCode = 0;
    BYTE sector[512];
    DWORD bytesRead;
    HANDLE device = NULL;
    int numSector = 5;

    device = CreateFile(L"\\\\.\\C:",    // Drive to open
                        GENERIC_READ,           // Access mode
                        FILE_SHARE_READ|FILE_SHARE_WRITE,        // Share Mode
                        NULL,                   // Security Descriptor
                        OPEN_EXISTING,          // How to create
                        0,                      // File attributes
                        NULL);                  // Handle to template

    if(device == INVALID_HANDLE_VALUE)
    {
        printf("CreateFile: %u\n", GetLastError());
        return 1;
    }

    SetFilePointer (device, numSector*512, NULL, FILE_BEGIN) ;

    if (!ReadFile(device, sector, 512, &bytesRead, NULL))
    {
        printf("ReadFile: %u\n", GetLastError());
    }
    else
    {
        printf("Success!\n");
    }

    return 0;
}

这篇关于在Windows上使用C语言读取硬盘上的特定扇区的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-28 07:49