psw.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 + -