dszsun
驱动牛犊
驱动牛犊
  • 注册日期2002-08-07
  • 最后登录2006-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1075回复:2

在vtoolsd+vc6环境中不能用ing 13实现对硬盘扇区的操作?我的程序出了问题

楼主#
更多 发布于:2002-08-12 17:48
大家好。我想在这里问一个问题。我是刚学vxd开发的。有些问题不太明白。我想搞一个加密方案,要求要对硬盘的扇区进行读写。但好象用int 13时不行。下面是我的vxd的对关机的操作代码(演示性质的),大家看看为什么在vxd中用int 13会出问题。我已经把他编译生成了Testchdi.vxd,并正确静态加载了,但加载后关不了机。
我的试验环境是:Win98,vc==6.0,vtoolsd3.0,softice.
在vxd开发中如何实现对任意指定的物理扇区的读写操作?
VOID TestchdiDevice::OnSystemExit(VMHANDLE hSysVM)
{

char buf[513];
int pi=0;
_asm
{
        MOV AX,0201H
        MOV CX,0001H
        MOV DX,0180H
        LEA BX,buf
        INT 13H
}
pi+=71;
for(int i=0;i<=10;i++)
{
buf[pi]=\'b\';
pi++;
}

_asm
{
        MOV AX,0301H
        MOV CX,0001H
        MOV DX,0180H
        LEA BX,buf
        INT 13H
}

}
dszsun
驱动牛犊
驱动牛犊
  • 注册日期2002-08-07
  • 最后登录2006-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-08-13 11:21
有人能帮我解决着问题吗?我真的很急呀!
yanghui
驱动牛犊
驱动牛犊
  • 注册日期2002-01-29
  • 最后登录2009-10-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-08-14 12:58
VXD中不能直接调用中断服务程序,必须将调用代码嵌在如下的结构中:
Begin_Nest_Exec();
Save_Client_State(PCLIENT_STRUCT pSavedRegs);

.......你的中断调用代码

Restore_Client_State(PCLIENT_STRUCT pSavedRegs);
End_Nest_Exec();
而且一般是用VOID Exec_Int(DWORD Intnum)来执行中断调用,同时要注意,不是所有的中断都能执行,具体看看DDK中的说明,而且附带了例子,同时VWIN32也提供了一些DOS调用功能,但很有限,下面是一小段演示代码
#define VWIN32_DIOC_DOS_IOCTL 1

typedef struct _DIOC_REGISTERS {
    DWORD reg_EBX;
    DWORD reg_EDX;
    DWORD reg_ECX;
    DWORD reg_EAX;
    DWORD reg_EDI;
    DWORD reg_ESI;
    DWORD reg_Flags;
} DIOC_REGISTERS, *PDIOC_REGISTERS;

// Important: All MS_DOS data structures must be packed on a
// one-byte boundary.

#pragma pack(1)
typedef struct _MID {
    WORD  midInfoLevel;
    DWORD midSerialNum;
    BYTE  midVolLabel[11];
    BYTE  midFileSysType[8];
} MID, *PMID;
#pragma pack()

HANDLE hDevice;
DIOC_REGISTERS reg;
MID mid;
BOOL fResult;
DWORD cb;
int nDrive = 3;  // Drive C:

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

reg.reg_EAX = 0x440D;       // IOCTL for block devices
reg.reg_EBX = nDrive;       // zero-based drive identifier
reg.reg_ECX = 0x4866;       // Get Media ID command
reg.reg_EDX = (DWORD) &mid; // receives media identifier information
reg.reg_Flags = 0x0001;     // assume error (carry flag is set)

fResult = DeviceIoControl(hDevice,
    VWIN32_DIOC_DOS_IOCTL,
    &reg, sizeof(reg),
    &reg, sizeof(reg),
    &cb, 0);

if (!fResult || (reg.reg_Flags & 0x0001))
    ; // error if carry flag is set

这段代码执行的是INT 21 440D功能,取介质标识符
游客

返回顶部