@Override
	public boolean added(Program program, AddressSetView set, TaskMonitor monitor, MessageLog log)
			throws CancelledException {
		this.currentProgram = program;

		Listing listing = program.getListing();
		FunctionManager functionManager = program.getFunctionManager();
		ReferenceManager referenceManager = program.getReferenceManager();

		// iterate over all external symbols
		SymbolTable symbolTable = program.getSymbolTable();
		SymbolIterator externalSymbols = symbolTable.getExternalSymbols();
		for (Symbol externalSymbol : externalSymbols) {
			if (externalSymbol.getSymbolType() != SymbolType.FUNCTION) {
				continue;
			}

			Function externalFunction = functionManager.getFunctionAt(externalSymbol.getAddress());
			Parameter[] params = externalFunction.getParameters();
			if (params.length == 0) {
				continue;
			}

			Reference[] references = externalSymbol.getReferences();
			processExternalFunction(listing, referenceManager, references, externalFunction,
				params);
		}

		// use the 'results' to propagate param info to the local variables, data, and params of
		// the calling function
		Msg.trace(this, "Processing propagation results - count: " + results.size());
		for (PushedParamInfo paramInfo : results) {
			Address paramAddress = paramInfo.getAddress();
			Instruction instruction = listing.getInstructionAt(paramAddress);

			// wait on applying data types - the microsoft analyzer does some of this
			// see how much/well it does first
			if (!instruction.getOperandRefType(0).isData()) {
				continue;
			}

			int opType = instruction.getOperandType(0);
			if (!isAddressReferenceOperand(opType)) {
				continue;
			}

			Address referencedAddress = getReferencedAddress(paramAddress);
			if (referencedAddress == null) {
				continue;
			}

			String paramName = paramInfo.getName();
			String symbolName = paramName + "_" + referencedAddress.toString();

			addSymbol(symbolTable, referencedAddress, symbolName);

			String paramText = paramName + " parameter of " + paramInfo.getCalledFunctionName();
			String newComment = paramText + "\n";
			Msg.trace(this, "External Function Call at " + paramAddress + " : " + paramText +
				" at " + referencedAddress.toString());

			createComment(referencedAddress, newComment, paramInfo);

			clearUndefinedDataType(referencedAddress, monitor);

			createData(paramInfo, referencedAddress);
		}

		return true;
	}
This will return true if enough pushes before top of function.
This will return false if not enough pushes or if not a function.
Ghidra/Features/MicrosoftCodeAnalyzer/src/main/java/ghidra/app/plugin/prototype/MicrosoftCodeAnalyzerPlugin/PropagateExternalParametersAnalyzer.java