📄 floppydisk.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, ®,
sizeof(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, ®,
sizeof(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, ®,
sizeof(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 + -