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

📄 windisk.cpp

📁 低级磁盘读些程序
💻 CPP
字号:
// Windisk.cpp: implementation of the CWindisk class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Windisk.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CWindisk::CWindisk()
{
	strcpy(KEYFILE,"a:\\info.map");	
}

CWindisk::~CWindisk()
{
	strcpy(KEYFILE,"");	
}



int CWindisk::yzjqm(int command, char *jqm)
{
	int i=1,j=0,z=0,s=0;
	char info[512];
	if(command==0 && strlen(jqm)==8)
	{/*写机器码*/
		memset(info,NULL,512);
		s=ReadSector(0,1,79,17,info);/*返回0读取成功*/
			if(s) return 3;
		z=0,j=0;
		for(i=100;i<604 && j<8;i++)
   		{
   			z++;
   			if(z==3) z=0;
			if(i%63==0) info[i-100]=jqm[j++]+z;
   		}
		s=WriteSector(0,1,79,17,info);
		if(s) return 3;/*返回0写入成功*/
		return 0;
	}
	if(command==2134)
	{/*写原机器码*/
		return yzjqm(0,"24886547");
	}
	if(command==1 && strlen(jqm)==8)
	{
		memset(info,NULL,512);
		s=ReadSector(0,1,79,17,info);/*返回0读取成功*/
						if(s) return 3;
		z=0,j=0;/*验证本机器码*/
   		for(i=100;i<604;i++)
   		{
   				z++;
   				if(z==3) z=0;
				if(i%63==0 && j<8)
   				{
					if(info[i-100]!=jqm[j++]-z) 
					{
						return 1;
					}
				}
   		}
		return 0;
	//if(yz==0) return 0/*验证初期机器码成功*/;
	//else if(yz==1) s=1/*验证本机机器码成功*/;
	//else s=2;/*验证机器码失败*/
	}
}

int CWindisk::MakeSector(unsigned char drive, unsigned char head, unsigned char track, unsigned char sector, char *buffer)
{
int i,ret,retry;
unsigned char cmd[3]={5,3,2};
char ctemp[513];
for(i=0;i<3;i++)
{
 retry=5;
 while(retry) 
 {
  
  if(i==0)
  {ctemp[0]=track;
   ctemp[1]=head;
   ctemp[2]=sector;
   ctemp[3]=2;
  }
  else if(i==1)
   memcpy(ctemp,buffer,512);
  ret=WinBiosDisk(cmd[i],drive,head,track,sector,1,ctemp);
  if(ret==0)break;
  else if(ret==0x3)return ret;
  WinBiosDisk(2,drive,head,track?track-1:track+1,sector,1,ctemp); //重置磁头
  retry--;	 
 }
 if(!retry)return ret;
}
ret=memcmp(ctemp,buffer,512);
if(ret)return 0xffff;
else return 0;
}

int CWindisk::ReadSector(unsigned char drive, unsigned char head, unsigned char track, unsigned char sector, char *buffer)
{
OSVERSIONINFO ovinfo;
ovinfo.dwOSVersionInfoSize=sizeof (OSVERSIONINFO);
GetVersionEx(&ovinfo);

if(ovinfo.dwPlatformId!=VER_PLATFORM_WIN32_NT)
{
int i,retry=5;
while(retry) 
{
 i=WinBiosDisk(2,drive,head,track,sector,1,buffer);
 if(i==0)break;
 WinBiosDisk(2,drive,head,track?track-1:track+1,sector,1,buffer); //重置磁头
 retry--;
}
}
/************************************************************************/
//WIN2000读写
else
{
	int ret=0;
	HANDLE hDev;
	unsigned long dwRet;
	
	hDev=CreateFile("\\\\.\\A:",GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
	SetFilePointer(hDev,512*(18*(track*2+head)+(sector-1)),0,FILE_BEGIN);	
	for(int s=0;s<5;s++)
	{
	 i=ReadFile(hDev,buffer,512,&dwRet,0);
	 if(i==0) break;
	}
	CloseHandle(hDev);
}
return i;
}

int CWindisk::WinBiosDisk(unsigned char command, unsigned char drive, unsigned char head, unsigned char track, unsigned char sector, unsigned char nsectors, void *buffer)
{
/****************************************************************/
//WIN9X读写
	HANDLE hd;
	DWORD dw;
	//int13 寄存器参数块
	typedef struct tagPackage
	{
		void  *buffer;            //  ebx 寄存器

		unsigned char  drive;     //  edx 寄存器
		unsigned char  head;      // 
		unsigned short edx_high;  //   

		unsigned char  sector;    //  ecx 寄存器
		unsigned char  track;     //
		unsigned short ecx_high;  //

		unsigned char  number;    // eax 寄存器
		unsigned char  option;    //
		unsigned short eax_high;  //
	
		unsigned int   edi;       // edi 寄存器

		unsigned int   esi;
		unsigned int   eflag;
	} PK;

	PK pk;
	 memset(&pk,0,sizeof PK);
	pk.buffer=buffer;
	pk.drive=drive;
	pk.head=head;
	pk.sector=sector;
	pk.track=track;
	pk.option=command;
	pk.number=nsectors;

	if(command==0x18)pk.edi=(int)buffer;
	hd=CreateFile("\\\\.\\vWin32",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,NULL,NULL);
	if(hd==NULL)return 1;
	DeviceIoControl(hd,4,&pk,0x1c,&pk,0x1c,&dw,NULL);
	if(command==0x8)memcpy(buffer,(unsigned char *)pk.edi,11);
	CloseHandle(hd);
	return pk.option;
}
/************************************************************************/
//WIN2000读写

int CWindisk::yzkey()
{
   char buf,buffer[513];
   int i=0,j=0,z=0;
   FILE *fp;
   fp=fopen(KEYFILE,"r");
     if(!fp) return 3;
   memset(buffer,512,NULL);
   i=ReadSector(0,0,79,18,buffer);
   if(i) return 4;/*返回0读取成功*/
   if(strlen(buffer)<511) return 1;
   j=0;buf=0;z=0;
   for(i=10;i<5120;i++)
   {
   	z++;
   	if(z==10) z=0;
	buf=fgetc(fp);
	if(i%10==1)
	{
		if(buffer[j++]!=buf+z) return 1;/*验证磁盘钥匙*/
	}
   }
   fclose(fp);
   return 0;/*验证成功*/
}

int CWindisk::WriteSector(unsigned char drive, unsigned char head, unsigned char track, unsigned char sector,char *buffer)
{
OSVERSIONINFO ovinfo;
ovinfo.dwOSVersionInfoSize=sizeof (OSVERSIONINFO);
GetVersionEx(&ovinfo);

if(ovinfo.dwPlatformId!=VER_PLATFORM_WIN32_NT)
{
int i,retry=5;
char *buffer1;
buffer1=new char[8196];
while(retry) 
{
 i=WinBiosDisk(3,drive,head,track,sector,1,buffer);
 if(i==0)break;
 WinBiosDisk(2,drive,head,track?track-1:track+1,sector,1,buffer1); //重置磁头
 retry--;
}
}
else
{
	hDev=CreateFile("\\\\.\\A:",GENERIC_READ,FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
	SetFilePointer(hDev,512*(18*(track*2+head)+(sector-1)),0,FILE_BEGIN);
	WriteFile(hDev,buffer,512,&dwRet,0);
	CloseHandle(hDev);
}
return i;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -