⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xpok.cpp

📁 YSS915 (KP2V2) is an LSI for processing Karaoke voice signals. This LSI has an A/D converter (1 cha
💻 CPP
📖 第 1 页 / 共 3 页
字号:
   //等待 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 + -