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

📄 lockdlg.cpp

📁 电脑编程技巧和源码。很不错的。
💻 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,&reg,sizeof(reg),&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,&reg,sizeof(reg),&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,&reg,sizeof(reg),&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,&reg,sizeof(reg),&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,&reg,sizeof(reg),&reg,sizeof(reg),&cb1,0);
    //第一取是否换盘状态
	reg.reg_EAX=0x1600;
	reg.reg_EDX=0x0000;
    DeviceIoControl(hDevice,VWIN32_DIOC_DOS_INT13,&reg,sizeof(reg),&reg,sizeof(reg),&cb1,0);
    //第二取是否换盘状态
	reg.reg_EAX=0x1600;
	reg.reg_EDX=0x0000;
    DeviceIoControl(hDevice,VWIN32_DIOC_DOS_INT13,&reg,sizeof(reg),&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,&reg,sizeof(reg),&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 + -