如何在WIN32应用程序中读写硬盘的扇区。

Hover 2000-03-04 11:02:00
...全文
202 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zoucaiming 2001-07-29
  • 打赏
  • 举报
回复
如何做“只有写一个IO子系统Driver,或者Thunk到Win16,然后直接调用INT13”?有源程序吗?
mainroad 2000-03-08
  • 打赏
  • 举报
回复

//用VWIN32接口调用DOS功能25/26(Windows 95)或7305/7306(Windows OSR2及以上)
//如果想直接读写硬盘绝对扇区,由于VWIN32的VWIN32_DIOC_DOS_INT13接口存在Bugs,
//只有写一个IO子系统Driver,或者Thunk到Win16,然后直接调用INT13。


#define VWIN32_DIOC_DOS_INT25 2
#define VWIN32_DIOC_DOS_INT26 3
#define VWIN32_DIOC_DOS_IOCTL 1

#define FAILUE_LOAD_VWIN32 1
#define FAILUE_LOCK_DRIVE 2
#define FAILUE_CALLING 3
#define FAILUE_DIOC 4
#define FAILUE_LOAD_EXT_DIOC 5

#ifndef QWORD
#define QWORD ULONGLONG
#endif

typedef struct DIOC_REGISTERS {
DWORD ebx;
DWORD edx;
DWORD ecx;
DWORD eax;
DWORD edi;
DWORD esi;
DWORD eflags;
} DIOC_REGISTERS, *PDIOC_REGISTERS;

typedef struct DISKIOADDR{
DWORD StartSector; //dd ? ;sector number to start
WORD Sectors; //dw ? ;number of sectors
DWORD Buffer; //dd ? ;address of buffer
}DISKIOADDR;

int ExecIoCommand( WORD dCode, DIOC_REGISTERS *reg )
{
HANDLE hVxd;
BOOL fResult;
DWORD cb;

SetLastError(0);

hVxd = CreateFile( "\\\\.\\vwin32", 0, 0,
NULL, 0, FILE_FLAG_DELETE_ON_CLOSE, NULL );

if( GetLastError() == ERROR_FILE_NOT_FOUND )
return FAILUE_LOAD_VWIN32;


fResult = ::DeviceIoControl( hVxd,
dCode,
reg, sizeof( DIOC_REGISTERS ),
reg, sizeof( DIOC_REGISTERS ),
&cb, 0 );

if( !fResult ) {
cb = GetLastError();
#ifdef _DEBUG
wvsprintf( (char *)error, "Error code: %u", (char *)&cb );
::MessageBox( NULL, error, "error", MB_OK );
#endif
fResult = FAILUE_DIOC;
}
else if( reg->eflags & 1 ) fResult = FAILUE_CALLING;
else fResult = 0;

CloseHandle( hVxd );
return( fResult );
}


//用VWIN32的Int25/Int26接口(不支持FAT32,仅适用于Windows95)
int AbsLogRead95(char drv, char *buf, int StartSectors, int Num )
{
DIOC_REGISTERS r; //int 25 for read

r.eax = drv-1;
r.ebx = (unsigned)buf;
r.ecx = Num;
r.edx = StartSectors;
return (ExecIoCommand( VWIN32_DIOC_DOS_INT25, &r ) );
}

//用VWIN32调用DOS的0x7305功能(支持FAT32,仅适用于Windows OSR 2及以上版本)
int AbsLogRead97(char drv, char *buf, int StartSectors, int Num)
{
int ErrorCode;
DIOC_REGISTERS reg;
DISKIOADDR addr;
*( DWORD *)( ( BYTE * )&addr ) = StartSectors; //sector start
*( WORD *)( ( BYTE * )&addr + 4 ) = Num; //sector number
*( DWORD *)( ( BYTE * )&addr + 6 ) = (unsigned)buf; //buf size
reg.eax = 0x7305;
reg.ebx = (unsigned)&addr;
reg.ecx = -1;
reg.edx = drv;
reg.esi = 0;
ErrorCode = ExecIoCommand( 6, ® );
return ErrorCode;
}
lu0 2000-03-07
  • 打赏
  • 举报
回复
THUNK到WIN16,调用INT13.事先需要获取排他硬盘访问.

16,471

社区成员

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

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

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