public void createBlocksAndSymbols() throws MemoryConflictException, LockException,
			IllegalArgumentException, AddressOverflowException, CancelledException {
		Memory memory = program.getMemory();
		MemoryBlock block1 = memory.getBlock(BLOCK_NAME);
		if (block1 != null) {
			if (!block1.getStart().equals(tebAddress) || block1.getSize() != blockSize ||
				!block1.isInitialized()) {
				throw new MemoryConflictException("Incompatible " + BLOCK_NAME + " block exists");
			}
			clearBlock(block1);
		}
		else {
			ByteArrayInputStream byteStream = getTEBBytes();
			block1 = memory.createInitializedBlock(BLOCK_NAME, tebAddress, byteStream, blockSize,
				null, false);
		}
		block1.setWrite(true);
		block1.setArtificial(true);
		LayDownFlat laydown = new LayDownFlat(program, tebAddress, is64Bit);
		create(laydown);
		Data data = program.getListing().getDataAt(tebAddress.add(is64Bit ? 0x30 : 0x18));
		markDataAsConstant(data);
	}
Create 2 blocks, one that is initialized to hold a proper value for the TEB Self reference field
and another to hold the remainder of the TEB.  The data structure is layed down as a
series of symbols on these blocks.
@throws MemoryConflictException if there are overlap problems with other blocks 
@throws CancelledException if block creation is cancelled
@throws AddressOverflowException for problems with block's start Address
@throws IllegalArgumentException for problems with the block name or the TEB data-type
@throws LockException if it cannot get an exclusive lock on the program
Ghidra/Features/Base/src/main/java/ghidra/app/util/datatype/microsoft/ThreadEnvironmentBlock.java