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

📄 savedisk.cpp

📁 保存软盘内容到一个指定的文件内.vc++6.0
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// loaddll.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "resource.h"
#include <stdio.h>
#include "SaveDisk.h"
#include <mmsystem.h>
#pragma comment(lib,"winmm")
#include <time.h>
#include <COMMCTRL.H>
#pragma comment(lib,"comctl32.lib")
#include <setupapi.h>
#pragma comment(lib,"setupapi.lib")
#include <devioctl.h>
#include <DBT.H>
//#include <ntddstor.h>
#include <ntddscsi.h>
#include "ntddstor.h"
#include <SHLOBJ.H>

HWND AfxMainHwnd;
HINSTANCE MainInstance;
HANDLE SaveThread;
BOOL CancelSave;
HINSTANCE AFXInstance;
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK	About(HWND, UINT, WPARAM, LPARAM);

#define OOPS() Oops(__FILE__, __LINE__)  //调用OOPS宏,可以以消息框形式显示调用处的行号,所在的文件名


//输出调试信息到文件里
BOOL PrintToFile(PUCHAR Buffer,//打印信息
				 ULONG OLen,   //打印信息长度
				 BOOL IsChar){ //打印信息以字符形式显示还是以数值形式显示
	char tembuf[1000]="";
	CHAR tem[10]="";
	HANDLE DFileHandle;
	DWORD nNumberOfBytesToWrite,i;
	DFileHandle = CreateFile("DbgInfor.txt",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_WRITE|FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,NULL);
	if(DFileHandle==INVALID_HANDLE_VALUE)
		return FALSE;
	nNumberOfBytesToWrite=OLen;
	ZeroMemory(tembuf,sizeof(tembuf));
	if(!IsChar){
		for(i=0;i<OLen;i++){
			sprintf(tem,"%02X",Buffer[i]);
			strcat(tembuf,tem);			
		}
		strcat(tembuf,"\r\n");
		nNumberOfBytesToWrite=OLen*2+1;
	}
	else{		
		strcpy(tembuf,(PCHAR)Buffer);
		strcat(tembuf,"\r\n\0");
		nNumberOfBytesToWrite=strlen((PCHAR)Buffer);
	}
	SetFilePointer(DFileHandle,0,NULL,FILE_END);
	WriteFile(DFileHandle,tembuf,nNumberOfBytesToWrite,&nNumberOfBytesToWrite,NULL);
	CloseHandle(DFileHandle);
	return FALSE;
}

//显示格式化字符串
VOID  DebugPrint (LPCTSTR lpFormat,...){
 	CHAR TextBufferTmp[500]="";    
    va_list arglist;
    va_start(arglist, lpFormat);
	vsprintf(TextBufferTmp,lpFormat,arglist);
	va_end(arglist);
	OutputDebugString(TextBufferTmp);
	//SendDlgItemMessage(AfxAfxMainHwnd,IDC_show,LB_ADDSTRING,0,(LPARAM)(LPCTSTR)TextBufferTmp);
	//PrintToFile(TextBufferTmp,strlen(TextBufferTmp),TRUE);//打印到指定DbgInfor.txt文件里
	return;
}
/*显示上次运行错误*/
void ShowLastError(PCHAR FuncName) 
{
	DWORD LastResult=0; // pointer to variable to receive error codes	
	char szSysMsg[100],tem[1000]="";
	LastResult=GetLastError();
	FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,LastResult,
		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),szSysMsg,sizeof(szSysMsg),0);	
	sprintf(tem,"%s:Last Err(%x)%s",FuncName,LastResult,szSysMsg);
	DebugPrint(tem);
}

/*将十六进制字符转换成十进制码,数字转换成字符用ltoa()函数*/
ULONG mStrToBcd(PCHAR str) 
{ 
	char mlen,i=0;
	UCHAR iChar=0,Char[9]="";
	UINT mBCD=0,de=1;
	mlen=strlen(str);
	memcpy(Char,str,mlen);
	for(i=mlen-1;i>=0;i--)
	{	iChar=Char[i];
	if ( iChar >= '0' && iChar <= '9' )
		mBCD = mBCD+(iChar -'0')*de;
	else if ( iChar >= 'A' && iChar <= 'F' ) 
		mBCD =mBCD+ (iChar - 'A' + 0x0a)*de;
	else if ( iChar >= 'a' && iChar <= 'f' )
		mBCD =mBCD+ (iChar - 'a' + 0x0a)*de;
	else return(0);
	de*=16;
	}
	return(mBCD);
}

double GetCurrentTimerVal(){//获取硬件计数器已运行时间,ms为单位,比GetTickCount更准确
	LARGE_INTEGER litmp; 
	double dfFreq,QPart1; 
	QueryPerformanceFrequency(&litmp);  //频率以HZ为单位
	dfFreq = (double)litmp.QuadPart;    //获得计数器的时钟频率
	QueryPerformanceCounter(&litmp);
	QPart1 = (double)litmp.QuadPart;        //获得初始值
	return(QPart1 *1000/ dfFreq  );  //获得对应的时间值=振荡次数/振荡频率,单位为秒
}

