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

📄 leftview.cpp

📁 visual c++ 实例编程
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			NetCall.NumSectors = DrivePacket->NumSectors;
			NetCall.NTRelativeSector = DrivePacket->NTRelativeSector;
			NetCall.RelativeSector = 0;
			NetCall.Flag = DrivePacket->Flag;
			send(SocketNum, (char *) &NetCall, sizeof(SECTOR_FUNC), 0);
			CallNet();
		}
		else if(gOSWin95){
			if(!(DllThunk32)(DrivePacket->Drive, DrivePacket->Cylinder, DrivePacket->Head, 
					DrivePacket->Sector, DrivePacket->NumSectors, (LPBYTE)BufferDir, DrivePacket->NTRelativeSector, DrivePacket->Flag)){
				AfxMessageBox("Boot Record not accessible!");
				return;
			}
		}
		else{
			char TmpStr[100];
			if(DrivePacket->Drive < 0x80){
				wsprintf(TmpStr, "\\\\.\\%c:", DrivePacket->Drive+'A');
				if(hDisk[DrivePacket->Drive])
					CloseHandle(hDisk[DrivePacket->Drive]);
				if((hDisk[DrivePacket->Drive]=CreateFile(TmpStr, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL))==INVALID_HANDLE_VALUE){
					AfxMessageBox("Drive not accessible!");
					*pResult = -1;
					return;
				}
			}
			else
				wsprintf(TmpStr, "\\\\.\\PHYSICALDRIVE%u", DrivePacket->Drive - 0x80);
			__int64 Tmp64 = ((__int64) DrivePacket->NTRelativeSector) * 512;
			long TmpVal = Tmp64 & 0xFFFFFFFF;
			long TmpValHi = (Tmp64 >> 32);
			SetFilePointer(hDisk[DrivePacket->Drive], TmpVal, &TmpValHi, FILE_BEGIN);
			TmpVal = 0;
			ReadFile(hDisk[DrivePacket->Drive], BufferDir, DrivePacket->NumSectors * 512, (DWORD *) &TmpVal, NULL);
			if(TmpVal != (DrivePacket->NumSectors * 512)){
				AfxMessageBox("Boot Record not accessible!");
				return;
			}
		}
		BOOT *BootRecord = (BOOT *) BufferDir;
		WORD FatType = ((BootRecord->BytesPerSector * (BootRecord->TotalSectors ? BootRecord->TotalSectors:BootRecord->ExtendedTotalSectors)) /
				(BootRecord->BytesPerSector * BootRecord->SectorsPerCluster)>=4096) ? FAT16:FAT12;
		if(DrivePacket->FatType == FAT32)
			FatType = FAT32;
		for(i=0;i<BootRecord->NumFATs; i++){
			wsprintf(TmpStr, "FAT %u", i+1);
			Packets->Cylinder = DrivePacket->Cylinder;
			Packets->Drive = DrivePacket->Drive;
			Packets->Flag = DrivePacket->Flag;
			Packets->Head = DrivePacket->Head;
			if(DrivePacket->FatType == FAT32)
				Packets->NumSectors = BootRecord->ExtendedSectorsPerFAT;
			else
				Packets->NumSectors = BootRecord->SectorsPerFAT;
			Packets->Sector = DrivePacket->Sector;
			Packets->Type = FatType;
			Packets->RelativeSector = BootRecord->ReservedSectors + ((DrivePacket->FatType == FAT32) ? BootRecord->ExtendedSectorsPerFAT:BootRecord->SectorsPerFAT)*i;
			Packets->TotalHeads = BootRecord->NumHeads;
			Packets->SectorsPerTrack = BootRecord->SectorsPerTrack;
			Packets->SectorsPerCluster = BootRecord->SectorsPerCluster;
			Packets->FatType = FatType;
			Packets->TotalSectors = BootRecord->TotalSectors ? BootRecord->TotalSectors:BootRecord->ExtendedTotalSectors;
			Packets->NTRelativeSector = DrivePacket->NTRelativeSector;
			Packets->Net = DrivePacket->Net;

			TvI.mask = TVIF_CHILDREN | TVIF_TEXT | TVIF_PARAM;
			TvI.pszText = TmpStr;
			TvI.cChildren = 0;
			TvI.lParam = (long)Packets++;

			TvIns.item = TvI;
			TvIns.hParent = (HTREEITEM) pNMTreeView->itemNew.hItem;
			TvIns.hInsertAfter = hPrev;
			hPrev = DiskTree->InsertItem((LPTVINSERTSTRUCT) &TvIns);
		}
		strcpy(TmpStr, "Root Directory");
		Packets->Cylinder = DrivePacket->Cylinder;
		Packets->Drive = DrivePacket->Drive;
		Packets->Flag = DrivePacket->Flag;
		Packets->Head = DrivePacket->Head;
		if(DrivePacket->FatType == FAT32){
			Packets->NumSectors = 0;
			Packets->Attributes = ATTR_SUBDIR;
		}
		else
			Packets->NumSectors = (BootRecord->NumRoot * 32)/512;
		Packets->Sector = DrivePacket->Sector;
		Packets->Type = (DrivePacket->FatType == FAT32) ? FILES_FOLDERS:ROOT_DIR;
		Packets->TotalHeads = BootRecord->NumHeads;
		Packets->SectorsPerTrack = BootRecord->SectorsPerTrack;
		Packets->SectorsPerCluster = BootRecord->SectorsPerCluster;
		Packets->FatRelativeSector = BootRecord->ReservedSectors;
		Packets->RelativeSector = BootRecord->ReservedSectors + ((DrivePacket->FatType == FAT32) ? BootRecord->ExtendedSectorsPerFAT:BootRecord->SectorsPerFAT)*i;
		Packets->DataAreaSector = Packets->RelativeSector + ((DrivePacket->FatType == FAT32) ? 0:(BootRecord->NumRoot*32)/512);
		if(DrivePacket->FatType == FAT32){
			Packets->NumFatSectors = BootRecord->ExtendedSectorsPerFAT;
			Packets->StartCluster = BootRecord->RootStartCluster;
		}
		else{
			Packets->NumFatSectors = BootRecord->SectorsPerFAT;
		}
		Packets->FatType = FatType;
		Packets->TotalSectors = BootRecord->TotalSectors ? BootRecord->TotalSectors:BootRecord->ExtendedTotalSectors;
		Packets->NTRelativeSector = DrivePacket->NTRelativeSector;
		Packets->Net = DrivePacket->Net;
		TvI.mask = TVIF_CHILDREN | TVIF_TEXT | TVIF_PARAM;
		TvI.pszText = TmpStr;
		TvI.cChildren = 1;
		TvI.lParam = (long)Packets++;

		TvIns.item = TvI;
		TvIns.hParent = (HTREEITEM) pNMTreeView->itemNew.hItem;
		TvIns.hInsertAfter = hPrev;
		hPrev = DiskTree->InsertItem((LPTVINSERTSTRUCT) &TvIns);
		LocalUnlock(hMemBufferDir);
		LocalFree(hMemBufferDir);
		break;
		}
	case ROOT_DIR:{
		hMemBufferDir = LocalAlloc(LMEM_MOVEABLE|LMEM_DISCARDABLE|LMEM_ZEROINIT, DrivePacket->NumSectors * 512);
		if(hMemBufferDir == NULL){
			AfxMessageBox("Fatal Error!  Not able to allocate a Buffer for Root Directory!");
			return;
		}
		BufferDir = (LPBYTE) LocalLock(hMemBufferDir);
		if(!LoadSectors(DrivePacket, &CylHeadSect, BufferDir)){
			AfxMessageBox("Root Directory not fully accessible!");
		}
		DIRECTORY *Directory=(DIRECTORY *)BufferDir;
		for(i=0; i<(DrivePacket->NumSectors*16); i++){
			char *Lfn = (char *) (Packets+1);
			if(((Directory->Attributes & 0xF) == 0xF) || ((BYTE)Directory->Name[0] == 0xE5) || (Directory->Name[0] == 5)){
				Directory++;				//Its a LFN Skip it
				continue;
			}
			if(Directory->Attributes & ATTR_VOLUME){
				Directory++;				//Its a LFN Skip it
				continue;
			}
			if(Directory->Name[0] == 0)
				break;
			WORD TmpVal=0;
			if(Directory != (DIRECTORY *)BufferDir)
				TmpVal=FormLongFileName(Directory, Lfn);
			if(TmpVal == 0){
				memcpy(Lfn, Directory->Name, 8);
				Lfn[8] = '.';
				memcpy(&(Lfn[9]), Directory->Extension, 3);
				Lfn[12]=0;
				TmpVal = 12;
			}
			*(Lfn+TmpVal) = 0;
			Packets->Cylinder = DrivePacket->Cylinder;
			Packets->Drive = DrivePacket->Drive;
			Packets->Flag = DrivePacket->Flag;
			Packets->Head = DrivePacket->Head;
			Packets->NumSectors = 0;
			Packets->Sector = DrivePacket->Sector;
			Packets->Type = FILES_FOLDERS;
			Packets->RelativeSector = DrivePacket->RelativeSector + DrivePacket->NumSectors;
			Packets->TotalHeads = DrivePacket->TotalHeads;
			Packets->SectorsPerTrack = DrivePacket->SectorsPerTrack;
			Packets->SectorsPerCluster = DrivePacket->SectorsPerCluster;
			Packets->FatRelativeSector = DrivePacket->FatRelativeSector;
			Packets->DataAreaSector = DrivePacket->DataAreaSector;
			if(DrivePacket->FatType == FAT32)
				Packets->StartCluster = ((DWORD) Directory->StartCluster + (((DWORD)Directory->StartClusterHi)<<16));
			else
				Packets->StartCluster = (DWORD) Directory->StartCluster;
			Packets->NumFatSectors = DrivePacket->NumFatSectors;
			Packets->Lfn = Lfn;
			Packets->FatType = DrivePacket->FatType;
			Packets->Attributes = (WORD) Directory->Attributes;
			Packets->TotalSectors = DrivePacket->TotalSectors;
			Packets->NTRelativeSector = DrivePacket->NTRelativeSector;
			Packets->Net = DrivePacket->Net;

			TvI.mask = TVIF_CHILDREN | TVIF_TEXT | TVIF_PARAM;
			TvI.pszText = LPSTR_TEXTCALLBACK;
			TvI.cChildren = (Directory->Attributes & ATTR_SUBDIR) ? 1:0;
			TvI.lParam = (long)Packets;
			Directory++;

			TvIns.item = TvI;
			TvIns.hParent = (HTREEITEM) pNMTreeView->itemNew.hItem;
			TvIns.hInsertAfter = hPrev;
			Lfn += TmpVal+1;
			Packets = (DRIVEPACKET *) Lfn;
			hPrev = DiskTree->InsertItem((LPTVINSERTSTRUCT) &TvIns);
		}
		LocalUnlock(hMemBufferDir);
		LocalFree(hMemBufferDir);
		break;
		}
	case FILES_FOLDERS:{
		hMemBufferDir = LocalAlloc(LMEM_MOVEABLE|LMEM_DISCARDABLE|LMEM_ZEROINIT, DrivePacket->NumFatSectors * 512);
		if(hMemBufferDir == NULL){
			AfxMessageBox("Fatal Error!  Not able to allocate a Buffer For FAT!");
			return;
		}
		BufferDir = (LPBYTE) LocalLock(hMemBufferDir);
		DRIVEPACKET FatDrivePacket;
		memcpy(&FatDrivePacket, DrivePacket, sizeof(DRIVEPACKET));
		FatDrivePacket.RelativeSector = DrivePacket->FatRelativeSector;
		FatDrivePacket.NumSectors = DrivePacket->NumFatSectors;
		if(!LoadSectors(&FatDrivePacket, &CylHeadSect, BufferDir)){
			FatDrivePacket.RelativeSector += DrivePacket->NumFatSectors;			//First FAT fails
			if(!LoadSectors(&FatDrivePacket, &CylHeadSect, BufferDir)){
				AfxMessageBox("FAT not accessible!");
				return;
			}
		}
		DWORD NumFatEntries = CountFatEntries(FatDrivePacket.StartCluster, FatDrivePacket.FatType, BufferDir);
		if(!NumFatEntries)
			return;
		HLOCAL hMemBufferFatEntries = LocalAlloc(LMEM_MOVEABLE|LMEM_DISCARDABLE|LMEM_ZEROINIT, NumFatEntries*4);
		if(hMemBufferFatEntries == NULL){
			AfxMessageBox("Fatal Error!  Not able to allocate a Buffer for FAT Entries!");
			return;
		}
		LPDWORD BufferFatEntries = (LPDWORD) LocalLock(hMemBufferFatEntries);
		StoreFatEntries(FatDrivePacket.StartCluster, FatDrivePacket.FatType, BufferFatEntries, NumFatEntries, BufferDir);
		LocalUnlock(hMemBufferDir);
		LocalFree(hMemBufferDir);
		hMemBufferDir = LocalAlloc(LMEM_MOVEABLE|LMEM_DISCARDABLE|LMEM_ZEROINIT, NumFatEntries * DrivePacket->SectorsPerCluster * 512);
		if(hMemBufferDir == NULL){
			AfxMessageBox("Fatal Error! Not able to allocate a Buffer!");
			LocalUnlock(hMemBufferFatEntries);
			LocalFree(hMemBufferFatEntries);
			return;
		}
		BufferDir = (LPBYTE) LocalLock(hMemBufferDir);
		if(!ReadDirBuffer(BufferFatEntries, DrivePacket, NumFatEntries, BufferDir)){
			AfxMessageBox("Not able to load the sub-directory");
			LocalUnlock(hMemBufferFatEntries);
			LocalFree(hMemBufferFatEntries);
			return;
		}
		LocalUnlock(hMemBufferDir);
		BufferDir = (LPBYTE) LocalLock(hMemBufferDir);
		DIRECTORY *Directory=(DIRECTORY *)BufferDir;
		for(i=0; i<(NumFatEntries*DrivePacket->SectorsPerCluster*16) /*512/32*/; i++){
			char *Lfn = (char *) (Packets+1);
			if(((Directory->Attributes & 0xF) == 0xF) || ((BYTE)Directory->Name[0] == 0xE5) || (Directory->Name[0] == 5)){
				Directory++;				//Its a LFN Skip it
				continue;
			}
			if((Directory->Attributes & ATTR_SUBDIR) && (Directory->Name[0]=='.')){
				Directory++;				//Its a LFN Skip it
				continue;
			}
			if(Directory->Name[0] == 0)
				break;
			WORD TmpVal=0;
			if(Directory != (DIRECTORY *)BufferDir)
				TmpVal=FormLongFileName(Directory, Lfn);
			if(TmpVal == 0){
				memcpy(Lfn, Directory->Name, 8);
				Lfn[8] = '.';
				memcpy(&(Lfn[9]), Directory->Extension, 3);
				Lfn[12]=0;
				TmpVal = 12;
			}
			*(Lfn+TmpVal) = 0;
			Packets->Cylinder = DrivePacket->Cylinder;
			Packets->Drive = DrivePacket->Drive;
			Packets->Flag = DrivePacket->Flag;
			Packets->Head = DrivePacket->Head;
			Packets->NumSectors = 0;
			Packets->Sector = DrivePacket->Sector;
			Packets->Type = FILES_FOLDERS;
			Packets->RelativeSector = DrivePacket->RelativeSector + DrivePacket->NumSectors;
			Packets->TotalHeads = DrivePacket->TotalHeads;
			Packets->SectorsPerTrack = DrivePacket->SectorsPerTrack;
			Packets->SectorsPerCluster = DrivePacket->SectorsPerCluster;
			Packets->FatRelativeSector = DrivePacket->FatRelativeSector;
			Packets->DataAreaSector = DrivePacket->DataAreaSector;
			if(DrivePacket->FatType == FAT32)
				Packets->StartCluster = ((DWORD) Directory->StartCluster + (((DWORD)Directory->StartClusterHi)<<16));
			else
				Packets->StartCluster = (DWORD) Directory->StartCluster;
			Packets->Lfn = Lfn;
			Packets->FatType = DrivePacket->FatType;
			Packets->NumFatSectors = DrivePacket->NumFatSectors;
			Packets->Attributes = (WORD) Directory->Attributes;
			Packets->TotalSectors = DrivePacket->TotalSectors;
			Packets->NTRelativeSector = DrivePacket->NTRelativeSector;
			Packets->Net = DrivePacket->Net;

			TvI.mask = TVIF_CHILDREN | TVIF_TEXT | TVIF_PARAM;
			TvI.pszText = LPSTR_TEXTCALLBACK;
			TvI.cChildren = (Directory->Attributes & ATTR_SUBDIR) ? 1:0;
			TvI.lParam = (long)Packets;
			Directory++;

			TvIns.item = TvI;
			TvIns.hParent = (HTREEITEM) pNMTreeView->itemNew.hItem;
			TvIns.hInsertAfter = hPrev;
			Lfn += TmpVal+1;
			Packets = (DRIVEPACKET *) Lfn;
			hPrev = DiskTree->InsertItem((LPTVINSERTSTRUCT) &TvIns);
		}
		LocalUnlock(hMemBufferFatEntries);
		LocalFree(hMemBufferFatEntries);
		LocalUnlock(hMemBufferDir);
		LocalFree(hMemBufferDir);
		break;
		}
	}
	m_wndStatusBarCtrl->SetText("", 0, 0);
}

void CLeftView::OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult) 
{
	TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
	// TODO: Add your control notification handler code here
	pTVDispInfo->item.pszText = (char *)((DRIVEPACKET *)(pTVDispInfo->item.lParam))->Lfn;
	*pResult = 0;
}

⌨️ 快捷键说明

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