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

📄 general.cpp

📁 最新visualC++编程200例书籍源码包括对数据库的操作
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	}
	wsprintf(TmpStr, "Current Sector Number: %lu", DrivePacket->RelativeSector);
	m_wndStatusBarCtrl->SetText(TmpStr, 1, 0);
	m_wndStatusBarCtrl->SetText("", 0, 0);
	return;
}

BOOL CalcCylHeadSect(DRIVEPACKET *DrivePacket, CYLHEADSECT *CylHeadSect)
{
	DWORD TmpCyl, TmpSector;
	TmpCyl = DrivePacket->Cylinder;
	TmpSector = DrivePacket->Sector;
	TmpCyl |= ((TmpSector & 0xC0) << 2);
	TmpSector &= 0x3f;
	DWORD TmpRelSect = (TmpCyl * DrivePacket->TotalHeads + 
			DrivePacket->Head) * DrivePacket->SectorsPerTrack + TmpSector-1 + DrivePacket->RelativeSector;
	CylHeadSect->Sector = TmpRelSect % DrivePacket->SectorsPerTrack + 1;
	DWORD CalcSect = TmpRelSect / DrivePacket->SectorsPerTrack;
	CylHeadSect->Cylinder = CalcSect/DrivePacket->TotalHeads;
	if(CylHeadSect->Cylinder > 1023)
		return TRUE;
	CylHeadSect->Head = CalcSect % DrivePacket->TotalHeads;
	CylHeadSect->Sector |= (CylHeadSect->Cylinder & 0x300) >> 2;
	CylHeadSect->Cylinder &= 0xFF;
	return FALSE;
}

BOOL LoadSectors(DRIVEPACKET *DrivePacket, CYLHEADSECT *CylHeadSect, LPBYTE Buffer)
{
	DRIVEPACKET TmpDP, TmpDrivePacket;
	DWORD TmpVal = DrivePacket->NumSectors;
	BOOL Int13ExtFlag;
	m_wndStatusBarCtrl->SetText("Wait....", 0, 0);
	memcpy(&TmpDP, DrivePacket, sizeof(DRIVEPACKET));
	if(DrivePacket->Net){
		NetEvent = BUFFER_FILL;
		BufferNet = Buffer;
		BytesToFill = DrivePacket->NumSectors*512;
		memcpy(&gDrivePacket, DrivePacket, sizeof(DRIVEPACKET));
		NetCalls.Function = LOAD_SECTORS;
		memcpy(&NetCalls.DrivePacket, DrivePacket, sizeof(DRIVEPACKET));
		send(SocketNum, (char *) &NetCalls, sizeof(SECTORS_FUNC), 0);
		CallNet();
	}
	else if(gOSWin95){
		do{
			Int13ExtFlag = CalcCylHeadSect(&TmpDP, CylHeadSect);
			DWORD TmpNumSectors = TmpDP.SectorsPerTrack - (CylHeadSect->Sector & 0x3F) + 1;
			TmpNumSectors = TmpVal > TmpNumSectors ? TmpNumSectors:TmpVal;
			if(!(DllThunk32)(DrivePacket->Drive, CylHeadSect->Cylinder, CylHeadSect->Head, CylHeadSect->Sector, TmpNumSectors, Buffer+(DrivePacket->NumSectors - TmpVal) * 512, DrivePacket->NTRelativeSector + TmpDP.RelativeSector, DrivePacket->Flag & Int13ExtFlag)){
				if (TmpNumSectors == 1)
					return FALSE;
				memcpy(&TmpDrivePacket, &TmpDP, sizeof(DRIVEPACKET));
				for(int i=0; i<TmpNumSectors; i++){
					TmpDrivePacket.NumSectors = 1;
					if(!LoadSectors(&TmpDrivePacket, CylHeadSect, (LPBYTE)(Buffer+i*512))){
						for(int j=0; j<512; j++){
							Buffer[i*512+j] = 0xE5;
						}
					}
					TmpDrivePacket.RelativeSector++;
				}
				return FALSE;
			}
			TmpVal -= TmpNumSectors;
			TmpDP.RelativeSector += TmpNumSectors;
		}while(TmpVal);
	}
	else{
		__int64 Tmp64 = (((__int64) DrivePacket->NTRelativeSector) + ((__int64) DrivePacket->RelativeSector)) * 512;
		long TmpVal = Tmp64 & 0xFFFFFFFF;
		long TmpValHi = (Tmp64 >> 32);
		SetFilePointer(hDisk[DrivePacket->Drive], TmpVal, &TmpValHi, FILE_BEGIN);
		TmpVal = 0;
		ReadFile(hDisk[DrivePacket->Drive], Buffer, DrivePacket->NumSectors * 512, (DWORD *) &TmpVal, NULL);
		if((!TmpVal) && (DrivePacket->Drive < 0x80)){
			CloseHandle(hDisk[DrivePacket->Drive]);
			char TmpStr[100];
			wsprintf(TmpStr, "\\\\.\\%c:", DrivePacket->Drive+'A');
			if((hDisk[DrivePacket->Drive]=CreateFile(TmpStr, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL))==INVALID_HANDLE_VALUE){
				return FALSE;
			}
			Tmp64 = (((__int64) DrivePacket->NTRelativeSector) + ((__int64) DrivePacket->RelativeSector)) * 512;
			TmpVal = Tmp64 & 0xFFFFFFFF;
			TmpValHi = (Tmp64 >> 32);
			SetFilePointer(hDisk[DrivePacket->Drive], TmpVal, &TmpValHi, FILE_BEGIN);
			TmpVal = 0;
			ReadFile(hDisk[DrivePacket->Drive], Buffer, DrivePacket->NumSectors * 512, (DWORD *) &TmpVal, NULL);
		}
		if(TmpVal != (DrivePacket->NumSectors * 512)){
			if (DrivePacket->NumSectors == 1)
				return FALSE;
			DRIVEPACKET TmpDrivePacket;
			memcpy(&TmpDrivePacket, &TmpDP, sizeof(DRIVEPACKET));
			for(int i=0; i<DrivePacket->NumSectors; i++){
				TmpDrivePacket.NumSectors = 1;
				if(!LoadSectors(&TmpDrivePacket, CylHeadSect, (LPBYTE)(Buffer+i*512))){
					for(int j=0; j<512; j++){
						Buffer[i*512+j] = 0xE5;
					}
				}
				TmpDrivePacket.RelativeSector++;
			}
			return FALSE;
		}
	}
	return TRUE;
}

BOOL WriteSectors(DRIVEPACKET *DrivePacket, CYLHEADSECT *CylHeadSect, LPBYTE Buffer)
{
	DRIVEPACKET TmpDP, TmpDrivePacket;
	DWORD TmpVal = DrivePacket->NumSectors;
	BOOL Int13ExtFlag;
	m_wndStatusBarCtrl->SetText("Wait....", 0, 0);
	memcpy(&TmpDP, DrivePacket, sizeof(DRIVEPACKET));
	if(DrivePacket->Net){
		NetEvent = BUFFER_FILL;
		BufferNet = Buffer;
		BytesToFill = DrivePacket->NumSectors*512;
		memcpy(&gDrivePacket, DrivePacket, sizeof(DRIVEPACKET));
		NetCall.Function = WRITE_SECTORS;
		memcpy(&NetCalls.DrivePacket, DrivePacket, sizeof(DRIVEPACKET));
		send(SocketNum, (char *) &NetCalls, sizeof(SECTORS_FUNC), 0);
		CallNet();
	}
	else if(gOSWin95){
		do{
			Int13ExtFlag = CalcCylHeadSect(&TmpDP, CylHeadSect);
			DWORD TmpNumSectors = TmpDP.SectorsPerTrack - (CylHeadSect->Sector & 0x3F) + 1;
			TmpNumSectors = TmpVal > TmpNumSectors ? TmpNumSectors:TmpVal;
			if(!(DllThunk32Write)(DrivePacket->Drive, CylHeadSect->Cylinder, CylHeadSect->Head, CylHeadSect->Sector, TmpNumSectors, Buffer+(DrivePacket->NumSectors - TmpVal) * 512, DrivePacket->NTRelativeSector + TmpDP.RelativeSector, DrivePacket->Flag & Int13ExtFlag)){
				if (TmpNumSectors == 1)
					return FALSE;
				memcpy(&TmpDrivePacket, &TmpDP, sizeof(DRIVEPACKET));
				for(int i=0; i<TmpNumSectors; i++){
					TmpDrivePacket.NumSectors = 1;
					WriteSectors(&TmpDrivePacket, CylHeadSect, (LPBYTE)(Buffer+i*512));
					TmpDrivePacket.RelativeSector++;
				}
				return FALSE;
			}
			TmpVal -= TmpNumSectors;
			TmpDP.RelativeSector += TmpNumSectors;
		}while(TmpVal);
	}
	else{
		__int64 Tmp64 = (((__int64) DrivePacket->NTRelativeSector) + ((__int64) DrivePacket->RelativeSector)) * 512;
		long TmpVal = Tmp64 & 0xFFFFFFFF;
		long TmpValHi = (Tmp64 >> 32);
		SetFilePointer(hDisk[DrivePacket->Drive], TmpVal, &TmpValHi, FILE_BEGIN);
		TmpVal = 0;
		WriteFile(hDisk[DrivePacket->Drive], Buffer, DrivePacket->NumSectors * 512, (DWORD *) &TmpVal, NULL);
		if((!TmpVal) && (DrivePacket->Drive < 0x80)){
			CloseHandle(hDisk[DrivePacket->Drive]);
			char TmpStr[100];
			wsprintf(TmpStr, "\\\\.\\%c:", DrivePacket->Drive+'A');
			if((hDisk[DrivePacket->Drive]=CreateFile(TmpStr, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL))==INVALID_HANDLE_VALUE){
				return FALSE;
			}
			Tmp64 = (((__int64) DrivePacket->NTRelativeSector) + ((__int64) DrivePacket->RelativeSector)) * 512;
			TmpVal = Tmp64 & 0xFFFFFFFF;
			TmpValHi = (Tmp64 >> 32);
			SetFilePointer(hDisk[DrivePacket->Drive], TmpVal, &TmpValHi, FILE_BEGIN);
			TmpVal = 0;
			WriteFile(hDisk[DrivePacket->Drive], Buffer, DrivePacket->NumSectors * 512, (DWORD *) &TmpVal, NULL);
		}
		if(TmpVal != (DrivePacket->NumSectors * 512)){
			if (DrivePacket->NumSectors == 1)
				return FALSE;
			DRIVEPACKET TmpDrivePacket;
			memcpy(&TmpDrivePacket, &TmpDP, sizeof(DRIVEPACKET));
			for(int i=0; i<DrivePacket->NumSectors; i++){
				TmpDrivePacket.NumSectors = 1;
				WriteSectors(&TmpDrivePacket, CylHeadSect, (LPBYTE)(Buffer+i*512));
				TmpDrivePacket.RelativeSector++;
			}
			return FALSE;
		}
	}
	return TRUE;
}

void DisplayFAT12(DRIVEPACKET *DrivePacket)
{
	WORD i;					  
	DeleteColumns();
	gListViewType = FAT12;
	m_wndStatusBarCtrl->SetText("Wait....", 0, 0);
	ListView->InsertColumn(0, "FAT Entry", LVCFMT_LEFT, 100, 0);
	for(i=0; i<16; i++){ 
		wsprintf(TmpStr, "%03X", i);
		ListView->InsertColumn(i+1, TmpStr, LVCFMT_LEFT, 35, i+1);
	}
	if(!LoadSectors(DrivePacket, &CylHeadSect, Buffer)){
		AfxMessageBox("FAT not accessible!");
		return;
	}
	WORD TmpVal = DrivePacket->NumSectors*64; /*(512/(16*3/2)*/
	WORD TmpVal1 = TmpVal % 3;
	for(i=0; i<(TmpVal/3 + (TmpVal1 ? 1:0)); i++){
		wsprintf(TmpStr, "%08lX", i*16);
		ListView->InsertItem(LVIF_TEXT|LVIF_PARAM, i, LPSTR_TEXTCALLBACK, 0, 0, i, (LPARAM) i);
	}
	wsprintf(TmpStr, "Current Sector Number: %lu", DrivePacket->RelativeSector);
	m_wndStatusBarCtrl->SetText(TmpStr, 1, 0);
	m_wndStatusBarCtrl->SetText("", 0, 0);
	return;
}

