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

📄 general.cpp

📁 visual c++ 实例编程
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		}
		else{
			if(hDisk[i+0x80])
				CloseHandle(hDisk[i+0x80]);
			char TmpStr[26] = "\\\\.\\PHYSICALDRIVE0";
			TmpStr[17] = i+'0';
			if((hDisk[i+0x80]=CreateFile(TmpStr, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL))==INVALID_HANDLE_VALUE)
				break;
		}
		wsprintf(TmpStr, "Hard Disk %lu", i+1);
		TvI.mask = TVIF_CHILDREN | TVIF_TEXT | TVIF_PARAM;
		TvI.pszText = TmpStr;
		TvI.cChildren = 1;
		TvI.lParam = (long)DrivePacket;
		DrivePacket->Drive = 0x80+i;
		DrivePacket->Cylinder = 0;
		DrivePacket->Head = 0;
		DrivePacket->Sector = 1;
		DrivePacket->NumSectors = 1;
		DrivePacket->Type = PART_TABLE;
		DrivePacket->RelativeSector = 0;
		DrivePacket->NTRelativeSector = 0;
		if(gOSWin95)
			DrivePacket->Flag = (DllCheckInt13Extension)(0x80+i);
		else
			DrivePacket->Flag = 0;

		NumHards++;

		TvIns.item = TvI;
		TvIns.hParent = TVI_ROOT;
		TvIns.hInsertAfter = TVI_LAST;
		hPrevHD = DiskTree->InsertItem((LPTVINSERTSTRUCT) &TvIns);
		DrivePacket++;
	}
	m_wndStatusBarCtrl->SetText("", 0, 0);
}

void DisplaySubDir(DRIVEPACKET *DrivePacket)
{
	WORD i;					  
	m_wndStatusBarCtrl->SetText("Wait....", 0, 0);
	DeleteColumns();
	gListViewType = SUB_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);
	DIRECTORY *Directory=(DIRECTORY *)Buffer;
	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);
	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;
		if((Directory->Attributes & ATTR_SUBDIR) && (Directory->Name[0]=='.')){
			Directory++;				//Its a . or .. Skip it
			continue;
		}
//		if(((BYTE)Directory->Name[0] != 0xE5) && (Directory->Name[0] != 0x05)){
//			Directory++;
//			continue;
//		}
		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);
	}
	m_wndStatusBarCtrl->SetText("", 0, 0);
}

DWORD CountFatEntries(DWORD StartCluster, WORD FatType, LPBYTE Buffer)
{
	if(!(StartCluster & 0xFFFFFFF))
		return 0;
	switch(FatType)
	{
	case FAT16:
		if(StartCluster == 0xFFFF)
			return 0;
		break;
	case FAT12:
		if(StartCluster == 0xFFF)
			return 0;
		break;
	case FAT32:
		if((StartCluster & 0xFFFFFFF) == 0xFFFFFFF)
			return 0;
		break;
	}
	DWORD NumFatEntries = 1, NextCluster = StartCluster;
	while(TRUE){
		switch(FatType)
		{
		case FAT16:
			NextCluster = (WORD)Buffer[NextCluster*2]+(WORD)Buffer[NextCluster*2+1]*256;
			if(!NextCluster)
				return NumFatEntries;
			if(NextCluster == 0xFFFF)
				return NumFatEntries;
			break;
		case FAT12:{
			DWORD TmpVal = (WORD)Buffer[(NextCluster*3)/2]+(WORD)Buffer[(NextCluster*3)/2+1]*256;
			NextCluster = (NextCluster % 2) ? (TmpVal >> 4):(TmpVal & 0xFFF);
			if(!NextCluster)
				return NumFatEntries;
			if(NextCluster == 0xFFF)
				return NumFatEntries;
			break;
			}
		case FAT32:
			NextCluster &= 0xFFFFFFF;
			NextCluster = (DWORD)Buffer[NextCluster*4]+(((DWORD)Buffer[NextCluster*4+1])<<8) + 
				(((DWORD)Buffer[NextCluster*4+2])<<16) + (((DWORD)Buffer[NextCluster*4+3])<<24);
			NextCluster &= 0xFFFFFFF;
			if(!NextCluster)
				return NumFatEntries;
			if(NextCluster == 0xFFFFFFF)
				return NumFatEntries;
			break;
		}
		NumFatEntries++;
	}
}

