如何在WIN32应用程序中读写硬盘的扇区。
问题点数:50、回复次数:3Top
1 楼lu0(lu0.126.com)回复于 2000-03-07 22:41:00 得分 25
THUNK到WIN16,调用INT13.事先需要获取排他硬盘访问.Top
2 楼mainroad()回复于 2000-03-08 23:20:00 得分 25
//用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;
}
Top
3 楼zoucaiming(Zcm)回复于 2001-07-29 12:38:29 得分 0
如何做“只有写一个IO子系统Driver,或者Thunk到Win16,然后直接调用INT13”?有源程序吗?Top





