⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 floppydisk.cpp

📁 一个用C语言写的在9x/ME/NT/2K读写软驱的源代码
💻 CPP
字号:
/*
Author : Nish
EMail : nishinapp@yahoo.com
Version : 2.0
*/
#include "stdafx.h"
#include "FloppyDisk.h"

BOOL CFloppyDisk::b9xME = CFloppyDisk::Is9xME();
HANDLE CFloppyDisk::hFloppyDisk=NULL;

int CFloppyDisk::ReadFloppyDisk9xME(BYTE *buffer, WORD cylinder, WORD sector, WORD head)
{
 	HANDLE 	hDevice;   
	DIOC_REGISTERS 	reg;
	BOOL 	fResult;
	DWORD 	byteCnt; 
	    	
	hDevice = CreateFile("\\\\.\\vwin32", 0, 0, NULL, 0,
		FILE_FLAG_DELETE_ON_CLOSE, NULL);

	reg.reg_EAX=0x0201;
	reg.reg_EBX=(DWORD)buffer;
	reg.reg_ECX=cylinder*0x100 + sector;
	reg.reg_EDX=((head==0)?0x0000:0x0100);
	reg.reg_Flags=0x0001;

	fResult = DeviceIoControl(hDevice, VWIN32_DIOC_DOS_INT13, &reg,
		sizeof(reg), &reg, sizeof(reg), &byteCnt, 0);
	
	CloseHandle(hDevice);

	if(!fResult || (reg.reg_Flags & 0x0001))
		return NISH_ERROR;

	return NISH_NO_ERROR;
}

int CFloppyDisk::WriteFloppyDisk9xME(BYTE *buffer, WORD cylinder, WORD sector, WORD head)
{
 	HANDLE 	hDevice;   
	DIOC_REGISTERS 	reg;
	BOOL 	fResult;
	DWORD 	byteCnt; 
    	
	hDevice = CreateFile("\\\\.\\vwin32", 0, 0, NULL, 0,
		FILE_FLAG_DELETE_ON_CLOSE, NULL);

	reg.reg_EAX=0x0301;
	reg.reg_EBX=(DWORD)buffer;
	reg.reg_ECX=cylinder*0x100 + sector;	
	reg.reg_EDX=((head==0)?0x0000:0x0100);
	reg.reg_Flags=0x0001;

	fResult = DeviceIoControl(hDevice, VWIN32_DIOC_DOS_INT13, &reg,
		sizeof(reg), &reg, sizeof(reg), &byteCnt, 0);

	CloseHandle(hDevice);

	if(!fResult || (reg.reg_Flags & 0x0001))
		return NISH_ERROR;

	return NISH_NO_ERROR;
}

void CFloppyDisk::ResetDisk9xME()
{
 	HANDLE 	hDevice;   
	DIOC_REGISTERS 	reg;
	BOOL 	fResult;
	DWORD 	byteCnt; 
    	
	hDevice = CreateFile("\\\\.\\vwin32", 0, 0, NULL, 0,
		FILE_FLAG_DELETE_ON_CLOSE, NULL);

	reg.reg_EAX=0x0000;	
	reg.reg_EDX=0x0000;
	

	fResult = DeviceIoControl(hDevice, VWIN32_DIOC_DOS_INT13, &reg,
		sizeof(reg), &reg, sizeof(reg), &byteCnt, 0);

	CloseHandle(hDevice);

}

BOOL CFloppyDisk::Is9xME()
{
	OSVERSIONINFO ovinfo;
	ovinfo.dwOSVersionInfoSize=sizeof (OSVERSIONINFO);
	GetVersionEx(&ovinfo);
	if(ovinfo.dwPlatformId==VER_PLATFORM_WIN32_NT)
		return false;
	else 
		return true;
}

int CFloppyDisk::ReadFloppyDisk(BYTE *buffer, WORD cylinder, WORD sector, WORD head)
{
	if(b9xME)
		return ReadFloppyDisk9xME(buffer,cylinder,sector,head);
	else
		return ReadFloppyDiskNT2K(buffer,cylinder,sector,head);
}

int CFloppyDisk::WriteFloppyDisk(BYTE *buffer, WORD cylinder, WORD sector, WORD head)
{
	if(b9xME)
		return WriteFloppyDisk9xME(buffer,cylinder,sector,head);
	else
		return WriteFloppyDiskNT2K(buffer,cylinder,sector,head);;
}

void CFloppyDisk::ResetDisk()
{
	if(b9xME)
		ResetDisk9xME();
	else
		ResetDiskNT2K();
}


int CFloppyDisk::ReadFloppyDiskNT2K(BYTE *buffer, WORD cylinder, WORD sector, WORD head)
{
	DWORD count;
	BOOL retValue;
	if(!IsFloppyOpen())	
		hFloppyDisk=OpenFloppyDisk();	
	if(!hFloppyDisk)
		return NISH_ERROR;
	SetFilePointer(hFloppyDisk,
		512*(18*(cylinder*2+head)+(sector-1)),0,
		FILE_BEGIN);
	retValue=ReadFile(hFloppyDisk,buffer,512,&count,NULL);
	if(retValue)
		return NISH_NO_ERROR;
	else
		return NISH_ERROR;
}

int CFloppyDisk::WriteFloppyDiskNT2K(BYTE *buffer, WORD cylinder, WORD sector, WORD head)
{
	DWORD count;
	BOOL retValue;
	if(!IsFloppyOpen())
		hFloppyDisk=OpenFloppyDisk();
	if(!hFloppyDisk)	
		return NISH_ERROR;
	SetFilePointer(hFloppyDisk,
		512*(18*(cylinder*2+head)+(sector-1)),0,
		FILE_BEGIN);
	retValue=WriteFile(hFloppyDisk,buffer, 512,&count,NULL);
	if(retValue)
		return NISH_NO_ERROR;
	else
		return NISH_ERROR;
}

void CFloppyDisk::ResetDiskNT2K()
{
	if(IsFloppyOpen())
		CloseFloppyDisk();
	hFloppyDisk=OpenFloppyDisk();
	CloseFloppyDisk();
}

void CFloppyDisk::CloseFloppyDisk()
{
	if(hFloppyDisk)
	{
		CloseHandle(hFloppyDisk);
		hFloppyDisk=NULL;		
	}
}

BOOL CFloppyDisk::IsFloppyOpen()
{
	return (hFloppyDisk?true:false);
}

HANDLE CFloppyDisk::OpenFloppyDisk()
{
	if(IsFloppyOpen())
		return hFloppyDisk;
	else
	{
		HANDLE tmpHandle;
		tmpHandle=CreateFile("\\\\.\\A:",
			GENERIC_READ|GENERIC_WRITE,0,
			NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
		if(tmpHandle==INVALID_HANDLE_VALUE)			
			return NULL;
		else			
			return tmpHandle;		
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -