THUNK到WIN16,调用INT13.事先需要获取排他硬盘访问.
解决方案 »
- 请问vc中如何实现类似word文字编辑的功能,
- 如何对css文件中class属性进行修改
- 怎样得到list中的当前所在项
- 请问在mainfrm中怎么用SetTimer函数?
- 在线提问,在线给分(一个很菜的问题)
- 请问如何解决连接错误
- 图遍历的演示
- 内存映射如何映射大文件,超过4G就报磁盘空间不足?
- 关于dll的,小弟调用 __FUnloadDelayLoadedDLL(m_DllFile)后不起效果,哪位给讲讲
- 上一个没有会,分送不出去了,现问一个简单的,还是150分,有能力者食之
- 用SHFileoperate()可以得到一个文件在Windows中显示的名称,但如果设置了"隐藏已知文件类型的扩展名"得到的就是没有扩展名的了,我想无论用户是否设置,都得到文件的全名,应该如何做?
- 如何在NT下读写磁盘物理扇区?
//用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
#endiftypedef 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;
}