在98/ME下如何与Floppy(Driver?)通信

greentape 2001-05-10 10:00:00
注意是98/ME不是NT
VC++ 6.0

谢谢!
...全文
90 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tasehouny 2001-05-10
  • 打赏
  • 举报
回复
我在别人的基础上写了一个类,拿出来和大家共享,函数中包含原作者的信息

// Bios.h: interface for the CBios class.
//
//////////////////////////////////////////////////////////////////////
/********************************************************************
创建日期: 2000/07/17
文件名称: bios.h
作者 : Tase houny
电子邮件: tase@163.net

文件描述:
*********************************************************************/

#if !defined(AFX_BIOS_H__D25E5BB1_5B1F_11D4_BF46_00E04C800DD8__INCLUDED_)
#define AFX_BIOS_H__D25E5BB1_5B1F_11D4_BF46_00E04C800DD8__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CBios
{
public:
int FormatDisk(int head,int track,int sector);
int Virefy(int head,int track,int sec);
int GotoTrack(int track);
int ResetDisk(void);
int WriteSector(unsigned char drive,unsigned char head,unsigned char track,unsigned char sector,unsigned char *buffer);
int ReadSector(unsigned char drive,unsigned char head,unsigned char track,unsigned char sector,unsigned char *buffer);
int MakeSector(unsigned char drive,unsigned char head,unsigned char track,unsigned char sector,unsigned char *buffer);
CBios();
virtual ~CBios();

protected:
int WinBiosDisk(unsigned char command,unsigned char drive,unsigned char head,unsigned char track,unsigned char sector,unsigned char nsectors,void *buffer);
// int WinReadDisk(unsigned char drive,unsigned char sector,unsigned char nsectors,void *buffer);
};

#endif // !defined(AFX_BIOS_H__D25E5BB1_5B1F_11D4_BF46_00E04C800DD8__INCLUDED_)

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
/* 软盘扇区绝对读取函数 WinBiosDisk()

作者: 周化 编译平台: Virusal C++ 6.0

为了方便, 本函数的参数设计得同 Turbo C 2.0 的 biosdisk() 函数一样.

本函数还有以下两个缺点以待改进:
1.本函数还只能读能读 A: 和 B:,即只能对软盘操作
2.不能改变磁盘扇区大小,只能是标准的 512 个字节。

参数说明:
command 操作:
0 重置磁盘
2 读扇区
3 写扇区
4 校验磁道
5 格式化磁道
8 得到设备参数 (int 1EH)
drive 驱动器 A:=0 B:=1
head 磁头号,范围 0 - 1
track 磁道号,范围 0 - 84 ( 80 - 84 为特殊磁道,通常用来加密 )
sector 扇区号,范围 0 - 255 ( 19 - 255 为非标准扇区编号,通常用来加密)
nsectors 每次读或写的扇区数,不能超出每磁道的最大扇区数
buffer 数据写入或读出的缓冲区,大小为 512 个字节

返回值 ( 同 Int 13H ):

0x0 成功
0x1 无效的命令
0x3 磁盘被写保护
0x4 扇区没有找到
0xa 发现坏扇区
0x80 磁盘没有准备好

******************************************************************/

CBios::CBios()
{

}

CBios::~CBios()
{

}

int CBios::WinBiosDisk(unsigned char command,unsigned char drive,unsigned char head,unsigned char track,unsigned char sector,unsigned char nsectors,void *buffer)
{
HANDLE hd;
DWORD dw;

//int13 寄存器参数块
typedef struct tagPackage
{
void *buffer; // ebx 寄存器

unsigned char drive; // edx 寄存器
unsigned char head; //
unsigned short edx_high; //

unsigned char sector; // ecx 寄存器
unsigned char track; //
unsigned short ecx_high; //

unsigned char number; // eax 寄存器
unsigned char option; //
unsigned short eax_high; //

unsigned int edi; // edi 寄存器

unsigned int esi;
unsigned int eflag;
} PK;

PK pk;
memset(&pk,0,sizeof PK);
pk.buffer=buffer;
pk.drive=drive;
pk.head=head;
pk.sector=sector;
pk.track=track;
pk.option=command;
pk.number=nsectors;

if(command==0x18)pk.edi=(int)buffer;
hd=CreateFile("\\\\.\\vWin32",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,NULL,NULL);
if(hd==NULL)return 1;
DeviceIoControl(hd,4,&pk,0x1c,&pk,0x1c,&dw,NULL);
if(command==0x8)memcpy(buffer,(unsigned char *)pk.edi,11);
CloseHandle(hd);
return pk.option;

}

/*
int CBios::WinReadDisk(unsigned char drive, unsigned char sector, unsigned char nsectors, void *buffer)
{

}
*/
int CBios::MakeSector(unsigned char drive, unsigned char head, unsigned char track, unsigned char sector, unsigned char *buffer)
{
int i,ret,retry;
unsigned char ctemp[513],cmd[3]={5,3,2};
for(i=0;i<3;i++)
{
retry=5;
while(retry)
{

if(i==0)
{ctemp[0]=track;
ctemp[1]=head;
ctemp[2]=sector;
ctemp[3]=2;
}
else if(i==1)
memcpy(ctemp,buffer,512);
ret=WinBiosDisk(cmd[i],drive,head,track,sector,1,ctemp);
if(ret==0)break;
else if(ret==0x3)return ret;
WinBiosDisk(2,drive,head,track?track-1:track+1,sector,1,ctemp); //重置磁头
retry--;
}
if(!retry)return ret;
}
ret=memcmp(ctemp,buffer,512);
if(ret)return 0xffff;
else return 0;
}

int CBios::ReadSector(unsigned char drive, unsigned char head, unsigned char track, unsigned char sector, unsigned char *buffer)
{
int i,retry=5;
while(retry)
{
i=WinBiosDisk(2,drive,head,track,sector,1,buffer);
if(i==0)break;
WinBiosDisk(2,drive,head,track?track-1:track+1,sector,1,buffer); //重置磁头
retry--;
}
return i;

}

int CBios::WriteSector(unsigned char drive, unsigned char head, unsigned char track, unsigned char sector, unsigned char *buffer)
{
int i,retry=5;
char *buffer1;
buffer1=new char[8196];
while(retry)
{
i=WinBiosDisk(3,drive,head,track,sector,1,buffer);
if(i==0)break;
WinBiosDisk(2,drive,head,track?track-1:track+1,sector,1,buffer1); //重置磁头
retry--;
}
delete []buffer1;
return i;

}

int CBios::ResetDisk()
{
char *buff;
buff = new char[8196];
int i;
i = WinBiosDisk(0,0,1,1,1,1,buff);
delete []buff;
return i;
}

int CBios::GotoTrack(int track)
{
char *buff;
buff = new char[8196];
int i,retry = 5;
int h,sec;
while(retry)
{
h = rand()%2;
sec = rand()%18;
i = WinBiosDisk(4,0,h,track,sec,5,buff);
if(i==0)break;
retry--;
}
delete []buff;
return i;
}

int CBios::Virefy(int head, int track, int sec)
{
int i,retry=5;
char *buff;
buff=new char[8196];
while(retry)
{
i=WinBiosDisk(4,0,head,track,sec,1,buff);
if(i==0)break;
WinBiosDisk(2,0,head,track?track-1:track+1,sec,1,buff); //重置磁头
retry--;
}
delete []buff;
return i;
}

int CBios::FormatDisk(int head, int track, int sector)
{
BYTE buf[1024];
for(int i= 0;i<1024;i++)
{
buf[i] = 0xF6;
}
// char *buff =(char*)buf;
int err = MakeSector(0,head,track,sector,buf);
return err;
}


greentape 2001-05-10
  • 打赏
  • 举报
回复
使用VXD技术是不是需要DDK?
DDK去哪里弄还是只有VC++6.0就行了?

supperlxf 2001-05-10
  • 打赏
  • 举报
回复
编个dos程序,用win32作外壳调用,最简单
wjyasd 2001-05-10
  • 打赏
  • 举报
回复
通过VXD技术吧!(要是想控制软区的话)
dux 2001-05-10
  • 打赏
  • 举报
回复
think
ginkgoboy 2001-05-10
  • 打赏
  • 举报
回复
关注

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