public void analyzeFunction(HashMap<Address, Long> constUse, DecompInterface decompiler,
			Program prog, Function f, Address refAddr, int paramIndex,
			ArrayList<PcodeOp> defUseList) {
		if (f == null) {
			return;
		}

		// check if decompilation of this function failed previously
		if (badDecompFunctions.contains(f.getEntryPoint())) {
			return;
		}

		Instruction instr = prog.getListing().getInstructionAt(refAddr);
		if (instr == null) {
			return;
		}

		decompileFunction(f, decompiler);

		if (hfunction == null) {
			// failed to decompile, add to bad list
			badDecompFunctions.add(f.getEntryPoint());
			return;
		}

		Iterator<PcodeOpAST> ops = hfunction.getPcodeOps(refAddr);
		while (ops.hasNext()) {
			if (monitor.isCancelled()) {
				break;
			}

			PcodeOpAST pcodeOpAST = ops.next();
			if (pcodeOpAST.getOpcode() == PcodeOp.CALL) {
				// get the second parameter
				Varnode parm = pcodeOpAST.getInput(paramIndex); // 1st param is the call dest
				if (parm == null) {
					return;
				}
				// see if it is a constant
				if (parm.isConstant()) {
					// then this is a resource id
					// lookup the resource and create a reference
					long value = parm.getOffset();
					// TODO: not so fast, if there is a defUseList, must apply it to get the real constant USED!
					try {
						value = applyDefUseList(value, defUseList);
						constUse.put(instr.getAddress(), value);
					}
					catch (InvalidInputException exc) {
						// don't worry about error
					}
				}
				else {
					followToParam(constUse, defUseList, hfunction, parm, null);
				}
				// if this is anything else, get the high variable to see if it can be traced back to a param
				// then repeat with any calls to this function at whatever the param is
			}
		}
	}
Analyze a functions references.
Populates the address/value pairs of resource address and ID
@param constUse - resource address/value pairs
Ghidra/Features/Decompiler/ghidra_scripts/WindowsResourceReference.java