📄 lockdlg.cpp
字号:
// lockDlg.cpp : implementation file
//
#include "stdafx.h"
#include "lock.h"
#include "lockDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CLockDlg dialog
CLockDlg::CLockDlg(CWnd* pParent /*=NULL*/)
: CDialog(CLockDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CLockDlg)
//}}AFX_DATA_INIT
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CLockDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CLockDlg)
DDX_Control(pDX, IDC_COMBO2, m_ZhuMian);
DDX_Control(pDX, IDC_COMBO1, m_CiDao);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CLockDlg, CDialog)
//{{AFX_MSG_MAP(CLockDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_CREATE()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
ON_COMMAND(IDC_FORMAT,Format)
ON_COMMAND(IDC_CESHI,CeShi)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLockDlg message handlers
BOOL CLockDlg::OnInitDialog()
{
CDialog::OnInitDialog();
int index=0;
m_CiDao.SetCurSel(index);
m_ZhuMian.SetCurSel(index);
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CLockDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
HCURSOR CLockDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
BOOL CLockDlg::Format()
{
//读软盘信息正确后开始格式化操作
if(Jm1())
{
//初始化磁盘ID信息表
boot_d2[0]=0x50+m_CiDao.GetCurSel();
boot_d2[1]=m_ZhuMian.GetCurSel();
boot_d2[2]=m_shanqu;
boot_d2[3]=0x02;
//计算要格式化扇区的具体所在
Boot_Data=20481+m_CiDao.GetCurSel()*16*16;
k=1;
while (k<=5)
{
reg.reg_EAX=0x0501;
reg.reg_ECX=Boot_Data;
reg.reg_EDX=m_ZhuMian.GetCurSel()*16*16;
reg.reg_EBX=(DWORD)&boot_d2;
reg.reg_Flags=0x0001;
fresult=DeviceIoControl(hDevice,VWIN32_DIOC_DOS_INT13,®,sizeof(reg),®,sizeof(reg),&cb1,0);
if(!fresult||(reg.reg_Flags&0x0001))
k++;
else
break;
}
if(k!=5) Jm();
}
else
MessageBox("格式化失败!","格式化信息框",MB_OK|MB_ICONEXCLAMATION);
return TRUE;
}
BOOL CLockDlg::Jm()
{
CString str;
Boot_Data=20480+m_CiDao.GetCurSel()*16*16+m_shanqu;
k=1;
while (k<=5)
{
//给扇区开始赋特定标志
boot_d2[0]=m_cs1;
boot_d2[1]=m_cs2;
boot_d2[2]=m_cs3;
boot_d2[3]=m_cs4;
boot_d2[4]=m_cs5;
boot_d2[5]=m_cs6;
boot_d2[510]=0x55;
boot_d2[511]=0xaa;
//写特定信息与格式化好的扇区
reg.reg_EAX=0x0301;
reg.reg_ECX=Boot_Data;
reg.reg_EDX=m_ZhuMian.GetCurSel()*16*16;
reg.reg_EBX=(DWORD)&boot_d2;
reg.reg_Flags=0x0001;
fresult=DeviceIoControl(hDevice,VWIN32_DIOC_DOS_INT13,®,sizeof(reg),®,sizeof(reg),&cb1,0);
if(!fresult||(reg.reg_Flags&0x0001))
k++;
else
break;
}
if(k==5)
{ MessageBox("格式化失败!","格式化信息框",MB_OK|MB_ICONEXCLAMATION);
MessageBeep(MB_ICONEXCLAMATION);//写失败后提示并响铃
}
else
{
jyh=boot_d2[0];
for(int i=0;i<512;i++)
jyh^=boot_d2[i];
str.Format("校验和为:%2x",jyh);
MessageBox(str+"\n"+"格式化成功!","格式化信息框",MB_OK|MB_ICONEXCLAMATION);
MessageBeep(MB_OK);//提示格式化后算出的校验和,此值很有用请记住
}
return TRUE;
}
BOOL CLockDlg::CeShi()
{
Boot_Data=20480+m_CiDao.GetCurSel()*16*16+m_shanqu;
k=1;
while (k<=5)
{
reg.reg_EAX=0x0201;
reg.reg_ECX=Boot_Data;
reg.reg_EDX=m_ZhuMian.GetCurSel()*16*16;
reg.reg_EBX=(DWORD)&boot_d2;
reg.reg_Flags=0x0001;
fresult=DeviceIoControl(hDevice,VWIN32_DIOC_DOS_INT13,®,sizeof(reg),®,sizeof(reg),&cb1,0);
if(!fresult||(reg.reg_Flags&0x0001))
{
k++;
}
else
{ m_jyh=boot_d2[0];
for(int i=0;i<512;i++)
m_jyh^=boot_d2[i];
break;
}
}
//对特定字和校验和进行测试
if(boot_d2[0]==0xaa&&boot_d2[1]==0xbb&&boot_d2[2]==0xcc&&
boot_d2[3]==0xdd&&boot_d2[4]==0xee&&boot_d2[5]==0xff&&
boot_d2[510]==0x55&&boot_d2[511]==0xaa&&m_jyh==jyh)
MessageBox("测试成功!","测试信息框",MB_OK|MB_ICONEXCLAMATION);
else
MessageBox("测试失败!","测试信息框",MB_OK|MB_ICONEXCLAMATION);
return TRUE;
}
int CLockDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
wook=FALSE;
//清接受数据区
for(int i2=0;i2<512;i2++)
boot_d2[i2]=0x00;
//规定判断的磁道与特定扇区号
//此处为82道第ID值为0xaa的扇区
CiDao=0x52aa;
//规定判断的柱面与驱动器号
//此处为A驱动器的0x01柱面
ZhuMian=0x0100;
//校验和初始化为零
m_jyh=jyh=0x00;
//格式化的特定起始扇区号
m_shanqu=0xaa;
//判断标志,可自行修改
m_cs1=0xaa;
m_cs2=0xbb;
m_cs3=0xcc;
m_cs4=0xdd;
m_cs5=0xee;
m_cs6=0xff;
//打开虚拟设备驱动程序VWIN32.VxD
hDevice=CreateFile("\\\\.\\vwin32",
GENERIC_WRITE|GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
//如hDevice非空则执行判断程序,否则调用退出函数
if(hDevice!=NULL) ;//PanDuan();
else OnCancel();
return 0;
}
void CLockDlg::OnDestroy()
{
CDialog::OnDestroy();
CloseHandle(hDevice);
//判断为非法复制则可用下面的语句强行退出WIN9x系统并关机
//ExitWindowsEx(EWX_FORCE|EWX_REBOOT,0);
// TODO: Add your message handler code here
}
//此函数用来读取当前软盘的引导信息
BOOL CLockDlg::Jm1()
{
k=1;
for(int i2=0;i2<512;i2++)
boot_d2[i2]=0x00;
//循环读5次有一次正确退出
while(k<=5)
{
reg.reg_EAX=0x0201;
reg.reg_ECX=0x0001;
reg.reg_EDX=0x0000;
reg.reg_EBX=(DWORD)&boot_d2;
reg.reg_Flags=0x0001;
fresult=DeviceIoControl(hDevice,VWIN32_DIOC_DOS_INT13,®,sizeof(reg),®,sizeof(reg),&cb1,0);
if(!fresult||(reg.reg_Flags&0x0001))
k++;
else
break;
}
//判断是否软盘引导区信息
if(boot_d2[510]==0x55&&boot_d2[511]==0xaa)
wook=TRUE;
else
wook=FALSE;
return wook;
}
BOOL CLockDlg::PanDuan()
{
int k;
k=1;
while (k<=5)
{
//第一次读特定的扇区信息
reg.reg_EAX=0x0201;
reg.reg_ECX=CiDao;
reg.reg_EDX=ZhuMian;
reg.reg_EBX=(DWORD)&boot_d2;
fresult=DeviceIoControl(hDevice,VWIN32_DIOC_DOS_INT13,®,sizeof(reg),®,sizeof(reg),&cb1,0);
//第一取是否换盘状态
reg.reg_EAX=0x1600;
reg.reg_EDX=0x0000;
DeviceIoControl(hDevice,VWIN32_DIOC_DOS_INT13,®,sizeof(reg),®,sizeof(reg),&cb1,0);
//第二取是否换盘状态
reg.reg_EAX=0x1600;
reg.reg_EDX=0x0000;
DeviceIoControl(hDevice,VWIN32_DIOC_DOS_INT13,®,sizeof(reg),®,sizeof(reg),&cb1,0);
//第二次读特定的扇区信息会成功
reg.reg_EAX=0x0201;
reg.reg_ECX=CiDao;
reg.reg_EDX=ZhuMian;
reg.reg_EBX=(DWORD)&boot_d2;
fresult=DeviceIoControl(hDevice,VWIN32_DIOC_DOS_INT13,®,sizeof(reg),®,sizeof(reg),&cb1,0);
//无盘时reg.reg_EAX返回值为0x8000;
//有盘无指定的扇区时reg.reg_EAX返回值为0x200;
//有盘且有指定扇区时reg.reg_EAX返回值为0x400,但数据任然能读出;
if(fresult&&(reg.reg_EAX!=0x200)&&(reg.reg_EAX!=0x8000))
{
//计算本扇区的校验和
m_jyh=boot_d2[0];
for(int i=0;i<512;i++)
m_jyh^=boot_d2[i];
break;
}
else
k++;
}
//对特定字和校验和进行校验
if(boot_d2[0]==0xaa&&boot_d2[1]==0xbb&&boot_d2[2]==0xcc&&
boot_d2[3]==0xdd&&boot_d2[4]==0xee&&boot_d2[5]==0xff&&
boot_d2[510]==0x55&&boot_d2[511]==0xaa&&m_jyh==0xdf)
{;//判断成功后的处理可放在此
MessageBeep(MB_OK);
}
else
{ MessageBeep(MB_ICONQUESTION);
MessageBox("你是非法用户!\n不能进入系统!","测试信息框",MB_OK|MB_ICONEXCLAMATION);
OnCancel();//按取消键的处理函数
}
return TRUE;
}
void CLockDlg::OnCancel()
{
// TODO: Add extra cleanup here
CDialog::OnCancel();
//发送结束消息
SendMessage(WM_DESTROY);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -