听说硬盘ID号能改,是真的吗?
解决方案 »
- 如何进行设置?
- VB6如何实际自动编译.................
- VB 打开损坏 word 文档
- 关于图像区域面积的计算
- 我想通过与adodc绑定的text向数据库中添加数据,具体该怎么做?
- 關於ActiveReport2.0
- 在启动VB或Excel(VBA)时,出现附件中拷贝的窗口。---在线等待,多谢
- 如何实现类似windows搜索文件的功能,主要是针对文件中包含的文字进行模糊查询搜索。
- 具有挑战的问题!!!!求助帮忙
- 请教ADO下Create View的问题
- 有多个窗体,每个窗体有不同的子过程,如何在模块中编写代码执行某窗体内的子过程!
- sql server,表中只有一个字段,由datagrid控件显示,在选中一个datagrid行后,执行delete时,提示更新影响到过多的行....然后所有与该行
硬盘ID号,硬盘序列号,serial number ,物理序号,逻辑驱动器的序列号
为什么没有个标准说法?
卷序列号,或者说磁盘序列号是一个分区所获取的序列号,各种操作系统对磁盘序列号的格式不是统一的,而且使用随机数分配的。虽然这种序列号随机性非常大,几乎也能做到全球唯一,但是不能保证唯一性。所以磁盘序列号的获取和修改都非常简单。
最好用vb实现,vc也可。
用BIOS API一定也行。
用WIN32API行不行,我就不知道了。
可以刷FIRMWARE吗?
http://www.sysinternals.com/ntw2k/source/misc.shtml#VolumeId这是用THUNK实现的绝对读写(微软的Knowledge Base)
http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q137/1/76.asp&NoWebContent=1这是用VxD实现的对硬盘绝对读写:Windows9x下绝对读写硬盘扇区的例程由于win9x下由win32程序对硬盘的写操作被屏蔽,所以绝对硬盘的读写的思路在于设法转入16位程序,因此有两种方法可以达到这种目的:使用THUNK机制调用16位DLL或用VxD转到16位方式,我觉得用THUNK太麻烦,其实VxD挺好编的,而且用起来也方便, 当时也是出于学习目的,编了这么一个VxD,还是挺好用的,我看精华区对这个问题的讨论好像没有什么结果,就把它贴出来,算是班门弄斧吧!
我是用DDK编的,主要是因为我当时是出于学习。
//这是程序的主要部分,其中有一些宏定义,从字面上就能知道是干什么的,我就不罗嗦
//了
DWORD _stdcall CVXD_W32_DeviceIOControl(LPDIOC lpDIOCParms,
CLIENT_STRUCT *pRegs)
{
DWORD dwRetVal = 0,retu;
DWORD *i;
PVMMCB hVM;
DIOC_REGISTERS *lpReg,*lpOutReg;
CLIENT_STRUCT saveregs;
DWORD PageNum;
WORD PageOff;
DWORD Address;
DWORD V86PageNum,MyPage;
WORD seg,offset;
hVM=Get_Cur_VM_Handle();
i=(DWORD *)(lpDIOCParms->lpvOutBuffer);
lpReg=(DIOC_REGISTERS *)(lpDIOCParms->lpvInBuffer);
lpOutReg=(DIOC_REGISTERS *)(lpDIOCParms->lpvOutBuffer);
switch(lpDIOCParms->dwIoControlCode)
{
.
.
.
case 2:
if(lpDIOCParms->cbInBuffer!=sizeof(DIOC_REGISTERS))
return dwRetVal=-1;
//保存当前虚拟机的寄存器状态
_asm push edi
_asm lea edi,saveregs
VMMCall(Save_Client_State);
_asm pop edi
//输入的参数,具体怎么用看INT13的说明吧
_ClientEAX=lpReg->reg_EAX;
_ClientEDX=lpReg->reg_EDX;
_ClientECX=lpReg->reg_ECX;
_ClientEFlags=lpReg->reg_Flags;
/* 以下这一段是编写这个VxD时要考虑的主要问题:把缓冲区的地址映射入虚拟86的地址
区,Win32中用的都是线性地址,先根据它求出页面号,再把缓冲区所在的页映射到虚拟86区
中去,下面程序中有一个Bug,它没有考虑到缓冲区所占页面大于一页时的情形,事实上,缓
冲区可能处在叶面的边界上,而且它的大小可能超过一页,这些都要根据上面参数中给出
的缓冲区大小计算,当时我嫌麻烦,随便应付了一下.用的时候要把这段代码改一下
*/
PageNum=(lpReg->reg_EBX)>>12;
PageOff=(lpReg->reg_EBX)&0xfff;
_asm{
push 0
push 1
push 10
push hVM
push PageNum
}
VMMCall(_LinMapIntoV86);
_asm add esp,14h
_asm mov retu,eax
_asm mov MyPage,edx //返回的页面号在edx寄存器中
if(retu==0) return 3;//这是我自己胡乱选的错误码,你可以自己定成
//其它值
Address=(MyPage<<12)+PageOff;//计算新的线性地址
seg=LOWORD(Address>>4); //把线性地址转化成传统的段:偏
offset=LOWORD(Address-(seg<<4)); //移量的形式
_ClientAltES=seg;//这里一定不能弄错了,在Win32 Ring3程序中用的
//是_ClientES,而虚拟86方式下用的段寄存器则在
//_ClientAltES中,所以要用它
_ClientBX=offset;
//xixi,好戏开始了
VMMCall(Begin_Nest_V86_Exec);//这一句使得系统转入虚拟86方式
_asm mov eax,13h
VMMCall(Exec_Int);//发出int 13h中断调用
//保存返回值
if(lpDIOCParms->cbOutBuffer==sizeof(DIOC_REGISTERS))
{
lpOutReg->reg_Flags=_ClientEFlags;
lpOutReg->reg_EAX=_ClientEAX;
lpOutReg->reg_EBX=_ClientEBX;
lpOutReg->reg_ECX=_ClientECX;
lpOutReg->reg_EDX=_ClientEDX;
}
End_Nest_Exec();//退出虚拟86方式
//轻轻地我走了,正如我轻轻地来,我挥一挥衣袖,不带走一片云彩
_asm push esi
_asm lea esi,saveregs
VMMCall(Restore_Client_State);
_asm pop esi
//这一段取消原来的映射
VMMCall(_GetNulPageHandle);
_asm mov PageNum,eax
_asm{
push 0
push 0
push 1
push 10
push hVM
push PageNum
}
VMMCall(_MapIntoV86);
_asm add esp,18h
//OK
return dwRetVal=0;
}
return dwRetVal;
}