C程序无法获得软盘驱动器

时间:2016-10-04 11:26:56

标签: c windows console-application floppy

我有配置了软盘驱动器(A :)的Windows 7 VM。我试图将软盘驱动器的引导扇区读入结构。但是,每次运行此程序时,都无法找到软盘驱动器。我可以确认它是可以访问的。

代码:

#include "stdafx.h"
#include<Windows.h>
#include<stdio.h>
#include<conio.h>
#include<WinBase.h>

#pragma pack(1)

struct boot
{
    BYTE jump[3];   
    char bsOemName[8];
    WORD bytesperSector;    
    BYTE sectorpercluster;
    WORD sectorsreservedarea;
    BYTE copiesFAT;
    WORD maxrootdirentries;
    WORD totalSectors;
    BYTE mediaDescriptor;
    WORD sectorsperFAT;
    WORD sectorsperTrack;
    WORD sides;
    WORD hiddenSectors;
    char reserve[480];


};

void ReadSector(char *src, int ss, int num, void* buff);

void main()
{
    struct boot b;
    ReadSector("\\\\.\\A:", 0, 1, &b);  

    printf("\nBoot sector Name: %s\n", b.bsOemName); 
    printf("Bytes per sector: %d\n", b.bytesperSector);
    printf("Sectors per Cluster: %d\n", b.sectorpercluster);
    printf("Total Sectors: %d\n", b.totalSectors);
}

void ReadSector(char *src, int ss, int num, void* buff)
{
    HANDLE h;       //HANDLE is a typedef of void *HANDLE
    unsigned int br;
    h = CreateFile(src, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
    DWORD dw = GetLastError();
    printf("\nLast Error: %d", dw);
    if (h != NULL)
    {
        printf("\nError reading floppy disk '%s'", src);
        printf("\nReturn value for handle = %d", h);

    }   

    else
    {
        printf("\nSuccess..");
    }

    SetFilePointer(h, (ss * 512), NULL,FILE_BEGIN );
    ReadFile(h, buff, num, &br, NULL);
    CloseHandle(h);
}

输出/错误:

 C:\Users\IEUser\Desktop>Hardware.exe

Last Error: 2
Error reading floppy disk '\\.\A:'
Return value for handle = -1
Boot sector Name:
Bytes per sector: 14336
Sectors per Cluster: 248
Total Sectors: 0

Output Screenshot

系统返回的错误代码为2:系统找不到指定的文件。

由于无法打开软盘驱动器,结构变量会保存垃圾值。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

看起来传递给ReadSector()函数的参数存在问题(该函数又将参数传递给CreateFile()函数)和ReadFile()函数调用。

有问题的代码: ReadSector("\\\\.\\A:", 0, 1, &b);

我只需要在第一个参数中添加“L”:ReadSector(L"\\\\.\\A:", 0, 1, &b);

修复了文件句柄问题,但后来无法读取文件。我意识到它是ReadFile()函数无效。

有问题的代码:ReadFile(h, buff, num, &br, NULL);

我只需要用512替换'num',因为这个函数需要知道需要读取多少字节。这里的'num'设置为1,这就是它没有按预期工作的原因。

ReadFile(h, buff, 512, &br, NULL)

我修改了原始代码,检查CreateFile()和ReadFile()返回值。

以下是修改后的代码:

#include "stdafx.h"
#include<Windows.h>
#include<stdio.h>
#include<conio.h>
#include<WinBase.h>

#pragma pack(1)

struct boot
{
    BYTE jump[3];   //BYTE is a typedef for unsigned char
    char bsOemName[8];
    WORD bytesperSector;    //WORD is a typdef for unisigned short
    BYTE sectorpercluster;
    WORD sectorsreservedarea;
    BYTE copiesFAT;
    WORD maxrootdirentries;
    WORD totalSectors;
    BYTE mediaDescriptor;
    WORD sectorsperFAT;
    WORD sectorsperTrack;
    WORD sides;
    WORD hiddenSectors;
    char reserve[480];


};

void ReadSector(char *src, int ss, int num, void* buff);

void main()
{
    struct boot b;

    ReadSector(L"\\\\.\\A:", 0, 1, &b); //Machinename.drive, 0 = read 0th logical sector(that is Boot Sector), 1 = Read 1 sector, &b = Read it into Structure b

    printf("\nOEM Name: %s", b.bsOemName); 
    printf("\nBytes per sector: %d", b.bytesperSector);
    printf("\nSectors per Cluster: %d", b.sectorpercluster);
    printf("\nTotal Sectors: %d\n", b.totalSectors);

void ReadSector(char *src, int ss, int num, void* buff)
{
    HANDLE h ;      //HANDLE is a typedef of void *HANDLE
    unsigned int br;
    h = CreateFile(src, 
                   GENERIC_READ,
                   FILE_SHARE_READ,
                   0, 
                   OPEN_EXISTING,
                   0,
                   0);

    if (h == INVALID_HANDLE_VALUE)
    {
        printf("\nError reading disk '%s'", src);
        //printf("\nReturn value for handle = %d", h);
        printf("\nLast Error: %ld", dw);

    }

    else
    {
        printf("\nReturn value for handle = %d", h);
    }

    SetFilePointer(h, (ss * 512), NULL,FILE_BEGIN );
    if (!ReadFile(h, buff, 512, &br, NULL))
    {
        printf("\nReadFile: %u\n", GetLastError());
    }
    else
    {
        printf("\nRead File Success!\n");
    }


    CloseHandle(h);
}

节目输出:

C:\Users\IEUser\Desktop>Hardware.exe

Return value for handle = 36
Read File Success!

OEM Name: *-v4VIHC
Bytes per sector: 512
Sectors per Cluster: 1
Total Sectors: 2880

C:\Users\IEUser\Desktop>

参考:read-and-write-hard-disk-sector-directly-and-efficiently