//延时函数,以ms为单位
VOID DelayTime1(double TimerVal){//定时值为ms,其定时误差一般不超过0.5微秒,精度与CPU等机器配置有关
	LARGE_INTEGER litmp; 
	LONGLONG QPart1,QPart2;
	double dfMinus, dfFreq, dfTim,NewTimerVal; 
	NewTimerVal = TimerVal*0.001;       //将ms定时值转成s值
	QueryPerformanceFrequency(&litmp);  //频率以HZ为单位
	dfFreq = (double)litmp.QuadPart;    //获得计数器的时钟频率
	QueryPerformanceCounter(&litmp);
	QPart1 = litmp.QuadPart;            //获得初始值
	do{
		QueryPerformanceCounter(&litmp);
		QPart2 = litmp.QuadPart;        //获得中止值
		dfMinus = (double)(QPart2-QPart1);
		dfTim = dfMinus / dfFreq;       //获得对应的时间值=振荡次数/振荡频率,单位为秒		
	}while(dfTim<NewTimerVal);
	return;
}

//获取磁盘属性
BOOL GetDisksProperty(HANDLE hDevice, PSTORAGE_DEVICE_DESCRIPTOR pDevDesc)
{
	STORAGE_PROPERTY_QUERY	Query;	
	DWORD dwOutBytes;				
	BOOL bResult;					

	Query.PropertyId = StorageDeviceProperty;
	Query.QueryType = PropertyStandardQuery;

	bResult = ::DeviceIoControl(hDevice,			
			IOCTL_STORAGE_QUERY_PROPERTY,			
			&Query, sizeof(STORAGE_PROPERTY_QUERY),	
			pDevDesc, pDevDesc->Size,				
			&dwOutBytes,							
			(LPOVERLAPPED)NULL);
	return bResult;
}
PVOID trim(PVOID str)  //去除字符串中的前后空格
{
	PCHAR x;
	char y[1000]="",z[1000]="";
	x=(char *)str;
	if (lstrlen(x)==0) return(NULL) ;
	while(*x==' '|| *x==0x09 )  //trimleft
		x++;
	if (*x==NULL)
		return(NULL);
	else
		strcpy(y,x);
	x=y+lstrlen(y);
	x--;
	while(*x==' '|| *x==0x09) x--;
	memcpy(z,y,x-y+1);
    z[lstrlen(z)]='\0';
	return(&z[0]);
}
//读磁盘扇区
int ReadSector	(HANDLE DevHandle,int nsects, int lsect,PVOID buffer)
{
	ULONG	i, j;
	CHAR   tem[512]="";	
	
	i = lsect*512;
	j = SetFilePointer( DevHandle, i, NULL, FILE_BEGIN );  // 指定读扇区起始号
	if ( i != j ) {//指定读扇区起始号出错
		return( 3 );
	}
	i = nsects*512;
	if ( ! ReadFile( DevHandle, buffer, i, &i, NULL ) ) {  // 读一个扇区512字节
		return( 4 );
	}
	if ( i != (ULONG)(nsects*512) ) {
		return( 5 );
	}
	return(0);
}
void SearchUDisk()//搜索指定U盘
{
	HANDLE mDevice;
	ULONG i;
	CHAR DiskID[512],DiskDesc[512],Buf[1024],logicname[100]="";
	PCHAR str;
	PSTORAGE_DEVICE_DESCRIPTOR pDevDesc=NULL;
	
	pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)Buf;
	i = 0;
	for(i=1;i<10;i++)
	{
		//打开指定的盘符,获取盘符的设备号
		sprintf(&logicname[0],"\\\\.\\PhysicalDrive%d",i);
		mDevice = CreateFile( &logicname[0], GENERIC_READ | GENERIC_WRITE,
			FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
			NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );	
		if(mDevice==INVALID_HANDLE_VALUE){
			continue;
		}
		//获取U盘属性			
		pDevDesc->Size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1;
		if(GetDisksProperty(mDevice, pDevDesc))
		{
			if(pDevDesc->BusType != BusTypeUsb)//寻找USB接口磁盘
			{					
				CloseHandle(mDevice);
				continue;
			}		
		}				
		{
			CHAR SectorData[512]="";
			if(ReadSector(mDevice,1,0,SectorData))//读DBR扇区错误.
			{
				CloseHandle(mDevice);
				continue;
			}
			if( (SectorData[509]!='W') || (SectorData[510]!='C') || (SectorData[511]!='H') )
			{
				CloseHandle(mDevice);
				continue;			
			}
		}
		{//保存物理盘的ID字符串
			ULONG k;
			PCHAR p= (char*)pDevDesc;
			str = (pDevDesc->VendorIdOffset ? &p[pDevDesc->VendorIdOffset]:"(NULL)");				
			strcpy(&DiskID[0],"VEN_");
			strcat(DiskID,(PCHAR)trim(str));
			strcat(DiskID,"&PROD_");
			str=(pDevDesc->ProductIdOffset ? &p[pDevDesc->ProductIdOffset]:"(NULL)");
			strcat(DiskID,(PCHAR)trim(str));
			for(k=0;k<strlen(DiskID);k++)//按照instanceid里的格式以_代替。
			{
				if(DiskID[k]==' ')
					DiskID[k] = '_';
			}
		}
		sprintf(&DiskDesc[0],"可移动盘%d %s\0",i,DiskID);
		SendDlgItemMessage(AfxMainHwnd,IDC_UList,CB_ADDSTRING,0,(LPARAM)(LPCTSTR)DiskDesc);
		CloseHandle(mDevice);
	}
}
//从当前条目中获取磁盘的序号
int GetDiskNumFromSel()
{
	ULONG ItemSel=0;
	CHAR DiskID[512]="";
	PCHAR p;
	SendDlgItemMessage(AfxMainHwnd,IDC_UList,CB_GETLBTEXT,ItemSel,(LPARAM)(LPCTSTR)&DiskID[0]);

⌨️ 快捷键说明

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