public void createBlockAndStructure()
			throws MemoryConflictException, LockException, IllegalArgumentException,
			AddressOverflowException, CodeUnitInsertionException, InvalidInputException {
		Memory memory = program.getMemory();
		MemoryBlock block = memory.getBlock(BLOCK_NAME);
		if (block != null) {
			if (!block.getStart().equals(tebAddress) || block.getSize() != blockSize ||
				block.isInitialized()) {
				throw new MemoryConflictException("Incompatible " + BLOCK_NAME + " block exists");
			}
			clearBlock(block);
		}
		else {
			block = memory.createUninitializedBlock(BLOCK_NAME, tebAddress, blockSize, false);
		}
		block.setWrite(true);
		block.setArtificial(true);
		LayDownStructure laydown = new LayDownStructure(is64Bit);
		create(laydown);
		if (is64Bit) {
			DataType selfRef = new Pointer64DataType(laydown.tebDataType);
			laydown.tebDataType.replaceAtOffset(0x30, selfRef, 8, "Self", null);
		}
		else {
			DataType selfRef = new Pointer32DataType(laydown.tebDataType);
			laydown.tebDataType.replaceAtOffset(0x18, selfRef, 4, "Self", null);
		}
		Listing listing = program.getListing();
		listing.createData(tebAddress, laydown.tebDataType);
		SymbolTable symbolTable = program.getSymbolTable();
		symbolTable.createLabel(tebAddress, "TEB", SourceType.ANALYSIS);
	}
Create TEB as a single uninitialized block.  A TEB structure is created and is
placed on the block.
@throws MemoryConflictException if there are overlap problems with other blocks 
@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
@throws CodeUnitInsertionException for problems laying down the structure on the block
@throws InvalidInputException for problems with the symbol name attached to the TEB
Ghidra/Features/Base/src/main/java/ghidra/app/util/datatype/microsoft/ThreadEnvironmentBlock.java