void StoreFatEntries(DWORD StartCluster, WORD FatType, LPDWORD FatEntries, DWORD NumFatEntries, LPBYTE Buffer)
{
	DWORD NextCluster = StartCluster;
	for(DWORD i=0; i<NumFatEntries; i++){
		switch(FatType)
		{
		case FAT16:
			FatEntries[i] = NextCluster;
			NextCluster = (WORD)Buffer[NextCluster*2]+(WORD)Buffer[NextCluster*2+1]*256;
			break;
		case FAT12:{
			FatEntries[i] = NextCluster;
			DWORD TmpVal = (WORD)Buffer[(NextCluster*3)/2]+(WORD)Buffer[(NextCluster*3)/2+1]*256;
			NextCluster = (NextCluster % 2) ? (TmpVal >> 4):(TmpVal & 0xFFF);
			break;
			}
		case FAT32:
			NextCluster &= 0xFFFFFFF;
			FatEntries[i] = NextCluster;
			NextCluster = (DWORD)Buffer[NextCluster*4]+(((DWORD)Buffer[NextCluster*4+1])<<8) + 
				(((DWORD)Buffer[NextCluster*4+2])<<16) + (((DWORD)Buffer[NextCluster*4+3])<<24);
			NextCluster &= 0xFFFFFFF;
			break;
		}
	}
}

BOOL ReadDirBuffer(LPDWORD FatBuffer, DRIVEPACKET *DrivePacket, DWORD NumFatEntries, LPBYTE Buffer)
{
	DRIVEPACKET TmpDrivePacket;
	DWORD TmpVal=0;
	for(DWORD i=0; i<NumFatEntries; i++){
		memcpy(&TmpDrivePacket, DrivePacket, sizeof(DRIVEPACKET));
		TmpDrivePacket.RelativeSector += DrivePacket->SectorsPerCluster * (FatBuffer[TmpVal++]-2);
		TmpDrivePacket.NumSectors = DrivePacket->SectorsPerCluster;
		if(!LoadSectors(&TmpDrivePacket, &CylHeadSect, Buffer))
			return FALSE;
		Buffer += DrivePacket->SectorsPerCluster * 512;
	}
	return TRUE;
}

BOOL WriteDirBuffer(LPDWORD FatBuffer, DRIVEPACKET *DrivePacket, DWORD NumFatEntries, LPBYTE Buffer)
{
	DRIVEPACKET TmpDrivePacket;
	DWORD TmpVal=0;
	for(DWORD i=0; i<NumFatEntries; i++){
		memcpy(&TmpDrivePacket, DrivePacket, sizeof(DRIVEPACKET));
		TmpDrivePacket.RelativeSector += DrivePacket->SectorsPerCluster * (FatBuffer[TmpVal++]-2);
		TmpDrivePacket.NumSectors = DrivePacket->SectorsPerCluster;
		if(!WriteSectors(&TmpDrivePacket, &CylHeadSect, Buffer))
			return FALSE;
		Buffer += DrivePacket->SectorsPerCluster * 512;
	}
	return TRUE;
}

void DisplayFilesFolders(DRIVEPACKET *TmpDrivePacket)
{
	DRIVEPACKET DrivePacket;
	memcpy(&DrivePacket, TmpDrivePacket, sizeof(DRIVEPACKET));
	DRIVEPACKET FatDrivePacket;
//	gListViewType = 0;
	memcpy(&FatDrivePacket, TmpDrivePacket, sizeof(DRIVEPACKET));
	FatDrivePacket.RelativeSector = DrivePacket.FatRelativeSector;
	FatDrivePacket.NumSectors = DrivePacket.NumFatSectors;
	if(!LoadSectors(&FatDrivePacket, &CylHeadSect, Buffer)){
		FatDrivePacket.RelativeSector += DrivePacket.NumFatSectors;
		if(!LoadSectors(&FatDrivePacket, &CylHeadSect, Buffer)){
			AfxMessageBox("FAT not accessible!");
			return;
		}
	}
	DWORD NumFatEntries = CountFatEntries(FatDrivePacket.StartCluster, FatDrivePacket.FatType, Buffer);
	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, Buffer);
	LocalUnlock(hMemBuffer);
	LocalFree(hMemBuffer);
	hMemBuffer = LocalAlloc(LMEM_MOVEABLE|LMEM_DISCARDABLE|LMEM_ZEROINIT, NumFatEntries * DrivePacket.SectorsPerCluster * 512);
	if(hMemBuffer == NULL){
		AfxMessageBox("Fatal Error!  Not able to allocate a buffer!");
		LocalUnlock(hMemBufferFatEntries);
		LocalFree(hMemBufferFatEntries);
		return;
	}
	Buffer = (LPBYTE) LocalLock(hMemBuffer);
	if(!ReadDirBuffer(BufferFatEntries, &DrivePacket, NumFatEntries, Buffer)){
		AfxMessageBox("Not able to fully load the sub-directory");
	}
	LocalUnlock(hMemBuffer);
	Buffer = (LPBYTE) LocalLock(hMemBuffer);
	DrivePacket.NumSectors = NumFatEntries * DrivePacket.SectorsPerCluster;
	DisplaySubDir(&DrivePacket);
	wsprintf(TmpStr, "Current Cluster Number: 0x%08X, Current Sector Number: %lu", BufferFatEntries[gCurrentIndex], DrivePacket.RelativeSector+(BufferFatEntries[gCurrentIndex]-2)*DrivePacket.SectorsPerCluster);
	m_wndStatusBarCtrl->SetText(TmpStr, 1, 0);
	LocalUnlock(hMemBufferFatEntries);
	LocalFree(hMemBufferFatEntries);
}

void DisplayFile(DRIVEPACKET *DrivePacket)
{
	WORD i;					  
	m_wndStatusBarCtrl->SetText("Wait....", 0, 0);
	DeleteColumns();
	gListViewType = FILES_FOLDERS;
	ItsFile = true;
	ListView->InsertColumn(0, "Offset", LVCFMT_LEFT, 85, 0);
	for(i=0; i<16; i++){ 
		wsprintf(TmpStr, "%02X", i);
		ListView->InsertColumn(i+1, TmpStr, LVCFMT_LEFT, 30, i+1);
	}
	ListView->InsertColumn(i+1, "", LVCFMT_LEFT, 15, i+1);
	i++;

	for(int j=0; (i-17) < 16; i++, j++){ 
		wsprintf(TmpStr, "%01X", j);
		ListView->InsertColumn(i+1, TmpStr, LVCFMT_LEFT, 20, i+1);
	}
	DRIVEPACKET FatDrivePacket;
	memcpy(&FatDrivePacket, DrivePacket, sizeof(DRIVEPACKET));
	memcpy(&gDrivePacket, DrivePacket, sizeof(DRIVEPACKET));
	FatDrivePacket.RelativeSector = DrivePacket->FatRelativeSector;
	FatDrivePacket.NumSectors = DrivePacket->NumFatSectors;
	if(!LoadSectors(&FatDrivePacket, &CylHeadSect, Buffer)){
		FatDrivePacket.RelativeSector += DrivePacket->NumFatSectors;
		if(!LoadSectors(&FatDrivePacket, &CylHeadSect, Buffer)){
			AfxMessageBox("FAT not accessible!");
			return;
		}
	}
	gNumFatEntries = CountFatEntries(FatDrivePacket.StartCluster, FatDrivePacket.FatType, Buffer);
	if(!gNumFatEntries)
		return;
	if(hMemBufferFatEntries){
		LocalUnlock(hMemBufferFatEntries);
		LocalFree(hMemBufferFatEntries);
	}
	hMemBufferFatEntries = LocalAlloc(LMEM_MOVEABLE|LMEM_DISCARDABLE|LMEM_ZEROINIT, gNumFatEntries*4);
	if(hMemBufferFatEntries == NULL){
		AfxMessageBox("Fatal Error!  Not able to allocate a buffer for FAT Entries!");
		return;
	}
	BufferFatEntries = (LPDWORD) LocalLock(hMemBufferFatEntries);
	StoreFatEntries(FatDrivePacket.StartCluster, FatDrivePacket.FatType, BufferFatEntries, gNumFatEntries, Buffer);
	gSectorsPerCluster = DrivePacket->SectorsPerCluster;
	gCurrentIndex = 0;
	if(hMemBuffer){
		LocalUnlock(hMemBuffer);
		LocalFree(hMemBuffer);
	}
	hMemBuffer = LocalAlloc(LMEM_MOVEABLE|LMEM_DISCARDABLE|LMEM_ZEROINIT, gSectorsPerCluster * 512);
	if(hMemBuffer == NULL){
		AfxMessageBox("Fatal Error!  Not able to allocate a Buffer!");
		LocalUnlock(hMemBufferFatEntries);
		LocalFree(hMemBufferFatEntries);
		return;
	}
	Buffer = (LPBYTE) LocalLock(hMemBuffer);
	memcpy(&FatDrivePacket, DrivePacket, sizeof(DRIVEPACKET));
	FatDrivePacket.RelativeSector += (BufferFatEntries[gCurrentIndex]-2) * gSectorsPerCluster;  //Now load the first cluster of file
	FatDrivePacket.NumSectors = DrivePacket->SectorsPerCluster;
	if(!LoadSectors(&FatDrivePacket, &CylHeadSect, Buffer)){
		AfxMessageBox("Cluster not accessible!");
	}
	for(i=0; i<gSectorsPerCluster * 32; i++){

⌨️ 快捷键说明

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