📄 xpok.cpp
字号:
//等待 BYS 0
waitLoop = 100000;
while (--waitLoop > 0)
{
if(waitLoop<4) {printf("命令执行失败0\n");return done;}
InPortB(IDE); //读交一下交互状态寄存器 使主机在读它时它的值是有效的
portValue=InPortB(baseAddress + 7);
if ((portValue & 0x80) == 0x00) //BYS 如果设备不忙
{
//如果设备出错就读交互状态寄存器,开中断,并退出返回失败
if ((portValue & 0x01) == 0x01){printf("命令执行失败1\n");OutPortB(IDE, 0x00);return done;}
//如果设备准备好数据传送
if ((portValue & 0x50) == 0x50){ break; }
}
}
//----------------- 写参数写命令过程结束-------------------------------------------------
//----------------- 读取寄存器数据开始 -------------------------------------------------------
Cmd[0] = InPortB(baseAddress + 1); //错误寄存器/功能
if(Cmd[0]!=0x00) {printf("传数据失败1\n");OutPortB(IDE, 0x00);return done;}
Cmd[1] = InPortB(baseAddress + 2); //扇区数寄存器
Cmd[2] = InPortB(baseAddress + 3); //扇区号寄存器
Cmd[3] = InPortB(baseAddress + 4); //柱面号寄存器底字节
Cmd[4] = InPortB(baseAddress + 5); //柱面号寄存器高字节
Cmd[5] = InPortB(baseAddress + 6); //设备选择/磁头寄存器 磁头参数只用低4位请只设低4位的值
Cmd[6] = InPortB(baseAddress + 7); //命令/状态寄存器(这里设定的是查看硬盘信息命令F8)
//----------------- 读取寄存器数据结束 -------------------------------------------------------
//---- 关中断 ----
OutPortB(IDE, 0x00); //可择 这里不要那后面的 开中断也不能要
//---- 关中断 ----
//---------------- 后期处理开始 -------------------------------------------------------
//---------------- 后期处理结束 -------------------------------------------------------
//----------------- 显示开始 -------------------------------------------------------
//PrintIdeInfo1(diskdata);
//----------------- 显示结束 -------------------------------------------------------
done = true;
return done;
}
/* ======================================= */
/* 读取硬盘内部出厂数据函数及初始化(新) */
/* ======================================= */
BOOL SW_IDENTIFY_DEVICE (int drive)
{
BOOL done=false;
WORD kk[256];
BYTE sw[7];
sw[0]=0;
sw[1]=0;
sw[2]=0;
sw[3]=0;
sw[4]=0;
sw[5]=0;
sw[6]=0xEC;
if(!SW_InOutDriveCmd(drive,0,true,sw,kk))
return done=false;
PrintIdeInfo(kk);
done = true;
return done;
}
BOOL SW_READ_NATIVE_MAX_ADDRESS(int drive)
//参数不用指针是为了工作于多线程
{
BOOL done=false;
unsigned long int MaxAddress1=0;
BYTE sw[7];
sw[0]=0;
sw[1]=0;
sw[2]=0;
sw[3]=0;
sw[4]=0;
sw[5]=0;
sw[6]=0xF8;
if(!SW_NoDriveCmd(drive,true,sw))
return done;
//显示返回
printf("错误寄存器 :%02x\n",sw[0]);
printf("扇区数寄存器 :%02x\n",sw[1]);
printf("扇区号寄存器 :%02X\n",sw[2]);
printf("柱面号寄存器底字节:%02X\n",sw[3]);
printf("柱面号寄存器底字节:%02X\n",sw[4]);
printf("驱动器/磁头寄存器 :%02X\n",sw[5]);
printf("状态 :%02X\n",sw[6]);
//计算最大地址并显示
MaxAddress1=(sw[5]&0x0f)*0xffffff+sw[4]*0xffff+sw[3]*0xff+sw[2];
printf("%d\n",MaxAddress1);
done=true;
return done;
}
BOOL SW_SET_MAX_ADDRESS(int drive,unsigned long MaxAddress)
{
BOOL done=false;
unsigned long int Zyn_Sectors=MaxAddress*2*1000;
unsigned int F3data = 0, F4data = 0, F5data = 0, F6data = 0;
F6data = Zyn_Sectors/(unsigned long)0x1000000; //
F5data = (Zyn_Sectors%(unsigned long)0x1000000)/0x10000; //计算按排
F4data = ((Zyn_Sectors%(unsigned long)0x1000000)%0x10000)/0x100; //积存器值
F3data = ((Zyn_Sectors%(unsigned long)0x1000000)%0x10000)%0x100; //
BYTE sw[7];
sw[0]=0;
sw[1]=1;
sw[2]=F3data;
sw[3]=F4data;
sw[4]=F5data;
sw[5]=F6data;
sw[6]=0xF9;
if(SW_READ_NATIVE_MAX_ADDRESS(drive))
{
if(!SW_NoDriveCmd(drive,true,sw))
return done;
}
else
return done;
//显示返回
printf("错误寄存器 :%02x\n",sw[0]);
printf("扇区数寄存器 :%02x\n",sw[1]);
printf("扇区号寄存器 :%02X\n",sw[2]);
printf("柱面号寄存器底字节:%02X\n",sw[3]);
printf("柱面号寄存器底字节:%02X\n",sw[4]);
printf("驱动器/磁头寄存器 :%02X\n",sw[5]);
printf("状态 :%02X\n",sw[6]);
//计算最大地址并显示
Zyn_Sectors=(sw[5]&0x0f)*0xffffff+sw[4]*0xffff+sw[3]*0xff+sw[2];
printf("LBA : %u\n",Zyn_Sectors);
Zyn_Sectors=Zyn_Sectors/2/1000;
printf("Mb : %u\n",Zyn_Sectors);
done=true;
return done;
}
//执行这个口令磁盘必须没有锁定,
//传送一个口令给磁盘,但是口令必须要关机才能保存
BOOL SW_SET_MAX_SET_PASSWORD(int drive, char password[16] )
{
BOOL done=false;
BYTE sw[7];
WORD kk[256];
for(int i=0;i<256;i++)
{
kk[i]=0;
}
for(int i1=1;i1<17;i1++)
{
kk[i]=password[i];
}
sw[0]=0x01;
sw[1]=0;
sw[2]=0;
sw[3]=0;
sw[4]=0;
sw[5]=0;
sw[6]=0xF9;
//if(!SW_InOutDriveCmd(drive,1,true,sw,kk))
//return done;
PrintIdeInfo(kk);
done = true;
return done;
}
//执行指令之后使设备锁定,除了可以执行解锁和冻结指令,
//其它SET_MAX指令都不能执行
BOOL SW_SET_MAX_LOCK (int drive)
{
BOOL done=false;
BYTE sw[7];
sw[0]=0x02;
sw[1]=0;
sw[2]=0;
sw[3]=0;
sw[4]=0;
sw[5]=0;
sw[6]=0xF8;
if(!SW_NoDriveCmd(drive,true,sw))
{
return done;
}
done = true;
return done;
}
//执行指令之后,所有SET_MAX指令都可以执行
//有5次密码机会,到了就要关机重来
BOOL SW_SET_MAX_UNLOCK(int drive, char password[16] )
{
BOOL done=false;
BYTE sw[7];
WORD kk[256];
for(int i=0;i<256;i++)
{
kk[i]=0;
}
for(int i1=1;i1<17;i1++)
{
kk[i]=password[i];
}
sw[0]=0x03;
sw[1]=0;
sw[2]=0;
sw[3]=0;
sw[4]=0;
sw[5]=0;
sw[6]=0xF9;
//if(!SW_InOutDriveCmd(drive,1,true,sw,kk))
//return done;
PrintIdeInfo(kk);
done = true;
return done;
}
//只支持LAB方式 0---到138G 超过了就出错
BOOL SW_READ_WRITE_SECTOR(int drive, int InOut, unsigned long Address,WORD buf[256] )
{
BOOL done=false;
unsigned long Addr=Address;
BYTE sw[7];
sw[0]=0;
sw[1]=1;
sw[2]=(BYTE)Addr;
sw[3]=(BYTE)(Addr>>8);
sw[4]=(BYTE)(Addr>>16);
sw[5]=(BYTE)(Addr>>24);
if(InOut==0)
sw[6]=0x20;
if(InOut==1)
sw[6]=0x30;
if(!SW_InOutDriveCmd(drive,InOut,true,sw,buf))
return done;
done = true;
return done;
}
BOOL SW_LOCK(int drive, char password[16] ,unsigned long MaxAddress)
{
BOOL done=false;
if(!SW_SET_MAX_ADDRESS(drive,MaxAddress))
return done;
if(!SW_SET_MAX_SET_PASSWORD(drive,password))
return done;
if(!SW_SET_MAX_LOCK (drive))
return done;
done = true;
return done;
}
BOOL SW_UNLOCK(int drive, char password[16], unsigned long MaxAddress)
{
BOOL done=false;
if( !SW_SET_MAX_UNLOCK(drive, password ) )
return done;
if(!SW_SET_MAX_ADDRESS(drive,MaxAddress))
return done;
done = true;
return done;
}
int main(int argc, char* argv[])
{
HMODULE hNtdll;
//ULONG ReturnLength;
OSVERSIONINFO OSVersionInfo;
OSVersionInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
EnablePrivilege (SE_DEBUG_NAME);
hNtdll =LoadLibrary ("ntdll.dll");
if(hNtdll==NULL)
{
printf("sb1");return 0;
}
ZwSystemDebugControl = (PZwSystemDebugControl) GetProcAddress (hNtdll, "ZwSystemDebugControl");
if( ZwSystemDebugControl== NULL)
{
printf("sb3");return 0;
}
if(GetVersionEx (&OSVersionInfo) == NULL)
{
printf("sb4");
}
if (OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT &&
OSVersionInfo.dwMajorVersion >= 5 &&
OSVersionInfo.dwMinorVersion >= 1) //Windows XP以上
{
int i=20;
while(--i>0)
{
char k='1';
k=getchar();
if(k=='1')
SW_READ_NATIVE_MAX_ADDRESS(0);
if(k=='2')
//SW_SET_MAX_ADDRESS(0,20010);
SW_IDENTIFY_DEVICE (0);
if(k=='3')
{
WORD sw[256];
for(int i=0;i<50;i++)
{
SW_READ_WRITE_SECTOR(0,0,0,sw);
PrintIdeInfo1(sw);
}
}
}
}
else
{
printf ("This program require Windows XP or Windows 2003.\n");
}
FreeLibrary(hNtdll);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -