コード例 #1
0
ファイル: BridgeManager.cpp プロジェクト: DrGolem/Heimdall
bool BridgeManager::ReceiveDump(int chipType, int chipId, FILE *file) const
{
	bool success;

	// Start file transfer
	BeginDumpPacket beginDumpPacket(chipType, chipId);
	success = SendPacket(&beginDumpPacket);

	if (!success)
	{
		InterfaceManager::PrintError("Failed to request dump!\n");
		return (false);
	}

	DumpResponse dumpResponse;
	success = ReceivePacket(&dumpResponse);
	unsigned int dumpSize = dumpResponse.GetDumpSize();

	if (!success)
	{
		InterfaceManager::PrintError("Failed to receive dump size!\n");
		return (false);
	}

	unsigned int transferCount = dumpSize / ReceiveFilePartPacket::kDataSize;
	if (transferCount % ReceiveFilePartPacket::kDataSize != 0)
		transferCount++;

	vector<char> buffer(kDumpBufferSize * ReceiveFilePartPacket::kDataSize, 0);

	for (unsigned int i = 0; i < transferCount; i++)
	{
		DumpPartFileTransferPacket dumpPartPacket(i);
		success = SendPacket(&dumpPartPacket);

		if (!success)
		{
			InterfaceManager::PrintError("Failed to request dump part #%i!\n", i);
			return (false);
		}
		
		ReceiveFilePartPacket receiveFilePartPacket;
		success = ReceivePacket(&receiveFilePartPacket);
		
		if (!success)
		{
			InterfaceManager::PrintError("Failed to receive dump part #%i!\n", i);
			continue;
			return (true);
		}

		if (buffer.size() + receiveFilePartPacket.GetReceivedSize() > kDumpBufferSize * ReceiveFilePartPacket::kDataSize)
		{
			// Write the buffer to the output file
			fwrite(&buffer.front(), 1, buffer.size(), file);
			buffer.clear();
		}

		// Copy the packet data into pitFile.
		unsigned char* pDataBegin = receiveFilePartPacket.GetData();
		unsigned char* pDataEnd = receiveFilePartPacket.GetData() + receiveFilePartPacket.GetReceivedSize();
		buffer.insert(buffer.end(), pDataBegin, pDataEnd);
	}

	if (!buffer.empty())
	{
		// Write the buffer to the output file
		fwrite(&buffer.front(), 1, buffer.size(), file);
	}
	
	// End file transfer
	FileTransferPacket fileTransferPacket(FileTransferPacket::kRequestEnd);
	success = SendPacket(&fileTransferPacket);

	if (!success)
	{
		InterfaceManager::PrintError("Failed to send request to end dump transfer!\n");
		return (false);
	}

	ResponsePacket responsePacket(ResponsePacket::kResponseTypeFileTransfer);
	success = ReceivePacket(&responsePacket);

	if (!success)
	{
		InterfaceManager::PrintError("Failed to receive end dump transfer verification!\n");
		return (false);
	}

	return (true);
}
コード例 #2
0
ファイル: BridgeManager.cpp プロジェクト: DrGolem/Heimdall
int BridgeManager::ReceivePitFile(vector<unsigned char> *pitBuffer) const
{
	if (!pitBuffer)
		return (0);

	bool success;

	// Start file transfer
	PitFilePacket pitFilePacket(PitFilePacket::kRequestDump);
	success = SendPacket(&pitFilePacket);

	if (!success)
	{
		InterfaceManager::PrintError("Failed to request receival of PIT file!\n");
		return (0);
	}

	PitFileResponse pitFileResponse;
	success = ReceivePacket(&pitFileResponse);
	int fileSize = pitFileResponse.GetFileSize();


	if (!success)
	{
		InterfaceManager::PrintError("Failed to receive PIT file size!\n");
		return (0);
	}

	int transferCount = fileSize / ReceiveFilePartPacket::kDataSize;
	if (fileSize % ReceiveFilePartPacket::kDataSize != 0)
		transferCount++;

	vector<unsigned char> buffer(fileSize, 0);

	// NOTE: The PIT file appears to always be padded out to exactly 4 kilobytes.
	for (int i = 0; i < transferCount; i++)
	{
		DumpPartPitFilePacket requestPacket(i);
		success = SendPacket(&requestPacket);

		if (!success)
		{
			InterfaceManager::PrintError("Failed to request PIT file part #%i!\n", i);
			return (0);
		}
		
		ReceiveFilePartPacket receiveFilePartPacket;
		success = ReceivePacket(&receiveFilePartPacket);
		
		if (!success)
		{
			InterfaceManager::PrintError("Failed to receive PIT file part #%i!\n", i);
			return (0);
		}

		// Copy the whole packet data into the buffer.
		unsigned char* pDataStart = receiveFilePartPacket.GetData();
		unsigned char* pDataEnd = receiveFilePartPacket.GetData() + receiveFilePartPacket.GetReceivedSize();
		buffer.insert(buffer.end(), pDataStart, pDataEnd);
	}

	// End file transfer
	PitFilePacket pitFilePacket2(PitFilePacket::kRequestEndTransfer);
	success = SendPacket(&pitFilePacket);

	if (!success)
	{
		InterfaceManager::PrintError("Failed to send request to end PIT file transfer!\n");
		return (0);
	}

	success = ReceivePacket(&pitFileResponse);

	if (!success)
	{
		InterfaceManager::PrintError("Failed to receive end PIT file transfer verification!\n");
		return (0);
	}

	*pitBuffer = buffer;
	return (fileSize);
}
コード例 #3
0
bool BridgeManager::ReceiveDump(unsigned int chipType, unsigned int chipId, FILE *file) const
{
    bool success;

    // Start file transfer
    BeginDumpPacket *beginDumpPacket = new BeginDumpPacket(chipType, chipId);
    success = SendPacket(beginDumpPacket);
    delete beginDumpPacket;

    if (!success)
    {
        Interface::PrintError("Failed to request dump!\n");
        return (false);
    }

    DumpResponse *dumpResponse = new DumpResponse();
    success = ReceivePacket(dumpResponse);
    unsigned int dumpSize = dumpResponse->GetDumpSize();
    delete dumpResponse;

    if (!success)
    {
        Interface::PrintError("Failed to receive dump size!\n");
        return (false);
    }

    unsigned int transferCount = dumpSize / ReceiveFilePartPacket::kDataSize;
    if (transferCount % ReceiveFilePartPacket::kDataSize != 0)
        transferCount++;

    char *buffer = new char[kDumpBufferSize * ReceiveFilePartPacket::kDataSize];
    unsigned int bufferOffset = 0;

    for (unsigned int i = 0; i < transferCount; i++)
    {
        DumpPartFileTransferPacket *dumpPartPacket = new DumpPartFileTransferPacket(i);
        success = SendPacket(dumpPartPacket);
        delete dumpPartPacket;

        if (!success)
        {
            Interface::PrintError("Failed to request dump part #%d!\n", i);
            delete [] buffer;
            return (false);
        }

        ReceiveFilePartPacket *receiveFilePartPacket = new ReceiveFilePartPacket();
        success = ReceivePacket(receiveFilePartPacket);

        if (!success)
        {
            Interface::PrintError("Failed to receive dump part #%d!\n", i);
            continue;
            delete receiveFilePartPacket;
            delete [] buffer;
            return (true);
        }

        if (bufferOffset + receiveFilePartPacket->GetReceivedSize() > kDumpBufferSize * ReceiveFilePartPacket::kDataSize)
        {
            // Write the buffer to the output file
            // bytesWritten is discarded (it's just there to stop GCC warnings)
            int bytesWritten = fwrite(buffer, 1, bufferOffset, file);
            bufferOffset = 0;
        }

        // Copy the packet data into pitFile.
        memcpy(buffer + bufferOffset, receiveFilePartPacket->GetData(), receiveFilePartPacket->GetReceivedSize());
        bufferOffset += receiveFilePartPacket->GetReceivedSize();

        delete receiveFilePartPacket;
    }

    if (bufferOffset != 0)
    {
        // Write the buffer to the output file
        // bytesWritten is discarded (it's just there to stop GCC warnings)
        int bytesWritten = fwrite(buffer, 1, bufferOffset, file);
    }

    delete [] buffer;

    // End file transfer
    FileTransferPacket *fileTransferPacket = new FileTransferPacket(FileTransferPacket::kRequestEnd);
    success = SendPacket(fileTransferPacket);
    delete fileTransferPacket;

    if (!success)
    {
        Interface::PrintError("Failed to send request to end dump transfer!\n");
        return (false);
    }

    ResponsePacket *responsePacket = new ResponsePacket(ResponsePacket::kResponseTypeFileTransfer);
    success = ReceivePacket(responsePacket);
    delete responsePacket;

    if (!success)
    {
        Interface::PrintError("Failed to receive end dump transfer verification!\n");
        return (false);
    }

    return (true);
}
コード例 #4
0
ファイル: BridgeManager.cpp プロジェクト: 470379590/Heimdall
int BridgeManager::ReceivePitFile(unsigned char **pitBuffer) const
{
	*pitBuffer = nullptr;

	bool success;

	// Start file transfer
	PitFilePacket *pitFilePacket = new PitFilePacket(PitFilePacket::kRequestDump);
	success = SendPacket(pitFilePacket);
	delete pitFilePacket;

	if (!success)
	{
		Interface::PrintError("Failed to request receival of PIT file!\n");
		return (0);
	}

	PitFileResponse *pitFileResponse = new PitFileResponse();
	success = ReceivePacket(pitFileResponse);
	unsigned int fileSize = pitFileResponse->GetFileSize();
	delete pitFileResponse;

	if (!success)
	{
		Interface::PrintError("Failed to receive PIT file size!\n");
		return (0);
	}

	unsigned int transferCount = fileSize / ReceiveFilePartPacket::kDataSize;
	if (fileSize % ReceiveFilePartPacket::kDataSize != 0)
		transferCount++;

	unsigned char *buffer = new unsigned char[fileSize];
	int offset = 0;

	// NOTE: The PIT file appears to always be padded out to exactly 4 kilobytes.
	for (unsigned int i = 0; i < transferCount; i++)
	{
		DumpPartPitFilePacket *requestPacket = new DumpPartPitFilePacket(i);
		success = SendPacket(requestPacket);
		delete requestPacket;

		if (!success)
		{
			Interface::PrintError("Failed to request PIT file part #%d!\n", i);
			delete [] buffer;
			return (0);
		}
		
		ReceiveFilePartPacket *receiveFilePartPacket = new ReceiveFilePartPacket();
		success = ReceivePacket(receiveFilePartPacket);
		
		if (!success)
		{
			Interface::PrintError("Failed to receive PIT file part #%d!\n", i);
			delete receiveFilePartPacket;
			delete [] buffer;
			return (0);
		}

		// Copy the whole packet data into the buffer.
		memcpy(buffer + offset, receiveFilePartPacket->GetData(), receiveFilePartPacket->GetReceivedSize());
		offset += receiveFilePartPacket->GetReceivedSize();

		delete receiveFilePartPacket;
	}

	// End file transfer
	pitFilePacket = new PitFilePacket(PitFilePacket::kRequestEndTransfer);
	success = SendPacket(pitFilePacket);
	delete pitFilePacket;

	if (!success)
	{
		Interface::PrintError("Failed to send request to end PIT file transfer!\n");
		delete [] buffer;
		return (0);
	}

	pitFileResponse = new PitFileResponse();
	success = ReceivePacket(pitFileResponse);
	delete pitFileResponse;

	if (!success)
	{
		Interface::PrintError("Failed to receive end PIT file transfer verification!\n");
		delete [] buffer;
		return (0);
	}

	*pitBuffer = buffer;
	return (fileSize);
}
コード例 #5
0
ファイル: BridgeManager.cpp プロジェクト: selbyk/Heimdall
int BridgeManager::ReceivePitFile(unsigned char **pitBuffer) const
{
	*pitBuffer = nullptr;

	bool success;

	// Start file transfer
	PitFilePacket *pitFilePacket = new PitFilePacket(PitFilePacket::kRequestDump);
	success = SendPacket(pitFilePacket);
	delete pitFilePacket;

	if (!success)
	{
		Interface::PrintError("Failed to request receival of PIT file!\n");
		return (0);
	}

	PitFileResponse *pitFileResponse = new PitFileResponse();
	success = ReceivePacket(pitFileResponse);
	unsigned int fileSize = pitFileResponse->GetFileSize();
	delete pitFileResponse;

	if (!success)
	{
		Interface::PrintError("Failed to receive PIT file size!\n");
		return (0);
	}

	unsigned int transferCount = fileSize / ReceiveFilePartPacket::kDataSize;
	if (fileSize % ReceiveFilePartPacket::kDataSize != 0)
		transferCount++;

	unsigned char *buffer = new unsigned char[fileSize];
	int offset = 0;

	for (unsigned int i = 0; i < transferCount; i++)
	{
		DumpPartPitFilePacket *requestPacket = new DumpPartPitFilePacket(i);
		success = SendPacket(requestPacket);
		delete requestPacket;

		if (!success)
		{
			Interface::PrintError("Failed to request PIT file part #%d!\n", i);
			delete [] buffer;
			return (0);
		}

		int receiveEmptyTransferFlags = (i == transferCount - 1) ? kEmptyTransferAfter : kEmptyTransferNone;
		
		ReceiveFilePartPacket *receiveFilePartPacket = new ReceiveFilePartPacket();
		//***** FIX BUG *****
		success = ReceivePacket(receiveFilePartPacket, kDefaultTimeoutEmptyTransfer, receiveEmptyTransferFlags);
		
		if (!success)
		{
			Interface::PrintError("Failed to receive PIT file part #%d!\n", i);
			delete receiveFilePartPacket;
			delete [] buffer;
			return (0);
		}

		// Copy the whole packet data into the buffer.
		memcpy(buffer + offset, receiveFilePartPacket->GetData(), receiveFilePartPacket->GetReceivedSize());
		offset += receiveFilePartPacket->GetReceivedSize();

		delete receiveFilePartPacket;
	}

	// End file transfer
	pitFilePacket = new PitFilePacket(PitFilePacket::kRequestEndTransfer);
	success = SendPacket(pitFilePacket);
	delete pitFilePacket;

	if (!success)
	{
		Interface::PrintError("Failed to send request to end PIT file transfer!\n");
		delete [] buffer;
		return (0);
	}

	pitFileResponse = new PitFileResponse();
	success = ReceivePacket(pitFileResponse);
	delete pitFileResponse;

	if (!success)
	{
		Interface::PrintError("Failed to receive end PIT file transfer verification!\n");
		delete [] buffer;
		return (0);
	}

	*pitBuffer = buffer;
	return (fileSize);
}