【问题标题】:C program fails get a handle to floppy drive [duplicate]C程序无法获得软盘驱动器的句柄[重复]
【发布时间】:2017-02-12 13:08:05
【问题描述】:

我有一个配置了软盘驱动器 (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:系统找不到指定的文件。

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

有人可以帮忙吗?

【问题讨论】:

  • 请将错误粘贴为文本
  • 我敢打赌“A:”不是设备名称。在设备管理器中找到您的驱动器,然后尝试为该设备列出的其他一些“名称”。 the documentation 中还列出了一些访问软盘的限制;例如,您目前没有使用FILE_SHARE_WRITE,但看起来您必须使用。
  • 请注意,documentation 声明:“打开卷或软盘时,dwShareMode 参数必须具有 FILE_SHARE_WRITE 标志。”
  • @KlasLindbäck 这只是转义反斜杠,正如 C 字符串文字中所需要的那样。编译后,按照文档的建议,字符串正确:\\.\A:
  • @LightnessRacesinOrbit:感谢您的回复伙伴。我确实尝试了在设备管理器中找到的其他名称,但这没有帮助。我也尝试过使用“FILE_SHARE_WRITE”,但这也不起作用(尽管这是我应该根据文档使用的那个)。

标签: c windows console-application floppy


【解决方案1】:

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

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

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

这解决了文件句柄问题,但它无法读取文件。然后我意识到它是 ReadFile() 函数不起作用。

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

我只需要将 'num' 替换为 512,因为此函数需要知道它需要读取多少字节。这里的 '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

【讨论】:

  • 如果这段代码(或原始代码)在编译时没有抱怨类型不匹配,那么你的编译器配置错误。 src 参数应为 wchar_t * 以匹配 CreateFile()。
  • 谢谢@HarryJohnston!
  • 简单的解决方案是将字符集更改为“多字节字符集”。
猜你喜欢
  • 2012-12-02
  • 2019-02-01
  • 1970-01-01
  • 2012-08-07
  • 2016-07-08
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
相关资源
最近更新 更多