欢迎来到虫虫下载站 | 资源下载 资源专辑 关于我们
虫虫下载站

psw.c

redboy for gba 是BPNS为GBA编写的一个小软件。软件的邹形是BASIC高级语言解释执行器。几经修改和扩展
C
字号:
#include <csagb.h>
#include <graph.h>
#include <Qgraph.h>
#include <rb_mem.h>
#include <rb_stdio.h>
#include <rbasic.h>
#define psw_set_M 700 //20*8=160 字节
#define SET_BAS 10344
#define fbase 0x080E1000
#define root_mes 32
#define root_name 20

extern char num_key_board(u8 xp,u8 yp,u8 xsp,u8 ysp,u16 color,u16 bg,char *str);
extern void write(u8 xp,u8 yp,u16 color,char *str);
extern void paint_en(u8 xp,u8 yp,u16 color,char ch);
extern new_ascii(char ch,u8 xp,u8 yp,u16 color);
extern void n_box(u8 xp,u8 yp,u8 xsp,u8 ysp,u16 color,u16 bg);
extern void (*sys_deamon)();
extern u8 rb_xp,rb_yp;

u32 _sys_pid=0;//系统标识

typedef struct
{
   u32 pid;//文件pid
   u32 psw;//密码
   u16 pass;//是否已经打开过
} psw_mes;

psw_mes *_sys_psws;

void psw_deamon()
{
   r_box(47+rb_xp*8,57,46+7+rb_xp*8,68,0,5);
}

void input_psw(char *tit,char *psw,u8 m)//输入密码
{
   u8 done=1;
   u8 xp=rb_xp;
   u8 sel=0,old=0;
   u8 str[20]="\0";
   int i;
   psw[0]='\0';
   rb_xp=0;
   sys_deamon=psw_deamon;
   r_box(41,32,201,101,0,0);
   Q_box(40,30,200,100,RGB(27,27,26));
   r_box(40,30,200,100,RGB(30,30,30),0);
   Q_box(41,31,199,45,RGB(3,7,15));
   r_line(41,46,199,46,RGB(30,30,30),1);
   cwrite(42,33,RGB(30,30,30),tit);
   Q_box(45,55,195,70,RGB(30,30,30));
   n_box(45,55,195,70,RGB(3,7,15),RGB(27,27,26));
   for (i=0;i<10;i++)
   {
      n_box(45+i*15,78,56+i*15,97,RGB(3,7,15),RGB(27,27,26));
      new_ascii(i+48,47+i*15,80,RGB(7,7,15));
   }
   while (1)
   {
      readkey();
      if (CS_IsKeyDown(KEY_LEFT) || CS_IsKeyHold(KEY_UP))
      {
         sel=(sel+9)%10;
         done=1;
      }
      else if(CS_IsKeyDown(KEY_RIGHT) || CS_IsKeyHold(KEY_DOWN))
      {
         sel=(sel+1)%10;
         done=1;
      }
      else if((CS_IsKeyDown(KEY_B) || CS_IsKeyDown(KEY_L)) && rb_xp)
      {
         done=2;
         rb_xp--;
         psw[rb_xp]='\0';
         str[rb_xp]='\0';
      }
      else if(CS_IsKeyDown(KEY_A) && rb_xp<15)
      {
         psw[rb_xp]=48+sel;
         str[rb_xp]='*';
         rb_xp++;
         psw[rb_xp]='\0';
         str[rb_xp]='\0';
         done=2;
      }
      else if(CS_IsKeyDown(KEY_START) || CS_IsKeyDown(KEY_R))
      {
         sys_deamon=NULL;
         return;
      }
      if (done==1)
      {
         if (old!=sel) r_box(46+old*15,79,55+old*15,96,0,5);
         old=sel;
         r_box(46+old*15,79,55+old*15,96,0,5);
         done=0;
      }
      else if (done==2)
      {
         sys_deamon=NULL;
         Q_box(46,56,194,69,RGB(30,30,30));
         if (m) write(47,56,RGB(3,7,15),str);
         else write(47,56,RGB(3,7,15),psw);
         done=0;
         sys_deamon=psw_deamon;
      }
   }
   //num_key_board(100,100,45,60,RGB(30,0,30),RGB(30,30,30),psw);
}

u32 psw_to_num(char *psw)
{
   int i=0;
   u32 psw1=0;
   u32 w=1;
   while (i<9)
   {
      if (psw[i]=='\0') goto the_end;
      psw1+=(psw[i]-48)*w;
      w*=10;
      i++;
   }
   w=1;
   while (i<16)
   {
      if (psw[i]=='\0') goto the_end;
      psw1+=(psw[i]-48)*w;
      w*=10;
      i++;
   }
the_end:
   return psw1;
}

void get_psws()
{
   int i;
   CS_SeekInSRAM(SRAM_SEEK_START,SET_BAS+psw_set_M);
   for (i=0;i<20;i++)//更多能设置20个文件密码
   {
      CS_LoadFromSRAM(&_sys_psws[i],8);
      _sys_psws[i].pass=0;//初始化状态
   }
}

