?? savedisk.cpp
字號:
// 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 + -