www.pudn.com > hddlock.rar > LOCKMAIN.C


//******************************************** 
//文件名:LOCKMAIN.C 
//功能:1. 调用显示汉字函数 
//      2. 调用字符处理函数 
//      3. 调用读扇区汇编子程序 
//      4. 调用写扇区汇编子程序 
//      5. 建立扇区数据备份文件 
//      6. 将扇区清零对硬盘实行加锁 
//      7. 将数据写回扇区对硬盘实行解锁 
//******************************************** 
#include                          //1. 
#include                           //2. 
#include                           //3. 
#include                           //4. 
#include                          //5. 
#include                           //6. 
#include                              //7. 
#include                        //8. 
#include"port.h"                            //9.包含硬盘序列号头文件 
#include"pw.h"                              //10.包含密钥头文件 
extern RHD(int,int,int,int,char *);         //11.声明读扇区汇编子程序 
extern WHD(int,int,int,int,char *);         //12.声明写扇区汇编子程序 
int outhz(int,int,char *,int);              //13.声明汉字显示函数 
void finame(int,int);                       //14.声明字符处理函数 
void jia(void);                             //15.声明加密函数 
void jie(void);                             //16.声明解密函数 
void copyf(void);                           //17.声明拷贝文件函数 
void cle(void);                             //18.声明扇区清零函数 
char name[13];                              //19. 
                                            //20. 