void no_pass()
{
   int i;
   for (i=0;i<20;i++) _sys_psws[i].pass=0;
}
void save_psw(int id)
{
   if (id>19) return;
   CS_SeekInSRAM(SRAM_SEEK_START,SET_BAS+psw_set_M+id*8);
   CS_SaveToSRAM(&_sys_psws[id],8);//设置
}

int is_need_psw(u32 pid)//文件是否需要密码,需要反回密码编号,否则返回-1
{
   int i=0;
   while (i<20)
   {
      if (pid==_sys_psws[i].pid)
      {
         if (_sys_psws[i].pass) return -1;
         else return i;
      }
      i++;
   }
   return -1;
}

int sys_pass(u32 pid,char *tit)//口令检测
{
   int id=is_need_psw(pid);
   char str[20]="\0";
   if (id>-1)
   {
      input_psw(tit,str,1);
      if (psw_to_num(str)==_sys_psws[id].psw)
      {
         _sys_psws[id].pass=1;//置密码已经打开态
         return 1;//密码通过
      }
      return 0;
   }
   else return 1;//无需验证
}

int set_psw(int id)//设置密码
{
   u32 psw1,psw2;
   char psw[20];
   if (id==19) input_psw("请设置管理员密码:",psw,0);
   else input_psw("请输入密码:",psw,0);
   psw1=psw_to_num(psw);
   input_psw("请再次输入密码:",psw,0);
   psw2=psw_to_num(psw);
   if (psw1!=psw2 || psw1==0)
   {
      arlt("操作失败:","你两次输入的密码不同或者密码无效!");
      return 0;
   }
   else
   {
      _sys_psws[id].psw=psw1;
      save_psw(id);
      arlt("操作成功:","您已经成功设置了您的密码.");
      return 1;
   }
}

void chg_psw(u32 pid)//
{
   int fuid=-1;
   int i,id=-1;
   char psw[20];
   u32 psw1=0;
   for(i=0;i<20;i++)
   {
      if (_sys_psws[i].pid==0 && fuid<0) fuid=i;
      else if(_sys_psws[i].pid==pid) {id=i;break;}
   }
   if (id==-1) id=fuid;
   if (id==-1)
   {
      arlt("系统提示:","密码空间已满,您最多可设置20个密码.");
      return;
   }
   else
   {
      if (_sys_psws[19].psw)//需要管理员密码
      {
         input_psw("请输入管理员密码:",psw,1);
         psw1=psw_to_num(psw);
         if (psw1!=_sys_psws[19].psw)
         {
            arlt("密码错误:","你输入的密码不对,系统拒绝你的操作.");
            return;
         }
      }
      _sys_psws[id].pid=pid;
      _sys_psws[id].pass=0;
      if (!set_psw(id)) _sys_psws[id].pid=pid;//没有正确设置密码
   }
}

void chg_apsw()//修改管理员密码
{
   chg_psw(_sys_psws[19].pid);
}
void del_psw(u32 pid)
{
   int i=0;
   int id=-1;
   u32 psw1;
   char psw[20]="\0";
   while (i<20)
   {
      if (pid==_sys_psws[i].pid) {id=i;break;}
      i++;
   }
   if (id==-1) return;
   if (_sys_psws[19].psw)//需要管理员密码
   {
      input_psw("请输入管理员密码:",psw,1);
      psw1=psw_to_num(psw);
      if (psw1!=_sys_psws[19].psw)
      {
         arlt("密码错误:","你输入的密码不对,系统拒绝你的操作.");
         return;
      }
   }
   _sys_psws[id].pid=0;//删除密码
   save_psw(id);
}
void psw_init()
{
   u8 r=31;
   int i;
   u32 dpsw=321;
   u32 loc=0;
   psw_mes root;
   _sys_psws=(psw_mes *)new_malloc(sizeof(psw_mes)*20);//分配密码内存空间
   get_psws();
   for (i=0;i<160;i++)
   {
      if (i%6==0) r--;
      DmaClear(3,RGB(r,r,r),mVRAM+loc,480,16);
      loc+=240;
   }
   root=*(psw_mes*)(fbase+root_mes);
   if (root.pid!=_sys_psws[19].pid)//重新安装了文件系统
   {
      bmar_init();//书签无效
      _sys_psws[19].pid=root.pid;
      _sys_psws[19].psw=0;
      _sys_psws[19].pass=0;
      _sys_pid=root.pid;//获得系统pid号
      chg_psw(_sys_psws[19].pid);
      for (i=0;i<19;i++) _sys_psws[i].pid=0;
      for (i=0;i<20;i++) save_psw(i);//重新保存
   }
   else if (_sys_psws[19].psw)//需要密码
   {
      if ( _sys_psws[19].psw==dpsw) return;
      i=0;
      while (i==0) i=sys_pass(_sys_psws[19].pid,"请先登录:");
      _sys_psws[19].pass=1;
   }
   //_sys_psws[19].psw=0;
   //for (i=0;i<19;i++) _sys_psws[i].pid=0;
   //for (i=0;i<20;i++) save_psw(i);//重新保存
}

⌨️ 快捷键说明

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