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

📄 server.cpp

📁 visual c++ 实例编程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
						NULL,    // GUID implies protocol so no need to specify
						RES_SERVICE,  // Specifies that we are trying to find local address to bind to
						NULL,  // Currently not supported
						CSABuf, // Results buffer
						&dwCSABufsize,   // Size of results buffer
						NULL,    // Not supported
						NULL);    // Not supported
						   // Need at least one address returned in order to bind()
	GetLastError();
	if(bind(SocketNum, CSABuf[0].LocalAddr.lpSockaddr, CSABuf[0].LocalAddr.iSockaddrLength)==SOCKET_ERROR){
		closesocket(SocketNum);
		return FALSE;
	}
	if (getsockname(SocketNum,
				   (PSOCKADDR) &CSABuf[0].LocalAddr.lpSockaddr,
				   (PINT) &CSABuf[0].LocalAddr.iSockaddrLength) == SOCKET_ERROR){
	   // Error -- better cleanup
		closesocket(SocketNum);
		return FALSE;
	}
	// Listen on the socket
	if (listen(SocketNum, 5) == SOCKET_ERROR)
	{
	   // Error -- cleanup
		MessageBox(hDlg, "Error in listen", "LISTEN", MB_OK);
		closesocket(SocketNum);
		return FALSE;
	}
	if(WSAAsyncSelect(SocketNum,
						hDlg,
						MW_CONNECTED,
						FD_ACCEPT) == SOCKET_ERROR)
	{
	   // Error -- cleanup
		MessageBox(hDlg, "Error in WSAAsyncSelect", "ERROR", MB_OK);
		closesocket(SocketNum);
		return FALSE;
	}
	return TRUE;

}

void InitDisks(void)
{
	gOSWin95 = ((int) GetVersion() < 0);
	if(gOSWin95){
		hLib = LoadLibrary("Disk32.DLL");
		if(hLib == NULL){
			MessageBox(NULL, "Disk32.DLL not found", "	SERVER", MB_OK);
			return;
		}
		DllThunk32 = (DLLFUNC *) GetProcAddress(hLib, "ReadDisk32");
		if(DllThunk32 == NULL){
			MessageBox(NULL, "ReadDisk32 Function not accessible!", "SERVER", MB_OK);
			return;
		}
		DllThunk32Write = (DLLFUNC *) GetProcAddress(hLib, "WriteDisk32");
		if(DllThunk32Write == NULL){
			MessageBox(NULL, "WriteDisk32 Function not accessible!", "SERVER", MB_OK);
			return;
		}
		DllCheckInt13Extension = (DLLCHECK *) GetProcAddress(hLib, "CheckInt13Extension32");
		if(DllCheckInt13Extension == NULL){
			MessageBox(NULL, "DllCheckInt13Extension Function not accessible!", "SERVER", MB_OK);
			return;
		}
		hVxD = CreateFile("\\\\.\\DISK.VXD", 0,0,0,
			CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0);
		
		if ( hVxD == INVALID_HANDLE_VALUE )
		{
				MessageBox(NULL, "Unable to open DISK.VXD", "SERVER", MB_OK);
				NumFloppies = 0;
				EnumTreeRoot();
				return;
			dwErrorCode = GetLastError();
			if ( dwErrorCode == ERROR_NOT_SUPPORTED ){
				MessageBox(NULL, "Unable to open DISK.VXD.\nDevice does not support DeviceIOCTL\n", "SERVER", MB_OK);
				return;
			}
			else{
				MessageBox(NULL, "Unable to open DISK.VXD", "SERVER", MB_OK);
			}
			return;
		}
		else
		{
			DeviceIoControl(hVxD, DISK_DETECT,
				(LPVOID)NULL, 0,
				(LPVOID)RetInfo, sizeof(RetInfo),
				&cbBytesReturned, NULL);
			NumFloppies = RetInfo[0];
			CloseHandle(hVxD);
			EnumTreeRoot();
		}
	}
	else{
		char TmpStr[]="A:\\";
		NumFloppies = 0;
		for(int i=0; i<26; i++){
			TmpStr[0] = 'A'+i;
			if(GetDriveType(TmpStr)==DRIVE_REMOVABLE)
				NumFloppies++;
		}
		EnumTreeRoot();
	}
}

void EnumTreeRoot(void)
{
	char TmpStr1[1000];
	for(i=0;;i++){
		if(gOSWin95){
			if(!(DllThunk32)(i+0x80, 0, 0, 1, 1, (LPBYTE) TmpStr1, 0, FALSE))
				break;
		}
		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, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL))==INVALID_HANDLE_VALUE)
				break;
		}
		NumHards++;
	}
}

BOOL LoadSectors(DRIVEPACKET *DrivePacket, LPBYTE Buffer)
{
	DRIVEPACKET TmpDP, TmpDrivePacket;
	DWORD TmpVal = DrivePacket->NumSectors;
	BOOL Int13ExtFlag;
	memcpy(&TmpDP, DrivePacket, sizeof(DRIVEPACKET));
	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, (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, (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, LPBYTE Buffer)
{
	DRIVEPACKET TmpDP, TmpDrivePacket;
	DWORD TmpVal = DrivePacket->NumSectors;
	BOOL Int13ExtFlag;
	memcpy(&TmpDP, DrivePacket, sizeof(DRIVEPACKET));
	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, (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, (LPBYTE)(Buffer+i*512));
				TmpDrivePacket.RelativeSector++;
			}
			return FALSE;
		}
	}
	return TRUE;
}

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 AllocateBuffer(DWORD NumSectors)
{
	if(NumAllocSectors < NumSectors){
		if(hBuffer){
			LocalUnlock(hBuffer);
			LocalFree(hBuffer);
		}
		hBuffer = 0;
		if((hBuffer = LocalAlloc(LMEM_MOVEABLE|LMEM_DISCARDABLE|LMEM_ZEROINIT, NumSectors*512)) == NULL)
			return FALSE;
		Buffer = (PBYTE) LocalLock(hBuffer);
		NumAllocSectors = NumSectors;
		return TRUE;
	}
	return TRUE;
}

⌨️ 快捷键说明

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