void main(int argc,char *argv[])            //21.带命令行参数的主函数 
{                                           //22. 
  FILE *tmfp,*fp;                           //23. 
  char ch;                                  //24. 
  char tmp[30];                             //25. 
  char pwh[11];                             //26. 
  int i,j,k,l;                              //27. 
  unsigned num=48059;                       //28. 
  long flag1,flag2,flag3;                   //29. 
  unsigned long m;                          //30. 
  unsigned char s1,s2,s3,s4;                //31. 
  char sh[21];                              //32. 
  unsigned id;                              //33. 
  unsigned cw[257];                         //34. 
  long port=135792468;                      //35.设定序列号基数 
  long pw=135798642;                        //36.设定密钥基数 
  extern char gsh[16];                      //37. 
  int gdriver=DETECT,gmode;                 //38. 
  registerbgidriver(EGAVGA_driver);         //39. 
  initgraph(&gdriver,&gmode,"");            //40. 
  setbkcolor(0);                            //41. 
  cleardevice();                            //42. 
                                            //43. 
  if(argc==1)                               //44.若命令行参数为1 
    strcpy(name,argv[0]);                   //45. 
  else                                      //46.否则 
  {                                         //47. 
    strcpy(tmp,"多余的参数:");             //48. 
    strcat(tmp,argv[1]);                    //49. 
    setviewport(0,20,200,60,0);             //50. 
    outhz(0,0,tmp,7);                       //51.调用汉字显示函数 
    outhz(0,20,"按任一键退出",7);           //52. 
    getch();                                //53. 
    closegraph();                           //54. 
    exit(0);                                //55. 
  }                                         //56. 
  m=0;                                      //57. 
  outp(0x1f6,0xa0);                         //58. 
  outp(0x1f7,0xec);                         //59. 
  while(inp(0x1f7)!=0x58 && m++<0xffff)     //60. 
  ;                                         //61. 
  for(id=0;id!=256;id++)                    //62. 
    cw[id]=inpw(0x1f0);                     //63. 
  for(j=10,k=0;j<=19;j++)                   //64. 
  {                                         //65. 
    sh[k++]=(char)(cw[j]/256);              //66. 
    sh[k++]=(char)(cw[j]%256);              //67. 
  }                                         //68. 
  sh[k]='\0';                               //69. 
  l=strlen(sh);                             //70. 
                                            //71. 
  for(i=0;i0)                                 //93. 
  ;                                         //94. 
  flag1=0;                                  //95. 
  while(1)                                  //96. 
  {                                         //97. 
    setviewport(0,20,200,40,0);             //98. 
    outhz(0,0,"输入密钥:",7);              //99.调用汉字显示函数 
    finame(90,20);                          //100.调用字符处理函数 
    strcpy(pwh,gsh);                        //101. 
    strcpy(pwh,strupr(pwh));                //102.字符串转大写 
    for(i=0;i<10;i++)                       //103. 
    {                                       //104. 
      srand(pw);                            //105. 
      ch=rand();                            //106. 
      hdpw[i]=hdpw[i]^ch;                   //107. 
      pw=pw+7;                              //108. 
    }                                       //109. 
    j=0;                                    //110. 
    for(i=0;i<10;i++)                       //111. 
    {                                       //112. 
      if(pwh[i]==hdpw[i])                   //113.密钥字符若相等 
        j++;                                //114. 
      else                                  //115.否则 
      {                                     //116. 
        flag1=88;                           //117. 
        break;                              //118. 
      }                                     //119. 
    }                                       //120. 
    if(flag1==88)                           //121. 
    {                                       //122. 
      fp=fopen("hhdlock.exe","rb+");        //123.以添加方式打开文件 
      fseek(fp,2362,0);                     //124.移动文件指针 
      fread(&id,2,1,fp);                    //125.读两个字节的值 
      if((id-48059)>=2)                     //126. 
      {                                     //127. 
        cleardevice();                      //128. 
        setviewport(0,20,200,40,0);         //129. 
        outhz(0,0,"非法用户!",14);         //130. 
        remove(name);                       //131. 
        while(1)                            //132. 
        ;                                   //133. 
      }                                     //134. 
      setviewport(0,40,200,100,0);          //135. 
      outhz(0,0,"输入的密钥错误!",15);     //136. 
      strcpy(tmp,"剩余的输入密钥的次数:"); //137. 
      i=2-(id-48059);                       //138. 
      itoa(i,pwh,10);                       //139. 
      strcat(tmp,pwh);                      //140. 
      outhz(0,20,tmp,15);                   //141. 
      id++;                                 //142. 
      rewind(fp);                           //143. 
      fseek(fp,2362,0);                     //144. 
      fwrite(&id,2,1,fp);                   //145. 
      fclose(fp);                           //146. 
      outhz(0,40,"按任一键退出",7);         //147. 
      getch();                              //148. 
      closegraph();                         //149. 
      exit(0);                              //150. 
    }                                       //151. 
    printf("\n");                           //152. 
    if(j==10)                               //153. 
    {                                       //154. 
      id=48059;                             //155. 
      fp=fopen("hhdlock.exe","rb+");        //156. 
      fseek(fp,2362,0);                     //157. 
      fwrite(&id,2,1,fp);                   //158.恢复原来的值 
      fclose(fp);                           //159. 
      break;                                //160. 
    }                                       //161. 
  }                                         //162. 
                                            //163. 
  m=63;                                     //164. 
  tmfp=tmpfile();                           //165. 
  fwrite(&m,4,1,tmfp);                      //166. 
  rewind(tmfp);                             //167. 
  fread(&s4,1,1,tmfp);                      //168. 
  fread(&s3,1,1,tmfp);                      //169. 
  fread(&s2,1,1,tmfp);                      //170. 
  fread(&s1,1,1,tmfp);                      //171. 
  fclose(tmfp);                             //172. 
  tmpnam(tmp);                              //173. 
  RHD(s1,s2,s3,s4,tmp);                     //174. 
  flag1=0;                                  //175. 
  fp=fopen(tmp,"rb");                       //176. 
  for(i=0;i<=511;i++)                       //177. 
  {                                         //178. 
    ch=fgetc(fp);                           //179. 
    flag1+=ch;                              //180. 
  }                                         //181. 
  fclose(fp);                               //182. 
  remove(tmp);                              //183. 
  m=64;                                     //184. 
  tmfp=tmpfile();                           //185. 
  fwrite(&m,4,1,tmfp);                      //186. 
  rewind(tmfp);                             //187. 
  fread(&s4,1,1,tmfp);                      //188. 
  fread(&s3,1,1,tmfp);                      //189. 
  fread(&s2,1,1,tmfp);                      //190. 
  fread(&s1,1,1,tmfp);                      //191. 
  fclose(tmfp);                             //192. 
  tmpnam(tmp);                              //193. 
  RHD(s1,s2,s3,s4,tmp);                     //194. 
  flag2=0;                                  //195. 
  fp=fopen(tmp,"rb");                       //196. 
  for(i=0;i<=511;i++)                       //197. 
  {                                         //198. 
    ch=fgetc(fp);                           //199. 
    flag2+=ch;                              //200. 
  }                                         //201. 
  fclose(fp);                               //202. 
  remove(tmp);                              //203. 
  m=65;                                     //204. 
  tmfp=tmpfile();                           //205. 
  fwrite(&m,4,1,tmfp);                      //206. 
  rewind(tmfp);                             //207. 
  fread(&s4,1,1,tmfp);                      //208. 
  fread(&s3,1,1,tmfp);                      //209. 
  fread(&s2,1,1,tmfp);                      //210. 
  fread(&s1,1,1,tmfp);                      //211. 
  fclose(tmfp);                             //212. 
  tmpnam(tmp);                              //213. 
  RHD(s1,s2,s3,s4,tmp);                     //214. 
  flag3=0;                                  //215. 
  fp=fopen(tmp,"rb");                       //216. 
  for(i=0;i<=511;i++)                       //217. 
  {                                         //218. 
    ch=fgetc(fp);                           //219. 
    flag3+=ch;                              //220. 
  }                                         //221. 
  fclose(fp);                               //222. 
  remove(tmp);                              //223. 
  if((flag1==0)&&(flag2==0)&&(flag3==0))    //224. 
  {                                         //225. 
    setviewport(0,40,200,80,0);             //226. 
    outhz(0,0,"正在解锁,请稍等",10);       //227. 
    jie();                                  //228. 
    outhz(0,40,"解锁成功",15);              //229. 
    outhz(0,60,"按任一键退出",7);           //230. 
    getch();                                //231. 
    closegraph();                           //232. 
  }                                         //233. 
  else                                      //234. 
  {                                         //235. 
    if((fp=fopen("data.hd","rb"))!=NULL)    //236.检测文件名 
    {                                       //237. 
      fclose(fp);                           //238. 
      cleardevice();                        //239. 
      setviewport(0,20,620,60,0);           //240. 
      outhz(0,20,"[data.hd]文件已在当前"    //241. 
        "目录中,请先将其删除或移走,再"    //242. 
        "运行程序",7);                      //243. 
      outhz(0,40,"按任一键退出",7);         //244. 
      getch();                              //245. 
      closegraph();                         //246. 
      exit(0);                              //247. 
    }                                       //248. 
    setviewport(0,40,200,60,0);             //249. 
    outhz(0,0,"正在加锁,请稍等",13);       //250. 
    jia();                                  //251. 
    copyf();                                //252. 
    cle();                                  //253. 
    setviewport(0,80,200,120,0);            //254. 
    outhz(0,20,"加锁成功",15);              //255. 
    outhz(0,40,"按任一键退出",7);           //256. 
    getch();                                //257. 
    closegraph();                           //258. 
  }                                         //259. 
}                                           //260. 
char gsh[16];                               //261. 
                                            //262. 