void DisplayRootDir(DRIVEPACKET *DrivePacket)
{
	WORD i;					  
	DeleteColumns();
	gListViewType = ROOT_DIR;
	ListView->InsertColumn(MS_DOS, "MS-DOS Name", LVCFMT_LEFT, 100, 0);
	ListView->InsertColumn(LFN, "Long File Name", LVCFMT_LEFT, 200, 0);
	ListView->InsertColumn(START_CLUS, "Starting Cluster", LVCFMT_LEFT, 100, 0);
	ListView->InsertColumn(ATTR, "Attributes", LVCFMT_LEFT, 75, 0);
	ListView->InsertColumn(SIZE, "Size", LVCFMT_LEFT, 75, 0);
	ListView->InsertColumn(DATETIME, "Modified Date", LVCFMT_LEFT, 125, 0);
	ListView->InsertColumn(CREATEDATE, "Created Date", LVCFMT_LEFT, 125, 0);
	ListView->InsertColumn(ACCESSDATE, "Accessed Date", LVCFMT_LEFT, 125, 0);
	if(!LoadSectors(DrivePacket, &CylHeadSect, Buffer)){
		AfxMessageBox("Root Directory not fully accessible!");
	}
	if(hMemFilePacket){
		LocalUnlock(hMemFilePacket);
		LocalFree(hMemFilePacket);
	}
	hMemFilePacket = LocalAlloc(LMEM_MOVEABLE | LMEM_DISCARDABLE, DrivePacket->NumSectors * 512 + DrivePacket->NumSectors*8 /*For LFN & .*/);
	if(hMemFilePacket == NULL){
		AfxMessageBox("Unable to allocate memory");
		return;
	}
	FILEPACKET *FilePacket = (FILEPACKET *) LocalLock(hMemFilePacket);
	DIRECTORY *Directory=(DIRECTORY *)Buffer;
	for(i=0; i<(DrivePacket->NumSectors*16); i++){
		if((Directory->Attributes & 0xF) == 0xF){
			Directory++;				//Its a LFN Skip it
			continue;
		}
		if(Directory->Name[0] == 0)
			break;
		memmove(FilePacket->Name, Directory->Name, 8);
		FilePacket->Name[8] = '.';
		memmove(&(FilePacket->Name[9]), Directory->Extension, 3);
		FilePacket->Name[12]=0;
		FilePacket->Attributes = Directory->Attributes;
		FilePacket->Date = Directory->Date;
		FilePacket->CreateDate = Directory->CreateDate;
		FilePacket->AccessDate = Directory->AccessDate;
		FilePacket->Size = Directory->Size;
		FilePacket->StartCluster = (DWORD) Directory->StartCluster + (((DrivePacket->FatType == FAT32) ? (DWORD) Directory->StartClusterHi:0)<<16);
		FilePacket->Time = Directory->Time;
		FilePacket->Lfn = (char *) (FilePacket+1);
		WORD TmpVal=0;
		if(Directory != (DIRECTORY *)Buffer)
			TmpVal=FormLongFileName(Directory, (char *)(FilePacket+1));
		FilePacket++;
		*((char *) FilePacket+TmpVal)=0;
		Directory++;
		ListView->InsertItem(LVIF_TEXT|LVIF_PARAM, i, LPSTR_TEXTCALLBACK, 0, 0, i, (LPARAM) (FilePacket-1));
		FilePacket = (FILEPACKET *)((char *) FilePacket+TmpVal+1);
	}
	wsprintf(TmpStr, "Current Sector Number: %lu", DrivePacket->RelativeSector);
	m_wndStatusBarCtrl->SetText(TmpStr, 1, 0);
}

WORD FormLongFileName(DIRECTORY *Directory, char *LfnBuff)
{
	WORD TmpLen=0;
	char *Lfn = (char *) Directory;
	if(((Directory-1)->Attributes & 0xF) != 0xF)
		return TmpLen;
	do{
		Lfn -= 32;
		for(int i=0; i<31; i++){
			if((i==10) | (i==11) | (i==12) | (i==25) | (i==26))
				continue;
			LfnBuff[TmpLen++] = Lfn[i+1];
			if(Lfn[i+1]==0)
				break;
			i++;			//Skip past the Unicode Hi byte
		}
	}while(!(Lfn[0] & 0x40));
	LfnBuff[TmpLen]=0;
	return TmpLen;
}

void EnumTreeRoot(void)
{
	char TmpStr1[1000];
	LocalUnlock(hMemPackets);
	LocalUnlock(hMemDrivePacket);
	Packets = (DRIVEPACKET *) LocalLock(hMemPackets);
	DrivePacket = (DRIVEPACKET *) LocalLock(hMemDrivePacket);
	m_wndStatusBarCtrl->SetText("Wait....", 0, 0);
	for(DWORD i=0; i<NumFloppies; i++){
		wsprintf(TmpStr, "Floppy Disk %lu", i+1);
		TvI.mask = TVIF_CHILDREN | TVIF_TEXT | TVIF_PARAM;
		TvI.pszText = TmpStr;
		TvI.cChildren = 1;
		TvI.lParam = (long)DrivePacket;
		DrivePacket->Drive = (WORD) i;
		DrivePacket->Cylinder = 0;
		DrivePacket->Head = 0;
		DrivePacket->Sector = 1;
		DrivePacket->NumSectors = 1;
		DrivePacket->Type = BOOT_RECORD;
		DrivePacket->RelativeSector = 0;
		DrivePacket->NTRelativeSector = 0;
		DrivePacket->Flag = 0;

		TvIns.item = TvI;
		TvIns.hParent = TVI_ROOT;
		TvIns.hInsertAfter = TVI_LAST;
		DiskTree->InsertItem((LPTVINSERTSTRUCT) &TvIns);
		DrivePacket++;
	}
	for(i=0;;i++){
		if(gOSWin95){
			if(!(DllThunk32)(i+0x80, 0, 0, 1, 1, (LPBYTE) TmpStr1, 0, FALSE))
				break;

⌨️ 快捷键说明

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