void jia()                                  //263. 
{                                           //264. 
  FILE *tmfp,*hdfp,*fp;                     //265. 
  char h[512];                              //266. 
  char tmp[13];                             //267. 
  int i,j;                                  //268. 
  int fat;                                  //269. 
  unsigned long sec[120];                   //270. 
  unsigned number=0;                        //271. 
  unsigned long k=0,m;                      //272. 
  unsigned long data1,data2;                //273. 
  unsigned char s1,s2,s3,s4;                //274. 
  char ch;                                  //275. 
                                            //276. 
  hdfp=fopen("data.hd","ab+");              //277.以添加方式打开文件 
  tmfp=tmpfile();                           //278. 
  fwrite(&k,4,1,tmfp);                      //279. 
  rewind(tmfp);                             //280. 
  fread(&s4,1,1,tmfp);                      //281. 
  fread(&s3,1,1,tmfp);                      //282. 
  fread(&s2,1,1,tmfp);                      //283. 
  fread(&s1,1,1,tmfp);                      //284. 
  fclose(tmfp);                             //285. 
  tmpnam(tmp);                              //286. 
  RHD(s1,s2,s3,s4,tmp);                     //287. 
  sec[number]=k;                            //288. 
  number++;                                 //289. 
  fp=fopen(tmp,"rb");                       //290. 
  for(i=0;i<=511;i++)                       //291. 
  {                                         //292. 
    ch=fgetc(fp);                           //293. 
    fputc(ch,hdfp);                         //294. 
  }                                         //295. 
  fseek(fp,470,0);                          //296. 
  fread(&data1,4,1,fp);                     //297.读扇区数字段值 
  fseek(fp,450,0);                          //298. 
  fat=fgetc(fp);                            //299.读分区格式字段值 
  fclose(fp);                               //300. 
  remove(tmp);                              //301. 
                                            //302. 
  m=k=k+63;                                 //303. 
  for(j=1;j<=5;j++)                         //304. 
  {                                         //305. 
    tmfp=tmpfile();                         //306. 
    fwrite(&k,4,1,tmfp);                    //307. 
    rewind(tmfp);                           //308. 
    fread(&s4,1,1,tmfp);                    //309. 
    fread(&s3,1,1,tmfp);                    //310. 
    fread(&s2,1,1,tmfp);                    //311. 
    fread(&s1,1,1,tmfp);                    //312. 
    fclose(tmfp);                           //313. 
    tmpnam(tmp);                            //314. 
    RHD(s1,s2,s3,s4,tmp);                   //315. 
    sec[number]=k;                          //316. 
    number++;                               //317. 
    fp=fopen(tmp,"rb");                     //318. 
    for(i=0;i<=511;i++)                     //319. 
    {                                       //320. 
      ch=fgetc(fp);                         //321. 
      fputc(ch,hdfp);                       //322. 
    }                                       //323. 
    fclose(fp);                             //324. 
    remove(tmp);                            //325. 
    k++;                                    //326. 
  }                                         //327. 
  if(fat==0x0b)                             //328.若是FAT32分区 
  {                                         //329. 
    k=m+32;                                 //330. 
    for(j=1;j<=6;j++)                       //331. 
    {                                       //332. 
      tmfp=tmpfile();                       //333. 
      fwrite(&k,4,1,tmfp);                  //334. 
      rewind(tmfp);                         //335. 
      fread(&s4,1,1,tmfp);                  //336. 
      fread(&s3,1,1,tmfp);                  //337. 
      fread(&s2,1,1,tmfp);                  //338. 
      fread(&s1,1,1,tmfp);                  //339. 
      fclose(tmfp);                         //340. 
      tmpnam(tmp);                          //341. 
      RHD(s1,s2,s3,s4,tmp);                 //342. 
      sec[number]=k;                        //343. 
      number++;                             //344. 
      fp=fopen(tmp,"rb");                   //345. 
      for(i=0;i<=511;i++)                   //346. 
      {                                     //347. 
        ch=fgetc(fp);                       //348. 
        fputc(ch,hdfp);                     //349. 
      }                                     //350. 
      fclose(fp);                           //351. 
      remove(tmp);                          //352. 
      k++;                                  //353. 
    }                                       //354. 
  }                                         //355. 
  if(data1==0)                              //356. 
  ;                                         //357. 
  else                                      //358. 
  {                                         //359. 
    k=data1;                                //360. 
    while(1)                                //361. 
    {                                       //362. 
      tmfp=tmpfile();                       //363. 
      fwrite(&k,4,1,tmfp);                  //364. 
      rewind(tmfp);                         //365. 
      fread(&s4,1,1,tmfp);                  //366. 
      fread(&s3,1,1,tmfp);                  //367. 
      fread(&s2,1,1,tmfp);                  //368. 
      fread(&s1,1,1,tmfp);                  //369. 
      fclose(tmfp);                         //370. 
      tmpnam(tmp);                          //371. 
      RHD(s1,s2,s3,s4,tmp);                 //372. 
      sec[number]=k;                        //373. 
      number++;                             //374. 
      fp=fopen(tmp,"rb");                   //375. 
      for(i=0;i<=511;i++)                   //376. 
      {                                     //377. 
        ch=fgetc(fp);                       //378. 
        fputc(ch,hdfp);                     //379. 
      }                                     //380. 
      fseek(fp,470,0);                      //381. 
      fread(&data2,4,1,fp);                 //382. 
      fseek(fp,450,0);                      //383. 
      fat=fgetc(fp);                        //384. 
      fclose(fp);                           //385. 
      remove(tmp);                          //386. 
                                            //387. 
      m=k=k+63;                             //388. 
      for(j=1;j<=5;j++)                     //389. 
      {                                     //390. 
        tmfp=tmpfile();                     //391. 
        fwrite(&k,4,1,tmfp);                //392. 
        rewind(tmfp);                       //393. 
        fread(&s4,1,1,tmfp);                //394. 
        fread(&s3,1,1,tmfp);                //395. 
        fread(&s2,1,1,tmfp);                //396. 
        fread(&s1,1,1,tmfp);                //397. 
        fclose(tmfp);                       //398. 
        tmpnam(tmp);                        //399. 
        RHD(s1,s2,s3,s4,tmp);               //400. 
        sec[number]=k;                      //401. 
        number++;                           //402. 
        fp=fopen(tmp,"rb");                 //403. 
        for(i=0;i<=511;i++)                 //404. 
        {                                   //405. 
          ch=fgetc(fp);                     //406. 
          fputc(ch,hdfp);                   //407. 
        }                                   //408. 
        fclose(fp);                         //409. 
        remove(tmp);                        //410. 
        k++;                                //411. 
      }                                     //412. 
      if(fat==0x0b)                         //413. 
      {                                     //414. 
        k=m+32;                             //415. 
        for(j=1;j<=6;j++)                   //416. 
        {                                   //417. 
          tmfp=tmpfile();                   //418. 
          fwrite(&k,4,1,tmfp);              //419. 
          rewind(tmfp);                     //420. 
          fread(&s4,1,1,tmfp);              //421. 
          fread(&s3,1,1,tmfp);              //422. 
          fread(&s2,1,1,tmfp);              //423. 
          fread(&s1,1,1,tmfp);              //424. 
          fclose(tmfp);                     //425. 
          tmpnam(tmp);                      //426. 
          RHD(s1,s2,s3,s4,tmp);             //427. 
          sec[number]=k;                    //428. 
          number++;                         //429. 
          fp=fopen(tmp,"rb");               //430. 
          for(i=0;i<=511;i++)               //431. 
          {                                 //432. 
            ch=fgetc(fp);                   //433. 
            fputc(ch,hdfp);                 //434. 
          }                                 //435. 
          fclose(fp);                       //436. 
          remove(tmp);                      //437. 
          k++;                              //438. 
        }                                   //439. 
      }                                     //440. 
      if(data2==0)                          //441. 
        break;                              //442. 
      k=data1+data2;                        //443. 
    }                                       //444. 
  }                                         //445. 
  fclose(hdfp);                             //446. 
}                                           //447. 
                                            //448. 
void copyf()                                //449.拷贝文件函数 
{                                           //450. 
  FILE *fp;                                 //451. 
  int i;                                    //452. 
  char ch;                                  //453. 
  unsigned l,u;                             //454. 
  char datahd[30720];                       //455. 
                                            //456. 
  i=open("data.hd",O_CREAT);                //457. 
  l=filelength(i);                          //458. 
  close(i);                                 //459. 
  fp=fopen("data.hd","rb");                 //460. 
  for(u=0;u